知識點:數字邏輯,深度優先遍歷,回溯,動態規劃
解題思路:前排的大部分樓主都是利用格雷編碼的性質,動態規劃求解。如果沒學過格雷編碼的同學可能很難理解。
其實這道題也可以看成是圖的搜尋,利用深度優先搜尋和回溯可以求解。用乙個n維的陣列儲存當前數字的每一位,分別改變每一位,遞迴地搜尋,最終可以找到乙個可行解。
class
solution
vector<
int> res;
vector<
int>
bits
(n,0);
vector<
bool
>
marked
(pow(2
, n)
,false);
dfs(n, bits, marked, res)
;return res;
}bool
dfs(
int n, vector<
int>
& bits, vector<
bool
>
& marked, vector<
int>
& res)
for(
int i =
0; i < n; i++
) res.
pop_back()
; marked[number]
=false
;//回溯恢復原來的狀態
return
false;}
intbittonum
(vector<
int> bits)
return res;}}
;//leetcode-cn.com/problems/gray-code/solution/shen-du-you-xian-sou-suo-hui-su-fa-qiu-jie-by-ppca/
知識點:二分搜尋
終止條件是num[mid] > num[mid+1],那麼num[mid+1】就是最小值。
搜尋規則:如果如果nums[mid] >= nunm[left]那麼左半部分是有序陣列,最小值再右半部分,left = mid + 1,反之,最小值在左半部分,right = mid - 1
class
solution
return left;}}
;
知識點:二分法
解題思路:
1.可以利用上題找到最小值,然後用target比較,可以決定在哪部分進行二分搜尋
2. 直接二分法:
分兩種情況討論:有序陣列在這左邊;有序陣列在右邊
class
solution
else
}return-1
;}};
知識點:分治法,動態規劃,遞增棧
思路1:分治法
思路2:動態規劃法
對於位置i,以i為中心的,向左邊掃瞄,第乙個小於heights[i]的位置x,向左邊掃瞄,第乙個小於heights[i]的位置y,面積是heights[i] * (y - x - 1)
思路3:遞增棧
//動態規劃法
class
solution
for(
int i = n -
2; i >=
0; i--
)int res =0;
for(
int i =
0; i < n; i++
) res = std::
max(res,
(rights[i]
- lefts[i]-1
)* heights[i]);
return res;}}
;
其他思路的**實現 leetcode刷題記錄
我覺得每天來兩道,練習練習,再看看人家是怎麼優化的。1.給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那 兩個 整數,並返回他們的陣列下標。c 暴力求解,204ms,9.1m class solution for index,num in enumerate ...
LeetCode刷題記錄
動態規劃和貪心演算法的異同點 class solution throw newruntimeexception 時間複雜度 o n 2 對於每個元素,我們試圖通過遍歷陣列的其餘部分來尋找它所對應的目標元素,這將耗費 o n o n 的時間。因此時間複雜度為 o n 2 需要一種方法,尋找符合要求的元...
leetcode刷題記錄
工作之餘刷刷題排解下寂寞 1 面試題66.構建乘積陣列 解題思路 題目要求可以簡化為求陣列中任意乙個元素左右兩邊所有元素的乘積。偷懶就用了乙個套路,練習了p c c python class solution def constructarr self,a list int list int 除法是...