【leetcode】双指针(二)

news2024/10/7 18:31:23

标题: 【leetcode】双指针(二)

水墨不写bug

9ad320e756224fc8971909cde5e7143e.jpeg


正文开始:

 

(一)总和为目标值的两个数


        购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]
示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]
提示:

1 <= price.length <= 10^5
1 <= price[i] <= 10^6
1 <= target <= 2*10^6

 

首先是暴力算法:

        枚举出所有的两个数形成的集合,判断两数之和是否等于target即可;

        优化:

        a,初始化left , right 分别指向数组的左右两端(这里不是真正意义上的指针,⽽是数组的下标)
        b, 当 left < right 的时候,⼀直循环
         i、当 nums[left] + nums[right] == target 时,说明找到结果,记录结果,并且返回;
         ii、当 nums[left] + nums[right] < target 时:
        • 对于升序数组nums[left] ,此时 nums[right] 相当于是nums[left] 能碰到的最⼤值。如果此时不符合要求,说明在这个数组里面,没有别的数满足 nums[left] 的要求了。
        因此,我们可以⼤胆舍去这个数,让 left++ ,去比较下⼀组数据;
        • 那对于 nums[right] ⽽⾔,由于此时两数之和是⼩于⽬标值的, nums[right] 还可以选择⽐nums[left] ⼤的值继续努⼒达到⽬标值,因此 right 指针我们暂时不动;
        iii、 当 nums[left] + nums[right] > target 时,同理我们可以舍去nums[right] 。让 right-- ,继续⽐较下⼀组数据,⽽ left 指针不变(因为它还是可以去匹配比nums[right] 更⼩的数的)。

 

(一)三数之和

        给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。

        请你返回所有和为 0 且不重复的三元组。

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

 

 

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

 

提示:

  • 3 <= nums.length <= 3000
  • -10^5 <= nums[i] <= 10^5

         其实在两数之和的基础上,三数之和就显得简单了许多,如果直接给你一道三数之和,也许你无法想到正确的符合时间复杂度的算法,但是我们在了解了两数之和之后,就会发现三数之和其实是两数之和的一般化的情况:

算法思想:

        对于任意数组,我们可以先固定一个数,然后在剩余的数组中找到两个数,并使这两个数的和等于固定的数的相反数即可;

        这也就是降维思想来解决问题,当我们理解了三数之和的解法之后,就会发现两数之和的查找其实就是三数之和固定一个固定值后对剩余两数的查找;

        

class Solution {
public:

    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int>> ret;
        int left = 0,right = 0;
        //排序
        sort(nums.begin(),nums.end());
        int n = nums.size();
        for(int target = 0 ;nums[target] <= 0 && (target < n-1) ; target++ )
        {
            if( ( target > 0)&&nums[target] == nums[target - 1] )
            {
                continue;
            }
            for(left = target+1,right = n-1;left < right; )
            {
                if(nums[left] + nums[right] + nums[target] < 0 && (left < right)) 
                {
                   ++left;
                }
                else if(nums[left] + nums[right] + nums[target] > 0 && (left < right)) 
                {
                    --right;
                }
                else
                {
                    
                     //插入数据
                    ret.push_back( {nums[left],nums[right],nums[target]} );
                    //处理连续跨越问题和越界问题
                    while(nums[++left] == nums[left-1] && (left < right));
                    
                    while(nums[--right] == nums[right+1] && (left < right));
                }
            }
        }
        return ret;
    }
};

 

(二)四数之和

 

        给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

 

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

 

提示:

  • 1 <= nums.length <= 200
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9

        在两数之和与三数之和的思路延续上,我们也可以类似的类比出四数之和的解决方法:

思路:

        对于任意一个数组找到和为target的数,

        可以先固定一个数组中的数a,在除此数a的其余数组中找到target-a的数;

        接下来固定一个数b,在除此数b和数a的其余数组中找到target-a-b的数;

        再固定一个数c,在除此数c和数b和数a的其余数组中找到target-a-b-c的数;

        现在这个问题就退化成了二数之和的问题:

        对任意数组,在除此数c和数b和数a的其余数组中找到target-a-b-c的数。

这样我们将这个问题不断简化,就将复杂的问题转化为简单的我们可以解决的问题。

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> ret;
        //排序
        sort(nums.begin(),nums.end());
        int n = nums.size() ;
        
        //找和为target的4个数
        for(int a = 0;a < n-1;)
        {
            //找和为target-nums[a]的3个数
            for(int b = a+1;b < n-1;)
            {
                
                //找和为target-nums[a]-nums[b]的2个数,这时可利用双指针
                for(int left = b+1,right = n-1;left < right;)
                {
                    long sum = (long)nums[a] + (long)nums[b] + (long)nums[left] + (long)nums[right];

                    if( sum < target && (left < right))
                    {
                        ++left;
                    }
                    else if(sum > target && (left < right))
                    {
                        --right;
                    }
                    else 
                    {
                        ret.push_back( { nums[a] , nums[b] , nums[left] , nums[right] } );
                        while(nums[++left] == nums[left-1] && (left < right));
                        while(nums[--right] == nums[right+1] && (left < right));
                    }
                }
                b++;
                while(nums[b] == nums[b-1] && (b < n-1)) b++;
            }
            a++;
            while(nums[a] == nums[a-1] && (a < n-1 )) a++;
        }
        return ret;
    }
};

回顾

目录

(一)总和为目标值的两个数

(一)三数之和

(二)四数之和

 


完~

未经作者同意禁止转载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1566048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

支持各种不同系列nvdia显卡和amd显卡,DeepFaceLab安装与使用,附完整的软件打包下载一键安装

支持各种不同系列nvdia显卡和amd显卡&#xff0c;DeepFaceLab安装与使用&#xff0c;附完整的软件打包下载一键安装。 主要使用的技术&#xff1a; 1. 深度学习&#xff08;Deep Learning&#xff09; 深度学习是人工智能领域的一个重要分支&#xff0c;它通过模拟人脑的神经…

面试经典150题【131-140】

文章目录 面试经典150题【131-140】123.买卖股票的最佳时机III188.买卖股票的最佳时机IV二分查找的板子&#xff1a;35.搜索插入位置74.搜索二维矩阵162.寻找峰值33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置153.寻找旋转排序数组中的最小值4.寻找两个正…

C++之类和对象的中篇

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法&#xff1a;直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义&#xff1a;可以少传一个/多个参数给函数&…

归并排序和分治

归并排序 归并排序是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治策略&#xff08;分治法将问题分成一些小的问题然后递归求解&#xff0c;而治的阶段则将分的阶段得到的各答案"修补"在一起&#xff0c;即分而治之)。 分而治之 可以看到这种结构…

前端实现菜单搜索搜索(功能模版)

目录 前言正文 前言 总体界面如下所示&#xff1a; 正文 <template><div class"avue-searchs"click.self"handleEsc"><div class"avue-searchs__title">菜单搜索</div><div class"avue-searchs__content"…

游戏运营分析:如何在新游戏上线初期实现精细化运营?

一、背景介绍 在当今的手游市场中&#xff0c;每一款新游戏的发布都如同踏上一段充满未知与挑战的探险之旅。游戏刚上线时&#xff0c;运营情况往往如同飘摇的小船&#xff0c;随时可能受到风浪的侵袭。此时&#xff0c;如何准确地找到问题所在&#xff0c;为游戏的健康运营和持…

瀚海贫者福,铜子恣意游

上学时打饭追求性价比的习惯一直不改&#xff0c;半个大鱼头三块钱&#xff0c;一份豆腐一块钱&#xff0c;还有一个红烧茄子2块5&#xff0c;再加三毛钱的饭&#xff0c;共6块8毛钱&#xff0c;早晚餐也会有这类性价比高又营养的选择&#xff0c;科大食堂现在越来越人性化&…

蓝桥杯练习——拼出一个未来

选中 index.html 右键启动 Web Server 服务&#xff08;Open with Live Server&#xff09;&#xff0c;让项目运行起来。接着&#xff0c;打开环境右侧的【Web 服务】&#xff0c;就可以在浏览器中看到如下效果&#xff1a; 目标 完善 js/index.js 的 TODO 部分&#xff0c;实…

零基础学会Python

⭐简单说两句⭐ ✨ 正在努力的小新~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &…

C 回调函数的两种使用方法

对回调&#xff08;callback&#xff09;函数的一点粗陋理解&#xff0c;在我小时候&#xff0c;隔壁村有家月饼小作坊&#xff08;只在中秋那段时间手工制作一些月饼出售&#xff0c;后来好像不做了&#xff09;&#xff0c;做出的月饼是那种很传统很经典的款式&#xff0c;里…

电机的工作电流怎么计算?

电机的工作电流计算通常需要考虑多个因素&#xff0c;包括电机的额定功率、工作电压、效率以及负载情况等。以下是一个基本的计算方法&#xff0c;用于估算直流电机或交流电机在特定条件下的工作电流。 了解电机参数 额定功率 (P_rated) 电机的额定功率是指在额定工作条件下&am…

深入C语言:探究static关键字的奥秘

文章目录 一、链接属性二、static变量1、定义静态局部变量2、在函数内部使用静态变量3、函数中静态局部变量与递归 三、static变量与全局变量的区别1、存储期与生命周期2、可见性与作用域3、使用场景4、静态与动态内存分配 注意事项 当用于不同的上下文环境时&#xff0c; sta…

005 高并发内存池_CentralCache设计

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;高并发内存池 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言本文重点一、构建CentralCache结构二、运用慢开始反馈调节算法三、完成向CentralCache中心缓存申请四…

Netty经典32连问

文章目录 1、Netty是什么&#xff0c;它的主要特点是什么&#xff1f;2、Netty 应用场景了解么&#xff1f;3、Netty 核心组件有哪些&#xff1f;分别有什么作用&#xff1f;4、Netty的线程模型是怎样的&#xff1f;如何优化性能&#xff1f;5、EventloopGroup了解么?和 Event…

第十三届蓝桥杯大赛软件赛省赛CC++大学B组

第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组 文章目录 第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组1、九进制转十进制2、顺子日期3、刷题统计4、修建灌木5、x进制减法6、统计子矩阵7、积木画8、扫雷9、李白打酒加强版10、砍竹子 1、九进制转十进制 计算器计算即可。2999292。 2、…

RD55UP06-V 三菱iQ-R系列C语言功能模块

RD55UP06-V 三菱iQ-R系列C语言功能模块 RD55UP06-V用户手册&#xff0c;RD55UP06-V功能&#xff0c;RD55UP06-V系统配置 RD55UP06-V参数规格&#xff1a;10BASE-T/100BASE-TX/1000BASE-T 1通道&#xff1b;字节存储次序格式小端模式; 可使用SD存储卡插槽&#xff1b;工作RAM 1…

路由、插槽

路由 前端路由&#xff1a;Hash地址(url中#后面的部分)与组件之间的对应关系 页面效果&#xff1a;在浏览器中访问不同的Hash地址时&#xff0c;会显示不同的组件 SPA项目(单页面应用程序&#xff0c;就是Vue项目&#xff0c;最后所有模板都展示在一个html上) vue路由(vue-r…

VUE3——生命周期

Vue3.0中可以继续使用Vue2.x中的生命周期钩子&#xff0c;但有有两个被更名&#xff1a; beforeDestroy改名为 beforeUnmountdestroyed改名为 unmounted Vue3.0也提供了 Composition API 形式的生命周期钩子&#xff0c;与Vue2.x中钩子对应关系如下&#xff1a; beforeCreate&g…