目錄
valid-parentheses(棧,簡單)
search-in-rotated-sorted-array(查詢,中等)
search-in-rotated-sorted-array-ii(查詢,中等)
word-search(回溯,dfs,中等)
combinations(回溯,dfs,中等)
題目
給定乙個只包括 '(',')','','[',']' 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。
示例 1: 輸入: "()" 輸出: true;
示例 2: 輸入: "(){}" 輸出: true
示例 3: 輸入: "(]" 輸出: false
示例 4: 輸入: "([)]" 輸出: false
示例 5: 輸入: "" 輸出: true
思路
棧的特性是先進後出,那麼用來解決括號問題是乙個不錯的選擇。遍歷括號序列,只要是左邊的括號(大,小,中都行)全部都把對應的右邊括號給壓入棧中,
最後的else if是點睛之筆:
else if(sstack.empty() || sstack.top() != s[i])
return false;
如果遍歷到最後,一種往裡面塞,左半邊的括號,那這個序列肯定是錯的,因為這個是比對的不同型別的括號序列那麼左半邊的括號肯定是對應著相應的右半邊的(不是單一括號的匹配問題),如果,不一樣,那肯定是錯的,那麼如果塞入右半邊括號的時候,和棧裡面的不對應,那肯定是錯的。
關鍵這個裡面記住stack的建立和使用。
class solution ');
else if(sstack.empty() || sstack.top() != s[i])
return false;
else
sstack.pop();
}return sstack.empty();
}};
題目
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。
搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 o(log n) 級別。
示例 1: 輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4
示例 2: 輸入: nums = [4,5,6,7,0,1,2], target = 3 輸出: -1
思路
用二分法來求解,最關鍵的地方是:
if ((a[0] > target) ^ (a[0] > a[mid]) ^ (target > a[mid]))
lo = mid + 1;
(a[0] > target) ^ (a[0] > a[mid])(旋轉後)或者(target > a[mid])(未旋轉)的時候,只可能是target在數列的後半部分,而且,這種情況不同時成立。^的意義是, 按位異或運算子。 參與運算的兩個值,如果兩個相應位相同,則結果為0,否則為1.
另外,注意的是,二分法更新的是前後兩端的座標,不是mid。
class solution
return lo == hi && a[lo] == target ? lo : -1;
}};
題目
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,0,1,2,2,5,6] 可能變為 [2,5,6,0,0,1,2] )。
編寫乙個函式來判斷給定的目標值是否存在於陣列中。若存在返回 true,否則返回 false。
示例 1: 輸入: nums = [2,5,6,0,0,1,2], target = 0 輸出: true
示例 2: 輸入: nums = [2,5,6,0,0,1,2], target = 3 輸出: false
思路
最保守的查詢,乙個乙個找。
class solution
};
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。
示例:輸入: n = 4, k = 2
輸出:[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]思路
採用遞迴的思路來進行回溯,在dfs函式裡面,res代表最後的結果陣列,ary存在每一種組合的可能,start是每次遍歷的起始位置。
其中,最不容易想通的地方就是下面的**部分:,如果k!=0,說明長度為k的ary沒塞滿,需要繼續塞,那繼續塞的時候,該塞多少呢?傳入的start預設是1,說明ary最開始塞的時候,而且裡面沒有數,就塞1,塞完1後,在下一次遞迴dfs的時候,將start增1,說明之後要塞的數是(start+1),這樣保證了數的逐步增加,不會出現重複的;那麼該塞多少個呢?,code給的上限是i <= n - k + 1,還是以初始數值為例,n=4,k=2。首次塞入的時候,上限是4-2+1,對應的是每個ary開頭數字分別能為:1,2,3,那麼,這個上限就是限制了每個ary的開頭數字。在之後環節的遞迴中,傳入def的k位置引數逐次減一,這樣,每次的上限就變小,因為當前一位確定後,後一位所能利用的數字的確少了乙個。
另外,每次的push_back和pop_back,體現了回溯的思想,每次操作完後,將ary清空,這樣ary陣列可以重複使用了。
for (int i = start; i <= n - k + 1; i++)
def,首先定義遞迴出口,檢查k是否為0,為0的時候將所得到的ary,存入res,完成一次遞迴。如果不為0,開始下次遞迴,首先在當前大迴圈裡確定首位的數值(由start決定,一次相加),再利用後面的遞迴,依次將后位可選的數字依次填補,直至k==0,到達遞迴出口,完成全部操作。
完整code
class solution
void dfs(vector> &res, vector&ary, int n, int start, int k)
else
for (int i = start; i <= n - k + 1; i++)
}};
Leetcode刷題防忘錄(十)
目錄 climbing stairs 動態規劃,簡單 reverse integer 進製,簡單 permutations 全排列,簡單 powx n 分治,簡單 sqrtx 分治,簡單 假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂...
Leetcode刷題防忘錄(十一)
目錄 4sum 多指標遍歷,中等 merge intervals 遍歷,中等 spiral matrix 二維矩陣,中等 3sum 遍歷,中等 two sum 遍歷,簡單 給定乙個包含 n 個整數的陣列 nums 和乙個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d 使...
leetcode刷題紀實(四)
給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。如果有兩個中間結點,則返回第二個中間結點。class solution return slow 這是快慢指標的經典解法,通過快慢指標移動速度的不同,來尋找到鍊錶的中間結點,而最好的速度比為2 1,這樣就可以使得當快指標到達鍊錶尾的時候,...