2019-03-06-算法-进化(三数之和)

题目描述
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:
[[-1, 0, 1],[-1, -1, 2]
]

我的初步思路:利用穷举法加优化来完成,代码如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();if(nums == null || nums.length<3) {return list;}//1.排序Arrays.sort(nums);Set<String> set = new HashSet<String>();StringBuilder sb = new StringBuilder();//2.查找匹配项并去重for(int i=0;i<nums.length-2 && nums[i]<=0;i++) {for(int j=i+1;j<nums.length-1;j++) {for(int k=j+1;k<nums.length;k++) {sb.delete(0, sb.length());if(nums[i] + nums[j] + nums[k] == 0) {String tmp = sb.append(nums[i]).append(nums[j]).append(nums[k]).toString();if(!set.contains(tmp)) {set.add(tmp);list.add(Arrays.asList(nums[i], nums[j], nums[k]));}}}}}return list;}

但是在测试用例输入了一个巨长巨长的数组之后,程序执行时间超出了限制。继续在穷举法上做优化的空间已经不大了。所以考虑使用另一种方法。
改用双指针法,时间勉强达标,代码如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();if(nums == null || nums.length<3) {return list;}//1.排序Arrays.sort(nums);Set<String> set = new HashSet<String>();StringBuilder sb = new StringBuilder();//2.查找匹配项并去重for(int i=0;i<nums.length-2 && nums[i]<=0;i++) {int start =i+1, end = nums.length-1;while(nums[i]<=0 && start<end) {if(nums[i] + nums[start] + nums[end] <0) {start++;}else if (nums[i] + nums[start] + nums[end] >0) {end--;}else {sb.delete(0, sb.length());String tmp = sb.append(nums[i]).append(":").append(nums[start]).append(":").append(nums[end]).toString();if(!set.contains(tmp)) {set.add(tmp);list.add(Arrays.asList(nums[i], nums[start], nums[end]));}end--;}}}return list;}

上面的代码在去重方面明显还有优化空间,翻评论区发现别人的代码,参照优化如下:

public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> list = new ArrayList<List<Integer>>();if(nums == null || nums.length<3) {return list;}//1.排序Arrays.sort(nums);//2.查找匹配项并去重for(int i=0;i<nums.length-2 && nums[i]<=0;i++) {while (i>0 && i<nums.length-2 && nums[i] == nums[i-1])i++;int l =i+1, r = nums.length-1, sum=0-nums[i];while(nums[i]<=0 && l<r) {if(nums[l] + nums[r] < sum) {while ((l<r) && nums[l+1] == nums[l])l++;l++;}else if (nums[l] + nums[r] >sum) {while ((l<r) && nums[r-1] == nums[r])r--;r--;}else {list.add(Arrays.asList(nums[i], nums[l], nums[r]));while ((l<r) && nums[l+1] == nums[l])l++;while ((l<r) && nums[r-1] == nums[r])r--;r--;}}}return list;}

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

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

相关文章

2019-03-06-算法-进化(最接近的三数之和)

题目描述 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 …

P3345 [ZJOI2015]幻想乡战略游戏

P3345 [ZJOI2015]幻想乡战略游戏 带修改带权重心 这是经典的树上寻找关键点的题目&#xff0c;我们使用点分治处理这个问题&#xff0c;因为点分治的特性&#xff0c;就相当于在树上二分了。但是这与倍增不同&#xff0c;倍增只是在链上二分&#xff0c;而点分治则是在整棵树上…

莫比乌斯,欧拉函数题目练习(完结)

Starttime&#xff1a;2020/11/16Start\ time&#xff1a;2020/11/16Start time&#xff1a;2020/11/16 Lastupdatetime:2020/11/28Last\ update\ time: 2020/11/28Last update time:2020/11/28 AC22/22AC\ 22 / 22AC 22/22 解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(3)

前面两边的代码就是一套初步的工具包架构&#xff0c;基本底层通用&#xff0c;可以移植到任意项目实现类似的需求。接下来&#xff0c;再在我们特定的项目几微助手里面再实现一套基于自己项目的基类&#xff0c;根据项目需求抽象一下项目内的常用方法。理论上&#xff0c;这一…

2019-03-09-算法-进化(从排序数组中删除重复项)

题目描述 给定一个排序数组&#xff0c;你需要在原地删除重复出现的元素&#xff0c;使得每个元素只出现一次&#xff0c;返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1 给定数组 nums…

P6329 【模板】点分树 | 震波

P6329 【模板】点分树 | 震波 这是一道模板题&#xff0c;需要支持两个操作&#xff0c;操作一就是单点修改点权&#xff0c;操作二就是查询距离x不超过k的点权值和。 我们考虑建出点分树&#xff0c;然后对于每个点维护两个数据结构&#xff0c;一个处理当前分治范围到当前点…

基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(1)

在项目中&#xff0c;经常会需要对一些特定的业务对象进行属性的扩展&#xff0c;而且这些属性的扩展还具备极不可预测性、相互关系松散等特点。大部分的开发人员是最讨厌这类涉及到数据字段扩展的需求变更。这种调整&#xff0c;轻则数据要加字段&#xff0c;重则程序代码要做…

2019-03-09-算法-进化(买卖股票的最佳时机 II)

题目描述 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再次购买…

【C】Natasha V1.3.6.0 的升级日志

文章转载授权级别&#xff1a;C 预计阅读时间&#xff1a;8分钟开源库满足于个人&#xff0c;而完善于大众。Natasha 自稳定版发布之后&#xff0c;众多老铁参与增强改进&#xff0c;感谢如下老铁的反馈&#xff1a;1. 异常搜集在 wenjq0911 建议下&#xff0c;添加…

牛客练习赛69 解方程

解方程 ∑d∣nf(d)σp(nd)σq(n)f∗σpσq有σk∑d∣ndkidk∗If∗idp∗Iidq∗I∑d∣nμ(d)μ∗I对上面式子同时卷上一个μf∗idpidq因为idk是一个完全积性函数&#xff0c;所以idp−1μidpidk∗(μidp)∑d∣ndkμ(nd)(nd)k∑d∣nμ(d)ϵfidq∗(μidp)f(n)∑d∣nμ(d)dp(nd)qf(1…

2019-03-09-算法-进化(旋转数组)

题目描述 给定一个数组&#xff0c;将数组中的元素向右移动 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,6,7] 和 k 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1,2,3,4,5] 向右旋转 3 步: [5,6,7,1,2,3,4]示…

.NET 程序员如何学习Vue

之所以取这个标题&#xff0c;是因为本文来自内部培训的整理&#xff0c;培训的对象是公司的 .NET 程序员&#xff0c;.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对接。Vue 是现在比较流行的前端框架&#xff0c;也是非常容易入门的前端框架&#xff0c;…

P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)

P3714 [BJOI2017]树的难题 求解树上长度在L到R的树链中颜色段权值和最大的链。 首先求解树上链的问题&#xff0c;而且限制了链的长度&#xff0c;那么我们需要点分治处理&#xff0c;然后考虑每次分治&#xff0c;我们可以把链分成两类&#xff0c;先处理同色连通块&#xf…

A Simple Math Problem(2020 ICPC 江西省省赛)

A Simple Math Problem ∑i1n∑j1if(j)[gcd(i,j)1]∑i1n∑jinf(i)[gcd(i,j)1]∑i1n∑j1nf(i)[gcd(i,j)1]−∑i1n∑j1if(i)[gcd(i,j)1]f(1)∑d1nμ(d)nd∑i1ndf(id)−∑i1nf(i)ϕ(i)f(1)然后就可以O(nlog⁡n)求解了\sum_{i 1} ^{n} \sum_{j 1} ^{i} f(j)[gcd(i, j) 1]\\ \sum…

2019-03-10-算法-进化(存在重复)

给定一个整数数组&#xff0c;判断是否存在重复元素。 如果任何值在数组中出现至少两次&#xff0c;函数返回 true。如果数组中每个元素都不相同&#xff0c;则返回 false。 示例 1: 输入: [1,2,3,1] 输出: true示例 2: 输入: [1,2,3,4] 输出: false示例 3: 输入: [1,1,1,…

P3233 [HNOI2014]世界树(虚树/倍增/动态规划)

P3233 [HNOI2014]世界树 每次给出mi个点&#xff0c;查询每个点控制的点的个数&#xff0c;每个点由离他最近编号最小的点控制。 首先按照套路建出虚树&#xff0c;注意特判1节点&#xff0c;然后用栈维护右链&#xff0c;然后不断弹栈建边。 然后进行dp&#xff0c;求解出虚…

.Net之微信小程序获取用户UnionID

前言&#xff1a;在实际项目开发中我们经常会遇到账号统一的问题&#xff0c;如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一&#xff08;便于用户信息的管理&#xff09;。这段时间就有一个这样的需求&#xff0c;之前有个客户做了一个微信小程序商城&…

Absolute Math (HDU 6868)

Absolute Math 定义c(n)theprimenhave&#xff0c;c(1)0,c(2)1,c(4)1,c(6)2f(n)∑d∣nμ(d)22c(n)f(ab)f(a)f(b)f(gcd(a,b))∑i1mf(n)f(i)f(gcd(n,i))f(n)∑d∣n1f(d)∑i1mdf(id)[gcd(i,nd)1]f(n)∑d∣n1f(d)∑k∣ndμ(k)∑i1mkdf(ikd)Tkdf(n)∑T∣n∑i1mTf(iT)∑d∣Tμ(Td)f(d…

2019-03-10-算法-进化(只出现一次的数字)

题目描述 给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1…

自由源自于自律 及其他三则分享

Office 365 官方公众号的新创深度内容推荐竹板这么一打呀&#xff0c;别的咱不夸&#xff0c;单说我们的Office 365官方公众号&#xff08;“微软Office365”&#xff09;&#xff0c;近一段时间来在内容创作上面有一些新的突破——推出了一个关于探讨大脑及思维运作的专题。请…