LeetCode 15. 三数之和

Posted xiaoXingcode-go

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 15. 三数之和相关的知识,希望对你有一定的参考价值。

题目链接:LeetCode 15. 三数之和

题意:

在给定的数组中,找出三个数(三个数不重复)使得他们相加的和为 0 ,同时答案中不能有重复的答案

解题思路:

完整代码如下:


//双指针做法首先要有序

// 解法一 最优解,双指针 + 排序
func threeSum(nums []int) [][]int 
    var res [][]int
    sort.Ints(nums) //对nums数组进行排序
    //认为 i < j < k
for i:=0;i<len(nums);i++   //遍历 i
    if i>0 && nums[i] == nums[i-1] //去重
        continue
    
    for j,k:=i+1,len(nums)-1 ;j < k ; j++   //同时遍历 j 和 k  结束条件 j,k 相遇
        if j > i+1 && nums[j] == nums[j-1] //同样 去重
        continue
        
        for j < k-1 && nums[i] + nums[j] +nums[k-1] >=0   
            //目的是为了找到nums[i] + nums[j] +nums[k] > 0 的最小值
            k--
        
        if nums[i] + nums[j] +nums[k]== 0 
                res = append(res, []intnums[i], nums[j], nums[k])
        
    

    return res


leetcode(15)三数之和+去重

三数之和

解题思路:排序+双指针

class Solution 
    public List<List<Integer>> threeSum(int[] nums)   
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(nums.length<=2)
            return result;
        
        List<Integer> item = null;
        Arrays.sort(nums);
        int len = nums.length;
        int zeroCount = 0;
        Map<Integer,Integer> map = new HashMap<>();
        for(int i=0;i<len;i++)
            if(nums[i]==0)
               zeroCount++;  
            
            map.put(nums[i],i);
        
        if(zeroCount>=3)
            item = new ArrayList<>();
            item.add(0);
            item.add(0);
            item.add(0);
            result.add(item);
        
        int l=0;
        int r=0;
        int temp=0;
        Integer t = 0;
        for(int i=0;i<len-2;i++)
            if(nums[i+1]==nums[i])
                continue;
            
            if(i>0&&nums[i-1]==nums[i])
                temp = nums[i]*2;
                t = map.get(-temp);
                if(t!=null&&t>i)
                   item = new ArrayList<>();
                    item.add(nums[i]);
                    item.add(nums[i]);
                    item.add(-temp);
                    result.add(item); 
                
            
            l=i+1;
            r=len-1;
            while(l<r)
                if(nums[i]<-nums[l]-nums[r])
                    while(l<r&&nums[l+1]==nums[l])
                        l++;
                    
                    l++;
                else if(nums[i]>-nums[l]-nums[r])
                    while(l<r&&nums[r-1]==nums[r])
                        r--;
                    
                    r--;
                else
                    item = new ArrayList<>();
                    item.add(nums[i]);
                    item.add(nums[l]);
                    item.add(nums[r]);
                    result.add(item);
                    while(l<r&&nums[l+1]==nums[l])
                        l++;
                    
                    l++;
                    while(l<r&&nums[r-1]==nums[r])
                        r--;
                    
                    r--;
                
            
        
        return result;
    

 

以上是关于LeetCode 15. 三数之和的主要内容,如果未能解决你的问题,请参考以下文章

leetcode(15)三数之和+去重

LeetCode1两数之和15三数之和

LeetCode1两数之和15三数之和

LeetCode 15 三数之和

算法leetcode|15. 三数之和(rust重拳出击)

算法leetcode|15. 三数之和(rust重拳出击)