探索字节跳动-三数之和|刷题打卡

508 阅读1分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

二、思路分析:

这个事情是这样的,你首先要把原来的数组排个序(别问为什么排序,大多数思路都是建立再排完序的基础上的),然后就开始码了。

记得以前碰过类似的题目,不过应该是二数之和类型的,三数之和就显然麻烦得很,为了尽可能降低时间复杂度,应用双指针的方法,在过程中先排除一些明显不可能的情况(数组长度不够、最小和为负、最大和为正等情况)。

解法的关键是遍历元素,然后用双指针开始两头找,因为你已经从小到大排过序了,所以确保和小于零右指针右移找更大的数,和大于零左指针左移找更小的数,找到头都没找到那就是真没有了,中间元素位置往后移。

三、AC代码:

var threeSum = function(nums) {
    if(nums.length<3) return [];  
    
    let len = nums.length;
    nums.sort((a, b) => a - b);  
			
    let result = [];
    let left,right,count;
    for(let i=0;i<len-2;i++) {
        if(nums[i]==nums[i-1]) continue;  
        if(nums[i]+nums[i+1]+nums[i+2]>0) break;  
        if(nums[i]+nums[len-2]+nums[len-1]<0) continue; 
        left = i+1;
        right = len-1;
        while(left<right){
            count = nums[i]+nums[left]+nums[right];
            if(count<0) left++;  
            else if (count>0) right--;  
            else {
                result.push([nums[i], nums[left], nums[right]]);
                while(left<right && nums[left]==nums[left+1]) left++;
                while(left<right && nums[right]==nums[right-1]) right--;

                left++;
                right--;  
             
            }
        }
        }
        return result;
};

四、总结:

三数相加的评论区↓

leetcode-cn.com/problems/3s…