LeetCode 第 223 場周賽

2021-10-14 09:35:26 字數 2017 閱讀 7562

異或運算可逆, 所以直接異或回去.

class

solution

return res;

}}

雙指標, 前者距離後者 k 格.

/**

* definition for singly-linked list.

* public class listnode

* listnode(int val)

* listnode(int val, listnode next)

* }*/class

solution

listnode swap2 = n1;

int t = swap1.val;

swap1.val = swap2.val;

swap2.val = t;

return head;

}}

可以任意交換, 也就是只要兩個節點直接或間接有邊, 就能交換.

並查集找出所有連通圖, 連通圖里的節點可以任意交換. 把連通圖里所有節點打入乙個集合, target 要啥我就從集合裡拿啥, 不在集合裡就 res - 1.

class

solution

int res = n;

for(

int i =

0; i < n;

++i)

return res;

}private

intfind

(int

f,int x)

private

void

merge

(int

f,int i,

int j)

f[x]

= y;

}}

比賽時沒做出來, 賽後倒是想出來了乙個方法, 雖然還是很暴力… 但至少過了.

用回溯法列舉所有任務分配給任意使用者的情況.

然後發現很多回溯是重複的. 比如說如下兩種分配, 其實是一種 (這裡arr[i]表示任務i分配給打工人arr[i]):

[1, 1, 1, 2, 2, 3]

[2, 2, 2, 3, 3, 1]

最簡單的, 我們發現開局分配第乙個工作時, 分配給誰都是一樣的, 每種情況回溯下來都是重複的, 那我們不如讓第乙個工作只分配給第乙個人. 同樣, 第二個工作要麼繼續分配給第乙個人, 要麼分配給乙個沒工作的人, 而所有沒工作的人情況都是重複的, 於是不如就指定分給第二個人.

也就是給定n個 job 和k個人. 在已經分配了x個 job 給前y個人的情況下, 第x + 1個 job 要麼繼續分配給前y個人的其中之一, 要麼分配給乙個任意的沒工作的人. 於是本來這個 job 要回溯所有k個人, 現在剪成只要回溯min(k, x + 1).

class

solution

job = jobs;

man =

newint

[k];

res =

0x7fffffff;f

(0,0

,0);

return res;

}private

voidf(

int i,

int max,

int used)

int type = math.

min(man.length, used +1)

;for

(int j =

0; j < type;

++ j)

}}

執行用時:345 ms, 記憶體消耗:35.9 mb

這方法不好, 看大佬的方法是二分 + 狀態壓縮dp 可以只用幾毫秒.

leetcode 第132場周賽

愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...

leetcode周賽 第176場

題目描述 給你乙個 m n 的矩陣 grid,矩陣中的元素無論是按行還是按列,都以非遞增順序排列。請你統計並返回 grid 中 負數 的數目。示例 1 輸入 grid 4,3,2,1 3,2,1,1 1,1,1,2 1,1,2,3 輸出 8 解釋 矩陣中共有 8 個負數。示例 2 輸入 grid 3...

leetcode 第 180 場周賽

大佬都是3 5分鐘一題,而我10分鐘一題,最後一題還不會。qaq 5356.矩陣中的幸運數 給你乙個m n的矩陣,矩陣中的數字各不相同。請你按任意順序返回矩陣中的所有幸運數。幸運數是指矩陣中滿足同時下列兩個條件的元素 class solution object def luckynumbers se...