力扣 227 場周賽第四題 雙向 dfs 解決問題

2021-10-25 16:12:26 字數 1376 閱讀 5130

因為直接進行 dfs 時間複雜度為 : 2^40 -> 10^9 會stl

所以採用雙向 dfs(把陣列分成兩段來進行考慮):

對最大的情況進行考慮分析(即 length = 40 時)

(1) 對前一半的元素(20個)進行 dfs1 來得到每一種可能的組合答案(最多2^20 = 10^6 個),並進行排序

(2) 然後對於剩下的20個進行 dfs2 來得到每一種可能的組合答案 n ,然後在原陣列中二分找到小於等於 goal - n 的最後乙個數的位置 p

則 :res = min(abs(goal - n - a[p]),abs(goal - n - a[p+1]));(考慮邊界條件,具體看**實現即可)

時間複雜度分析:

二分:log n = 20

可能總數 : 2^20 = 10^6

則 : o(10^7)

===> 對於時間複雜度的優化:可以採用 2^22 和 2^18 或者其他方法來 : 22 * 2^18 < 20 * 2^20

class solution 

return l -1;

}void dfs2(vector& nums,int l)

auto it = get_lower(goal - x);

if(it != 0)

res = min(res,abs(goal - st[it] - x));

if(it + 1 < st.size())

res = min(res,abs(goal - st[it+1] - x));

if(res == 0 || sub == 0) break;}}

int minabsdifference(vector& nums, int goal_)

};

參考題解

和雙向 dfs 的思路相同,同樣是分成兩段來進行分析,列舉每一段的元素組合,並排序

然後 left 指向第一段的的開頭,right 指向第二段的結尾,x = a1[left] + a2[right] ,若x > goal 則,right--,否則 right++,並在過程中更新 res 即可

class solution  else 

}return ret;}};

力扣第165場周賽

a 和 b 在乙個 3 x 3 的網格上玩井字棋。井字棋遊戲的規則如下 玩家輪流將棋子放在空方格 上。第乙個玩家 a 總是用 x 作為棋子,而第二個玩家 b 總是用 o 作為棋子。x 和 o 只能放在空方格中,而不能放在已經被占用的方格上。只要有 3 個相同的 非空 棋子排成一條直線 行 列 對角線...

力扣第 202 場周賽

傳送門 5185 存在連續三個奇數的陣列 給你乙個整數陣列 arr,請你判斷陣列中是否存在連續三個元素都是奇數的情況 如果存在,請返回 true 否則,返回 false 示例 1 輸入 arr 2,6,4,1 輸出 false 解釋 不存在連續三個元素都是奇數的情況。示例 2 輸入 arr 1,2,...

力扣第 221 場周賽

class solution def halvesarealike self,s str bool score a e i o u a e i o u a s len s 2 b s len s 2 sa 0for ch in a if ch in score sa 1 sb 0for ch in ...