LeetCode 三数之和 — 优化解法

LeetCode 三数之和 — 改进解法

题目:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[ [-1, 0, 1], [-1, -1, 2] ]

 最开始做的解法是先将整个数组排序;然后遍历前两个数(a和b)的所有情况(n^2);对于第三个数,则从剩余的数中(即从第二个数下一个位置开始到末尾)利用二分查找出是否存在数字 -(a+b)即可。 复杂度O(n^2·logn) :

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans = new ArrayList<List<Integer>>();Arrays.sort(nums);Map<Integer,Integer> mi = new HashMap();for(int i=0;i<nums.length-1;i++) {if(mi.get(nums[i]) != null) continue; //记录i下标读过的数字mi.put(nums[i],1);Map<Integer,Integer> mj = new HashMap();    for(int j=i+1;j<nums.length;j++) {if(mj.get(nums[j]) != null) continue; //记录j下标读过的数字mj.put(nums[j],1);int temp = -(nums[i]+nums[j]);if(bSearch(nums,j+1,nums.length-1,temp) == false) continue; //二分搜索j下标之后的区间是否有数字tempans.add(Arrays.asList(nums[i],nums[j],temp));}}return ans;}//二分算法public boolean bSearch(int[] nums,int s,int e,int key) {int start=s,end=e,mid;while(start<=end){mid = (start+end)/2;if(key < nums[mid]) end=mid-1;else if(key > nums[mid]) start=mid+1;else if(key == nums[mid]) return true;}return false;}
}

里面有两个用了哈希的地方,所以时间复杂度应该还要乘上一个常数K...(解数组相关的题感觉总有些依赖哈希的方法=_= ...)




 最近做了另一个数组区间相关的题目,受其解法的启发,打算对这道题解法进行优化。
 还是先对数组进行排序;对第一个数字(a)进行遍历,而然后在剩余的数中用前后指针的方法找出两个和为-a的数字:两个指针left和right;left初始化为数字a的下一位置,right为最后一个位置。比较nums[left]+nums[right]+a和0的大小;如果大于0则right--,小于就left++。 其中在添加结果集时需考虑去重问题,用个哈希判断是否有重复就行了,复杂度O(n^2·K) :

class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> ans = new ArrayList<List<Integer>>();Arrays.sort(nums);Map<Integer,Integer> mi = new HashMap();for(int i=0;i<nums.length-2;i++) {if(mi.get(nums[i]) != null) continue; //记录i下标读过的数字mi.put(nums[i],1);Map<Integer,Integer> mj = new HashMap();int l = i+1, r = nums.length-1, temp;while(l<r) {temp = nums[i] + nums[l] + nums[r];if(temp < 0) {l++;} else if(temp > 0) {r--;} else {if((mj.get(nums[l])) == null) {ans.add(Arrays.asList(nums[i], nums[l], nums[r]));mj.put(nums[l], 1);}l++; r--;}}}return ans;}
}

转载于:https://www.cnblogs.com/geek1116/p/10172313.html

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

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

相关文章

[剑指offer]面试题第[3]题[JAVA][从尾到头打印链表][栈]

【问题描述】 输入一个链表&#xff0c;按链表从尾到头的顺序返回一个ArrayList。 /** * public class ListNode { * int val; * ListNode next null; * * ListNode(int val) { * this.val val; * } * } * */【解答思路】 1…

java学习(126):throw向上抛出异常

//throw抛出异常 import java.util.Scanner; public class test66{static class A {void d() throws Exception {int a, b, c;Scanner in new Scanner(System.in);System.out.println("亲输入a的值");a in.nextInt();System.out.println("请输入b的值");…

mysql存储过程并行_Mysql存储过程的执行顺序问题

Mysql存储过程的执行顺序问题SQL code:CREATE TABLE t_a (a_id int(11) NOT NULL AUTO_INCREMENT,a_name varchar(30) NOT NULL DEFAULT N/A,PRIMARY KEY (a_id)) ENGINEMyISAM DEFAULT CHARSETutf8;CREATE TABLE t_b (b_id int(11) NOT NULL AUTO_INCREMENT,b_name varchar(30…

remove()方法

remove()方法 描述 列表 remove() 方法通过指定元素的值来移除列表中某个元素的第一个匹配项&#xff0c;如果这个元素不在列表中会报一个异常。 语法 remove() 方法语法&#xff1a; L.remove(obj) 参数 obj -- 要从列表中移除的元素的值。返回值 该方法没有返回值&#xff0c…

[Java]集合的小抄 Java初学者必备

文章目录【背景】CollectionsListArrayList优势操作劣势操作LinkedList优势劣势最基本的两种检索集合中的所有对象的方法&#xff1a;CopyOnWriteArrayList补充说明StackMapMap 的常用方法&#xff1a;HashMapLinkedHashMapTreeMapConcurrentHashMapConcurrentSkipListMap补充说…

excel生成mysql语句_通过SQL语句直接实现Excel与数据库的导入导出

1、在SQL数据库中直接从Excel里面查询数据&#xff1a;select \* fromOPENROWSET(MICROSOFT.JET.OLEDB.4.0,Excel 5.0;HDRYES;DATABASEc:\\test.xls,sheet1$)2、从Excel文件中,导入数据到SQL数据库中,select \* into 表 from![](http://images.csdn.net/syntaxhighlighting/Out…

基础知识小记:

什么时候用这些循环&#xff1f; 1,、for(i;i<n;i) 知道循环的起止数, 循环中需要用到不断递增/递减的变量 2、for(String s:slist) 叫foreach循环, 遍历数组/集合中元素用的 为了减少代码量 3、while 不知道确切的循环次数, 但知道循环结束条件时使用 4、do while 先执行一…

java学习(127):finally语句

finally作为异常处理的一部分&#xff0c;它只能用在try/catch语句中&#xff0c;并且附带一个语句块&#xff0c;表示这段语句最终一定会被执行&#xff08;不管有没有抛出异常&#xff09;&#xff0c;经常被用在需要释放资源的情况下。 之前在写爬虫的时候数据库连接的频率…

[剑指offer]面试题第[6]题[JAVA][旋转数组的最小数字][二分法]

####【问题描述】 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转&#xff0c;该数组的最小值为1。 NOTE&#xff1a;给出…

mysql合并多条纪录字段_Mysql应用mysql合并多条记录的单个字段去一条记录编辑

《MysqL应用MysqL合并多条记录的单个字段去一条记录编辑》要点&#xff1a;本文介绍了MysqL应用MysqL合并多条记录的单个字段去一条记录编辑&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。测试用表结构&#xff1a;代码如下:---- 表的结构 tet--CREATE TABLE…

git之项目上传

git之项目上传 需求&#xff1a;将项目代码上传至github 前期准备&#xff1a; 1.github账号注册 2.安装git环境&#xff0c;可以打开且使用git shell. 3.生成SSH key并与github账号绑定 步骤&#xff1a; 1.进入gitshell 2. 进入到项目指定的目录下&#xff0c;适用git命令初始…

[leedcode][409][java]

####【题目描述】 给定一个包含大写字母和小写字母的字符串&#xff0c;找到通过这些字母构造成的最长的回文串。在构造过程中&#xff0c;请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。注意: 假设字符串的长度不会超过 1010。示例 1:输入: "abccccdd…

玩转oracle 11g(35):rman备份-参数文件spfile损坏恢复

1.参数文件spfile损坏恢复 (1)选择“开始”“运行”&#xff0c;输入cmd&#xff0c;按回车。 (2)输入“ set oracle_siddocare”&#xff0c;按回车。 &#xff08;oracle_sid根据实际名称填写&#xff09; (3)输入“rman target /”&#xff0c;按回车 如果在64bit下安装…

python获取页面隐藏元素_selenium操作隐藏的元素(python+Java)

有时候我们会碰到一些元素不可见&#xff0c;这个时候selenium就无法对这些元素进行操作了。例如&#xff0c;下面的情况&#xff1a;Python页面主要通过“display:none”来控制整个下拉框不可见。这个时候如果直接操作这个下拉框&#xff0c;就会提示&#xff1a;from seleniu…

docker 配置文件:/etc/docker/daemon.json

/etc/docker/daemon.json 是 docker 的配置文件&#xff0c;默认是没有的&#xff0c;需要我们手动创建&#xff0c;可配置项如下&#xff1a; [rootlocalhost ~]$ vim /etc/docker/daemon.json {"authorization-plugins": [],"data-root": "", …

[leedcode][JAVA][365][BFS]

【问题描述】 有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶&#xff0c;从而可以得到恰好 z升 的水&#xff1f;如果可以&#xff0c;最后请用以上水壶中的一或两个来盛放取得的 z升 水。你允许&#xff1a;装满任意一个水壶 清空任意一个…

玩转oracle 11g(36):rman备份-控制文件丢失恢复

ORA-00205: error in identifying control file, check alert log for more info 检查oracle的报警日志包含类似报错&#xff1a; ORA-00210: cannot open the specified control file ORA-00202: control file: D:\ORACLE\PRODUCT\10.2.0\ORADATA\DOCARE\C ONTROL01.CTL OR…

=在 java中怎么表示_在Java中各种类型运算符的介绍与其基本使用方式(有具体使用示例)...

一.算数运算符基本四则运算符 - * / %(使用规则简单&#xff0c;正常使用即可)注意事项&#xff1a;a) int/int 结果还是 int 要保留小数需要使用double来计算int a 1;int b 2;System.out.println(a/b);//结果为0b)0不能作为出除数c)%表示取余不仅仅可以对int求模&#xff0…

【旧文章搬运】无Device的驱动如何通信

原文发表于百度空间&#xff0c;2009-07-14 标准的驱动与ring3的通信过程是这样的&#xff1a;驱动中创建设备&#xff0c;并为设备创建符号链接&#xff0c;ring3用CreateFile打开符号链接得到设备句柄&#xff0c;然后DeviceIoControl发送ControlCodeDeviceIoControl的内容被…