首页 > 其他分享 >LeetCode 15. 三数之和(中等)

LeetCode 15. 三数之和(中等)

时间:2022-11-25 13:40:05浏览次数:56  
标签:right 15 nums int 三数 索引 指针 LeetCode left

题目描述:

给你一个包含 ​​n​​​ 个整数的数组 ​​nums​​​ ,判断 ​​nums​​ 中是否存在三个元素 abc ,使得 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
  • - <= nums[i] <=

题目分析:

这道题可以通过双指针的方法解决。开始先判断长度是否至少有三个数,没有三个数就直接返回空列表。长度满足要求再对数组进行排序,然后遍历这个数组,固定第一个数,让左指针指向该固定数的下一个数,而让右指针指向数组最后一个数,计数三者之和,满足条件则加入列表。添加完后需要用两个循环判断左指针指向的下一个数是否与当前左指针指向的数相同,如果相同直接跳过下一个数,这么做是为了去重。右指针同理。如果三者之和小于零,则需要更大的数才有可能使和变为零,当前已经固定了一个数,要使和变大,就要移动左指针。右指针同理。

题解:

执行用时: 20 ms

内存消耗: 42.1 MB

class Solution {
public List<List<Integer>> threeSum(int[] nums) {
// 获取长度
int length = nums.length;
// 当 数组为空 或者 长度小于三
if (nums == null || length < 3) {
// 直接返回一个空列表
return new ArrayList<>();
}
// 创建 ArrayList
List<List<Integer>> list = new ArrayList();
// 对数组进行排序
Arrays.sort(nums);
// 遍历数组
for (int i = 0; i < length; ++i) {
// 如果当前数字大于 0 ,则与后面任何数进行组合三者之和都会大于 0
if (nums[i] > 0) {
// 直接退出
break;
}
// 如果 i > 0 且该数与前面一个数一致,跳过此次循环,相当于去重
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
// 左指针索引 初始值为 i + 1
int left = i + 1;
// 右指针索引 初始值为数组长度减一
int right = length - 1;
// 左索引小于右索引循环
while(left < right) {
// 求当前数与左索引上的值与右索引上的值三者之和
int sum = nums[i] + nums[left] + nums[right];
// 如果和为 0 符合要求
if(sum == 0) {
// 将其添加至列表
list.add(Arrays.asList(nums[i], nums[left], nums[right]));
// 以下循环为了去重
while (left < right && nums[left] == nums[left + 1]) {
++left;
}
while (left < right && nums[right] == nums[right - 1]) {
--right;
}
// 左索引加一
++left;
// 右索引减一
--right;
} else if (sum < 0) {
// 如果和小于 0 需要让和更大 左索引加一
++left;
} else if (sum > 0) {
// 如果和大于 0 需要让和更小 右索引减一
--right;
}
}
}
// 返回 list
return list;
}
}

题目来源:力扣(LeetCode)




标签:right,15,nums,int,三数,索引,指针,LeetCode,left
From: https://blog.51cto.com/u_15891283/5886552

相关文章

  • LeetCode 16.最接近的三数之和(中等)
    题目描述:给你一个长度为​​n​​​的整数数组 ​​nums​​​ 和一个目标值 ​​target​​​。请你从​​nums​​​中选出三个整数,使它们的和与 ​​target​......
  • LeetCode 739.每日温度(中等)
    题目描述:请根据每日​​气温​​​列表​​temperatures​​​,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用​​0​​来代替......
  • LeetCode 20.有效的括号(简单)
    题目描述:给定一个只包括​​'('​​​,​​')'​​​,​​'{'​​​,​​'}'​​​,​​'['​​​,​​']'​​​ 的字符串​​s​​,判断字符串是否有效。有效字符串需满足:......
  • LeetCode 155.最小栈(简单)
    题目描述:设计一个支持​​push​​​,​​pop​​​,​​top​​操作,并能在常数时间内检索到最小元素的栈。​​push(x)​​——将元素x推入栈中。​​pop()​​ —......
  • LeetCode 769.最多能完成排序的块(中等)
    题目描述:数组​​arr​​​是​​[0,1,...,arr.length-1]​​的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果......
  • LeetCode 240.搜索二维矩阵II(中等)
    题目描述:编写一个高效的算法来搜索 ​​m x n​​​ 矩阵​​matrix​​​中的一个目标值​​target​​。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的......
  • LeetCode 232.用栈实现队列(简单)
    题目描述:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(​​push​​​、​​pop​​​、​​peek​​​、​​empty​​):实现​​MyQueu......
  • LeetCode 448.找到所有数组中消失的数字(简单)
    题目描述:给你一个含​​n​​​个整数的数组​​nums​​​,其中​​nums[i]​​​在区间​​[1,n]​​​内。请你找出所有在​​[1,n]​​​范围内但没有出现......
  • LeetCode 48.旋转图像(中等)
    题目描述:给定一个​​n × n​​​的二维矩阵 ​​matrix​​​表示一个图像。请你将图像顺时针旋转​​90​​度。你必须在原地旋转图像,这意味着你需要直接修改......
  • LeetCode 260.只出现一次的数字III(中等)
    题目描述:给定一个整数数组​​nums​​,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法......