lintcode-medium-3 Sum

Given an array S of n integers, are there elements ab,c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

For example, given array S = {-1 0 1 2 -1 -4}, A solution set is:

(-1, 0, 1)
(-1, -1, 2)

思路:先排序,然后逐个作为起点,再把后面的数从左右两边开始往中间搜索,如果和为0就加入结果,如果大于零,right向左移动,如果小于零,left向右移动。注意去掉重复的情况。

public class Solution {
    /**
     * @param numbers : Give an array numbers of n integer
     * @return : Find all unique triplets in the array which gives the sum of zero.
     */
    public ArrayList<ArrayList<Integer>> threeSum(int[] numbers) {
        // write your code here
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

        if(numbers == null || numbers.length == 0)
            return result;

        Arrays.sort(numbers);

        for(int i = 0; i < numbers.length - 2; i++){
            if(i > 0 && numbers[i] == numbers[i - 1])
                continue;

            int left = i + 1;
            int right = numbers.length - 1;

            while(left < right){
                if(numbers[i] + numbers[left] + numbers[right] == 0){
                    ArrayList<Integer> line = new ArrayList<Integer>();
                    line.add(numbers[i]);
                    line.add(numbers[left]);
                    line.add(numbers[right]);
                    result.add(new ArrayList<Integer>(line));

                    left++;
                    right--;
                    while(left < right && numbers[left] == numbers[left - 1])
                        left++;
                    while(left < right && numbers[right] == numbers[right + 1])
                        right--;
                }
                else if(numbers[i] + numbers[left] + numbers[right] < 0){
                    left++;
                }
                else{
                    right--;
                }
            }
        }

        return result;
    }
}
时间: 2024-10-21 16:04:28

lintcode-medium-3 Sum的相关文章

[lintcode medium]4 sum

4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Example Given array S = {1 0 -1 0 -2 2}, and target = 0. A solution

[lintcode medium] Two sum

Two Sum Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please no

LintCode &quot;Continuous Subarray Sum II&quot;

Flip over your mind: in rotated subarray case, we can simply cut the continuous smallest subarray. class Solution { public: /** * @param A an integer array * @return A list of integers includes the index of * the first number and the index of the las

[LintCode] Continuous Subarray Sum 连续子数组之和

Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your code should return the index of the first number and the index of the last number. (If their are duplicate answer, return anyone) Have you met this quest

[lintcode medium]Maximum Subarray II

Maximum Subarray II Given an array of integers, find two non-overlapping subarrays which have the largest sum. The number in each subarray should be contiguous. Return the largest sum. Example For given [1, 3, -1, 2, -1, 2], the two subarrays are [1,

lintcode medium Best Time to Buy and Sell Stock I,II,III

Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of a given stock on day i. If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm

[lintcode medium]Maximum Subarray Difference

Maximum Subarray Difference Given an array with integers. Find two non-overlapping subarrays A and B, which |SUM(A) - SUM(B)| is the largest. Return the largest difference. Example For [1, 2, -3, 1], return 6. Note The subarray should contain at leas

[lintcode medium]Palindrome Linked List

Palindrome Linked List Implement a function to check if a linked list is a palindrome. Example Given 1->2->1, return true Challenge Could you do it in O(n) time and O(1) space? //// 1\find out the medium index of Linked list 2\ reverse the right par

[Leetcode 1, Medium] Two sum

Problem: Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please n

LintCode &quot;Continuous Subarray Sum&quot;

A variation to a classical DP: LCS. class Solution { public: /** * @param A an integer array * @return A list of integers includes the index of * the first number and the index of the last number */ vector<int> continuousSubarraySum(vector<int>