思路
  • 直接暴力,\(O(n^4 log(n))\),不出意外的超时了。。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res; int i,j,k;
int len = nums.size();
for(i = 0; i < len; i++){
for(j = i+1; j < len; j++){
for(k = j+1; k < len; k++){
if(nums[i]+nums[j]+nums[k] == 0){
vector<int> inRes;
inRes.push_back(nums[i]);
inRes.push_back(nums[j]);
inRes.push_back(nums[k]);
bool ok = true;
for(int m = 0; m < res.size(); m++){
if(issame(inRes,res[m])){
ok = false;
continue;
}
}
if(ok) res.push_back(inRes);
}
}
}
}
return res;
}
bool issame(vector<int> a,vector<int> b){
if(a.size() != b.size()) return false;
sort(begin(a),end(a));
sort(begin(b),end(b));
bool ok = true;
for(int i = 0; i < a.size(); i++){
if(a[i] != b[i]){
ok = false;
}
}
return ok;
}
};
  • 利用map暴力,时间复杂度 \(O(n^3 log(n))\),依然超时。。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
map<int,int> tmp;
int i,j,k;
int len = nums.size();
for(i = 0; i < len; i++){
tmp[nums[i]] = i;
}
for(i = 0; i < len; i++){
for(j = i+1; j < len; j++){
vector<int> inRes = {};
if(tmp.find(-(nums[i]+nums[j])) != tmp.end() && tmp[-(nums[i]+nums[j])] != i && tmp[-(nums[i]+nums[j])] != j){
inRes.push_back(nums[i]);
inRes.push_back(nums[j]);
inRes.push_back(-(nums[i]+nums[j]));
bool ok = true;
for(int m = 0; m < res.size(); m++){
if(issame(inRes,res[m])) ok = false;
}
if(ok){
res.push_back(inRes);
}
} }
}
return res;
}
bool issame(vector<int> a,vector<int> b){
if(a.size() != b.size()) return false;
sort(begin(a),end(a));
sort(begin(b),end(b));
bool ok = true;
for(int i = 0; i < a.size(); i++){
if(a[i] != b[i]){
ok = false;
}
}
return ok;
}
};
  • 利用3个指针,首先固定一个,然后类似于Two Sum问题。(这里是用map存储返回结果的,需要避免重复的问题,而直接用set存储就方便许多了),复杂度为 \(O(n^2)\),如果用set的话,复杂度应该是 \(O(n^3)\)
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int i,lo,hi;
int len = nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>> res; for(int i = 0; i < len-2; i++){
int lo = i+1,hi = len-1;
int sum = -nums[i];
if(i == 0 || (nums[i] != nums[i-1] && i > 0)){
while(lo < hi){
if((nums[lo] + nums[hi]) == sum){
vector<int> tmp;
tmp.push_back(nums[i]);
tmp.push_back(nums[lo]);
tmp.push_back(nums[hi]);
cout << tmp[0] << " " << tmp[1] <<" " << tmp[2] << endl;
res.push_back(tmp);
while(lo < hi && nums[lo] == nums[lo+1]){
lo++;
}
while(lo < hi && nums[hi] == nums[hi-1]){
hi--;
}
lo++;hi--;
}
else if ((nums[lo]+nums[hi]) < sum)
{
lo++;
}else hi--;
}
}
}
return res;
}
};

15.Three Sum的更多相关文章

  1. 1. Two Sum + 15. 3 Sum + 16. 3 Sum Closest + 18. 4Sum + 167. Two Sum II - Input array is sorted + 454. 4Sum II + 653. Two Sum IV - Input is a BST

    ▶ 问题:给定一个数组 nums 及一个目标值 target,求数组中是否存在 n 项的和恰好等于目标值 ▶ 第 1题,n = 2,要求返回解 ● 代码,160 ms,穷举法,时间复杂度 O(n2), ...

  2. LeetCode#15 | Three Sum 三数之和

    一.题目 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意:答案中不可以包含 ...

  3. 【leetcode】15. 3 Sum 双指针 压缩搜索空间

    Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i ...

  4. oracle 按时间段统计15分钟内的数据

    string sql = "select to_char(StartTime, 'yyyy')||'-'|| to_char(StartTime, 'mm')||'-'|| to_char( ...

  5. oracle中sum求和问题

    如列表所示:都是选填字段name   age salary weight张三     18      20李四     17王五     21燕小六  15      22 sum(age+salar ...

  6. sum()函数——MATLAB

    a=sum(A)  %列求和 b=sum(A,2) %行求和 c=sum(A(:)) %矩阵求和 假定A为一个矩阵: sum(A)以矩阵A的每一列为对象,对一列内的数字求和. sum(A,2)以矩阵A ...

  7. 08-numpy-笔记-sum

    求和: axis = 0 按列求和 axis = 1 按行求和 >>> import numpy as np >>> a = np.mat([[1,2,3],[4, ...

  8. ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'

    凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...

  9. java多线程系类:JUC线程池:06之Callable和Future(转)

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

随机推荐

  1. android参数传递的几种方法

    Intent Intent i=new Intent(当前Activity.this,目标Activity.class); 1.传单值 传入: i. i.putExtra("名称" ...

  2. 《C++之那些年踩过的坑(附录一)》

    C++之那些年踩过的坑(附录一) 作者:刘俊延(Alinshans) 本系列文章针对我在写C++代码的过程中,尤其是做自己的项目时,踩过的各种坑.以此作为给自己的警惕. [版权声明]转载请注明原文来自 ...

  3. fuse on TDH4.8

    一.安装依赖包 yum install autoconf.noarch yum install automake yum install libtool* yum install m4 yum ins ...

  4. DirectFB学习笔记三

    本篇目的,通过键盘的esc键控制程序退出.学习输入设备产生事件,接收事件,产生反应. 首先获取输入设备 IDirectFBInputDevice *keyboard = NULL; dfb->G ...

  5. PHP怎么打开或者关闭文件?

    什么是文件处理? 文件处理包括读取,关闭,重写等.掌握文件的处理需要读者理清思路,掌握好文件处理的关键步骤和常用函数,那么就可以运用自如了!感兴趣的请移步php文件处理专题. 比如,访问一个文件需要 ...

  6. poj2398计算几何叉积

    Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing ...

  7. Set up HTTP/2 server with Spring Boot 【基于Spring boot搭建http2.0服务器】

    1. Server side With spring boot, we can set up a http server easily. Restcontroller make it easier t ...

  8. redis持久化快速回忆手册

    Redis提供的持久化机制: 1). RDB持久化:该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘. 2). AOF持久化:该机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服 ...

  9. iOS 使用 UIMenuController 且不隐藏键盘的方法

    iOS 使用 UIMenuController 且不隐藏键盘的方法 在键盘显示的时候使用 UIMenuController 弹出菜单,保持键盘显示且可输入的状态. 实现方法有 修改响应链(推荐) 遵循 ...

  10. 新年伊始,.net菜鸟入院的第一篇随笔

    学习.net有半年了,大二一年都是微软校园的负责人,但是因为根本没有系统的学习过编程的知识,所以一直都是活动负责人的身份,忙忙碌碌也没有什么收获,大三一狠心就退了,想能够踏踏实实的敲敲代码,手上的学习 ...