【哈希表算法题记录】15. 三数之和,18. 四数之和——双指针法

题目链接

15. 三数之和

思路

这题虽然放在哈希表的分类里面,但是用双指针法会更高效。

之前的双指针我们要么是一头left一尾right,要么是快fastslow指针。这里是要计算三个数的和,我们首先对数组进行从小到大的排序,先固定一个指针指向i,然后以该指针为开始,设置左指针指向i+1,然后右指针指向数组的末尾nums.size()-1

因为数组已经排序好了,我们只用看当前这三个数之和,如果比0小,说明左指针指向的数太小了,要向右移,如果比0大,说明右指针太大了,要向左移。这样我们就有了一个基本的逻辑。

然而,这题有一个条件就是答案中不可以包含重复的三元组。也就是说,如果已经找到了一个元组满足和为0,但是在进行接下来指针移动继续查找的时候,例如i的后面有一个相同的元素,或是左指针右边有一个相同的元素,或是右指针左边有一个相同的元素,那么我们在进行上述任意一种操作的时候,一定会再次遇到这个重复的满足和为0的元组,我们是不希望把它放进答案里的,所以要规避掉相同的元素。

cpp代码

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ans;// 对nums进行从小到大排序sort(nums.begin(), nums.end());for(int i = 0; i < nums.size(); i++){// 如果一开始i就大于0,那么后面的数一定都会大于0,无法产生满足和为0的元组if(nums[i]>0) return ans;// i去重if(i > 0 && nums[i] == nums[i-1]) continue;int left = i+1;int right = nums.size()-1;while(left < right) {// 如果三数之和大于0,那么右指针左移,找更小的数if(nums[i] + nums[left] + nums[right] > 0) right--;// 如果三数之和小于0,那么左指针右移,找更大的数else if(nums[i] + nums[left] + nums[right] < 0) left++;else{ans.push_back(vector<int>{nums[i], nums[left], nums[right]});// 左指针去重while (left < right && nums[left] == nums[left+1]) left++; // 右指针去重while (left < right && nums[right-1] == nums[right]) right--;left++;right--;}}}return ans;}
};

18. 四数之和

思路

实际上四数和三数一样,就是在三数上多了一层for循环。

不过需要注意的是,此时和是一个任意值target。在三数之和中,如果我们的i(第一个数)大于0(此题中的target),那么就不用继续看后面的数了,因为他们的和肯定是大于0的。但是在此题中,如果target是一个负数如-10,我们的i此时也对应一个负数如-4,虽然i大于target,但是我们不能直接进行剪枝操作,因为两负数相加会更小,所以我们的剪枝判断应该变成if(nums[i] > target && nums[i] >= 0) break;,也就是当nums[i] >= 0的时候,我们才能按照三数之和中的逻辑来剪枝。

cpp代码

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ans;sort(nums.begin(), nums.end());for(int i = 0; i < nums.size(); i++){// 剪枝if(nums[i] > target && nums[i] >= 0) break;// i去重if( i > 0 && nums[i] == nums[i-1]) continue;for(int j = i+1; j <nums.size(); j++){// 剪枝if(nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) break;// j去重if( j > i+1 && nums[j] == nums[j-1]) continue;int left = j+1;int right = nums.size()-1;while(left < right){if((long)nums[i]+nums[j]+nums[left]+nums[right] < target) left++;else if((long)nums[i]+nums[j]+nums[left]+nums[right] > target) right--;else{ans.push_back(vector<int>{nums[i], nums[j], nums[left], nums[right]});// left去重while(left < right && nums[left] == nums[left+1]) left++;// right去重while(left < right && nums[right] == nums[right-1]) right--;left++;right--;}}}}return ans;}
};

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

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

相关文章

./gradlew assembleRelease

在 Android 项目中使用 Gradle 进行打包&#xff0c;通常会涉及到配置 build.gradle 文件。其中&#xff0c;你需要指明签名配置&#xff08;signing config&#xff09;和构建类型&#xff08;build type&#xff09;。以下是一个基本的配置示例&#xff1a; 首先&#xff0c…

Docker 进阶

1、容器数据卷 什么是容器数据卷&#xff1f; 就是当容器内存在了mysql&#xff0c;在里面书写了数据&#xff0c;如果容器删除了&#xff0c;那么数据也就没有了&#xff0c;通过容器数据卷的技术&#xff0c;可以让容器内的数据持久化到Linux服务器上 操作 #docker run -…

三、HarmonyOS 应用开发入门之运行Hello World

目录 1、课程对象 1.1、有移动端开发经验 1.2、无移动端开发经验 1.3、对 HarmonyOS 感兴趣 2、DevEco Studio 的使用 2.1、DevEco Studio 的关键特性 智能代码编辑 低代码开发 多段双向实时预览 多端模拟仿真 2.2、安装配置 DevEco Studio 2.2.1、官网开发工具下载地…

基于Springboot的面向智慧教育的实习实践系统设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的面向智慧教育的实习实践系统设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

_数据_变量_内存

什么是数据? 存储于内存中代表特定信息的’东东’, 本质就是0101二进制具有可读和可传递的基本特性万物(一切)皆数据, 函数也是数据程序中所有操作的目标: 数据 算术运算逻辑运算赋值调用函数传参 … 什么是内存? 内存条通电后产生的存储空间(临时的)产生和死亡: 内存条(…

《深入Linux内核架构》第2章 进程管理和调度 (1)

目录 前言 2.1 进程优先级 2.2 进程生命周期 2.3 进程表示 2.3.1 进程类型 2.3.2 命名空间 2.3.3 进程ID号 2.3.4 进程关系 2.4 进程管理相关的系统调用 2.4.1 进程复制 2.4.2 内核线程 2.4.3 启动新程序 2.4.4 退出进程 前言 本章内容太多&#xff0c;分为两篇博…

游戏开发中的坑之十三 Lut贴图相关问题

1.网上下载的或者游戏截帧得到的Lut贴图贴上之后可能效果如下&#xff0c;需要在PS里垂直方向反转一下贴图。 2.相关设置&#xff1a; &#xff08;1&#xff09;取消勾选sRGB&#xff1b; &#xff08;2&#xff09;像素为1024x32或者512x16&#xff1b; &#xff08;3&#…

2115. 从给定原材料中找到所有可以做出的菜

文章目录 题意思路代码 题意 题目链接 原材料和每道菜需要什么材料&#xff0c;能做那些菜 思路 拓扑排序暴力 代码 // 暴力 class Solution { public:vector<string> findAllRecipes(vector<string>& recipes, vector<vector<string>>&…

常用的C++ STL

这里写自定义目录标题 常用的C STLstackqueuedeque 常用的C STL 常用到的C STL&#xff0c;方便查询。 stack Stack是一种容器适配器&#xff0c;专门设计用于LIFO (last-in first-out)操作&#xff0c;仅从容器的一端插入删除元素&#xff08;back or top&#xff09;。 成…

【机器学习300问】36、什么是集成学习?

一、什么是集成学习&#xff1f; &#xff08;1&#xff09;它的出现是为了解决什么问题&#xff1f; 提高准确性&#xff1a;单个模型可能对某些数据敏感或者有概念偏见&#xff0c;而集成多个模型可以提高预测的准确性。让模型变稳定&#xff1a;一些模型&#xff0c;如决策…

酷开科技以消费者需求为导向冲刺OTT行业的星辰大海

通过大屏营销、互动营销等方式&#xff0c;提升品牌认知度和市场竞争力。酷开科技始终坚持以消费者的需求为导向&#xff0c;致力于为品牌方和消费者搭建高效、准确的沟通桥梁&#xff0c;开创OTT大屏营销新纪元。 伴随技术发展&#xff0c;智能电视已经从“尝鲜”变成了主流产…

服务器镜像是什么

镜像即镜像服务器。镜像服务器与主服务器的服务内容都是一样的&#xff0c;只是放在一个不同的地方&#xff0c;分担主服务器的负载量。 可以使用&#xff0c;但不是原版的。在网上内容完全相同而且同步更新的两个或多个服务器&#xff0c;除主服务器外&#xff0c;其余的都被称…

Go语言必知必会100问题-24 如何正确的对切片进行拷贝

如何正确的对切片进行拷贝 内置的 copy 函数实现了将源切片中的数据拷贝到目标切片中的功能&#xff0c;尽管这是一个常用的内置函数&#xff0c;但是还是有不少开发者使用有误。下面会通过具体的例子说明 copy 的错误使用。如下代码中期望通过 copy 函数将源切片 src 中的数据…

每日温度_单调栈_java

每日温度 leetcode链接 问题描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0…

.NET MAUI 社区工具包 2023 年亮点

作者&#xff1a;Kym Phillpotts 排版&#xff1a;Alan Wang 2023 年已经过去了&#xff0c;让我们花点时间回顾一下 .NET MAUI Community Toolkit 项目的历程以及展望接下来的发展。作为 .NET MAUI 的配套产品&#xff0c;该开源库为开发人员提供了一组丰富多样的控件、转换器…

Axure基础 各元件的作用及介绍

图像热区 增加按钮或者文本的点击区域&#xff0c;他是透明的&#xff0c;在预览时看不见。 动态面板 用来绘制一下带交互效果的元件&#xff0c;他是动态的&#xff0c;如轮播图&#xff0c;一个动态面板里可以有多个子面板&#xff0c;每一个子面板对应着不同的效果。 他…

大数据笔记

文章目录 一、HBase1.HBase集群部署2.HBaseShell常用操作3.HBase过滤器 二、Spark1.spark集群部署 三、Hive1.Hive安装与配置与mySQL的安装2.Hivebeeline配置 四、Zookeeper1.Zookeeper集群部署2.ResourceManagerHA3.SparkHA4.Zookeeper案例 一、HBase 1.HBase集群部署 2.HBa…

C++容器——unordered_map浅谈

实现原理 unordered_map 在 C 标准库中的实现基于哈希表&#xff08;Hash Table&#xff09;数据结构。哈希表通过一个哈希函数将键转换为数组的索引&#xff0c;然后在对应的桶&#xff08;buckets&#xff09;中存储元素。当多个键映射到相同的哈希值时&#xff0c;通常采用…

《1w实盘and大盘基金预测 day2》

上贴指数预测还行&#xff0c;周三指数最低在3031&#xff0c;我预测的最低点3028。 昨天的预测 3028-3058-3072 今天gjd没有过多干预A股&#xff0c;主要去港股那边了。看的出来正在让市场自己走。目前技术指标还是好用的 3075应该不是这波行情的最高点 板块机会&#xff1…

【研发日记】,Matlab/Simulink开箱报告(十)——Requirements Toolbox

前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;五&#xff09;——S-Fuction模块(C MEX S-Function)》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;六&#xff09;——S-Fuction模块&#xff08;TLC&#xff09;》 见《开…