详细见:leetcode.com/problems/3sum
Java Solution: github
package leetcode;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class P015_3SumEquals0 {
public static void main(String[] args) {
System.out.println(new Solution().threeSum(new int[] {-1, 0, 1, 2, -1, -4}));
System.out.println(new Solution().threeSum(new int[] {-2, 0, 0, 2, 2}));
}
/*
* 9ms
* 33.46%
*/
static class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new LinkedList<List<Integer>>();
Arrays.sort(nums);
int i = 0, j = 0, k = 0;
for (i = 0; i != nums.length; i ++) {
if (i != 0 && nums[i] == nums[i - 1])
continue;
j = i + 1; k = nums.length - 1;
while (j < k) {
int sum = nums[i] + nums[j] + nums[k];
if (sum == 0) {
LinkedList<Integer> one = new LinkedList<Integer>();
one.add(nums[i]);
one.add(nums[j]);
one.add(nums[k]);
ans.add(one);
do {
j ++;
} while (j != nums.length && j != 0 && nums[j] == nums[j-1]);
do {
k --;
} while (k != -1 && k != nums.length - 1 && nums[k] == nums[k + 1]);
} else if (sum < 0) {
do {
j ++;
} while (j != nums.length && j != 0 && nums[j] == nums[j-1]);
} else {
do {
k --;
} while (k != -1 && k != nums.length - 1 && nums[k] == nums[k + 1]);
}
}
}
return ans;
}
}
}
C Solution: github
/*
url: leetcode.com/problems/3sum/
172ms 22.56%
*/
#include <stdio.h>
#include <stdlib.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
void bubble_sort(int *n, int s) {
int i = 0, sign = 1;
while (sign) {
sign = 0;
for (i = 1; i < s; i ++) {
if (*(n + i - 1) > *(n + i)) {
swap(n + i - 1, n + i);
sign = 1;
}
}
}
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
int i = 0, l = 0, r = 0, t = 0, size = 0, sum = 0, si = 0;
int ** answer = NULL;
int * temp = NULL;
bubble_sort(nums, numsSize);
for (i = 0; i < numsSize; i ++) {
if (i != 0 && *(nums + i - 1) == *(nums + i))
continue;
l = i + 1;
r = numsSize - 1;
t = - *(nums + i);
while (l < r) {
sum = *(nums + l) + *(nums + r);
if (sum == t) {
size ++;
l ++;
while (l < r && *(nums + l - 1) == *(nums + l))
l ++;
r --;
while (r > l && *(nums + r + 1) == *(nums + r))
r --;
} else if (sum > t) {
r --;
} else {
l ++;
}
}
}
printf("size is %d\r\n", size);
answer = (int **) malloc(sizeof(int *) * size);
for (i = 0; i < numsSize; i ++) {
if (i != 0 && *(nums + i - 1) == *(nums + i))
continue;
l = i + 1;
r = numsSize - 1;
t = - *(nums + i);
while (l < r) {
sum = *(nums + l) + *(nums + r);
if (sum == t) {
temp = (int *) malloc(sizeof(int) * 3);
*(temp + 0) = *(nums + i);
*(temp + 1) = *(nums + l);
*(temp + 2) = *(nums + r);
*(answer + (si ++)) = temp;
l ++;
while (l < r && *(nums + l - 1) == *(nums + l))
l ++;
r --;
while (r > l && *(nums + r + 1) == *(nums + r))
r --;
} else if (sum > t) {
r --;
} else {
l ++;
}
}
}
*(returnSize + 0) = size;
return answer;
}
int main() {
int nums[] = {-2,0,1,1,2};
int numsSize = 5;
int returnSize[] = {3, 0};
int i = 0, j = 0;
//bubble_sort(nums, numsSize);
int ** answer = threeSum(nums, numsSize, returnSize);
for (i = 0; i < *returnSize; i ++) {
for (j = 0; j < 3; j ++) {
printf("%d\t", *(*(answer + i) + j));
}
printf("\r\n");
}
for (i = 0; i < *returnSize; i ++) {
free(*(answer + i));
}
free(answer);
return 0;
}
Python Solution: github
#coding=utf-8
'''
url: leetcode.com/problems/3sum
@author: zxwtry
@email: zxwtry@qq.com
@date: 2017年3月28日
@details: Solution1: AC 1619ms 8.48%
@details: Solution2: AC 1159ms 36.49%
'''
class Solution1(object):
def threeSum(self, n):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ln = 0 if n == None else len(n)
ans = []
if ln < 3: return ans
m = {}
n.sort(key=None, reverse=False)
for i in range(ln):
m[n[i]] = i
for i in range(ln):
if i != 0 and n[i - 1] == n[i]: continue
for j in range(i + 1, ln):
if j != i + 1 and n[j - 1] == n[j]: continue
if -n[i]-n[j] in m and m[-n[i]-n[j]] > j:
ans.append([n[i], n[j], -n[i]-n[j]])
return ans
class Solution2(object):
def threeSum(self, n):
ln = 0 if n == None else len(n)
ans = []
if ln < 3: return ans
n.sort(key=None, reverse=False)
for i in range(ln):
if i != 0 and n[i - 1] == n[i]: continue
l, r, t = i + 1, ln - 1, -n[i]
while l < r:
if n[l] + n[r] == t:
ans.append([n[i], n[l], n[r]])
while True:
l += 1
if l >= r or n[l - 1] != n[l]:
break
while True:
r -= 1
if l >= r or n[r + 1] != n[r]:
break
elif n[l] + n[r] > t:
r -= 1
else:
l += 1
return ans
if __name__ == "__main__":
n = [0, 0, 0, 0, 0]
sol = Solution2()
print(sol.threeSum(n))