当前位置: 首页 > news >正文

力扣-三数之和

1.题目描述

2.题目链接

LCR 007. 三数之和 - 力扣(LeetCode) 

3.题目代码

import java.util.*;
class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);int temp=nums.length-1;Set<List<Integer>> set=new HashSet<>();while(temp>1){int left=0,right=temp-1;while(left<right){if(nums[left]+nums[right]+nums[temp]==0){List<Integer> row=Arrays.asList(nums[left],nums[right],nums[temp]);set.add(row);left++;right--;}else if(nums[left]+nums[right]+nums[temp]>0){right--;}else{left++;}}temp--;}return new ArrayList<>(set);}
}

4.解题思路

这道题我们用的依然还是双指针+定数指针的解题思路,和前面我记录的有效三角形的个数的OJ题目一样,只需要定义定数指针在数组的最后一个元素上,再在剩余数组的边界定义两个指针,根据单调性来进行指针的移动即可。

5.代码细节

1)类型转换

因为我们为了方便去重,定义的是set,而题目中的泛型要求我们返回List<List<Integer>>,所以我们在定义完set之后:

 Set<List<Integer>> set = new HashSet<>();

还需要在最后转换类型:

 return new ArrayList<>(set);

2)构造动态三元组

创建动态列表存储三元组:

List<Integer> row=Arrays.asList(nums[left],nums[right],nums[temp]);

3)找到三元组后的指针移动逻辑

在找到1个三元组并且存入set后,我们需要移动双指针:left--,right++

为什么呢?

因为我们需要寻找下一个符合条件的三元组,也就是寻找下一个满足nums[left]+nums[right]+nums[temp]==0的三元组,但是如果移动单个指针等式的平衡会被打破左边一定不会等于右边只有同时移动双指针,才有可能重新满足不等式。

相关文章:

  • 浙大团队研发Earth Explorer系统,探索深时演化/地学剖面/科研场景,赋能深时地球科学研究
  • 可理解性输入:逛超市
  • 教师角色的转变:从知识传授者到学习引导者
  • LeetCode 1004. 最大连续1的个数 III
  • 友达15.6寸G156HAN02.3工业显示模组
  • Redis String 设计思想深度解析
  • Datacom-hcia~Datacom-hcie学习笔记索引
  • 力扣-有效三角形的个数
  • 初识Linux · NAT 内网穿透 内网打洞 代理
  • 从零基础到最佳实践:Vue.js 系列(6/10):《Composition API(组合式 API)》
  • Redis集群在NoSQL中的应用与优化策略
  • 如何用数据可视化提升你的决策力?
  • CNN vs ViT:图像世界的范式演进
  • 英伟达CEO黄仁勋COMPUTEX 2025演讲实录:AI工厂时代已来,Blackwell架构全面投产
  • Java之函数式接口、lambda表达式、stream流操作、Optional容器、方法引用
  • 基于两阶段交互控制框架的互联多能系统协同自治优化
  • 架构图 C4 规范简介
  • vscode打开的文件被覆盖/只能打开两个文件(Visual Studio Code)
  • ollama使用gpu运行大模型
  • 【Java学习方法】类变量
  • wordpress开发平台/seo实战培训
  • 中小企业网站制作广州网络服务公司找赛合/市场推广是做什么的