15.三数之和(javascript)15.3Sum

原创
小哥 3年前 (2022-11-10) 阅读数 3 #大杂烩

16. 三个数字的最接近和(javascript)16. 3Sum Closest

给你一个容器 n 整数数组 nums,判断 nums 是否有三个要素 a,b,c ,使得 a + b + c = 0 ? 请找出所有和 0 以及不重复的三元组。

注意:答案不能包含重复的三元组。

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

示例 1:

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

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

问题解决参考: 绘图算法:15. 三数之和

起初,我尝试了中等规模的话题,但我想不出来。我只能参考前人的解决问题的想法。这是我认为最好理解的(我认为无论如何,O(∩_∩)O哈哈~)

别胡说八道,开始吧

根据问题的含义, 会发现一个特别的,当!nums为真或长度小于3,将返回空数组。

解决问题的思路:

  1. 按升序排列阵列,然后遍历它们。当发现第一项大于0,当然不存在,退出循环。
  2. i > 0 && nums[i] == nums[i - 1]将导致重复结果,跳过
  3. 两个指针:一个i+1,一分len-1为了初始化,l++,r–,靠近中间,当我们相遇时循环结束,这是内部循环。
  4. sum = nums[i] + nums[l] + nums[r];
    sum和0比较:
    大于0,说明nums[r]大,向左移动一个;
    小于0,说明nums[l]小,向右移动一个;
    等于0,表示该阵列合格。push到res 在里面,两个指针忘记在中间移动
    当 sum == 0 时,nums[l] == nums[l+1] 将导致重复结果,应跳过,l++
    当 sum == 0 时,nums[r] == nums[r-1] 将导致重复结果,应跳过,r−−

    var threeSum = function (nums) { let res = [] let len = nums.length if (!nums || len < 3) return res nums.sort((a, b) => { return a - b })//提升 for (let i = 0; i < len; i++) { if (nums[i] > 0) break//第一项更大0,不等于0 if (i > 0 && nums[i] == nums[i - 1]) continue;//将导致重复结果,跳过 let l = i + 1; let r = len - 1; while (l < r) { const sum = nums[i] + nums[l] + nums[r] if (sum == 0) { res.push([nums[i], nums[l], nums[r]]) while (l < r && nums[l] == nums[l + 1]) l++//将导致重复结果,跳过 while (l < r && nums[r] == nums[r - 1]) r--//将导致重复结果,跳过 l++ r-- } else if (sum < 0) { l++ } else if (sum > 0) { r-- } } } return res };

leetcode: https://leetcode.cn/problems/3sum/

请参考官方问题解决方案:
https://leetcode.cn/problems/3sum/solution/san-shu-zhi-he-by-leetcode-solution/

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除