目前只想到一种解法,即利用指针思想外加循环实现
时间复杂度O(N^2)
解法一
JAVA描述:
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
int len = nums.length;
if (len < 3) return result;
Arrays.sort(nums);
for (int i = 0; i < len; ++i) {
if(nums[i] > 0) break; //总和肯定大于0
if(i > 0 && nums[i] == nums[i - 1]) continue; //去指针i重复
int L = i + 1; //指针L
int R = len - 1; //指针R
while (L < R) {
int sum = nums[i] + nums[L] + nums[R];
// 自顶向下写法
if (sum == 0) {
result.add(Arrays.asList(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 result;
}
javaScript描述:
var threeSum = function(nums) {
const results = [];
if(nums.length < 3) return results;
nums = nums.sort((a, b) => a - b)
let target = 0;
for(let i = 0; i < nums.length - 2; i++) {
if(nums[i] > target) break;
if(i > 0 && nums[i] === nums[i - 1]) continue;
let j = i + 1;
let k = nums.length - 1;
while(j < k) {
let sum = nums[i] + nums[j] + nums[k];
if(sum === target) {
results.push([nums[i], nums[j], nums[k]]);
while(nums[j] === nums[j + 1]) j++;
while(nums[k] === nums[k - 1]) k--;
j++;
k--;
}else if(sum < target) {
j++;
}else {
k--;
}
}
}
return results;
};