LeetCode015 3Sum


详细见: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))




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值