15. 三数之和

2018-12-19  本文已影响0人  Jason_Shu

题目链接: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;

};

上一篇下一篇

猜你喜欢

热点阅读