1. 程式人生 > 其它 >[LeetCodeNote][java][雙指標]15.三數之和

[LeetCodeNote][java][雙指標]15.三數之和

15. 三數之和 - 力扣(LeetCode) (leetcode-cn.com)

題目描述:

給你一個包含 n 個整數的陣列nums,判斷nums中是否存在三個元素 a,b,c ,使得a + b + c = 0 ?請你找出所有和為 0 且不重複的三元組。

注意:答案中不可以包含重複的三元組。

示例1:

輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]

示例2:

輸入:nums = []
輸出:[]

示例3:

輸入:nums = [0]
輸出:[]

老規矩先上程式碼!

class Solution {
    public List<List<Integer>> threeSum(int
[] nums) { Arrays.sort(nums); List<List<Integer>> ans = new ArrayList<List<Integer>>(); for(int i=0;i<nums.length;i++){ if(i>0&&(nums[i]==nums[i-1])){ continue; } int c=nums.length-1;
int target = -nums[i]; for(int j=i+1;j<nums.length;j++){ if(j>i+1&&(nums[j]==nums[j-1])){ continue; } while(c>j&&(nums[c]+nums[j])>target){ --c; }
if(c==j) break; if(nums[c]+nums[j]==target){ List<Integer> l = new ArrayList<Integer>(); l.add(nums[i]); l.add(nums[j]); l.add(nums[c]); ans.add(l); } } } return ans; } }

雖說毫無關係,但是回憶一下兩數之和:給定一個和返回兩個陣列下標

當時用的方法是java中HashMap的幾個函式實現的

然後說下這道題

如果也使用HashMap 要算滿兩層迴圈(突然意識到也是兩層迴圈哎!一會兒就去寫寫試試

對於陣列問題 先想排序!

這題使用雙指標巧妙避免了三重迴圈

拿示例1的輸入舉例:

所謂的雙指標其實是j和c

j從i+1開始往後走,始終比c小,c從nums.length-1開始往前走,始終比j大

每一個i確定了一個target值為0-nums[i],也就是要找一對nums[j]和nums[c]的和為nums[i]的負數使三個數和為零。

需要注意的點:

由於題目要求答案中不可以包含重複的三元組,

所以例如如果i指向了-1位置……emmm這個例子不太好說明我們假設兩個-1中間再加一個-1奧

如果i指向了第一個-1 它找到了一組-1 -1 2

等到下一輪迴圈i指向了第二個-1 它又找到了一組-1 -1 2

顯然就重複了

所以我們規定,i如果相同,不重複找。

j同理。

c不能等於j和超過j

——————————————————手動分界線————————————————————

堅持刷題的第五天了

感覺寫程式碼確實是順了一些,看題解也看得快了

雖然做的題都很基礎 但是小菜雞就一步一步來吧

加油加油

(做題筆記做的屬實是很草率,希望能有一些改進

(以後多用平板畫圖試試