異或運算可逆, 所以直接異或回去.
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...