首页 > 基础资料 博客日记
三数之和(双指针法)
2024-08-04 10:30:03基础资料围观607次
Java资料网推荐三数之和(双指针法)这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣
题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
双指针法:首先我们要对数组进行排序,我们开始遍历数组从0下标开始记为i,定义left指针为i+1,right指针为nums.length-1(最后一位),然后开始收集结果,如果我们的nums[i]+nums[left]+nums[right]<0则left指针右移一位,如果我们的nums[i]+nums[left]+nums[right]>0则right指针左移一位,如果等于0则加入结果集中,但是这里有很多去重的细节,我们看以下代码中的解法。
import java.util.*;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
int left;
int right;
Arrays.sort(nums);
List<List<Integer>> result=new ArrayList<>();
for(int i=0;i<nums.length-2;i++){
if(nums[i]>0){
return result;
}
//如果和前一位相同的话我们再遍历数组就会有重复的结果集,我们直接跳过进入下一次循环
if(i>0 && nums[i]==nums[i-1] ){
continue;
}
left=i+1;
right=nums.length-1;
while(left<right){
if(nums[i]+nums[left]+nums[right]<0){
left++;
}else if(nums[i]+nums[left]+nums[right]>0){
right--;
}else{
List<Integer> list=new ArrayList<>();
list.add(nums[i]);
list.add(nums[left]);
list.add(nums[right]);
result.add(list);
//这一步操作看下图错误实例,这一步也是结果集去重的关键
while (right > left && nums[right] == nums[right - 1]) {
right--;
}
while (right > left && nums[left] == nums[left + 1]) {
left++;
}
left++;
right--;
}
}
}
return result;
}
}

文章来源:https://www.cnblogs.com/dfj-blog/p/18341491
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- FFmpeg开发笔记(一百零一)跨平台的开源音视频移动框架MobileFFmpeg
- AScript之匿名类型与动态类型
- 16. LangChain ChatPromptTemplate多模态应用实战
- RAG学习笔记:让大模型先查资料再回答问题
- 分享一个实验性的 DAG 流程审计 Skill
- .Net基于NetCoreKevin框架 AI 与 Hangfire 集成:实现AI智能自动任务调度
- 鸿蒙第一课
- AI 让 SeaTunnel 读源码和调试过时了吗?
- 【Azure Developer】ASP.NET Framework 4.8 集成 Azure Application Insights SDK 完整指南
- 做危险品外贸出口,包装选错为什么容易扣关亏损

