优选算法——双指针

优选算法

一、leetcode283.移动零

题目分析:

​ 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

算法原理:

快排原理

数组划分或者数组分块:即在一定的规则下将数组划分成若干个区间;在原数组上进行处理;

解决方法:使用双指针;在数组中是利用数组下标来充当指针;双指针一个负责条件就绪通知另一个指针,另一个指针负责处理任务;

解决过程:cur负责遍历数组,可以划分为处理过和未处理过区域,当前位置之前是处理过的区域,之后到数组结尾是未处理区域;dest负责在一处理过的数组区域之中根据规则划分数组块,一开始没有划分已处理区域所以指向为空,数组中就是-1;在遍历的过程中保持数组块的划分规则是保持不变的;

​ 当遍历完数组之后就得到最终需要的结果;

代码实现:

void moveZeroes(vector<int>& nums) {int cur=0;int dest=-1;for(;cur<nums.size();cur++){if(nums[cur]==0){continue;}swap(nums[++dest],nums[cur]);}return;
}

二、leetcode1089.复写零

题目分析:

​ 给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组就地进行上述修改,不要从函数返回任何东西

算法原理:

​ 双指针算法,先异地操作,然后优化成双指针下的就地操作;

​ 异地操作:一个指针负责遍历数组检查是否触发条件,另一个数组负责将符合条件的数组数据拷贝到一个新的数组当中;

​ 就地操作:先找到最后一个复写位置的数(使用双指针),检查此时的dest位置是否越界,cur指向此位置,dest从最后一个位置开始向前遍历;

代码实现:

void duplicateZeros(vector<int>& arr) {int cur = 0;int pos = -1;for (; cur < arr.size(); cur++) {if (arr[cur]) {pos++;} else {pos += 2;}if (pos >= arr.size() - 1) {break;}}if (pos == arr.size()) {arr[arr.size()-1]=0;cur--;pos-=2;}while (cur>=0) {if (arr[cur]) {arr[pos--] = arr[cur--];} else {arr[pos--] = arr[cur];arr[pos--] = arr[cur];cur--;}}
}

三、leetcode202.快乐数

题目分析:

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

算法原理:

​ 使用快慢双指针,找到环上重复的值是否是1;由于抽屉原理可知

代码实现:

int bitsum(int n) {int sum = 0;while (n) {sum += ((n % 10) * (n % 10));n /= 10;}return sum;}bool isHappy(int n) {int slow = n, fast = n;do {slow = bitsum(slow);fast = bitsum(fast);fast = bitsum(fast);} while (slow != fast);if (slow == 1) {return true;}return false;}

四、leetcode11.盛最多水的容器

题目分析:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

算法原理:

​ 利用单调性使用双指针解决问题,上世纪就按复杂度是On;开始两个指针指向数组的两边,不断往中间逼近并且记录容积,相遇时比较所有容积中最大的;往两边逼近时,去较小或者相等的一个数;

代码实现:

int maxArea(vector<int>& height) {int left = 0;int right = height.size() - 1;int ret = 0;vector<int> v;ret=height[left] < height[right]?height[left]:height[right];v.push_back((right-left)*ret);while (left != right) {if (height[left] > height[right]) {ret = (right - left) * height[right];v.push_back(ret);right--;} else {ret = (right - left) * height[left];v.push_back(ret);left++;}}int max = v[0];for (auto& e : v) {if (max < e) {max = e;}}return max;
}

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

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

相关文章

docker 开启 tcp 端口

前言&#xff1a;查了很多网上资料 都说要修改daemons,json 完全不管用&#xff0c;而且还导致添加 {“host”:["tcp://0.0.0.0:2375","unix:///var/lib/docker.sock"]} 后&#xff0c;docker restart 失败&#xff0c;浪费了不少时间 &#xff01;&am…

基于物理的渲染的光照参数

基于物理的渲染通常使用更加真实和复杂的光照模型&#xff0c;其中包括一系列物理参数来模拟光线在场景中的传播和反射。以下是一些常见的基于物理的渲染光照参数&#xff1a; 环境光&#xff08;Ambient Light&#xff09;&#xff1a;环境光在基于物理的渲染中仍然存在&#…

kafka安装配置及集成springboot

1. 安装 单机安装kafka Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装zookeeper dockerhub网址: https://hub.docker.com Docker安装zookeeper 下载镜像&#xff1a; docker pull zookeeper:3.4.14创建容器 doc…

docker(五):DockerFile

文章目录 DockerFile1、Dockerfile构建过程解析2、DockerFile常用保留字命令FROMMAINTAINERRUNEXPOSEWORKDIRUSERENVADDCOPYVOLUMECMDENTRYPOINT总结 3、案例 DockerFile 1、Dockerfile构建过程解析 官网文档&#xff1a;https://docs.docker.com/reference/dockerfile/ Dock…

【论文阅读笔记】HermesSim(Code is not Natural Language) (Security 24)

个人博客地址 HermesSim [Security 24] 论文&#xff1a;《Code is not Natural Language: Unlock the Power of Semantics-Oriented Graph Representation for Binary Code Similarity Detection》 仓库&#xff1a;https://github.com/NSSL-SJTU/HermesSim 提出的问题 二…

JVM调优:JVM中的垃圾收集器详解

JVM&#xff08;Java Virtual Machine&#xff09;垃圾收集器是Java虚拟机中的一个重要组件&#xff0c;负责自动管理Java堆内存中的对象。垃圾收集器的主要任务是找出那些不再被程序使用的对象&#xff0c;并释放它们占用的内存&#xff0c;以便为新的对象分配空间。这个过程被…

C#泛型委托

在C#中&#xff0c;delegate 关键字用于声明委托&#xff08;delegates&#xff09;&#xff0c;委托是一种类型安全的函数指针&#xff0c;允许你传递方法作为参数或从方法返回方法。有时我们需要将一个函数作为另一个函数的参数&#xff0c;这时就要用到委托&#xff08;Dele…

算法题② —— 链表专栏

1. 链表数据结构 struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}};2. 链表的删除 2.1 移除链表元素 力扣&#xff1a;https://leetco…

常见的自定义类加载器实现策略

1、从特定路径加载类&#xff1a; 这种策略允许类加载器从文件系统上的特定目录或JAR文件中加载类。例如&#xff0c;可以将应用程序的插件或扩展放在特定的目录中&#xff0c;并使用自定义类加载器动态加载它们。 2、从网络加载类&#xff1a; 自定义类加载器可以从远程服务…

引擎:主程渲染

一、引擎发展 二、引擎使用 1.游戏渲染流程 2.3D场景编辑器操作与快捷键 3.节点的脚本组件 脚本介绍 引擎执行流程 物体节点、声音组件\物理组件\UI组件、脚本组件 暴露变量到面板 4.节点的查找 基本查找 this.node&#xff1a;挂载当前脚本的节点A&#xff1b; this.nod…

Git LFS拉取大文件

当你使用Git LFS来管理大文件时&#xff0c;拉取包含这些大文件的仓库会稍微有些不同&#xff0c;但大部分过程自动化&#xff0c;用户体验类似于正常的Git操作。以下是拉取包含Git LFS对象的仓库的步骤&#xff1a; 确保已安装 Git LFS 在你尝试拉取任何包含通过Git LFS跟踪…

git两个不同仓库代码的同步

应用场景 将A仓库中代码同步到B仓库&#xff0c;并且在B仓库能够更新A仓库中的代码。 解决方案 解决步骤&#xff1a; 在仓库B中 首先&#xff0c;使用 git remote add 命令将 A 仓库添加为 B 仓库的远程仓库。确保你使用正确的远程仓库 URL。 git remote add repository_A…

一、精准化测试介绍

精准化测试介绍 一、精准化测试是什么&#xff1f;二、什么是代码插桩&#xff1f;三、两种插桩方式Offine模式&#xff1a;On-the-fly插桩: 四、jacoco覆盖率报告展示五、增量代码覆盖率监控原理六、精准测试系统架构图七、全量与增量覆盖率报告包维度对比八、全量与增量覆盖率…

Python 之 Flask框架(进阶版)

前面说了flask框架的基础用法&#xff0c;现在说一下Flask框架的进阶用法:#包引入 from flask import Flask,redirect,url_for,render_template,request,make_response,send_file,abort,flash, get_flashed_messages,Blueprint,views from os import urandomapp Flask(__name_…

牛客NC343 和大于等于K的最短子数组【困难 前缀和 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/3e1fd3d19fb0479d94652d49c7e1ead1 思路 本答案利用前缀和解答&#xff0c;Java&#xff0c;Go答案通过&#xff0c;但是同样的代码用PHP的话有一个测试用例超时 应该还有更优秀的答案&#xff0c;后面找到更优…

2022——蓝桥杯十三届2022国赛大学B组真题

问题分析 看到这个问题的同学很容易想到用十层循环暴力计算&#xff0c;反正是道填空题&#xff0c;一直算总能算得出来的&#xff0c;还有些同学可能觉得十层循环太恐怖了&#xff0c;写成回溯更简洁一点。像下面这样 #include <bits/stdc.h> using namespace std; in…

apk反编译修改教程系列-----反编译apk 去除软件强制更新的八种方式步骤解析【十七】

安卓有的apk 软件会不断更新。但有些用户需要旧版的有些功能或者新版功能增减原因等等。需要不更新继续使用。这类问题有的可以简单修改版本号来跳过更新。或者有的软件可以忽略。但对于某些无法跳过更新界面等等的apk。就需要深度反编译来去除软件的强制更新。 通过课程可以了…

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…

1067: 有向图的邻接表存储强连通判断

解法&#xff1a; 定理&#xff1a;有向图G是强连通图的充分必要条件是G中存在一条经过所有节点的回路 跟上道题一样 这是错误代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& a,int u) {a…

唤醒手腕 Go 语言 并发编程、Channel通道、Context 详细教程(更新中)

并发编程概述 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c…