From 1f180f5c57af9dc734cd02573d8a0b94f9caa917 Mon Sep 17 00:00:00 2001 From: "huangge1199@hotmail.com" Date: Mon, 3 May 2021 20:19:42 +0800 Subject: [PATCH] =?UTF-8?q?15:=E4=B8=89=E6=95=B0=E4=B9=8B=E5=92=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/leetcode/editor/cn/ThreeSum.java | 95 +++++++++++++++++++ src/main/java/leetcode/editor/cn/ThreeSum.md | 36 +++++++ 2 files changed, 131 insertions(+) create mode 100644 src/main/java/leetcode/editor/cn/ThreeSum.java create mode 100644 src/main/java/leetcode/editor/cn/ThreeSum.md diff --git a/src/main/java/leetcode/editor/cn/ThreeSum.java b/src/main/java/leetcode/editor/cn/ThreeSum.java new file mode 100644 index 0000000..2e54d43 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/ThreeSum.java @@ -0,0 +1,95 @@ +//给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重 +//复的三元组。 +// +// 注意:答案中不可以包含重复的三元组。 +// +// +// +// 示例 1: +// +// +//输入:nums = [-1,0,1,2,-1,-4] +//输出:[[-1,-1,2],[-1,0,1]] +// +// +// 示例 2: +// +// +//输入:nums = [] +//输出:[] +// +// +// 示例 3: +// +// +//输入:nums = [0] +//输出:[] +// +// +// +// +// 提示: +// +// +// 0 <= nums.length <= 3000 +// -105 <= nums[i] <= 105 +// +// Related Topics 数组 双指针 +// 👍 3303 👎 0 + +package leetcode.editor.cn; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +//15:三数之和 +public class ThreeSum { + public static void main(String[] args) { + //测试代码 + Solution solution = new ThreeSum().new Solution(); +// solution.threeSum(new int[]{-1, 0, 1, 2, -1, -4}); +// solution.threeSum(new int[]{-4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6}); + solution.threeSum(new int[]{-4, -2, -1}); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public List> threeSum(int[] nums) { + int n = nums.length; + Arrays.sort(nums); + List> ans = new ArrayList>(); + for (int first = 0; first < n; ++first) { + if (first > 0 && nums[first] == nums[first - 1]) { + continue; + } + int third = n - 1; + int target = -nums[first]; + for (int second = first + 1; second < n; ++second) { + if (second > first + 1 && nums[second] == nums[second - 1]) { + continue; + } + while (second < third && nums[second] + nums[third] > target) { + --third; + } + if (second == third) { + break; + } + if (nums[second] + nums[third] == target) { + List list = new ArrayList(); + list.add(nums[first]); + list.add(nums[second]); + list.add(nums[third]); + ans.add(list); + } + } + } + return ans; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/ThreeSum.md b/src/main/java/leetcode/editor/cn/ThreeSum.md new file mode 100644 index 0000000..818117d --- /dev/null +++ b/src/main/java/leetcode/editor/cn/ThreeSum.md @@ -0,0 +1,36 @@ +

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

+ +

注意:答案中不可以包含重复的三元组。

+ +

 

+ +

示例 1:

+ +
+输入:nums = [-1,0,1,2,-1,-4]
+输出:[[-1,-1,2],[-1,0,1]]
+
+ +

示例 2:

+ +
+输入:nums = []
+输出:[]
+
+ +

示例 3:

+ +
+输入:nums = [0]
+输出:[]
+
+ +

 

+ +

提示:

+ +
    +
  • 0 <= nums.length <= 3000
  • +
  • -105 <= nums[i] <= 105
  • +
+
Related Topics
  • 数组
  • 双指针
  • \n
  • 👍 3303
  • 👎 0
  • \ No newline at end of file