15.三数之和(javascript)15.3Sum
原创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,将返回空数组。
解决问题的思路:
- 按升序排列阵列,然后遍历它们。当发现第一项大于0,当然不存在,退出循环。
- i > 0 && nums[i] == nums[i - 1]将导致重复结果,跳过
- 两个指针:一个i+1,一分len-1为了初始化,l++,r–,靠近中间,当我们相遇时循环结束,这是内部循环。
-
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/
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除