刚开始没有想过度解问题,绕了一大圈,而后在倒数那几个长数组里超时了,一时无解。
看了前辈们的提示笔记,才发现思路压根不对。
对着范例代码一边抄一边调试,最后终于过了;在范例的指引下,也终于摸清了这道题的思路。算法
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