首页 > 其他分享 >15.三数之和

15.三数之和

时间:2022-11-08 14:58:06浏览次数:37  
标签:15 val nums int 三数 ++ 枚举 vector

思路

先把数组排序

先枚举i,再枚举j,确定了i和j的值,在保证\(nums[i] + nums[j] + nums[k - 1] >= 0\)的条件下,找到k的最小值,之后查看三数相加是否等于0,如果相等,记录答案,如果不等,那就继续枚举i和j

这里的j和k的确定使用的是双指针做法,因为有序,因此每次j增大,k必然要减小

Q1 如何去重?

以任意数组为例,开始时令i等于第一个元素,当枚举完j和k后,此时可以说,所有i = 第一个元素的方案都已经考虑过了,因此i要跳过后面所有等于第一个元素的值,j也是同样的道理,这样就能够做到去重

代码

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());

        for(int i = 0; i < nums.size(); i++)
        {
            if(i && nums[i] == nums[i - 1]) continue;
            int j = i + 1, k = nums.size() - 1;
            while(j < k)
            {
                if(j > i + 1 && nums[j] == nums[j - 1])
                {
                    ++j;
                    continue;
                }
                int val = nums[i] + nums[j] + nums[k];
                if(val == 0) ans.push_back({nums[i], nums[j], nums[k]});
									
                //此处必须是++j,不能换成--k,因为需要用j完成去重
                if(val <= 0) ++j;
                else --k;
            }
        }
        return ans;
    }
};

标签:15,val,nums,int,三数,++,枚举,vector
From: https://www.cnblogs.com/INnoVationv2/p/16869683.html

相关文章

  • VS2015快捷键大全
    在学习C基础总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。目录:零、VS常用快捷键一、VS2015快捷键大全一、VS2008快捷键大全三、VS2005......
  • 【HDLBits刷题笔记】15 Finding bugs in code
    Sim/circuit1从波形不难看出ab是相与的关系。moduletop_module(inputa,inputb,outputq);//assignq=a&b;//FixmeendmoduleSim/cir......
  • [LeetCode] 1544. Make The String Great
    Givenastring s ofloweranduppercaseEnglishletters.Agoodstringisastringwhichdoesn'thave twoadjacentcharacters s[i] and s[i+1] where:......
  • iOS15.6以后UITableview设置UITableViewStyleGrouped底部会多出一段空白
    在适配iPhone14的过程中,发现之前没问题的UITableview底部会多出一截,查看低版本系统手机正常显示,iOS15.6的iPhone11也有同样的问题。继iOS11以后UITableview多出空白又有新......
  • CF1572B. Xor of 3
    题意给出一个\(01\)序列,一次操作可以选择连续的三个数,把它们都变成三个数的异或和。问能否在\(n\)次以内全变成\(0\),输出方案题解仔细研究发现,无论如何三个数的异......
  • 【HDLBits刷题笔记】15 Finding bugs in code
    Bugsmux2原本代码的逻辑是反的,这不是坑人吗。moduletop_module(inputsel,input[7:0]a,input[7:0]b,output[7:0]out);assignout......
  • P1577 切绳子
    ​​传送门​​思路:用二分对答案mid进行枚举,若按照当前mid进行切割可获得的长度大于k,则l=mid+0.0001,否则r=mid-0.0001,最后用floor向下取整;#include<bits/stdc++.h>using......
  • 2022-2023-1 20221415 《计算机基础与程序设计》第十周学习总结
    2022-2023-120221415《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪......
  • dp-leetcode152
    动态规划问题,存在重叠子问题/***<p>给你一个整数数组<code>nums</code> ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘......
  • 基于VUE+Echarts大屏数据展示150套 (集合)
    ......