博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode——3Sum & 3Sum Closest
阅读量:6396 次
发布时间:2019-06-23

本文共 1957 字,大约阅读时间需要 6 分钟。

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:
• Elements in a triplet (a, b, c) must be in non-descending order. (ie, a ≤ b ≤ c)
• Thesolutionsetmustnotcontainduplicatetriplets.

For example, given array S = {-1 0 1 2 -1 -4}.  A solution set is:  (-1, 0, 1)  (-1, -1, 2)

思路

先对数组进行非递减排序, 确定一个数i,在对其后面的序列使用 左右游标p,q夹逼(PS:这个词确实有点)。  对num[i],num[p],num[q]三者的和sum 进行推断。

假设 sum>target: q--; 去重; 假设 sum<target: p++; 去重; 假设 sum==target: 返回结果; 去重;

这个算法的时间复杂度为O(n^2).

去重技巧:

  1. 假设num[i] = num[i - 1],说明刚才i-1时求的解在这次肯定也会求出一样的,所以直接跳过不求;
  2. 事实上指针p不须要从数组头開始,由于假设num[i]所在的解中假设有i之前的数。设其位置为j,那么我们求num[j]时,肯定把num[i]
    也找出来放到和num[j]一起的解里了,所以指针p事实上应该从i+1開始。即初始时p = i + 1, q = num.size() - 1;
  3. 当sum == 0,我们保存了当前解以后,须要num[i]在解中的其它的2个数组合,这个时候。肯定是p往后或者q往前。假设++p,发
    现事实上num[p] == num[p-1],说明这个解肯定和刚才反复了,再继续++p。

    同理,假设–q后发现num[q] == num[q+1],继续–q。

    这个去重操作主要针对这样的有多个同值的数组,如:-3, 1,1,1, 2,2,3,4。

C++代码

#include 
#include
using namespace std;class Solution { public: vector
> threeSum(vector
&num) { vector
> result; if(num.size()<3) return result; sort(num.begin(),num.end()); printf("size: %d\n", num.size()); for (int i=0; i
0){ --q; while(num[q]==num[q+1] &&p
newRes; newRes.push_back(num[i]); newRes.push_back(num[p]); newRes.push_back(num[q]); result.push_back(newRes); while(++p
p && num[q]==num[q+1]){ //do nothing } } } } return result; }};int main(int argc, char *argv[]) { int a[] = {-1,0,1}; vector
v(&a[0],&a[3]); Solution s; vector
> result = s.threeSum(v);}

3Sum Closet

再补充其相关题,思路是一样的。直接上代码:

class Solution {public:    int threeSumClosest(vector
& nums, int target) { int result; int min_gap = INT_MAX; sort(nums.begin(), nums.end()); for(int i=0; i

转载地址:http://cnrha.baihongyu.com/

你可能感兴趣的文章
oracle ORA-00119和ORA-00132解决方法
查看>>
ARM QT实现多点触摸【转】
查看>>
Weblogic项目部署教程
查看>>
Gradle -- buildScript块与allprojects块及根级别的repositories区别
查看>>
远程SSH连接服务与基本排错
查看>>
Objective-C学习笔记(十九)——对象方法和类方法的相互调用
查看>>
win10 WmiPrvSE.exe WMI Provider 占用CPU过高的问题
查看>>
hdu 4945 2048(DP)
查看>>
论文阅读:CNN-RNN: A Unified Framework for Multi-label Image Classification
查看>>
开篇有益-解析微软微服务架构eShopOnContainers(一)
查看>>
IE新发现
查看>>
quick check
查看>>
Debug时含有的子元素,在代码里获取不到的问题
查看>>
UVA 11020 - Efficient Solutions(set)
查看>>
RStudio版本号管理 整合Git
查看>>
使用 PHPMailer 发送邮件
查看>>
文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解
查看>>
CSS选择器学习小结
查看>>
什么叫贸工技发展模式?什么叫技工贸发展模式?
查看>>
MyEclipse for Spring 10.0: GWT 2.1 and Spring Scaffolding
查看>>