三数之和(双指针法)

news/2025/3/19 11:45:44/文章来源:https://www.cnblogs.com/dfj-blog/p/18341491

题目描述

给你一个整数数组 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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777599.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nessus Professional 10.8.0 Auto Installer for macOS Sonoma

Nessus Professional 10.8.0 Auto Installer for macOS SonomaNessus Professional 10.8.0 Auto Installer for macOS Sonoma 发布 Nessus 试用版自动化安装程序,支持 macOS Sonoma、RHEL 9 和 Ubuntu 24.04 请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-…

Nexpose v6.6.263 for Linux Windows - 漏洞扫描

Nexpose v6.6.263 for Linux & Windows - 漏洞扫描Nexpose v6.6.263 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Jul 31, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。您的本地漏…

最佳包裹

求三维凸包用增量法求解 假设我们已经维护好了前面的点的凸包,对于新加入的点: 如果这个点在凸包内部显然那就不用管了 如果这个点在凸包外部,那么考虑如下情况:将新点\(P_r\)当做光源,照的到的面全部删掉,照不到的面保留下来即可 如何判断一个面是否能够被照到:取多面体…

数值分析方法

数值分析复习笔记数值分析方法 数值方法可以用近似方法来理解 对于一些得不到解析解否则解析解计算难度太大的问题,如何用较少的计算得到相对较好(满足精度要求)的数值解、近似解。数值分析最基本的立足点是容许误差 例子:近似计算基本方法:离散化(e.g. 数值积分) 递推法(将…

rocksdb安装与使用

首先要安装gcc 7.3以上版本,依赖于c++ 17.参见gcc 7安装及4.8.5和7.5并存。 需要rpm方式或源码安装gflags 2.2,否则系统可能内置了gflags 2.1,从而导致链接时一直找不到gflags库。如下:/tmp/ccUXmr9R.o: In function `__static_initialization_and_destruction_0(int, int)…

WPF【无限滚动图片浏览】自定义控件

自定义控件自定义控件是我比较陌生的一个主题。我好久没练习过wpf了,需要巩固记忆。我想了一会儿,打开动漫之家,忽然觉得这个看漫画的图片浏览控件有意思。于是特地花了一天做了这个图片控件。我原本以为很容易,但实际上并不简单。这个图片浏览控件比我想象中要难许多,有技…

矩阵乘法内核优化CUDA杂谈

矩阵乘法内核优化CUDA杂谈矩阵乘法内核优化CUDA杂谈How to Optimize a CUDA Matmul Kernel for cuBLAS-like Performance: a Workloghttps://siboehm.com/articles/22/CUDA-MMM在这篇文章中,我将迭代优化用CUDA编写的矩阵乘法的实现。我的目标不是构建cuBLAS的替代品,而是深入…

Cocos Creator 3.8.x bundle核心知识点

bundle官网知识文档: https://docs.cocos.com/creator/3.8/manual/zh/asset/bundle.html bundle核心知识点如下:

python-sum()返回所有元素的总和

lb=[10,30,5,40,89,100] i=sum(lb) #返回所有元素的总和 #参数:序列 print(i)

python-max()返回最大值

lb=[10,30,5,40,89,100] i=max(lb) #返回最大值 #参数:序列 print(i)

python-min返回最小值

lb=[10,30,5,40,89,100] i=min(lb) #返回最小值 #参数:序列 print(i)

windows 隐藏桌面了解此图片

1. 桌面上有了解此图片图标无法删除这是因为在windows背景设置中选择了Window聚焦。如果想关闭可以选择其他选项。如果不想关闭Window聚焦还想隐藏桌面了解此图片图标,可以参考下面设置。 2. 打开注册表 win + x打开运行,输入regedit 回车。 3. 新建或修改注册表 在注册表的地…