leetcode_【15】三数之和

1.题目描述:

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

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

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

2.解题思路

  • 首先按升序排序;然后定义下标变量i,j,k,因为是三元组,所以要三个变量如果简单的遍历,那么跟是否有序没有关系,其时间复杂度将达到O(n^3)。仔细想想:如果当前选择了a、b、c三个数,如果其和小于目标target,那么需要将其中一个数用更大的数替换;反之亦然。但究竟替换三个数中的哪个数?无法确定就只能先固定两个变量,让其第三个变化(替换)。一种办法是:固定前两个数i,j,然后让k在一个范围中二分变化(二分查找思想)

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list = new ArrayList();
Arrays.sort(nums);
List<Integer> targets = new ArrayList<>(); // 用于去重
if((nums.length>0 && nums.length<3) ||(nums.length>0 &&nums[0]>0))
return list;
for(int i = 0;i<=nums.length-3;i++) {
int target = 0 - nums[i];
if (!targets.contains(target)) { //用于去重
targets.add(target);
int k = i + 1;
int j = nums.length - 1;
while (k < j) {
if (nums[k] + nums[j] == target) {
List<Integer> li = new ArrayList();
li.add(nums[i]);
li.add(nums[k]);
li.add(nums[j]);
list.add(li);
while (k < j && nums[k] == nums[k + 1])
++k;
while (k < j && nums[j] == nums[j - 1])
--j;
k++;
j--;
} else if (nums[k] + nums[j] < target) {
k++;
} else {
j--;
}
}
}
}
return list;
}
}

4.我的提交记录

leetcode提交结果

文章目录
  1. 1. 1.题目描述:
    1. 1.0.1. 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
  • 2. 2.解题思路
  • 3. 3.代码
  • 4. 4.我的提交记录
  • | 139.6k