五、leetcode之三数之和(力扣热题HOT100系列)

三数之和

      • 问题描述:
      • 问题分析:
      • 特别注意:
      • 实现思路:
      • 实现代码

问题描述:

五、leetcode之三数之和(力扣热题HOT100系列)_第1张图片

问题分析:

其实三数之和很类似于两数之和的问题。两数之和是寻找两个数字之和满足给定的目标值。这个场景中,给定的目标值是题目所给定的不变值。
而三数之和,我们可以拆分的细一点。假如给定数组 1 2 3 4,target=0。我们进行求解的时候,可以先拿出来一个值,假如说拿出来1,那么我们还需要找出另外两个数的和是(0-1)也就是-1即可。所以问题转化为了找出target=-1的两个数字。

特别注意:

1.此时的答案不止一个,所以在程序中找到结果也不能立刻返回,需要遍历剩下的结果
2.我们需要不断的变化k,来寻找i+j的满足值。也就是说,需要将给定数组中的每一个值遍历一次,然后寻找 [i+j = target - 遍历值] 成立的那个结果。
3.在遍历过程中,我们需要对重复的结果进行去重。

实现思路:

1.判断特殊情况,长度或空返回空结果
2.数组排序,原因:类似于两数之和,排序后可以找到解
3.遍历数组,得到target - nums[i] = target
两数之和的while逻辑
两数之和逻辑
4.找到结果则存入集合中,并进行去重
5.返回结果

实现代码

class Solution {


    public List<List<Integer>> threeSum(int[] given) {
        
        //特殊情况
        if(given.length<3){
            return new ArrayList<List<Integer>>();
        }
        //前提准备[数组排序,结果实例]
        Arrays.sort(given);
        if(given[0]>0)return new ArrayList<List<Integer>>();//[最小的数如果大于0,是没有结果的]
        ArrayList<List<Integer>> res = new ArrayList<List<Integer>>();
        //①遍历数组,first in 0 to n-1
        for(int i= 0;i<=given.length-1;i++){
            int sub = 0 - given[i];//后两个元素之和如果为sub,就是答案之一
            int left = i+1;
            int right = given.length-1;
            while(left<right){//循环指针寻找答案
                if((given[left]+given[right]) < sub){
                    left++;
                }else if((given[left]+given[right]) > sub){
                    right--;
                }else if((given[left]+given[right]) == sub){
                    ArrayList<Integer> temp = new ArrayList<>();
                    temp.add(given[i]);
                    temp.add(given[left]);
                    temp.add(given[right]);
                    if(!res.contains(temp)){
                        res.add(temp);
                    }
                    left++;//可能有存在其他答案  继续遍历
                }
            }
        }
        //②最后返回结果
        return res;
    }
}

你可能感兴趣的:(指针)