zoukankan      html  css  js  c++  java
  • 三数之和

    题目:

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

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

    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]

    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    function comp(a,b){
        return a-b;
    }
    var threeSum = function(nums) {
       nums.sort(comp);
        let left=0;
        let temp = [];
        let right ;
        let sum =0;
        if(nums.length<3){
            return temp;
        }
        for(let i=0;i<nums.length;i++){
            if(nums[i]>0){
                break;
            }
            if(i>0&&nums[i] == nums[i-1]) continue;
            left = i+1;
            right = nums.length-1;
            while(left<right){
               sum = nums[i]+nums[right]+nums[left];
                if(sum===0){
                    temp.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 --;
                }else if(sum>0){
                    right--;
                }else{
                    left ++;
                }
            }
            
        }
      
        return temp;
    };

    实现方式:先排序(从小到大),如果最左边的数大于0说明,没有可以组成0的数据,直接返回[];正常情况下:如果构成的数小于0,则需要将中间指针向右移动一位,如果构成的数大于0则需要将最右的数据向前移动一位;如果最左面最右面以及中间的数据可以构成0的就将其放到temp数组中,同时将中间(left)和右边(right),找到不是相同的下一位数据;如此循环。

    来源:https://leetcode-cn.com/problems/3sum/solution/hua-jie-suan-fa-15-san-shu-zhi-he-by-guanpengchn/

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

  • 相关阅读:
    JS----事件
    JS----计时器
    JS----文档对象模型
    JS----基本数据类型
    JS----函数
    JS----数组
    JS----正则表达式
    CSS----盒子模型与浮动
    Web-9月13日随笔
    Web-9月14日随笔
  • 原文地址:https://www.cnblogs.com/panjingshuang/p/11632089.html
Copyright © 2011-2022 走看看