無序兩數之和
對於當前num[i],要找的是target-num[i],可利用集合逐漸構建搜尋集合
class
solution
table[nums[i]
]=i;
}return ret;}}
;
有序數字兩數之和!!!
採用雙指標
class
solution
;return ret;
}else
if(curr else
if(curr >target )
}return ret;}}
;
3數字之和!!!
將原數列排序之後,歸納為有序三元組的解法。則依次選取第乙個數字後,後面兩數按照有序序列兩數之和求解。注意去重
//歸納為有序三元組的解法
class
solution);
++left;
--right;
while
(left == nums[left-1]
)++left;
while
(left < right && nums[right]
== nums[right+1]
)--right;}}
}return result;}}
;
最接近的3數字之和
思路同上一題,注意對最接近的判斷。
class
solution
if(sum++i;
else
if(sum>target)
--j;
else
}return ret;
}int
threesumclosest
(vector<
int>
& nums,
int target)
}return retsum;}}
;
四數之和
思路與三數之和一致。
注意與回溯法求k數之和不同處是,這裡的數字有正有負,如果回溯需要對每乙個數字均選擇或不選擇。而此處內層採用雙指標方法,效率高,不會超時。
class
solution);
++left;
--right;
//跳過相同數
while
((left < right)
&&(nums[left]
== nums[left-1]
))++left;
while
((left < right)
&&(nums[right]
== nums[right+1]
))-- right;}}
}}return result;}}
;
最大裝水體積!!!
//對於乙個木板對其容積由較小者的高度決定,另乙個較高者的高度即使更高也不影響。
//對於木板i,其能組成的最大容器是與》=height[i] 中距離最遠的那個木板組成。
//因此,對於中高度較小者a,其能組成的最大容積已經確定(由於i,j由兩側向內,假設a為i,此時j即為最遠的那個》=height[i]的木板),因此此時可以直接跳過a。
class
solution
else
}return area;}}
;
判斷鍊錶是否是回文子串
找到鍊錶中點後,將鍊錶後面一半翻轉,在與前一半比較。
最長無重複字元子串!!!
這是一道dp題目。
假設dp[i] 以第i個字元結尾的最長長度,同時記錄
s[i]上一次出現的位置。
若字元i第一次出現,則dp[i]=dp[i-1]+1
否則,最長長度不能超過到上一次出現的位置。因此,
dp[i]=min(dp[i-1]+1,i-last_pos);
class
solution
else
} character_pos[s[i]
]=i;
if(dp[i]
>ret)ret=dp[i];}
return ret;}}
;
雙指標的滑動視窗問題
參考文章 : 滑動視窗框架
最短目標串
球球速刷LC 貪心
貪心的思路很簡單 在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解,也就是當前最貪婪的解。跳躍遊戲1 維護乙個當前所能到達的視窗,並在這個視窗內遍歷每個點,看能達到的最遠距離farest。從而將視窗更新到當前視窗 end 1...
球球速刷LC 排序
最大數字 將字串排序,兩兩比較,二者組成的數字越大,則對於字串在前面。bool cmp const string a const string b class solution if result 0 0 result 0 return result 以下兩題思路類似。合併區間 插入區間 引用指數 ...
球球速刷LC BFS DFS 二輪
二叉樹裡已經大量使用了dfs,bfs,二叉樹的前序遍歷,中序遍歷 後序遍歷就是dfs,層序遍歷 就是bfs。對於二叉樹這種具有單向分層結構,進行dfs bfs時無需擔心會重複訪問,但是對於無向圖或者 有向有環圖等結構,需要使用輔助資料結構來記錄當前節點是否已經訪問過。島嶼數目 class solut...