美文网首页
15. 三数之和

15. 三数之和

作者: Jason_Shu | 来源:发表于2018-12-19 13:58 被阅读0次

    题目链接:https://leetcode-cn.com/problems/3sum/description/

    思路:
    第一种思路:暴力穷举法,用三个循环,时间复杂度O(N³)。
    第二种思路:为了使a+b+c=0, 先把nums数组sort一下(从小打大),a还是遍历一遍数组,但是申请两个「指针」来遍历a元素后的元素。left指向a后面的元素,right指向数组最后一个元素。这里有两个去重措施,第一个是在第一轮遍历中,用hash来判断是否有重复的目标数组。第二个是在while循环中,如果找到目标数组移动left和right后的元素与上一个相同,则直接跳过达到「去重」效果。

    代码:

    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    var threeSum = function(nums) {
        let left;
        let right;
        let temp;
        let sum = 0;
        let hash = {};
        let result = [];
        nums.sort((a, b) => {
            return a-b;
        });
    
    
        for(let i = 0; i < nums.length - 1; i++) {
            left = i + 1;
            right = nums.length - 1;
    
            while(left < right) {
                sum = nums[i] + nums[left] + nums[right];
                if(sum > 0) {
                    right--;
                } else {
                    if(sum < 0) {
                        left++;
                    } else {
                        if (sum === 0 && [nums[i], nums[left], nums[right]]) {
                            temp = [nums[i], nums[left], nums[right]];
                            if(!(temp in hash)) {
                                hash[temp] = 1;
                                result.push(temp);
                            }
                            left++;
                            right--;
                            //如果当前left和right所指元素与上一个相同,则忽略跳过,是为了在结果中去重
                            while(left < right && nums[left] === nums[left-1]) left++;
                            while(left < right && nums[right] === nums[right+1]) right--;
                        }
                    }
                }
            }
        }
    
        return result;
    
    };
    
    

    相关文章

      网友评论

          本文标题:15. 三数之和

          本文链接:https://www.haomeiwen.com/subject/hqndkqtx.html