力扣hot100 三数之和 双指针 细节去重

Problem: 15. 三数之和

文章目录

思路

👨‍🏫 参考

Code

⏰ 时间复杂度: O ( n 2 ) O(n^2) O(n2)

🌎 空间复杂度: O ( 1 ) O(1) O(1)

Java 复制代码
class Solution {
 	public List<List<Integer>> threeSum(int[] nums)
	{
		List<List<Integer>> res = new ArrayList<>();
		int len = nums.length;
		if (len < 3)
			return res;
		Arrays.sort(nums);// 升序排序

		for (int i = 0; i < len; i++)// i选一个数(三个数中最小的数)
		{
			if (nums[i] > 0)// 最小数已经 > 0,和不可能 == 0
				break;
			// 当前数和前一个数相同,去重
			if (i > 0 && nums[i] == nums[i - 1])
				continue;

			int l = i + 1;// 选取第二个数(中间的数)
			int r = len - 1;// 选取第三个数(最大的数)
			while (l < r)
			{
				int sum = nums[i] + nums[l] + nums[r];
				if (sum == 0)
				{
					res.add(Arrays.asList(nums[i], nums[l], nums[r]));
//					 去重 l 和 r 的数
//					跳过重复的值,避免重复解
//					例:[0,-2,-2,-1,1,2,2]  中的 -2 -2 2 2 就需要去重
					while (l < r && nums[l] == nums[l + 1])
						l++;
					while (l < r && nums[r] == nums[r - 1])
						r--;
//					走到这,l 是连续相同段的最后一个,r 是连续相同段的第一个
//					再跳一次,把 nums[l] nums[r] 跳过
					l++;
					r--;
				} else if (sum < 0)// 左边的值 调大一点
					l++;
				else if (sum > 0)// 右边的值 调小一点
					r--;
			}
		}
		return res;
	}
}
相关推荐
倒头就睡的小比特20 小时前
算法竞赛C++常用的STL
c++·算法
默_笙20 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!20 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_4260039620 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫20 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技20 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读21 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼21 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时21 小时前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控