15. 三数之和

发布时间 2023-11-22 10:34:41作者: 追梦•少年

2023-11-22

15. 三数之和 - 力扣(LeetCode)

思路:

三者都不相同,和为0,可以作为i》j》k 不影响的,可能有多个

一开始想的是:暴力法 3层循环,有点bt

借用哈希表,变为2层循环

后来发现会有去重问题,很麻烦

可以进一步思考-》nums[i]<=nums[j]<=nums[k]

进一步思考-》可以先将数组就行排序

还是有去重问题,此题不适合哈希表法,适合双指针

双指针:先将数组排序,暴力循环第一个数,用2个指针分别指向数组开始和结束,不断移动得到所有,需要注意,3个数的遍历都不能与自己的上一个重合-》解决去重问题

双指针:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //三者都不相同,和为0
        //可以作为i》j》k   不影响的 
        //可能有多个
 
        //暴力法  3层循环,有点bt
        //借用哈希表,变为2层循环
 
 
        //会有去重问题
        //可以进一步思考-》nums[i]<=nums[j]<=nums[k]
        //进一步思考-》可以先将数组就行排序
        //还是有去重问题,此题不适合哈希表法,适合双指针
 
        int n = nums.length;
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        
 
        for(int i=0;i<nums.length;){
            int left=i+1;
            int right=nums.length-1;
 
            while(left<right){
                if(nums[i]+nums[left]+nums[right]==0){
                    List<Integer> l=new ArrayList<>();
                    l.add(nums[i]);
                    l.add(nums[left]);
                    l.add(nums[right]);
                    ans.add(l);
 
                    int y=nums[left];
                    left++;
                    while(left<right && nums[left]==y){
                        left++;
                    }
                }else if(nums[i]+nums[left]+nums[right]<0){
                    // int y=nums[left];
                    // left++;
                    // while(left<right && nums[left]==y){
                    //     left++;
                    // }
                    left++;
                }else{
                    // int z=nums[right];
                    // right--;
                    // while(left<right && nums[right]==z){
                    //     left--;
                    // }
                    right--;
                }
 
 
            }
 
            int x=nums[i];
            i++;
            while(i<nums.length && nums[i]==x){
                i++;
            }
 
        }
        
        return ans;
 
 
 
    }
}