儘量一天更新一道題。
PS:代碼是自己做完後經過查看優代碼修改後的代碼。
1. 題目 :Two Sum
題意:給你一個n個數的數組A[ ] 和一個數值target,在數組中找到兩個加起來等於target的元素的位置。注意:位置下標從1開始的。
解題思路:
- vector + map/hash_map(hash_map可能更好點,但是有的編譯器不支持),複雜度: O(nlogn);
- 先對數組排序,然後用兩個指針,一個指針 st 指向開始,一個指針 end 指向結尾,計算兩個指針指向的值的和,如果大於目標值 target ,則end--,如果小於st++,等於則記錄返回。複雜度:O(n);
(1)代碼
2.題目:Add Two Numbers
解題思路:屬於胡搞一類的吧,so easy!
3.題目:Longest Substring Without Repeating Characters
解題思路:這題主要保持兩類記錄值就可以,一個是以字符下標爲索引的最新下標(這裏的下標是字符串中的下標,有點繞,),另一個是所有字符下標的最大值,不斷更新這兩類座標最可以了,同時不斷計算保存答案。說白了還是一道想法題。
4.題目:Median of Two Sorted Arrays
解題思路:挺好的一道題,解題思路在代碼中。
6.題目:ZigZag Conversion
解題思路:第5題先放一下,本題是一道找規律的題目,具體的解析在代碼中。
14.題目:Longest Common Prefix
題意:寫一個函數來尋找一個字符串數組中的最長公共前綴。
解題思路:以第一個字符串爲標準,依次判斷與每個字符串的第i個字符是否相等,如果當前字符串的長度爲i(i的取值從0開始)或者當前字符串的字符不和第一個字符串的字符相等,則返回先前記錄的長度,否則繼續比較第i+1個字符是否相等。
15.題目:3Sum
題意:給定一組數,找出3個數a,b,c,使得a + b + c = 0,找出的三元組不能重複。
解題思路:先對數組排序,然後依次設定每一個數爲target = - 當前數,然後就想2Sum一樣處理,去找另外的兩個數,時間複雜度爲O(n^2);
20.題目:Valid Parentheses
題意:驗證括號是否能正常閉合,如“()[]{}”是可以正常閉合的,但“(]”就是不正常的。
解題思路:順手A掉這題,老掉牙的題目,具體題目解析在代碼中。
21.題目: Merge Two Sorted Lists
解題思路:主要考歸併思想,具體題目解析在代碼中。
70.題目:Climbing Stairs
題意:有n級樓梯,你一次可以爬一級或兩級,問爬上n級樓梯有多少種爬法。
解題思路:典型的斐波那契數列。 當然用DP的思想來的話:dp[ i ] = dp[i - 1] + dp[i - 2];
98.題目:Validate Binary Search Tree
題意:判斷一顆二叉樹是否是二叉排序樹。
解題思路:二叉排序樹中序遍歷後是有序的,採用中序遍歷,訪問當前節點的時候,當前節點的值是否大於前一個節點的值(如果有的話),如果小於則不是二叉排序樹。