你是否觉得每天面对繁忙的工作和生活,编程能力逐渐停滞不前?或者你在寻找心仪工作的过程中,因为算法题目而错失良机?每次对面试官各种算法题目而力有不逮?那么就从现在开始参与【不看答案挑战,每天刷一道LeetCode题目】
挑战开始
每天一道 LeetCode 题,不看答案,独立完成。这不仅仅是一个刷题的过程,更是一种锻炼思维、培养毅力和解决问题能力的方式。
具体挑战内容如下:
- 每日刷题:每天笔者为大家从 LeetCode 中选择一道新的算法题进行解答,以**【Medium】**为主
- 不看答案:在整个解题过程中,尽量不查看任何形式的参考答案。
- 记录过程:每次解题后,记录你的解题思路和遇到的挑战。
- 持续坚持:尽量每天坚持完成一道题目,看看你能连续几天坚持下来。
- 总结与反思:每周或每月对你的解题过程进行总结,反思哪些方法和技巧对你最有效,哪些需要进一步改进。
- 分享打卡:完成挑战的同学可以在评论区留言,笔者会为每一位完成调整的同学点赞评论留言
题目【Medium】
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]]
满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。
请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
大家可以开始思考如何解答了哦。没有思路的同学可以稍稍往下滑动看一下参考思路
参考思路
标签
- 数组
- 双指针
- 排序
思路
- 考虑使用自带的排序函数对数组进行排序,从而减少操作复杂度
- 考虑使用双指针从头尾进行遍历,依次统计和的情况
- 注意对结果的去重
不要在往下滑了哦 😃 加油!
不要在往下滑了哦 😃 加油!
不要在往下滑了哦 😃 加油!
答案
/**
* 解题思路:
* 1. 排序
* 2. 双指针,依次遍历当前元素,然后取后面最大和最小的两值,计算和
* 3. 依次去重
*/
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if (nums == null || nums.length < 3) {
return res;
}
Arrays.sort(nums);
int l, r;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
// 如果当前数字大于0,则三数之和一定大于0
break;
}
if (i > 0 && nums[i] == nums[i - 1]) {
// 去重
continue;
}
l = i + 1;
r = nums.length - 1;
while (l < r) {
int tmp = nums[i] + nums[l] + nums[r];
if (tmp == 0) {
res.add(Arrays.asList(nums[i], nums[l], nums[r]));
while (l < r && nums[l] == nums[l + 1]) {
l++;
}
while (l < r && nums[r] == nums[r - 1]) {
r--;
}
l++;
r--;
}
if (tmp > 0) {
r--;
}
if (tmp < 0) {
l++;
}
}
}
return res;
}
更多惊喜
我还将定期分享:
-
最新互联网资讯:让你时刻掌握行业动态。
-
AI前沿新闻:紧跟技术潮流,不断提升自我。
-
技术分享与职业发展:助你在职业生涯中走得更远、更稳。
-
程序员生活趣事:让你在忙碌的工作之余找到共鸣与乐趣。
关注回复【1024】惊喜等你来拿!