【基础算法】双指针

 1.移动零

 移动零

 思路:

利用双指针算法

cur:从左往右扫描数组,遍历数组

dest:处理好的区间包括dest

dest初始化为-1,因为刚开始dest前应该没有非零元素。

即将非零元素移到dest之前即可

class Solution {
public:void moveZeroes(vector<int>& nums) {for(int cur = 0, dest = -1; cur < nums.size(); cur++){if(nums[cur]) //非零元素{swap(nums[++dest], nums[cur]);}}}
};

 2.复写零

 复写零

 思路:

要注意的是从“异地”操作,优化为“就地”操作。即题目要求是只能在就地操作,那我们就可以先尝试模拟在异地操作使用双指针算法,然后进行优化到就地双指针。

就地进行模拟时,应该从前往后还是从后往前,我们发现从前往后会覆盖掉我们需要的内容,所以我们要从后往前开始复写。

但又有个问题,我们并不知道最后要复写的内容是哪个!

所以我们要先从前开始寻找最后一个需要复写的元素

这时我们发现一个特例,这就是边界情况。dest走到了n的位置

class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0, dest = -1, n = arr.size();//寻找最后一个需要复写的元素while(cur < n){if(arr[cur]) dest++;else dest+=2;if(dest >=n-1) break;cur++;}//处理边界情况if(dest == n){arr[n - 1] = 0;cur--;dest-=2; }//从后往前复写while(cur >= 0){if(arr[cur]){arr[dest--] = arr[cur];}else{arr[dest--] = 0;arr[dest--] = 0;}cur--;}}
};

3.快乐数 

快乐数

思路:利用快慢指针解决

class Solution {
public:int bitsum(int n){int sum = 0;while(n){int r = n % 10;sum += r * r;n /= 10;}return sum;}bool isHappy(int n) {int slow = n, fast = bitsum(n);while(slow != fast){slow = bitsum(slow);fast = bitsum(bitsum(fast));}return slow == 1;}
};

4.盛最多水的容器

盛最多水的容器

思路:利用对撞指针解决,强度单调性

class Solution {
public:int maxArea(vector<int>& height) {int left = 0, right = height.size() - 1;int ret = 0;while(left < right){int v = min(height[left], height[right]) * (right - left);ret = max(ret, v);if(height[left] < height[right]) left++;else right--;}return ret;}
};

5.有效三角形的个数

有效三角形的个数

 

思路: 

对撞指针,利用单调性

class Solution {
public:int triangleNumber(vector<int>& nums) {sort(nums.begin(), nums.end());int ret = 0, n = nums.size();for(int i = n - 1; i >= 2; i--){int left = 0, right = i - 1;while(left < right){if(nums[left] + nums[right] > nums[i]){ret+=(right - left), right--;}else{left++;}}}return ret;}
};

6.和为s的两个数

查找总价格为目标值的商品

 

思路:

对撞指针,单调性

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left = 0, right = price.size() - 1;while(left < right){if(price[left] + price[right] < target){left++;}else if(price[left] + price[right] > target){right--;}else{return {price[left], price[right]};}}return {-1, -1};}
};

7.三数之和

三数之和

 

思路:

对撞指针 ,使用二数之和思想

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;sort(nums.begin(), nums.end());int n = nums.size();for(int i = 0; i < n; )  // i是固定数a{if(nums[i] > 0) break;//常数级优化int left = i + 1, right = n - 1, target = -nums[i];//寻找和等于target的两数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--;//去重 left rightwhile(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}//去重ii++;while(i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};

8.四数之和

四数之和

思路:

使用三数之和思想

 

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();for(int i = 0; i < n;){for(int j = i + 1; j < n;){int left = j + 1, right = n - 1;//防止t数据溢出,开long longlong long t = (long long)target - nums[i] - nums[j];while(left < right){if(nums[left] + nums[right] < t) left++;else if(nums[left] + nums[right] > t) right--;else{ret.push_back({nums[i], nums[j], nums[left], nums[right]});//不漏left++, right--;//去重 left 和 rightwhile(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}//去重jj++;while(j < n && nums[j] == nums[j - 1]) j++;}//去重ii++;while(i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};

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

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

相关文章

【黑马点评Redis——003优惠券秒杀】

1.优惠券秒杀 1.1 全局ID生成器 1.1.1 什么是全局ID生成器 全局ID生成器&#xff0c;是一种在分布式系统下用来生成全局唯一ID的工具。 需要满足以下特性&#xff1a; 唯一性高可用高性能递增性安全性 1.1.2 为什么需要全局ID生成器&#xff1f; 自增ID存在的问题&#…

nfs网络存储配置

准备&#xff1a;yum install rpcbind yum install nfs-server 一台服务器&#xff1a;192.168.220.131 一台客户端&#xff1a;192.168.220.220 服务器&#xff1a; 先启动rpcbind服务&#xff1a;systemctl restart rpcbind 在启动…

同旺科技 USB TO SPI / I2C适配器读写24LC256--字节写

所需设备&#xff1a; 1、USB 转 SPI I2C 适配器&#xff1b;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版&#xff1b; 00地址写入一个字节数据AA&#xff0c;并读回验证&#xff1b; 单字节写时序&#xff1a; 读字节时序&#xff1a; …

文件上传服务器、文件展示等异步问题

问题&#xff1a; 文件上传模块&#xff1a;当文件已经上传完成&#xff0c;文件进度已经走完了&#xff0c;但是服务器响应还没有返回结果&#xff0c;出现了&#xff0c;获取不到上传后的文件路径&#xff0c;需要等待服务器返回结果后&#xff0c;才能获取文件路径并点击跳…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

1.5 掌握Scala内建控制结构

本次课通过一系列编程任务和案例&#xff0c;深入讲解了Scala编程语言中的控制结构。 条件表达式 Scala的条件表达式使用if-else结构&#xff0c;允许根据条件执行不同的代码分支。与Java相比&#xff0c;Scala的条件表达式更加简洁&#xff0c;并且可以直接返回相应的值。 …

配置网络设备的密码设置以及忘记密码的恢复方式以及实现全网互通

1.实验拓扑图&#xff1a; 2.实验需求&#xff1a; 1.推荐步骤 1.1配置IP&#xff1a; 不过多说了&#xff0c;较为基础&#xff08;略&#xff09; 2.推荐步骤 2.所有网络设备配置console接口密码 首先进入全局模式&#xff0c;输入以下代码(进入接口console接口0给其配置密…

玩原神玩的!30本提升你视野、眼界和格局的好书不如你挑的一本适合自己的书!——早读(逆天打工人爬取热门微信文章解读)

许久不见&#xff0c;雨天坐公车&#xff0c;别是一番滋味在心头 引言Python 代码第一篇 洞见 人民日报推荐&#xff1a;30本提升你视野、眼界和格局的好书第二篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 不要着急 最好的总会在最不经意的时候出现 意外的六分钟…

Nacos服务注册中心

1.引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>2.application.properties中配置 # 应用名称 spring.application.namenacos-aserver…

Vue3炫酷商品卡牌 组件设计

文章目录 演示代码 感谢来自BinaryMoon-CSS 艺术之暗系魔幻卡牌的博文。&#x1f495; 演示 代码 接口类型 export interface CourseBaseVO {/*** 主键*/id: string | number;/*** 机构ID*/companyId: string | number;/*** 课程名称*/name: string;/*** 大分类*/mt: string…

在matplotlib中控制colorbar的长度

在matplotlib中控制colorbar的长度 使用matplotlib绘制带颜色的箭头图&#xff0c;有时想直接把颜色条拿来当比例尺条&#xff0c;就需要控制颜色条的长度。 1. pyplot.colorbar()参数说明 pyplot.colorbar(mappable, ax, cax, **kwargs) mappable是一个ScalarMappble类型的…

01、创建型-单例模式--只有一个实例

文章目录 前言一、基本介绍1.1 什么是单例模式1.2 为什么要用单例模式1.3 应用场景1.4 单例优缺点 二、单例模式的实现方式2.1 饿汉式单例2.1.1 静态变量方式2.1.2 静态代码块 2.2 懒汉式单例2.2.1 懒汉式单例2.2.2 懒汉式优化①-线程安全2.2.2 懒汉式优化②-双重检查锁2.2.3 懒…