【Leetcode】3Sum

题目链接:https://leetcode.com/problems/3sum/

题目:

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

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

思路:

先将数组排序,然后设立三个浮标,从左右向中间遍历。注意当某个triple满足条件时,为了避免重复,要移动浮标直到指向的元素发生变化。

算法

public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> lists = new ArrayList<List<Integer>>();
        Arrays.sort(nums);
        for (int i1 = 0; i1 < nums.length - 2; i1++) {
            if (i1 == 0 || nums[i1] > nums[i1 - 1]) { // 避免重复
                int i2 = i1 + 1;
                int i3 = nums.length - 1;
                while (i2 < i3) {
                    if (nums[i2] + nums[i3] + nums[i1] == 0) {
                        List<Integer> list = new ArrayList<Integer>();
                        list.add(nums[i1]);
                        list.add(nums[i2]);
                        list.add(nums[i3]);
                        while (i2 < i3 && nums[i2] == nums[i2 + 1]) {// 避免跟已有结果重复
                            i2++;
                        }
                        while (i2 < i3 && nums[i3] == nums[i3 - 1]) {// 避免跟已有结果重复
                            i3--;
                        }
                        i2++;
                        i3--;
                        lists.add(list);
                    } else if (nums[i2] + nums[i3] + nums[i1] > 0) {
                        i3--;
                    } else if (nums[i2] + nums[i3] + nums[i1] < 0) {
                        i2++;
                    }
                }
            }
        }
        return lists;
    }  
时间: 2024-10-16 07:13:57

【Leetcode】3Sum的相关文章

【LeetCode】3Sum Closest 解题报告

[题目] Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {

【LeetCode】3Sum Closest 解题报告 (Java)

[题目] Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {

【Leetcode】3Sum Closest

题目链接:https://leetcode.com/problems/3sum-closest/ 题目: Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exac

【leetcode】3Sum Closest(middle)

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

【leetcode】3Sum (medium)

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. Note: Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c) The solut

【leetcode】3Sum Closet

Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution. For example, given array S = {-1 2

【leetcode】Generate Parentheses

题目: 给定整数n,返回n对匹配的小括号字符串数组. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 分析: 这种问题的模式是:1)问题的解有多个 ,2)每个解都是由多个有效的 "步骤" 组成的,3)变更以有解的某个或某些"步骤"

【LeetCode】Implement strStr()

Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 标准KMP算法.可参考下文. http://blog.csdn.net/yaochunnian/article/details/7059486 核心思想在于求出模式串前缀与后缀中重复部分,将重复信息保存在n

【LeetCode】Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->