算法:3个数之和15. 3Sum
Posted 架构师易筋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:3个数之和15. 3Sum相关的知识,希望对你有一定的参考价值。
15. 3Sum
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.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Example 2:
Input: nums = []
Output: []
Example 3:
Input: nums = [0]
Output: []
Constraints:
- 0 <= nums.length <= 3000
- -105 <= nums[i] <= 105
两头逼近解法
分析:结果集不能重复,所要要排序,如果现在的数字跟以前相同,则跳过。
这里有三次跳过,可以看下面的 skip the same: 第一个数相同,第二个数相同,第三个数相同;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
int len = nums.length;
if (len < 3) return list;
Arrays.sort(nums);
for (int f = 0; f < len - 2; f++) {
if (f > 0 && nums[f] == nums[f - 1]) continue; // skip the same
int lo = f + 1, hi = len - 1;
int target = 0 - nums[f];
while (lo < hi) {
if (nums[lo] + nums[hi] == target) {
list.add(Arrays.asList(nums[f], nums[lo], nums[hi]));
while (lo < hi && nums[lo] == nums[lo + 1]) lo++; // skip the same
while (lo < hi && nums[hi] == nums[hi - 1]) hi--; // skip the same
lo++;
hi--;
} else if (nums[lo] + nums[hi] < target) {
lo++;
} else {
hi--;
}
}
}
return list;
}
}
以上是关于算法:3个数之和15. 3Sum的主要内容,如果未能解决你的问题,请参考以下文章