国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP)

這篇具有很好參考價(jià)值的文章主要介紹了【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

競(jìng)賽鏈接

https://leetcode.cn/contest/biweekly-contest-113/

Q1:8039. 使數(shù)組成為遞增數(shù)組的最少右移次數(shù)

https://leetcode.cn/problems/minimum-right-shifts-to-sort-the-array/

【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP

提示:

1 <= nums.length <= 100
1 <= nums[i] <= 100
nums 中的整數(shù)互不相同。

競(jìng)賽時(shí)代碼——枚舉答案

因?yàn)閿?shù)據(jù)范圍很小,所以可以從小到大枚舉可能的答案。

class Solution {
    public int minimumRightShifts(List<Integer> nums) {
        int n = nums.size();
        // a 是排好序之后的數(shù)組,作為標(biāo)準(zhǔn)答案
        int[] a = new int[n];
        for (int i = 0; i < n; ++i) a[i] = nums.get(i);
        Arrays.sort(a);
        // 枚舉答案,即枚舉右移次數(shù)
        for (int x = 0; x < n; ++x) {
            boolean f = true;
            // 檢查這個(gè)答案下每一位是否移動(dòng)后相等
            for (int i = 0; i < n; ++i) {
                if (nums.get(i) != a[(i + x) % n]) {
                    f = false;
                    break;
                }
            }
            if (f) return x;
        }
        return -1;
    }
}

Q2:2856. 刪除數(shù)對(duì)后的最小數(shù)組長(zhǎng)度

https://leetcode.cn/problems/minimum-array-length-after-pair-removals/
【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP

提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
nums 是 非遞減 數(shù)組。

競(jìng)賽時(shí)代碼——貪心+優(yōu)先隊(duì)列

首先貪心地想,能匹配就匹配。
但是對(duì)于樣例 [2, 3, 5, 4] 來說,2 和 3 匹配之后,5 和 4就不能匹配了。
所以在 2 和 3 匹配之后,當(dāng)枚舉到 5 時(shí),可以使用 5 替換掉 3,重新將 3 放入待匹配隊(duì)列中。

具體算法如下:


使用兩個(gè)優(yōu)先隊(duì)列維護(hù)已經(jīng)被枚舉過的數(shù)值。
pq1 維護(hù)等待匹配的較小數(shù)字,pq2 維護(hù)已經(jīng)匹配過的較大數(shù)字。

分情況討論:

  1. 當(dāng)前數(shù)字比 pq1 中的數(shù)字大時(shí),就將 pq1 中最小的數(shù)字刪除,兩者完成配對(duì),當(dāng)前數(shù)字放入 pq2。
  2. 當(dāng)前 pq1 中沒有數(shù)字,即前面沒有元素等待配對(duì)時(shí),將當(dāng)前數(shù)字與 pq2 中最小的數(shù)字比較,如果 pq2 中的數(shù)字較小,就使用當(dāng)前數(shù)字替換 pq2 中的數(shù)字與前面配對(duì),同時(shí) pq2 中這個(gè)最小的數(shù)字就多余了,將其放入 pq1 中等待后序的匹配。
  3. 當(dāng)前數(shù)字無法處理時(shí),就放入 pq1 等待后面出現(xiàn)更大的數(shù)字時(shí)刪除。
class Solution {
    public int minLengthAfterRemovals(List<Integer> nums) {
        int cnt = 0;    // 記錄刪除了幾個(gè)數(shù)字
        // pq1記錄較小的數(shù)字,pq2記錄較大的數(shù)字
        PriorityQueue<Integer> pq1 = new PriorityQueue<>(), pq2 = new PriorityQueue<>();
        for (int x: nums) {
            // 如果當(dāng)前數(shù)字比之前出現(xiàn)的 還沒被刪除過的數(shù)字 大
            if (!pq1.isEmpty() && x > pq1.peek()) {
                cnt += 2;
                pq1.poll();
                pq2.offer(x);
            } else {
                if (pq1.isEmpty() && !pq2.isEmpty() && x > pq2.peek()) {
                    // 如果較小的數(shù)字沒有了 且 當(dāng)前數(shù)字比已經(jīng)刪除的較大的數(shù)字大,就替換一下,將之前較大的數(shù)字放入較小的數(shù)字組中
                    pq1.offer(pq2.poll());
                    pq2.offer(x);
                } else pq1.offer(x);
            }
        }
        return nums.size() - cnt;
    }
}

解法2——貪心+二分查找 O ( log ? N ) O(\log{N}) O(logN)

https://leetcode.cn/problems/minimum-array-length-after-pair-removals/solutions/2446146/olog-n-tan-xin-er-fen-cha-zhao-pythonjav-t3qn/
【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP
當(dāng) m a x C n t ? 2 < = n maxCnt * 2 <= n maxCnt?2<=n 時(shí),最后的結(jié)果只和 n 的奇偶性有關(guān)。
所以我們只需要考慮 maxCnt 超過半數(shù)的情況,此時(shí)有序序列 nums 的中間位置元素 x 一定是出現(xiàn)次數(shù)最多的元素。
使用二分查找可以找到元素 x 出現(xiàn)的次數(shù)。

class Solution {
    public int minLengthAfterRemovals(List<Integer> nums) {
        int n = nums.size();
        int x = nums.get(n / 2);
        // 只需考慮maxCnt*2>n的情況,其它情況剩下的數(shù)字?jǐn)?shù)量只和n有關(guān)
        int maxCnt = lowerBound(nums, x + 1) - lowerBound(nums, x);
        return Math.max(maxCnt * 2 - n, n % 2);
    }

    // 找nums中最后一個(gè)比target小的位置
    public int lowerBound(List<Integer> nums, int target) {
        int l = -1, r = nums.size() - 1;
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (nums.get(mid) < target) l = mid;
            else r = mid - 1;
        }
        return l;
    }
}

Q3:6988. 統(tǒng)計(jì)距離為 k 的點(diǎn)對(duì)

https://leetcode.cn/problems/count-pairs-of-points-with-distance-k/
【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP

提示:
2 <= coordinates.length <= 50000
0 <= xi, yi <= 10^6
0 <= k <= 100

競(jìng)賽時(shí)代碼——異或性質(zhì)+哈希表

可以看到數(shù)據(jù)范圍很怪,是 50000,而 k 的數(shù)據(jù)范圍比較小,是 100。我們可以寫一個(gè)時(shí)間復(fù)雜度是 O ( n ? k ) O(n * k) O(n?k) 的算法。

將已經(jīng)枚舉過的 x 和 y 放入哈希表中。
對(duì)于一個(gè)新的 x 和 y,他要和另外的坐標(biāo)匹配之和為 k,最多有 k 中可能,即 —— 0 + k, 1 + (k - 1),2 + (k - 2),… ,k + 0。枚舉每種情況即可。

根據(jù)異或的性質(zhì),有 x ^ (i ^ x) = i, y ^ ((k - i) & y) = k - i,因此與 坐標(biāo) (x, y) 可以匹配的坐標(biāo)是 (i ^ x, (k - i) ^ y),其中 i 的取值范圍是 0 ~ k。

class Solution {
    public int countPairs(List<List<Integer>> coordinates, int k) {
        int ans = 0;
        Map<Integer, Map<Integer, Integer>> cnt = new HashMap<>();
        for (List<Integer> c: coordinates) {
            int x = c.get(0), y = c.get(1);
            // 枚舉 x 和 y 異或取值分配的所有可能。
            for (int i = 0; i <= k; ++i) {
                ans += cnt.getOrDefault(i ^ x, new HashMap<>()).getOrDefault((k - i) ^ y, 0);
            }
            // 將當(dāng)前坐標(biāo)放入哈希表
            if (!cnt.containsKey(x)) cnt.put(x, new HashMap<>());
            cnt.get(x).merge(y, 1, Integer::sum);
        }
        return ans;
    }
}

更多有關(guān)異或的題目可見:異或/XOR部分問題匯總

Q4:100041. 可以到達(dá)每一個(gè)節(jié)點(diǎn)的最少邊反轉(zhuǎn)次數(shù)

【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP

提示:
2 <= n <= 10^5
edges.length == n - 1
edges[i].length == 2
0 <= ui == edges[i][0] < n
0 <= vi == edges[i][1] < n
ui != vi
輸入保證如果邊是雙向邊,可以得到一棵樹。

競(jìng)賽時(shí)代碼——換根DP

第一次 dfs 求各個(gè)節(jié)點(diǎn)向下需要的反轉(zhuǎn)次數(shù)。
第二次 dfs 求答案。

class Solution {
    List<Integer>[] g;
    Set<Integer>[] t;
    int n;
    // 答案,該節(jié)點(diǎn)往下傳遞反轉(zhuǎn)的數(shù)量,
    int[] ans, cnt;
    
    public int[] minEdgeReversals(int n, int[][] edges) {
        this.n = n;
        ans = new int[n];
        cnt = new int[n];
        g = new ArrayList[n];
        t = new HashSet[n];
        Arrays.setAll(g, e -> new ArrayList<>());
        Arrays.setAll(t, e -> new HashSet<>());
        
        for (int[] e: edges) {
            int x = e[0], y = e[1];
            g[x].add(y);
            g[y].add(x);
            t[x].add(y);
        }
        
        dfs1(0, -1);        // 求cnt
        ans[0] = cnt[0];
        dfs2(0, -1);        // 求ans
        
        return ans;
    }
    
    public void dfs1(int x, int fa) {
        for (int y: g[x]) {
            if (y != fa) {
                dfs1(y, x);         // 先求cnt[y]
                if (!t[x].contains(y)) cnt[x]++;    // 如果x不能往y走,就+1
                cnt[x] += cnt[y];   
            }
        }
    }
    
    public void dfs2(int x, int fa) {
        for (int y: g[x]) {
            if (y != fa) {
                ans[y] = ans[x];    // 兩者的差別只取決于x和y之間邊的情況
                if (t[x].contains(y) && !t[y].contains(x)) ans[y]++;
                else if (!t[x].contains(y) && t[y].contains(x)) ans[y]--;
                dfs2(y, x);
            }
        }
    }
}

更多關(guān)于換根DP可見:
【算法】換根DP
【LeetCode每日一題合集】2023.7.10-2023.7.16(dfs & 換根DP)

相似題目——2581. 統(tǒng)計(jì)可能的樹根數(shù)目(???)

https://leetcode.cn/problems/count-number-of-possible-root-nodes/
【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP

提示:
edges.length == n - 1
2 <= n <= 10^5
1 <= guesses.length <= 10^5
0 <= ai, bi, uj, vj <= n - 1
ai != bi
uj != vj
edges 表示一棵有效的樹。
guesses[j] 是樹中的一條邊。
guesses 是唯一的。
0 <= k <= guesses.length

class Solution {
    List<Integer>[] g;
    Set<Long> s = new HashSet<Long>();  // 存儲(chǔ)各個(gè)guess
    // 節(jié)點(diǎn)數(shù)目,答案,k,節(jié)點(diǎn)0作為根節(jié)點(diǎn)猜對(duì)的數(shù)量
    int n, ans, k, cnt0;

    public int rootCount(int[][] edges, int[][] guesses, int k) {
        this.n = edges.length + 1;
        this.k = k;
        g = new ArrayList[n];
        Arrays.setAll(g, e -> new ArrayList<Integer>());
        for (int[] edge: edges) {
            int x = edge[0], y = edge[1];
            g[x].add(y);
            g[y].add(x);
        }

        for (int[] guess: guesses) {
            // 將兩個(gè) 4 字節(jié)數(shù)壓縮成一個(gè) 8 字節(jié)數(shù)
            s.add((long) guess[0] << 32 | guess[1]);    
        }

        dfs(0, -1);
        reroot(0, -1, cnt0);
        return ans;
    }

    // 計(jì)算 0 為根節(jié)點(diǎn)時(shí)猜對(duì)的次數(shù)
    public void dfs(int x, int fa) {
        for (int y: g[x]) {
            if (y != fa) {
                if (s.contains((long) x << 32 | y)) ++cnt0;
                dfs(y, x);
            }
        }
    }

    // 計(jì)算各個(gè)節(jié)點(diǎn)為根節(jié)點(diǎn)時(shí)猜對(duì)的次數(shù)
    public void reroot(int x, int fa, int cnt) {
        if (cnt >= k) ++ans;        // 此時(shí)已經(jīng)找到了答案(至少有 k 個(gè),所以是 >= k)
        for (int y: g[x]) {
            if (y != fa) {
                int c = cnt;
                if (s.contains((long) x << 32 | y)) --c;
                if (s.contains((long) y << 32 | x)) ++c;
                reroot(y, x, c);
            }
        }
    }
}

成績(jī)記錄

【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP

靠自己 AK 了!

【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP),算法刷題記錄,leetcode,算法,雙周賽,力扣,貪心,換根DP文章來源地址http://www.zghlxwxcb.cn/news/detail-733250.html

到了這里,關(guān)于【力扣周賽】第 113 場(chǎng)雙周賽(貪心&異或性質(zhì)&換根DP)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【力扣周賽】第357場(chǎng)周賽

    題目描述 描述:你的筆記本鍵盤存在故障,每當(dāng)你在上面輸入字符 ‘i’ 時(shí),它會(huì)反轉(zhuǎn)你所寫的字符串。而輸入其他字符則可以正常工作。 給你一個(gè)下標(biāo)從 0 開始的字符串 s ,請(qǐng)你用故障鍵盤依次輸入每個(gè)字符。 返回最終筆記本屏幕上輸出的字符串。 示例 1: 示例 2: 提示

    2024年02月13日
    瀏覽(21)
  • 【力扣周賽】第 352 場(chǎng)周賽

    【力扣周賽】第 352 場(chǎng)周賽

    第 352 場(chǎng)周賽 2760. 最長(zhǎng)奇偶子數(shù)組 提示: 1 = nums.length = 100 1 = nums[i] = 100 1 = threshold = 100 因?yàn)閿?shù)據(jù)范圍特別小,所以怎么暴力都是無所謂的。 繼續(xù)優(yōu)化 可以發(fā)現(xiàn),每個(gè)滿足條件的子數(shù)組是不會(huì)重疊的, 所以在枚舉 l 的時(shí)候,每次可以將下一個(gè) l 設(shè)置成 r。 代碼如下: 2761. 和

    2024年02月12日
    瀏覽(16)
  • 【力扣周賽】第350場(chǎng)周賽

    題目描述 描述:卡車有兩個(gè)油箱。給你兩個(gè)整數(shù),mainTank 表示主油箱中的燃料(以升為單位),additionalTank 表示副油箱中的燃料(以升為單位)。 該卡車每耗費(fèi) 1 升燃料都可以行駛 10 km。每當(dāng)主油箱使用了 5 升燃料時(shí),如果副油箱至少有 1 升燃料,則會(huì)將 1 升燃料從副油箱

    2024年02月09日
    瀏覽(21)
  • Leetcode 第 108 場(chǎng)雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動(dòng)態(tài)規(guī)劃)

    Leetcode 第 108 場(chǎng)雙周賽 Problem C 將字符串分割為最少的美麗子字符串(動(dòng)態(tài)規(guī)劃) 題目 給你一個(gè)二進(jìn)制字符串 s ,你需要將字符串分割成一個(gè)或者多個(gè) 子字符串 ,使每個(gè)子字符串都是 美麗 的。 如果一個(gè)字符串滿足以下條件,我們稱它是 美麗 的: 它不包含前導(dǎo) 0 。 它是

    2024年02月15日
    瀏覽(23)
  • 力扣周賽日記350

    早上興高采烈起床寫周賽,結(jié)果寫完兩題開始坐牢。菜的很。 LeetCode 第 350 場(chǎng)周賽 LeetCode 6901. 總行駛距離 2.1.1 題意 卡車兩個(gè)油箱,耗油1L行駛10km。油箱A耗5L,油箱B給郵箱A油1L。油箱A空后停止行駛,求可行使距離。 2.1.2 分析 開始想O(1)解法,發(fā)現(xiàn)這題主要問題在油箱B給了油箱

    2024年02月10日
    瀏覽(19)
  • 力扣119雙周賽

    模擬 貪心,一個(gè)變了下一個(gè)肯定不用變 滑動(dòng)窗扣維持k個(gè) 二進(jìn)制枚舉+Floyd –

    2024年02月04日
    瀏覽(16)
  • LeetCode 雙周賽 101,DP/中心位貪心/裴蜀定理/Dijkstra/最小環(huán)

    本文已收錄到 AndroidFamily,技術(shù)和職場(chǎng)問題,請(qǐng)關(guān)注公眾號(hào) [彭旭銳] 提問。 大家好,我是小彭。 這周比較忙,上周末的雙周賽題解現(xiàn)在才更新,雖遲但到哈。上周末這場(chǎng)是 LeetCode 第 101 場(chǎng)雙周賽,整體有點(diǎn)難度,第 3 題似乎比第 4 題還難一些。 2605.?從兩個(gè)數(shù)字?jǐn)?shù)組里生成最

    2023年04月09日
    瀏覽(18)
  • 115 雙周賽

    給你一個(gè)整數(shù) n 和一個(gè)下標(biāo)從 0 開始的字符串?dāng)?shù)組 words ,和一個(gè)下標(biāo)從 0 開始的數(shù)組 groups ,兩個(gè)數(shù)組長(zhǎng)度都是 n 。 兩個(gè)長(zhǎng)度相等字符串的 漢明距離 定義為對(duì)應(yīng)位置字符 不同 的數(shù)目。 你需要從下標(biāo) [0, 1, …, n - 1] 中選出一個(gè) 最長(zhǎng)子序列 ,將這個(gè)子序列記作長(zhǎng)度為 k 的 [

    2024年02月08日
    瀏覽(17)
  • 競(jìng)賽 雙周賽

    分段 塊定義為網(wǎng)格圖中 2 x 2 的一個(gè)子矩陣。對(duì)于 左上角格子為 [x, y] 的塊 ,其中 0 = x m - 1 且 0 = y n - 1 ,包含坐標(biāo)為 [x, y] ,[x + 1, y] ,[x, y + 1] 和 [x + 1, y + 1] 的格子。 任意一個(gè)點(diǎn) (x, y),包含它的塊為 [x-1, y-1], [x-1, y], [x, y-1], [x, y],其中坐標(biāo)不能越界。 BFS / DFS, 樹狀數(shù)組 方

    2024年02月12日
    瀏覽(20)
  • 第 107 場(chǎng)LeetCode雙周賽

    第 107 場(chǎng)LeetCode雙周賽

    A 最大字符串配對(duì)數(shù)目 顯然各字符串對(duì) 間匹配的先后順序不影響最大匹配數(shù)目, 可以從后往前遍歷數(shù)組, 判斷前面是否有和當(dāng)前末尾構(gòu)成匹配的. B 構(gòu)造最長(zhǎng)的新字符串 記憶化搜索: 定義狀態(tài) p a a , b b , a b , l a s t p_{aa,bb,ab,last} p aa , bb , ab , l a s t ? 為剩余三種字符串分別為aa、

    2024年02月11日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包