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

news/2024/10/4 7:37:52/

双指针

(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/news/1534291.html

相关文章

opencv实战项目(三十):使用傅里叶变换进行图像边缘检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一&#xff0c;什么是傅立叶变换&#xff1f;二&#xff0c;图像处理中的傅立叶变换&#xff1a;三&#xff0c;傅里叶变换进行边缘检测&#xff1a; 一&#xff0c…

JavaScript 数组方法

数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始)&#xff0c;整个数组用方括号表示。两端的方括号是数组的标志。 var a["a","b","c"]; 除了在定义时赋值&#xff0c;数组也可以先定义后赋值。 var arr[];arr[1]"a"…

分治算法:谈一谈大规模计算框架 MapReduce 中的分治思想

分治算法:谈一谈大规模计算框架 MapReduce 中的分治思想 在当今大数据时代,处理大规模数据的需求日益增长。MapReduce 作为一种广泛应用的大规模计算框架,其核心思想正是分治算法。本文将深入探讨 MapReduce 中的分治思想,并通过具体案例进行说明。 一、分治算法概述 分…

【JavaScript】数组函数汇总

JavaScript数组函数是处理和操作数据的基础&#xff0c;对于JavaScript开发至关重要。函数式编程方法&#xff0c;如map()、filter()和reduce()&#xff0c;能够提高代码的简洁性和功能性。数据不可变性是现代JavaScript开发中的一个重要概念&#xff0c;函数如concat()和slice…

C语言 | Leetcode C语言题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int fourSumCount(int* A, int ASize, int* B, int BSize, int* C, int CSize, int* D, int DSize) {struct hashTable* hashtable NULL;for (int i 0; i < ASize; i) {for (…

二值图像的面积求取的两种方法及MATLAB实现

一、引言 面积在数字图像处理中经常用到&#xff0c;在MATLAB中&#xff0c;计算二值图像的面积通常可以通过两种主要方法实现&#xff1a;遍历法和直接利用bwarea函数。下面将分别介绍这两种方法的原理和相应的MATLAB代码示例。 二、遍历法计算二值图像面积的原理和MATLAB代码…

物联网智能项目研究

物联网&#xff08;IoT&#xff09;作为当今数字化转型的重要推动力&#xff0c;正在改变我们的生活方式和工作模式。从智能家居、智慧城市到工业自动化&#xff0c;物联网技术的应用正在实现人们对智能生活的向往。本文将探讨一个具体的物联网智能项目&#xff0c;通过实际操作…

Stm32的bootloader无法使用问题

Stm32的bootloader无法使用问题 用不了一键下载电路 首先简单地对此处涉及的内容进行介绍:如果stm32的BOOT0引脚为低电平时,系统从FLASH中启动,而如果BOOT0引脚为高电平,且BOOT1为低电平时,系统从自举程序(bootloader)中启动. 我在自制照相机设计中加入了ISP一键下载电路,如…