15. 3Sum
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
Notice that the solution set must not contain duplicate triplets.
題目two sum衍伸過來的, 可以先拿來練習一下
Leetcode必刷題, 每個人的標配 :D
固定一個值, 找出有沒有剩下的數符合
回到3Sum, 這題是要找出任意三個數相加會為0的所有組合, 會出現多組答案的情況, 需要把Two sum的思路改一下
剛開始也是固定一個數, 找出剩下兩個數相加為remain, 就會是符合的組
但因為剩下的值相加不會限縮, 又題目沒有規定說要按順序吐出
所以可以先sort完再處理
拿[-1,0,1,2,-1,-4]作為範例:
再來是固定頭, 因為最後一定會至少有兩個數在後面, 所以頭只需要到count - 3
找出剩下的數組可以用Two Sum的雙迴圈來處理, 但有更好的方法
這時候剛開始sort的用處就出現了
當remain 為-1 如果剩餘的兩個相加 > 1我們就可以停止找數組, 直接換到下一個頭, 在往右加都會是更大
這邊可以用binary search的方式來找, 相加太多就限縮, 太少就往右增加
最後再把上下結合, 就可以解出答案