当前位置:网站首页>每日一题-三数之和-0716(2)
每日一题-三数之和-0716(2)
2022-08-05 05:17:00 【菜鸡程序媛】
题目:
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
思路:
- 先将数组排序(方便排除后面会重复的三元组)
- 是动态的指针哦,一个固定在最左面,两个一个在左面+1,一个在右面,判断三个数字的和来移动指针
- 如果出现和相等的三个数字,就要开始排除后面会重复的三元组
while((i < j) && (nums[i] == nums[++ i]));
while((j > i) && (nums[j] == nums[-- j]));
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
if(nums == null || nums.length < 3)
return null;
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i = 0; i <= nums.length - 3; i ++){
// 当前的数字已经大于0,后续没必要走了
if(nums[i] > 0)
break;
// 已经和之前的数字相等了
if((i > 0) && nums[i] == nums[i - 1])
continue;
int j = i + 1;
int k = nums.length - 1;
while(j < k){
int sum = nums[i] + nums[j] + nums[k];
if(sum < 0){
while((j < k) && nums[j] == nums[++ j]);
}else if(sum > 0){
while((j < k) && nums[k] == nums[-- k]);
}else{
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
res.add(list);
// 如果还是相等的j的话 已经添加过了 没必要重复使用
while((j < k) && nums[j] == nums[++ j]);
//j已经变了,k已经不满足相加等于和了,自然要向前走了
while((j < k) && nums[k] == nums[-- k]);
}
}
}
return res;
}
}
边栏推荐
猜你喜欢
随机推荐
《基于机器视觉的输电线路交叉点在线测量方法及技术方案》论文笔记
LeetCode刷题之第530题
Redis设计与实现(第三部分):多机数据库的实现
网络信息安全运营方法论 (上)
【UiPath2022+C#】UiPath Switch
深度学习系列(二)优化器 (Optimization)
发顶会顶刊论文,你应该这样写作
LeetCode刷题之第23题
三、自动配置源码分析
【nodejs】第一章:nodejs架构
【Promise高级用法】实现并行和串行API
TinyFlashDB:一种超轻量的可纠错的通用单片机flash存储方案
Tensorflow steps on the pit notes and records various errors and solutions
PoE视频监控解决方案
WCH系列芯片CoreMark跑分
AIDL detailed explanation
「实用」运维新手一定不能错过的17 个技巧
LeetCode刷题之第129题
电子产品量产工具(1)- 显示系统实现
You should write like this