刚开始没有想过分解问题,绕了一大圈,然后在倒数那几个长数组里超时了,一时无解。
看了前辈们的提示笔记,才发现思路压根不对。
对着范例代码一边抄一边调试,最后终于过了;在范例的指引下,也终于摸清了这道题的思路。
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的算法题,很适合锻炼思维。尤其代码写得多了,浮躁了。
这些算法题可以带给我更多刺激。
期待坚持下去那个有质的飞跃的我。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。