LeetCode hot100---双指针专题(C++语言)

embedded/2024/12/22 16:34:15/

双指针

(1)快慢双指针

适用于使用双指针进行元素移动,覆盖

(2)首尾双指针

计算区域面积,三数之和

1、移动0

(1)题目描述以及输入输出

(1)题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
(2)输入输出描述:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]关键思路:
fast遍历数组,slow用于指向零。遍历时,不为0元素时,slow与fast进行swap(),都会向右移动;0时,仅fast移动。

(2)代码块

class Solution {
public:void moveZeroes(vector<int>& nums) {int left = 0;int right = 0;if(nums.size() == 1)return;while(right<nums.size()){if(nums[right]){swap(nums[left],nums[right]);left++;}right++;}}
};

2、盛水最多的容器

(1)题目描述以及输入输出

(1)题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
(2)输入输出描述:
输入:height = [1,1]
输出:1关键思路:
首尾双指针while遍历数组,计算区域面积:(right-left)*min(height[left],height[right])
接着偏移左右双指针,height[left]<height[right],left++,找高边缘。

(2)代码块

class Solution {
public:int maxArea(vector<int>& height) {int left = 0;int right = height.size()-1;int area = 0;int result = 0;while(left<right){area = (right-left)*min(height[right],height[left]);	//计算区域高度result = max(area,result);if(height[left]<height[right])							// 找下一个高边缘left++;elseright--;}return result;}
};

3、三数之和

(1)题目描述以及输入输出

(1)题目描述:
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
(2)输入输出描述:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]关键思路:
遍历数组元素,遍历到该元素时先对元素进行去重,使用首尾双指针while计算三者相加的和,再进行首尾指针移动;
找到和为0的三元素后,插入结果,并对接下来的首尾指针进行去重,去重后指针均向中间移动。

(2)代码块

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());		// 先对数组排序vector<vector<int>> result;int left,right;for(int i = 0;i<nums.size();i++){if(nums[i] > 0)return result;if(i>0 && nums[i] == nums[i-1])	// 首元素去重continue;left = i+1;right = nums.size()-1;while(left<right){if(nums[i] + nums[left] + nums[right] > 0)	// 根据相加结果平移指针right--;else if(nums[i] + nums[left] + nums[right] < 0)left++;else										// 找到三数后进行去重{result.push_back(vector<int>{nums[i],nums[left],nums[right]});while(left<right && nums[left] == nums[left+1])left++;while(left<right && nums[right] == nums[right-1])right--;left++;right--;}}         }    return result;}
};

http://www.ppmy.cn/embedded/121595.html

相关文章

oracle解决关联查询报invalid number问题

出现问题的原因和背景 oracle进行关联查询的时候因为字段存在多个用逗号切割的id&#xff0c;导致查询的过程中报无效数字或非法数字 问题复现 新建表A CREATE TABLE "A" (id NUMBER NOT NULL,name VARCHAR2(255 BYTE) )INSERT INTO "A" VALUES (1, 上海…

Django对接支付宝沙箱环境(2024年9月新测有效)

1、申请沙箱环境 #需要填一些个人信息 https://opendocs.alipay.com/ 2、使用支付宝登入&#xff0c;并进入控制台&#xff0c;进入开发者工具推荐-->沙箱 3、获取基本信息 主要是APPID,和支付宝网关地址 4、生成应用私钥和应用公钥和支付宝公钥 上面的接口加签方式选择…

【深度学习】—— 自动微分、非标量变量的反向传播、 分离计算、 Python控制流的梯度计算

【深度学习】—— 自动微分 自动微分一个简单的例子 非标量变量的反向传播分离计算Python控制流的梯度计算 自动微分 求导是⼏乎所有深度学习优化算法的关键步骤。虽然求导的计算很简单&#xff0c;只需要⼀些基本的微积分。但对于复杂的模型&#xff0c;⼿⼯进⾏更新是⼀件很…

mac中文件夹怎么显示.git隐藏文件

1. 打开终端应用程序&#xff0c;然后进入到包含.git文件夹的目录&#xff0c;可以使用以下命令来显示隐藏文件和文件夹&#xff1a; defaults write com.apple.finder AppleShowAllFiles YES 2. 然后重启 Finder&#xff1a; killall Finder

Python案例--水仙花数的探索之旅

一、引言 水仙花数&#xff0c;也称为阿姆斯特朗数&#xff0c;是一种特殊的三位数&#xff0c;其各位数字的立方和等于其本身。例如&#xff0c;153就是一个水仙花数&#xff0c;因为 135333153135333153。这种数字的发现不仅展示了数字的内在美&#xff0c;也激发了人们对数…

硬件-开关电源-结构组成及元件作用

文章目录 一&#xff1a;开关电源组成1.1 开关电源是什么&#xff1f;1.2 开关电源六个组成部分 二&#xff1a;六个组成部分的作用2.1 EMC区域2.2 输入整流滤波区域2.3 控制区域2.4 变压器2.5 输出整流滤波区域2.6 反馈电路区域道友:勿以小恶弃人大美&#xff0c;勿以小怨忘人…

浅谈网络通信中的透传和非透传

在网络通信中&#xff0c;透传&#xff08;Transparent Transmission&#xff09;和非透传&#xff08;Non-Transparent Transmission&#xff09;是两种不同的数据传输模式&#xff0c;尤其在使用ESP8266这类WiFi模块时&#xff0c;这两种模式有其特定的应用场景&#xff1a; …

java中IO遇NIO的区别,你需要了解

Java中的IO&#xff08;Input/Output&#xff09;和NIO&#xff08;New Input/Output&#xff09;是处理数据输入输出操作的重要机制。下面分别详细讲解Java的IO与NIO&#xff0c;并列出面试中常问的问题点。 一、Java的IO 1. IO概述 Java IO是Java编程语言中用于输入输出操…