3sum java_[leetcode-15]3Sum(java)

news/2024/7/8 8:36:44

问题描述:

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)

The solution set must not contain duplicate triplets.

For example, given array S = {-1 0 1 2 -1 -4},

A solution set is:

(-1, 0, 1)

(-1, -1, 2)

分析:这道题想到了是先排序,然后再用两个指针,left 和right,分别从两端趋近。然后当z=-(Vleft+Vright),然后在中间搜索z(二分法)。然后用递归的方法,但是却超时了。看了网友的介绍。感觉网友的方法确实很好。

其思想如下:这里有三个变量,因此,向着O(n2)的方向努力。先对数组排序,当数从前向后移动时,固定住一个数,然后再选两个数:left = i+1;right = nums.length-1;然后二者向中间逼近。当Vl+Vr+p>0时,left++l若小于0,right–。当然为0时,添加到list中。

同样,去重也是一个比较讨厌的问题,一个很好的trick是:当num[i]==num[i-1]时,此时固定的数是一样的。那么此时,搜索到的list的集合一定是num[i-1](当p为num[i-1])的子集。所以过滤。

当一个三元组找到之后(num[i],nums[j],num[k])找到时,因为此时为有序排序。所以若num[j+1]==num[j],过滤。当num[k-1]==num[k]时,过滤。此时,再没有重复的可能。

代码如下:380ms

public class Solution {

public List> threeSum(int[] nums) {

List> res = new LinkedList>();

Arrays.sort(nums);//排序

int i;

int p;

int left,right;

int tmp;

List list;

for(i = 0;i

p = nums[i];

if(i-1>=0&&p==nums[i-1])

continue;

left = i+1;

right = nums.length-1;

while(left

tmp = nums[left]+nums[right]+p;

if(tmp==0){

list = new LinkedList();

list.add(p);

list.add(nums[left]);

list.add(nums[right]);

res.add(list);

while(left+1

left++;

while (right-1>=0&&nums[right-1]==nums[right])

right--;

left++;right--;

}else if(tmp<0)

left++;

else

right--;

}

}

return res;

}

}


http://www.niftyadmin.cn/n/4747376.html

相关文章

java mongodb 关闭连接_Java中获取MongoDB连接的方法

首先是所需jar包&#xff0c;Maven中的配置如下&#xff1a;org.mongodbmongodb-driver3.4.1org.mongodbbson3.4.1org.springframework.dataspring-data-mongodb1.7.0.RELEASEorg.mongodbmongo-java-driver3.9.1获取连接的代码如下(本中用的是模板类)&#xff1a;List addrs n…

用思维导图学习java_用思维导图纪录Java学习过程

之前小编我给大家分享过一些Java学习相关的图片&#xff0c;比如 Java入门三张图够吗 &#xff0c;这种图正是大名鼎鼎的思维导图。思维导图又叫心智导图是表达发散性思维的有效的图形思维工具 &#xff0c;它简单却又极其有效&#xff0c;是一种革命性的思维工具。思维导图运用…

apparmor mysql_apparmor 引起自定义mysql 日志问题

今天手贱&#xff0c;看到mysql 的日志在/var/log/mysql下面。总是觉得别扭&#xff0c;于是就想改变日志的位置&#xff0c;本人开发环境 vagrant ubuntu12.04 ,在/etc/mysql/mysql中修改了general_log的位置&#xff0c;放在/data/logs/mysql下面然后重启服务&#xff0c;s…

java extjs4 分页_ExtJs4 SpringMvc3 实现Grid 分页

新建一个Maven webapp项目&#xff0c;webxml以及spring配置没什么需要注意的&#xff0c;不再赘述。Maven依赖&#xff1a;(个人习惯&#xff0c;有用没用的都加上。。。)4.0.0zp.testextjswar0.0.1-SNAPSHOTextjs Maven Webapphttp://maven.apache.orgjunitjunit4.7testjstlj…

正则表达式判断是否mac地址 java_使用正则表达式判断字符串是否为MAC地址

今天Boss给了一个小任务&#xff0c;要求给定一个字符串&#xff0c;判断该字符串是否是MAC地址&#xff0c;并用Java和正则表达式实现。于是我顺便百度了下MAC地址&#xff0c;并在cmd下使用getmac获取本机的MAC地址&#xff0c;了解了一点后&#xff0c;就用Java实现了。为了…

java语言学习要点_菜鸟入门:Java语言学习六大要点

原标题&#xff1a;菜鸟入门&#xff1a;Java语言学习六大要点Java的学习是比较复杂的&#xff0c;主要表现在相关的一系列平台、规范和协议上。有经验的Java程序员都知道&#xff0c;只掌握了Java语言本身很难开发应用程序。不讨论这些复杂的概念&#xff0c;而是我是参加的培…

java终止正在运行的线程_Java再学习——停止一个正在运行的线程

关于这个问题&#xff0c;先了解一下Thread类方法中被废弃的那些方法。suspend(), resume(),stop()/stop(Throwable obj),destroy()首先&#xff0c;stop(Throwable obj)和destroy()方法在最新的Java中直接就不支持了&#xff0c;没必要去看了。我们只需瞧瞧suspend(), resume(…

mysql 5.7 jdbc 8.0_mysql8.0 jdbc连接注意事项

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼url增加参数useSSL 和时区 : jdbc:mysql://localhost:3306/mydb?useSSLfalse&serverTimezoneUTCdriver变化: com.mysql.jdbc.Driver > com.mysql.cj.jdbc.Driver常见错误提示1&#xff1a;如果driver没有添加cj&#xff0c…