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题解相关推荐

  1. LeetCode 554 砖墙 题解

    LeetCode 554 砖墙 题解 你的面前有一堵矩形的.由 n 行砖块组成的砖墙.这些砖块高度相同(也就是一个单位高)但是宽度不同.每一行砖块的宽度之和相等. 你现在要画一条 自顶向下 的.穿过 ...

  2. 【同113】LeetCode 129. Sum Root to Leaf Numbers

    LeetCode 129. Sum Root to Leaf Numbers Solution1:我的答案 二叉树路径和问题,类似113 /*** Definition for a binary tr ...

  3. LeetCode Two Sum III - Data structure design

    原题链接在这里:https://leetcode.com/problems/two-sum-iii-data-structure-design/ 题目: Design and implement a ...

  4. LeetCode Subarray Sum Equals K

    原题链接在这里:https://leetcode.com/problems/subarray-sum-equals-k/description/ 题目: Given an array of integ ...

  5. leetcode 907. Sum of Subarray Minimums | 907. 子数组的最小值之和(单调栈)

    题目 https://leetcode.com/problems/sum-of-subarray-minimums/ 题解 单调栈问题.参考左神算法课:https://ke.qq.com/webcou ...

  6. leetcode 371. Sum of Two Integers | 371. 两整数之和(补码运算)

    题目 https://leetcode.com/problems/sum-of-two-integers/ 题解 根据 related topics 可知,本题考察二进制运算. 第一次提交的时候,没想 ...

  7. LeetCode Path Sum III(前缀和)

    问题: 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点). 二叉树 ...

  8. LeetCode Combination Sum IV(动态规划)

    问题:给出一个数组nums和目标数target,问有多少组合形式 思路:用dp(i)表示目标数target的组合数.则有状态转移关系为dp(i)=sum(dp(i-nums[j])),其中i>= ...

  9. LeetCode Range Sum Query - Mutable(树状数组、线段树)

    问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...

  10. leetcode 834. Sum of Distances in Tree | 834. 树中距离之和(树形DP)

    题目 https://leetcode.com/problems/sum-of-distances-in-tree/ 题解 一般的算法题,指令条数为 10^8 以内是可以通过的.也就是说,如果 arr ...

最新文章

  1. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)
  2. Emojify - v2 吴恩达老师深度学习第五课第二周编程作业2
  3. 全球首个机器人抓取云竞赛落幕,华科夺冠,中国团队包揽前三
  4. 理财心理陷阱之:年终奖——年末的虚假繁荣
  5. Django - Django框架 简单介绍
  6. RouterOS SOCKS代理服务器(官方文档翻译)
  7. Java基础 Day04(个人复习整理)
  8. python获取季度函数_ORACLE时间常用函数(字段取年、月、日、季度)
  9. mac 安装laravel Valet环境
  10. Xamarin入门一 环境准备
  11. 把电脑虚拟机linux下编译的程序烧写到ARM9开发板的linux系统里面的具体操作步骤
  12. 【Git】3、创建Git版本库、配置Git仓库用户邮箱信息
  13. ffiddler抓取手机(app)https包
  14. 回顾过去,才能展望未来
  15. 终结HashMap面试?我是谁?我在哪
  16. MQTT网关如何接入物联网平台?
  17. DICOM之常用Tag
  18. 2022-2028全球与中国体育在线直播视频流市场现状及未来发展趋势
  19. 阿里云课堂-day06
  20. matlab中sps,Matlab/Simulink的SPS模块在电力系统输电线路中的应用

热门文章

  1. phonegap文件上传(java_php),Android应用开发之使用PhoneGap实现位置上报功能
  2. python怎么恢复默认窗口_如何恢复python编程环境spyder的窗口?
  3. 电梯里的爱情华科oj
  4. istio sidecar流量接管_istio 常见的 10 个异常
  5. java 约瑟夫环_java中约瑟夫环代码实现
  6. mysql动态代理_动态代理连接数据库
  7. cmd查看mysql版本_mysql安装-必会
  8. 容器技术Docker K8s 31 容器服务ACK基础与进阶-弹性伸缩
  9. 数据集:高考录取分数
  10. NumPy库---文件操作