原创 leetcode162——Find Peak Element

題目大意:在給出的數組中找出峯值的索引,假設nums[-1]=nums[n]=-∞,如果有多個返回任意一個即可,要求時間複雜度O(logn),。 分析:二分查找。時間複雜度O(logn)自然聯想二分查找。利用好題裏的-∞條件來不斷縮小搜索

原创 leetcode140——WordBreakⅡ

題目大意:給出字符串s和字典,用空格拆分字符串s,使得成爲一個或多個在字典中出現的單詞,找出所有可拆分的解。 分析:動態規劃。先用leetcode139判斷是否有解。有解的基礎上: 狀態:二維數組dp[i]——s[0~i-1]的所有可拆分

原创 leetcode150——Evaluate Reverse Polish Notation

題目大意:根據逆波蘭表達式法,求表達式的值 分析:棧。token爲數字時入棧,token爲運算符時彈出兩個棧頂元素,運算後入棧。注意題目給的string,string轉int用stoi(str)。 代碼: class Solution

原创 leetcode128——Longest Consecutive Sequence

題目大意:求未排序數組中的最長連續序列的長度,要求時間複雜度爲O(n)。例如[100,4,200,1,3,2],len=4。 分析:哈希表unordered_set。 原題=>遍歷數組時需要判斷某個數(大一或小一)是否存在=>用哈希表(查

原创 leetcode687——Longest Univalue Path

題目大意:求二叉樹中每個節點值都相同的最長路徑長度,長度=節點間邊數。 分析:dfs。維護全局maxLen,對每個節點求最長路徑。經過該節點的最長路徑=leftLen+rightLen。LeftGain、RightGain分別爲左右子節點

原创 leetcode124——Binary Tree Maximum Path Sum

題目大意:求二叉樹中最大路徑和,路徑可以從任意任意節點出發,到任意節點結束。 分析:dfs。維護全局maxSum,對每個節點求最大路徑。經過該節點的最大路徑=節點值+leftGain+rightGain。LeftGain、RightGai

原创 leetcode13——Roman to Integer

題目大意:將羅馬數字字符串轉換成整數 分析: 方法一:最簡單的思路。switch case從左到右依次判斷字符,將當前tmp加入ans。 方法二:轉換問題本質。原題=>當左邊字母<右邊字母,就做減法,否則就做加法。 代碼: 方法一: c

原创 leetcode416——Partition Equal Subset Sum

題目大意:判斷能否將數組分割成兩個等和的子集,元素均爲正整數。 分析:動態規劃揹包問題。原問題轉化爲是否能在數組中取出一些數,使得和爲數組元素總和的一半。 狀態:dp[i][j]——nums[0~i]可選,是否能使得選出元素的總和爲j。

原创 leetcode560——Subarray Sum Equals K

題目大意:求出元素和等於K的所有子數組個數 分析:暴力O(n³)不可取。可以利用哈希表做到遍歷一次得到答案。題意是想找出滿足i~j的和爲k的子數組,可以轉化爲sumj-k=sumi,也就是每遍歷到一個nums[j],就判斷是否已經存在一個

原创 leetcode406——Queue Reconstruction By Height

題目大意:給出二維數組代表打亂順序的一隊人,每個人由(身高h,排在他前面身高大於等於他的人的個數k)表示,重排隊列。 分析:貪心算法。由於矮子對高個子來說是“看不見”的(矮子插入在高個子前面不會影響高個子的k值),所以採取每次先放高個子的

原创 leetcode287——Find the Duplicate Number

題目大意:數組大小n+1,數組內元素範圍[1,n],求出重複的元素 分析:面試中一般採用前幾種做法。快慢指針的做法雖然很好,但是一般想不出來,除非你之前做過這道題。 方法一:排序後找相鄰元素重複的即可。時間複雜度O(nlogn)+空間複雜

原创 leetcode617——Merge Two Binary Trees

題目大意:合併兩棵二叉樹變成一棵樹,合併時重疊的兩節點值相加作爲新節點,否則不爲NULL的節點作爲新節點 分析:dfs。先合併當前節點:有一方爲空就直接返回另一方(這個分支無需再合併了),兩節點都存在就值相加。然後遞歸合併左右子樹即可。

原创 leetcode581——Shortest Unsorted Continuous Subarray

題目大意:找出最短的子數組,子數組排序後能讓整個數組升序(非降序) 分析:方法一:排序後比較,第一個和最後一個值不相等的位置就是子數組的左右界限。時間O(nlogn),空間O(n)。 方法二:題意=>找到亂序子數組的左右界限=>遍歷一次找

原创 leetcode442——Find All Duplicates in an Array

題目大意:大小爲n的數組中,每個數滿足1≤a[i]≤n,有些元素出現了兩次,有些元素出現了一次,找到重複數字。要求時間複雜度O(n),空間複雜度O(1)。 分析:和leetcode448類似。遍歷數組的過程中標記相反數,當要標記位置的數值

原创 leetcode240——Search a 2D MatrixⅡ

題目大意:在二維矩陣中找目標值,二維矩陣每行從左到右升序,每列從上到下升序。 分析:從左下角出發,如果當前值大於target,向上走(因爲當前值右、下都比當前值大);如果當前值小於target,向右走(因爲當前值左、上都比當前值小)。直到