题目

Given an array S of n integers, are there elements abc 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)

代码

class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
std::vector<std::vector<int> > ret_vector;
if (num.size() < )
{
return ret_vector;
}
// sort the vector
std::sort(num.begin(), num.end());
// visit all the left side element of the current element
const int target = ;
std::vector<int>::iterator end = num.end();
for (std::vector<int>::iterator i = num.begin(); i != end-; ++i){
// ignore first duplicate i
if ( i > num.begin() && *i==*(i-)) continue;
std::vector<int>::iterator j = i+;
std::vector<int>::iterator k = end-;
while (j<k){
const int tmp = *i+*j+*k;
if ( tmp < target ){
++j;
while ( *j==*(j-) && j<k ) ++j;
}
else if ( tmp > target ){
--k;
while ( *k==*(k+) && j<k ) --k;
}
else{
int tmp_triple[] = {*i,*j,*k};
std::vector<int> tmp_vector(tmp_triple,tmp_triple+);
ret_vector.push_back(tmp_vector);
++j;
--k;
while( *j==*(j-) && *k==*(k+) && j<k ) {
++j;
--k;
}
}
}
}
return ret_vector;
}
};

Tips:

1. 先对传入的vector排序,然后从前向后遍历。原则是:包含*i元素,且满足条件的triple都加入到返回结果中

2. 这里比较困难的一点是排除重复的triple,大概想一想原则,一些极端的case只能试验出来了

另,在mac上编辑的,不知道为什么用数组初始化vector编译不通过,所以采用了比较麻烦的传参方式

===============================================

第二次过这道题,大体思路记得不太清,重新学习了一下“排序+双指针夹逼”方法

参考的blog:http://www.cnblogs.com/tenosdoit/p/3649607.html

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > ret;
if ( nums.size()< ) return ret;
std::sort(nums.begin(), nums.end());
for ( int i=; i<nums.size()-; ++i )
{
// skip the duplicates elements
if ( i> && nums[i]==nums[i-] ) continue;
Solution::TwoSum(ret, nums, i+, -nums[i]);
}
return ret;
}
static void TwoSum(vector<vector<int> >& ret, vector<int>& nums, int begin, int target)
{
vector<int> tmp;
int start = begin;
int end = nums.size()-;
while ( begin<end )
{
if ( nums[begin]+nums[end]<target ){
begin++;
}
else if ( nums[begin]+nums[end]>target ){
end--;
}
else
{
// add a triple
tmp.push_back(nums[start-]);
tmp.push_back(nums[begin]);
tmp.push_back(nums[end]);
ret.push_back(tmp);
tmp.clear();
// skip the duplicate elements
begin++;
while ( begin<end && nums[begin]==nums[begin-] ) begin++;
end--;
while ( begin<end && nums[end]==nums[end+] ) end--;
}
}
}
};

tips:

1. 先对数组进行排序

2. 固定一个元素,从其后面元素开始,采用两头夹逼的方式进行遍历。(为什么要两边夹逼?因为元素已经从小到大排序好了,向后移动begin可以增加两个元素的和,向前移动end可以减小两个元素的和;采用这样的方式,相当于进可往最大和靠,退可往最小值收,可以保证不漏)

3. 如果遇到重复的元素要跳过去,因为题中要求不能出现重复的triple。

【3Sum】cpp的更多相关文章

  1. 【4Sum】cpp

    题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  2. 【Permutations】cpp

    题目: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...

  3. 【Subsets】cpp

    题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset ...

  4. 【Anagrams】 cpp

    题目: Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will ...

  5. 蓝桥杯 【dp?】.cpp

    题意: 给出一个2*n的方格,当刷完某一个方格的漆后可以且只可以走到相邻的任何一格,即上 下 左 右 左上 左下 右上 右下.可以从任意一个格子开始刷墙,问有多少种刷法,因为随着n的增大方案数会变多, ...

  6. 【Triangle 】cpp

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  7. 【N-Queens】cpp

    题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...

  8. 【Combinations】cpp

    题目: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For ex ...

  9. 【Candy】cpp

    题目: There are N children standing in a line. Each child is assigned a rating value. You are giving c ...

随机推荐

  1. [Unity3D] 如何识别屏幕边缘

    出现的问题 Unity3D中长度单位是米 使用Screen.resolutions获取的屏幕信息单位是像素 也就是说,即使获取了屏幕相关信息及参数,也无法把信息转换成可在editor中使用的信息.当时 ...

  2. Log4j知识汇总

    Log4j在java开发中还是很常见的,而在日志系统里面也占有举足轻重的地位,想要做好日志相关的工作,了解log4j还是很必要的. 下面就针对 log4j的官方文档user-guide 进行翻译与整理 ...

  3. 一篇文章读懂JSON

    什么是json? W3C JSON定义修改版: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,并不是 ...

  4. 微软AI发布会,集齐六大亮点召唤黑科技!

    7月12日,微软合作伙伴大会Inspire在华盛顿特区如火如荼地举行.同一天,在相隔5个时区的伦敦,微软还举办了一场关于人工智能的发布会.这是一场智能技术和情感体验两相交融的科技盛宴,既有黑科技,也有 ...

  5. Spring之IOC核心模块详解

    Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...

  6. Java 日期时间格式化

    在此记录Java日期时间格式化转换符,方便以后有需要时查找. 1.日期格式化 2.时间格式化 3.格式化常见的日期时间组合

  7. web调试的一些小技巧

    1.不带缓存的刷新,用于刷新css或者js:Ctrl+F5 待续...

  8. 关于Vue生命周期的小记录

    1.created的时候才能获取到data中的属性和methods中的方法 2.特殊情况:beforeCreate中如果是进行了ajax请求,在请求回调中对属性赋值是可以的,因为页面渲染速度比ajax ...

  9. C语言——字符串长度的计算方法

    1.不带转义字符的字符串 如:“abc!x=/”,其长度为7 2.带转义字符的字符串 (1) 字符串“abc\n”:其中的'\n'为转义字符(换行符),计算字符串长度时只能计作一个字符,所以该字符串的 ...

  10. PPII打不开 更改I.bat

    http://jingyan.baidu.com/article/3a2f7c2e7d277126afd6118d.html