刚开始没有想过分解问题,绕了一大圈,然后在倒数那几个长数组里超时了,一时无解。
看了前辈们的提示笔记,才发现思路压根不对。
对着范例代码一边抄一边调试,最后终于过了;在范例的指引下,也终于摸清了这道题的思路。
图片描述

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的算法题,很适合锻炼思维。尤其代码写得多了,浮躁了。
这些算法题可以带给我更多刺激。
期待坚持下去那个有质的飞跃的我。


MisterWrong
14 声望2 粉丝

终身学习者