剛開始沒有想過度解問題,繞了一大圈,而後在倒數那幾個長數組裏超時了,一時無解。
看了前輩們的提示筆記,才發現思路壓根不對。
對着範例代碼一邊抄一邊調試,最後終於過了;在範例的指引下,也終於摸清了這道題的思路。
算法
public static List<List<Integer>> f5(int[] nums) { Arrays.sort(nums); List<List<Integer>> result = new ArrayList<List<Integer>>(); for(int i = 0; i < nums.length -2; i++){//一次對比三個數,因此最後一個位置的3個數是length-3, length-2,length-1 if(i == 0 || i > 0 && nums[i] != nums[i-1]){//跳過與前一次重複的組合 int left = i + 1;//第二個數,雙指針之一,初始指向nums[i]下一個元素 int right = nums.length -1;//第三個數,雙指針,初始指向最後一個元素 int sum = 0 - nums[i];//把三數之和轉換爲兩數之和,簡化問題;把nums[i]取反輕鬆達到目的 while(left < right){ if(nums[left] + nums[right] == sum){ result.add(Arrays.asList(nums[i], nums[left], nums[right])); do{ left++;}while(left < right && nums[left-1] == nums[left]);//跳太重複 do{ right--;}while(left < right && nums[right] == nums[right+1]);//跳太重複 }else if(nums[left] + nums[right] < sum){ do{ left++; }while(left < right && nums[left-1] == nums[left]);//跳太重複 }else if(nums[left] + nums[right] > sum){ do{ right--; }while(left < right && nums[right] == nums[right+1]);//跳太重複 } } } } return result; }
今天的收穫是,學到了拆分問題以簡化實現的難度。
在看範例前,本身的實現簡直不堪入目。數組
LeetCode的算法題,很適合鍛鍊思惟。尤爲代碼寫得多了,浮躁了。
這些算法題能夠帶給我更多刺激。
期待堅持下去那個有質的飛躍的我。spa