Leetcode15 3Sums 双指针,折半查找

因为要保证每一个三元组的数字都不同,所以枚举三元组中的最小值。记三元组为【a,b,c】,最小值为a,最大值为c;

将数组排序,枚举每一个最小值,用双指针在其后面找到不同的b和c,因为bc不能重叠所以比较容易

不能枚举b,因为a和b有可能值相等,当出现相同的数时,无法保证b的左侧一定有与其值相等的a

import java.util.*;
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        HashMap<Integer,Integer> cnt = new HashMap<Integer,Integer>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++)
        {
            if(i>0 && nums[i]==nums[i-1])
                continue;
            int a = i+1;
            int b = nums.length-1;
            while(a<b){
                if(nums[i] + nums[a] + nums[b] == 0)
                {
                    ArrayList<Integer> tem = new ArrayList<Integer>();
                    tem.add(nums[i]);
                    tem.add(nums[a]);
                    tem.add(nums[b]);
                    ans.add(tem);
                    while(a<b && nums[a]==nums[a+1])a++;
                    while(b<nums.length-1 && nums[b]==nums[b+1])b--;
                    a++;
                    b--;
                }
                else if(nums[i] + nums[a] + nums[b] < 0)
                    a++;
                else b--;
            }
        }
        return ans;
    }
}

 

Guess you like

Origin blog.csdn.net/Dale_zero/article/details/117171838