LeetCode OJ 15. 3Sum
题目
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.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
解答
看这个题目,首先想到的是暴力枚举,不过做完之后看了网上的一些解答,好像暴力枚举确实是可以的。
但是作为一个可爱的娃的爸爸,我肯定是先想到排序,这样就算是暴力枚举,应该也会方便一丢丢?
不管怎么样先做个排序,排序完之后就要冷静的想一想这个问题的本质,毕竟除了3sum,这个题还可以出成4sum,5sum什么的。
我们知道,如果把这个题目改成求2sum,那么就很简单了,从头开始遍历,先确定第一个数,确定了第一个数后从尾开始遍历,不断尝试第二个数。
那么我们就可以递归的来思考这个问题,我们可以把这个问题看成,找到所有由一个数和一个2sum构成的组合,这样就很简单了。
于是我们同样从头开始遍历,先确定第一个数a,然后问题就变成,在a后面的数组中,求2sum,且2sum的和为-a。
下面是AC的代码,可能我细节方面做的还不够好,我的这个解法只能击败80%的答题者:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int i, j, k, m;
int length = nums.size();
int temp;
vector<vector<int>> ans;
if(length == 0){
return ans;
}
sort(nums.begin(), nums.end());
if(nums.front() > 0 || nums.back() < 0){
return ans;
}
for(i = 0; i < length - 2; i++){
if(i > 0 && nums[i - 1] == nums[i]){
continue;
}
for(j = i + 1, k = length - 1; j < k; ){
if(nums[i] + nums[j] + nums[k] == 0){
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[k]);
ans.push_back(temp);
j++;
while(j < k && nums[j] == nums[j - 1]){
j++;
}
k--;
while(j < k && nums[k] == nums[k + 1]){
k--;
}
}
else if(nums[i] + nums[j] + nums[k] < 0){
j++;
}
else{
k--;
}
}
}
return ans;
}
};
101
LeetCode OJ 15. 3Sum的更多相关文章
- LeetCode:15. 3Sum(Medium)
1. 原题链接 https://leetcode.com/problems/3sum/description/ 2. 题目要求 数组S = nums[n]包含n个整数,请问S中是否存在a,b,c三个整 ...
- 【LeetCode】15. 3Sum 三数之和
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...
- 【一天一道LeetCode】#15 3Sum
一天一道LeetCode系列 (一)题目 Given an array S of n integers, are there elements a, b, c in S such that a + b ...
- 《LeetBook》leetcode题解(15):3Sum[M]
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- LeetCode OJ:3Sum Closest(最接近的三数之和)
Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...
- Leetcode Array 15 3sum
思考的方向不对,即使用了多于别人几倍的时间,也不一定能够达到终点. 我的错误的想法(可以跳过):在leetcode上面做的第四道题,走路一个很大的弯路,收到之前做过的 Container With ...
- 【LeetCode】15. 3Sum 三个数和为0
题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...
- 【leetcode】15. 3Sum
题目描述: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...
- [LeetCode]题15:3Sum
第一次解: res = [] nums.sort() if len(nums)<3:return [] for i in range(len(nums)-2): left = i+1 right ...
随机推荐
- vue 父组件主动获取子组件的数据和方法 子组件主动获取父组件的数据和方法
Header.vue <template> <div> <h2>我是头部组件</h2> <button @click="getParen ...
- WGS84投影的WKID说明
关于WKID的几点说明 1.ArcGIS Server 10中: EPSG 3857 WGS_1984_Web_Mercator_Auxiliary_Sphere ESRI 10211 ...
- spark2.3.0 配置spark sql 操作hive
spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...
- cas server
Tomcat: V8.5.x Java: 1.8 x64 MySQL: 5.5.x OS: Win10 x64 I. war 0. clone git clone https://github.com ...
- WebView加载失败或网络异常时,替换WebView的错误界面;
WebView在加载失败时会显示一个失败原因的界面,各个手机显示的界面还都不一样,部分手机还会把Url显示出来:我们要做的就是统一加载失败的界面: 大概思路:在WebView这个控件上面再覆盖一个Vi ...
- css居中问题:水平居中、垂直居中
亲们支持我的新博客哦==>原文地址 ) 本篇文章所有演示代码下载==>github/calamus0427 css水平垂直居中是面试时候遇到最多的问题,我总结一下大部分解决方案 水平居中: ...
- SecureCRT连接linux,Hive中无法使用删除键
- 25.安装配置phantomjs
1.官网下载windows版本:http://phantomjs.org/download.html2.下载完解压,将PhantomJS可执行文件配置到环境变量里.比如: 将 E:\Soft\soft ...
- RecyclerView通用适配器
在Android开发中使用列表呈现数据的情况很多,现在我们常用RecyclerView呈现列表,为了开发敏捷和代码优雅,我们现在来打造<?xml version="1.0" ...
- vue-i18n
安装 npm install vue-i18n 初始化 import VueI18n from 'vue-i18n' Vue.use(VueI18n) const messages = { zh: { ...