15 3Sum(寻找三个数之和为指定数的集合Medium)

题目意思:给一个乱序数组,在里面寻找三个数之和为0的所有情况,这些情况不能重复,增序排列

思路:前面2sum,我用的是map,自然那道题map比双指针效率高,这道题需要先排序,再给三个指针,i、j、k

   对于i指针从前往后遍历,对于一个固定的i指针,其实就是2Sum的情况,给定一前一后两个指针进行遍历,

   值大了,就把后面的指针往前移,值小了就把前面的指针往后移。

   比较麻烦的地方在于去重,首先是i指针的去重,j和k只用一个去重就可以了

   ps:这是数组中一种十分常用的方法。

 1 class Solution {
 2 public:
 3     vector<vector<int>> threeSum(vector<int>& nums) {
 4         vector<vector<int>> ans;
 5         vector<int> temp(3);
 6         int size=nums.size();
 7         int j,k;
 8         sort(nums.begin(),nums.end());
 9         for(int i=0;i<size-2;++i){                 //注意这种位置可以写nums.size(),就是不能写nums.size()-2,什么原因我还没搞明白
10             //while(i>0&&nums[i]==nums[i-1])++i;   注意比较两种写法
11             if(i>0&&nums[i]==nums[i-1])continue;
12             j=i+1;
13             k=size-1;
14             while(j<k){
15                 if(j>i+1&&nums[j]==nums[j-1]){
16                     ++j;
17                     continue;
18                 }
19                 if(nums[j]+nums[k]>-nums[i])--k;
20                 else if(nums[j]+nums[k]<-nums[i])++j;
21                 else{
22                     temp[0]=nums[i];
23                     temp[1]=nums[j];
24                     temp[2]=nums[k];
25                     ans.push_back(temp);
26                     ++j;
27                     --k;
28                 }
29             }
30         }
31         return ans;
32     }
33 };

    复杂度:O(n2)

时间: 2024-11-05 19:05:50

15 3Sum(寻找三个数之和为指定数的集合Medium)的相关文章

18 4Sum((寻找四个数之和为指定数的集合Medium))

题目意思:给一个乱序数组,在里面寻找三个数之和为target的所有情况,这些情况不能重复,增序排列 思路:采用3Sum的做法 ps:有见一种用hash的,存任意两个元素的和,然后变成3sum问题,需要判断重复 图书馆的网,已经到了令人发指的程度,我告诫自己千万不要暴躁. 1 class Solution { 2 public: 3 vector<vector<int>> fourSum(vector<int>& nums, int target) { 4 vec

【c语言】求斐波那契数列的前40个数。特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和

// 求斐波那契数列的前40个数.特点,第1,2个数为1,从第三个数开始,该数是前面两个数之和 #include <stdio.h> int main() { int a = 1; int b = 1; int c,i; printf("%d\t%d\t",a,b); for(i = 3; i <= 40; i++) { c = a + b; printf("%d\t",c); a = b; b = c; } printf("\n&quo

3Sum Closest从数列中找到三个数之和最接近给定值

即求min{ target - a -b -c } a,b,c blog to Set S; (一)最简单的做法当然是求出所有的不相同的三个数和,保存到set里,然后用target,target (+/-) i ,i [0....] 复杂度基本上可以算是O(n^3). int threeSumClosest(vector<int> &num, int target) { int n=num.size(); if(n<3) return 0; unordered_set<in

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 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,

LeetCode 15 3Sum(3个数的和)

翻译 给定一个有n个整数的数组S,是否存在三个元素a,b,c使得a+b+c=0? 找出该数组中所有不重复的3个数,它们的和为0. 备注: 这三个元素必须是从小到大进行排序. 结果中不能有重复的3个数. 例如,给定数组S={-1 0 1 2 -1 4},一个结果集为: (-1, 0, 1) (-1, -1, 2) 原文 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? F

编程之美之高速寻找多个数满足给定条件

一.寻找三个数之和等于给定值 分析:方法类似与2Sum.就是先对数组进行排序,时间复杂度为O(nlogn),然后固定一个数,用两个指针进行遍历,找到三个数之和等于给定的值就可以,时间复杂度为O(n^2).详细可提交于leetcode:https://oj.leetcode.com/problems/3sum/,代码例如以下: vector<vector<int> > threeSum(vector<int> &num,int target){ vector<

【LeetCode-面试算法经典-Java实现】【015-3 Sum(三个数的和)】

[015-3 Sum(三个数的和)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 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) m

Java [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 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

简单代码 //输入三个数求最大值.

static void Main(){  //输入三个数求最大值.    string answar = "y";  while (answar=="y"||answar=="Y")  {    int x,y,z,max;   Console.WriteLine("请输入第一个数:");   x = int.Parse(Console.ReadLine());   Console.WriteLine("请输入第二个