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

15三数之和

时间:2025-01-14 21:21:48浏览次数:1  
标签:right 15 nums 三数 三元组 负数 正数 left

自己的思路是将解的情况分类:只有三种情况 (正,0,负),(正,正,负),(负,负,正)。
将nums分为两个数组pos,保存正数;neg,保存负数。
当两个数组的长度小于nums的长度时说明存在0,这个时候利用哈希的方法可以找到第一种情况的所有解;
对于第二种情况,构建set:possum,保存两个不同正数的和,然后利用哈希的方法去neg中寻找;
第三种情况和第二种类似。
判题的时候发现这样无法处理:全0,会直接输出为空、有重复的正数或负数,会出现重复的元组。
看解析
哈希的方法是自己想复杂了,构建两轮循环确定a,b,然后哈希寻找-a-b就可以了,难点也确实就在于去重
然后是双指针的方法

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end() );
        
        for(int i = 0; i < nums.size(); ++i )
        {
            if( nums[i] > 0 )
                return res;
            //上一轮成立的解的下标是 i-1,left, right
            //, 因此如果这一轮的nums{i] 和nums[i-1]相等就要去重
            if(i > 0 && nums[i] == nums[i-1])
                continue;
			
	//这里指针的初始化也要注意,起始三元组是 最小负数(i),第二小负数(left),最大正数(right)
	//这样就保证了每次left和right的移动都有可能找到潜在的解
	//通过三个指针的移动来保证所有的三元组都能搜索到
            int left = i + 1;
            int right = nums.size() - 1;
			
            while(left < right)
            {
                if( nums[i] + nums[left] + nums[right] < 0 )//当前三元组的和偏小,需要增大负数
                    left++;
                else if ( nums[i] + nums[left] + nums[right] > 0 )//当前三元组的和偏大,需要减小正数
                    right--;
                else 
                {
                    res.push_back( vector<int> {nums[i], nums[left], nums[right]} );
			//只有等于0的解才需要去重
			//去重,当前符合要求的解是i,left,right,因此要比较下一次可能移动到的位置
                    while( left < right && nums[right-1] == nums[right] ) 
                        right--;
                    while( left < right && nums[left+1] == nums[left] ) //去重
                        left++;

                    //由于此时是一组和为0的解,因此为了寻找下一组可能的解,left和right必须都要移动
                    right--;
                    left++;
		    //只要当得到一组新的三元组,即不出现重复时,才重新开始判断
                }
            } 

        }
        return res;
    }
};

标签:right,15,nums,三数,三元组,负数,正数,left
From: https://www.cnblogs.com/gqzz/p/18669501

相关文章

  • 12.15
    1.实验目的Hadoop运行在Linux系统上,因此,需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作,为顺利开展后续其他实验奠定基础。2.实验平台(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);(2)Hadoop版本:3.1.3。3.实验步骤1.熟悉常用的Linux操作1)cd命令:......
  • VP Educational Codeforces Round 159 (Rated for Div. 2)
    A.BinaryImbalance题意:给你一个01串,每次选一个01或者一个10在他们中间插一个0进去,问能不能让0的个数大于1。我们进行一次插入操作后,显然还可以继续操作,所以只要有0和1就一定可以。注意特判全0的情况。点击查看代码voidsolve(){ intn; std::cin>>n; std::s......
  • 15个Linux Grep命令使用实例(实用、常用)
    Grep命令主要用于从文件中查找指定的字符串。首先建一个demo_file:复制代码代码如下:$catdemo_fileTHISLINEISTHE1STUPPERCASELINEINTHISFILE.thislineisthe1stlowercaselineinthisfile.ThisLineHasAllItsFirstCharacterOfTheWordWithUpper......
  • Linux 运维必备 150 个命令汇总
    地址:https://www.linuxcool.com线上查询及帮助命令man:全拼manual,用来查看系统中自带的各种参考手册。help:用于显示shell内部命令的帮助信息。文件和目录操作命令ls:全拼list,列出目录的内容及其内容属性信息。cd:全拼changedirectory,切换当前......
  • 查找总价格为目标值的两个商品、三数之和--------双指针的方法解决问题
    OJ题:LCR179.查找总价格为目标值的两个商品-力扣(LeetCode)OJ题:15.三数之和-力扣(LeetCode)一、 查找总价格为目标值的两个商品(俩数之和)1.题目描述购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回......
  • 15. C语言 函数指针与回调函数
    本章目录:前言什么是函数指针?定义声明方式函数指针的基本用法示例:最大值函数输出示例:回调函数与函数指针什么是回调函数?通俗解释示例:回调函数实现动态数组填充输出示例:进一步探索:带参回调函数输出示例:函数指针的进阶技巧函数指针数组返回函数指针的函数输出示例:......
  • 15. 三数之和
    题目这道题着实不知道怎么动笔,看了卡哥思路,很详细,其中的去重小细节讲的非常好,里面讲了两种方法,一种是不太推荐的哈希解法(因为题目要求结果的三元组去重,所以哈希解法不太推荐,但是这个解法我也没太看懂),一种是更推荐的双指针解法。看了卡哥代码敲的:classSolution{public:v......
  • LeetCode:215.数组中的第K个最大元素
    LeetCode:215.数组中的第K个最大元素解题思路看到“第K个最大元素”。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把数组的值插入堆中。当堆的容量超过K,就删除堆顶。插入结束后,堆顶就是第K个最大元素。leetcode在线运行测试可能是用本地环境跑分...有缓存卡大数有er......
  • LeetCode Top Interview 150 - Stack
    Somescenarioswhereastackistypicallytheappropriatedatastructuretouse:1.ParenthesesMatching:Problemsthatrequirecheckingforbalancedparenthesesorbracketsoftenutilizestackstoensurethateveryopeningbrackethasacorrespondingclo......
  • P1540 [NOIP2010 提高组] 机器翻译
    题目背景NOIP2010提高组T1题目描述小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就......