当前位置:网站首页>每日一题-三数之和-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;
}
}
边栏推荐
- MSRA提出学习实例和分布式视觉表示的极端掩蔽模型ExtreMA
- (C语言)strlen、strcpy、strcat、strcmp、strstr函数的模拟实现
- 【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
- AIDL detailed explanation
- 单变量线性回归
- WCH系列芯片CoreMark跑分
- 【ts】typeScript高阶:any和unknown
- tensorflow的session和内存溢出
- CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
- 伪RTOS-ProroThread在CH573芯片上的移植
猜你喜欢
随机推荐
【nodejs】第一章:nodejs架构
【ts】typeScript高阶:any和unknown
沁恒MCU从EVT中提取文件建立MounRiver独立工程
LeetCode刷题之第33题
教你如何封装功能组件和页面组件
C语言查看大小端(纯代码)
C语言的一些小常识
十、视图解析原理与源码分析
Thread handler handle IntentServvice handlerThread
电子产品量产工具(5)- 页面系统实现
如何组织一场安全、可靠、高效的网络实战攻防演习?
【ts】typescript高阶:条件类型与infer
2021电赛资源及经验总结
【ts】typescript高阶:分布式条件类型
[Intensive reading of the paper] R-CNN's Bounding box regression problem is detailed
CAN、CAN FD
原来何恺明提出的MAE还是一种数据增强
idea 快速日志
LeetCode刷题之第746题
Polygon计算每一个角的角度