[LeetCode] Three Sum题解
Three Sum:
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: The solution set must not contain duplicate triplets.
这是一道LeetCode中标记为Medium的题。由于时间限制,对算法的复杂度有要求,最后的解法确实有点巧妙。
给一个有n个数字的数组S,找出所有满足a + b + c = 0的组合,结果排除重复元组。
最初的错误尝试
一开始的想法是,先将数组排序,通过三次遍历找出所有a、b、c的组合,再排除相同的元组。这个算法的复杂度在元组很少时是O(n^3),元组很多的时更大,在输入很长的时候就超时了。
接下来还是想在这个的基础上改良——将n缩小。
在某些时候——例如-3,-2,0,2,6,8,由于6和8比最小的两个数加起来还大,所以可以舍去不考虑。同理,在例如-5,0,1,2的数列中-5也可以不考虑。这样就减少了计算量。但是最后依然超时。
在复杂度至少是O(n^3)的算法上的改良尝试失败。我在过去做题遇到超时时,曾经做过很多次这种尝试,但是每次都失败了。改进算法还是要做到在O层面降低复杂度才行。
要找到一种复杂度Ω(n^3)的算法才有机会通过。
解决方案
在参考了LeetCode的Discussion之后,有了最后的解决方案。
这种解决方案参考了题目Two Sum的解法,复杂度只有O(n^2)。
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> re;sort(nums.begin(), nums.end());//当nums中元素个数不足3个时,返回一个空的re就可以了if(nums.size() < 3){return re;}for(int i = 0 ; i < nums.size() - 1 ; i++){ int target = nums[i];int font = i + 1;int back = nums.size()-1; while(back > font){//由于nums已经被排序,所以//如果三个数之和小于0,那么让font++,下一次检测三个数之和就会增大(也可能不变)//如果三个数之和大于0,那么让back--,下一次检测三个数之和就会减小(也可能不变)if(target + nums[font] + nums[back] < 0){font ++;}else if(target + nums[font] + nums[back] > 0){back --;}//等于0的时候添加到re中else if(target + nums[font] + nums[back] == 0 && font <back){vector<int> temp;temp.push_back(-target);temp.push_back(nums[font]);temp.push_back(nums[back]);re.push_back(temp);//此时要让font和back分别自增、自减到下一个不同的数字while(nums[font] == temp[1] && font <back){font ++;} while(nums[back] == temp[2] && font <back){back --;}} }//让target自增到下一个不同的数字while(i<nums.size()-1 && nums[i] == nums[i+1]){i++;}}return re;}
};
在这个算法里,最重要的是只用了两个循环就检测出所有abc元组。
其次,通过两次让font和back、target自增(自减)到下一个不同的数字,就排除了重复元组。
转载于:https://www.cnblogs.com/liangf27/p/9356873.html
[LeetCode] Three Sum题解相关推荐
- LeetCode 554 砖墙 题解
LeetCode 554 砖墙 题解 你的面前有一堵矩形的.由 n 行砖块组成的砖墙.这些砖块高度相同(也就是一个单位高)但是宽度不同.每一行砖块的宽度之和相等. 你现在要画一条 自顶向下 的.穿过 ...
- 【同113】LeetCode 129. Sum Root to Leaf Numbers
LeetCode 129. Sum Root to Leaf Numbers Solution1:我的答案 二叉树路径和问题,类似113 /*** Definition for a binary tr ...
- LeetCode Two Sum III - Data structure design
原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...
- LeetCode Subarray Sum Equals K
原题链接在这里:https://leetcode.com/problems/subarray-sum-equals-k/description/ 题目: Given an array of integ ...
- leetcode 907. Sum of Subarray Minimums | 907. 子数组的最小值之和(单调栈)
题目 https://leetcode.com/problems/sum-of-subarray-minimums/ 题解 单调栈问题.参考左神算法课:https://ke.qq.com/webcou ...
- leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)
题目 https://leetcode.com/problems/sum-of-two-integers/ 题解 根据 related topics 可知,本题考察二进制运算. 第一次提交的时候,没想 ...
- LeetCode Path Sum III(前缀和)
问题: 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). 二叉树 ...
- LeetCode Combination Sum IV(动态规划)
问题:给出一个数组nums和目标数target,问有多少组合形式 思路:用dp(i)表示目标数target的组合数.则有状态转移关系为dp(i)=sum(dp(i-nums[j])),其中i>= ...
- LeetCode Range Sum Query - Mutable(树状数组、线段树)
问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...
- leetcode 834. Sum of Distances in Tree | 834. 树中距离之和(树形DP)
题目 https://leetcode.com/problems/sum-of-distances-in-tree/ 题解 一般的算法题,指令条数为 10^8 以内是可以通过的.也就是说,如果 arr ...
最新文章
- python实现二叉树遍历(前序遍历、中序遍历、后序遍历)
- Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2
- 全球首个机器人抓取云竞赛落幕,华科夺冠,中国团队包揽前三
- 理财心理陷阱之:年终奖——年末的虚假繁荣
- Django - Django框架 简单介绍
- RouterOS SOCKS代理服务器(官方文档翻译)
- Java基础 Day04(个人复习整理)
- python获取季度函数_ORACLE时间常用函数(字段取年、月、日、季度)
- mac 安装laravel Valet环境
- Xamarin入门一 环境准备
- 把电脑虚拟机linux下编译的程序烧写到ARM9开发板的linux系统里面的具体操作步骤
- 【Git】3、创建Git版本库、配置Git仓库用户邮箱信息
- ffiddler抓取手机(app)https包
- 回顾过去,才能展望未来
- 终结HashMap面试?我是谁?我在哪
- MQTT网关如何接入物联网平台?
- DICOM之常用Tag
- 2022-2028全球与中国体育在线直播视频流市场现状及未来发展趋势
- 阿里云课堂-day06
- matlab中sps,Matlab/Simulink的SPS模块在电力系统输电线路中的应用
热门文章
- phonegap文件上传(java_php),Android应用开发之使用PhoneGap实现位置上报功能
- python怎么恢复默认窗口_如何恢复python编程环境spyder的窗口?
- 电梯里的爱情华科oj
- istio sidecar流量接管_istio 常见的 10 个异常
- java 约瑟夫环_java中约瑟夫环代码实现
- mysql动态代理_动态代理连接数据库
- cmd查看mysql版本_mysql安装-必会
- 容器技术Docker K8s 31 容器服务ACK基础与进阶-弹性伸缩
- 数据集:高考录取分数
- NumPy库---文件操作