【详解:两数之和三数之和四数之和】

本文讲解两数之和,三数之和和四数之和这三道经典双指针类型题。会在详解题目的同时给出AC代码【这三个题目从前往后是循序渐进的,非常巧妙】

目录

1、查找总价格为目标值的两个商品

2、三数之和

3、力扣18. 四数之和


1、查找总价格为目标值的两个商品

【本题即两数之和经典例题】 

解法一:暴力解法

本题是升序的数组,因此可以用「对撞指针」优化时间复杂度。
算法流程(附带算法分析,为什么可以使用对撞指针):
a. 初始化 left , right 分别指向数组的左右两端(不是我们理解的指针,而是数组的下标)
b. 当 left < right 的时候,一直循环

  •  当 nums[left] + nums[right] == target 时,说明找到结果,记录结果,并且返回;
  •  当 nums[left] + nums[right] < target 时
  •  对于 nums[left] 而言,此时 nums[right] 相当于是 nums[left] 能碰到的最大值。如果此时不符合要求,我们可以让left++,使和变大
  •  当 nums[left] + nums[right] > target 时,同理我们可以舍去nums[right] (因为和过大了,应该小一点)。让 right-- ,继续比较下一组数据,而 left 指针不变
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0, right = price.size() - 1;int sum = 0;while (left < right){sum = price[left] + price[right];if (sum > target) right--;else if (sum < target) left++;else return {price[left], price[right]};//这么返回会被视为vector返回}//因为没结果也要有返回值,所以为了让编译器过,随便设置一个返回值return {-1, -1};}
};

2、三数之和

找三元组的过程: 

去重: 【当然也可以用set等,但是我们可以想另一个办法】

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//1、排序sort(nums.begin(), nums.end());//2、双指针算法解决问题int  n = nums.size();for (int i = 0; i < n;){if (nums[i] > 0) break;//优化:若固定的数都>0,且是升序,后面之和不可能有负数//沿用两数之和操作int left = i + 1, right = n - 1 , target = -nums[i];while (left < right){int sum = nums[left] + nums[right];if(sum < target) left++;else if (sum > target) right--;else{ret.push_back({nums[i], nums[left], nums[right]});left++, right--; //对两个指针去重,前提是这个地方已经作为答案了,所以放在else中while (left < right && nums[left - 1] == nums[left]) left++;while (left < right && nums[right + 1] == nums[right]) right--;}}//对i指针去重i++;while (i < n && nums[i - 1] == nums[i]) i++;}return ret;}
};

3、力扣18. 四数之和

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;//1、排序sort(nums.begin(), nums.end());int n = nums.size();//2、利用双指针思想求解for (int i = 0; i < n;) //固定数a{//利用三数之和思路求解for (int j = i + 1; j < n;) //固定数b{int left = j + 1, right = n - 1;//数据范围为-10亿~10亿,那三个数相+-一定超int[-21亿~21亿]//所以这里用long long才行,强转即可long long t = (long long)target - nums[i] - nums[j];while (left < right){int sum = nums[left] + nums[right];if (sum > t) right--;else if (sum < t) left++;else {ret.push_back({nums[i],nums[j],nums[left++],nums[right--]});//对双指针去重while (left < right && nums[left-1] == nums[left]) left++;while (left < right && nums[right+1] == nums[right]) right--;}}//对j指针指向的数去重j++;while (j < n && nums[j - 1] == nums[j]) j++;}    //对i指针指向的数去重i++;while (i < n && nums[i - 1] == nums[i]) i++;        }return ret;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCS模型(径流曲线法)概述

目录 1.介绍&#xff1a;2.计算公式&#xff1a;参考文献&#xff1a;小结&#xff1a; 1.介绍&#xff1a; SCS模型&#xff08;径流曲线法&#xff09;是由美国农业部水土保持局(Soil Conservation Service) 基于经验提出&#xff0c;最初用于预测在农业用地小型流域降雨所累…

Django 框架添加管理员,完成对普通用户信息管理

前情回顾&#xff1a;Django框架 完成用户登录注册 文章目录 1.创建管理员2.完善管理员功能2.1增加管理员登录功能2.2完善展示用户信息功能2.3完善修改用户信息功能2.4完善删除用户信息功能 1.创建管理员 一般管理员都是直接指定&#xff0c;不开放页面注册&#xff0c;可以直…

【数据库系统概论】期末复习1

试述数据、数据库、数据库系统、数据库管理系统的概念。试述文件系统与数据库系统的区别和联系。试述数据库系统的特点。数据库管理系统的主要功能有哪些&#xff1f;试述数据库系统三级模式结构&#xff0c;这种结构的优点是什么&#xff1f;什么叫数据与程序的物理独立性&…

2024-01-03 无重叠区间

435. 无重叠区间 思路&#xff1a;和最少数量引爆气球的箭的思路基本都是一致了&#xff01;贪心就是比较左边的值是否大于下一个右边的值 class Solution:def eraseOverlapIntervals(self, points: List[List[int]]) -> int:points.sort(keylambda x: (x[0], x[1]))# 比较…

基于JAVA+SpringBoot的高校学术报告系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 智慧高校学术报告系统…

系统添加深色模式实现方案

业务需求,夜间看系统太刺眼,要求添加夜间模式 效果如下: 依赖如下: 参考了官方解决方案,尝试后没有有效的解决. 官方解决方案 后续打算换框架,发现antdesign pro vue版本的暗黑模式禁用了. ant design pro 预览地址 思路: 引入andesign 暗黑模式的样式 , 手动修改自定义类…

VLAN原理与配置

0x00 前言 本节主要记录VLAN相关的内容。 传统以太网的缺点 广播域越大&#xff0c;产生的网络安全问题&#xff0c;垃圾流量问题越严重。 什么是VLAN&#xff1f; Virtual Local Area NetWork 虚拟局域网技术。 VLAN的特点是什么 一个VLAN就是一个广播域&#xff0c;在…

AWS CodeCommit创建git库

问题 在AWS云国际站上面使用CodeCommit服务创建git代码库。这里假设本地已经安装好git&#xff0c;ssh等工具&#xff0c;并且本地已经创建好相关公私钥文件&#xff0c;熟悉git和ssh通用配置文件&#xff0c;这里不会介绍windows和pc上面的ssh和git配置文件差异&#xff0c;需…

RocketMQ 消费重试

消费者出现异常&#xff0c;消费某条消息失败时&#xff0c; Apache RocketMQ 会根据消费重试策略重新投递该消息进行故障恢复。本文介绍消费重试机制的原理、版本兼容性和使用建议。 一、应用场景​ Apache RocketMQ 的消费重试主要解决的是业务处理逻辑失败导致的消费完整性…

内裤洗衣机有用吗?五款小型洗衣机全自动推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

ubuntu查看内存使用情况命令

命令简介 在Ubuntu系统中&#xff0c;可以使用终端命令来查看电脑的内存使用情况。打开终端并输入以下命令&#xff1a; free -h 该命令可用于查看系统中内存的总量、已使用的内存、空闲的内存及缓冲区使用的内存。其中“-h”选项用于以人类可读的格式显示内存大小。执行该命…

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO

Java BIO、NIO(通信/群聊系统、零拷贝)、AIO BIO、NIO、AIO特点和场景 BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;、AIO&#xff08;Asynchronous I/O&#xff09;是Java中用于处理I/O操作的三种不同的I/O模型&#xff0c;它们具…