首页 > 其他分享 >力扣-三数之和

力扣-三数之和

时间:2023-09-24 17:36:31浏览次数:61  
标签:right nums int 三数 三元组 力扣 vector left

1.问题

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

注意: 答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

2.说明

输入说明:

首先输入n,表示输入n个整数

输入n个数组nums

输出说明:

输出所有能使得a+b+c=0的三个数的三元组

3.范例

输入范例:

6

-1 0 1 2 -1 -4

输出范例:

-1 0 -1

-1 -1 2

4.思路

使用双指针法进行解题,首先对数组进行排序

使用一层for循环,i遍历数组,当nums[i] >0时,后面的两个数和nums[i]相加一定也是>0,后面可以不再进行计算,因此直接返回reslut

同时定义下标left=i+1,right=nums.size()-1,即三元组nums[i] + nums[left] + nums[right]>0时,说明三数之和大于0,因排过序,因此,right往前移动,right--, 同理,若<0时,left++,直至left=right相遇为止

注意:题目中存在重复的元素,对于nums[i]==nums[i-1] 时,后面所计算的left和right同计算nums[i-1]的结果是一样的,因此需要进行去重!!!而且对a和b和c都需要进行去重!!!

5.代码

#include <iostream>
#include <stdio.h>
#include <algalgorithm>
#include <vector>
class Solution
{
    vector<vector<int>> treeSum(vector<int> &nums)
    {
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]>0)
                return result;
            //对a进行去重
            if(i>0&&nums[i]==nums[i-1])
                continue;

            int left=i+1;
            int right=nums.size()-1;
            while(left<right)
            {
                if(nums[i]+nums[left]+nums[right]>0)
                    right--;
                else if(nums[i]+nums[left]+nums[right]<0)
                    left++;
                else
                {
                    result.push_back(vector<int>{nums[i],nums[left],nums[right]});
                    //去重逻辑应该放在找到一个三元组之后,对b 和 c去重
                    while(right>left&&nums[right]==nums[right-1]) right--;
                    while(right>left&&nums[left]==nums[left+1]) left++;
                    //找到答案时,双指针同时收缩
                    right--;
                    left++;
                }
            }
        }
        return result;
    }
};
int main()
{
    //三数之和
    int n;
    cin>>n;
    vector<int> nums;
    int data;
    for(int i=0;i<n;i++)
    {
        cin>>data;
        nums.push_back(data);
    }
    vector<vector<int>> res=Solution().treeSum(nums);
    for(int i=0;i<res.size();i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<res[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

 

标签:right,nums,int,三数,三元组,力扣,vector,left
From: https://www.cnblogs.com/ohye/p/17726272.html

相关文章

  • 力扣-买卖股票的最佳时机(含冷冻期)
    1.问题给定一个整数数组,其中第i个元素代表了第i天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票(即冷冻......
  • 力扣-赎金信
    1.问题给定一个赎金信(ransom)字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回true;否则返回false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符......
  • 力扣---146. LRU 缓存
    请你设计并实现一个满足  LRU(最近最少使用)缓存 约束的数据结构。实现 LRUCache 类:LRUCache(intcapacity) 以 正整数 作为容量 capacity 初始化LRU缓存intget(intkey) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。voidput(intkey,......
  • 力扣-链表组件
    1.问题给定链表头结点head,该链表上的每个结点都有一个唯一的整型值。同时给定列表G,该列表是上述链表中整型值的一个子集。返回列表G中组件的个数,这里对组件的定义为:链表中一段极长连续结点的值(该值必须在列表G中)构成的集合。极长的含义是:这段连续结点的前面或后面结点不......
  • 力扣练习题
    1#include<bits/stdc++.h>2#defineMAXSIZE1003usingnamespacestd;4typedefstruct{5char*base;6char*top;7intstactsize;8}sqstack;9voidinitstack(sqstack&s){10s.base=newchar[MAXSIZE];11if(!s.ba......
  • 力扣6.N 字形变换(压缩矩阵)
    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请......
  • 力扣20.有效的括号
    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 示例1:输入:s="()"输出:true 示例 2:输入:s="()[]{}"......
  • 力扣14.最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl" 示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。 ......
  • 递归例题 力扣39 组合总数
    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一......
  • 力扣1.两数之和
    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例1:输入:nums=[2,......