283.移动零

目录

  • 题目
  • 解法
      • 解释:
  • .reverse()怎么用的?
    • Char 13: error: no matching function for call to 'reverse'
  • 什么是双指针?
      • 双指针的常见类型:
      • 总结:

题目

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

解法

你可以使用双指针的方法来解决这个问题。在遍历数组的过程中,维护一个指针 lastNonZeroIndex,该指针始终指向非零元素应该放置的位置。每当遇到非零元素时,将其与 lastNonZeroIndex 处的元素交换,最后将剩余的位置填充为 0

以下是具体的代码实现:

#include <iostream>
#include <vector>void moveZeroes(std::vector<int>& nums) {int lastNonZeroIndex = 0;// 遍历整个数组for (int i = 0; i < nums.size(); i++) {if (nums[i] != 0) {// 将非零元素移动到 lastNonZeroIndex 处std::swap(nums[lastNonZeroIndex], nums[i]);lastNonZeroIndex++;}}
}int main() {std::vector<int> nums = {0, 1, 0, 3, 12};moveZeroes(nums);// 输出结果for (int num : nums) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

解释:

  1. lastNonZeroIndex 记录当前第一个可以放置非零元素的位置。
  2. 遍历数组 nums,每当遇到非零元素时,将其与 lastNonZeroIndex 位置的元素交换,并将 lastNonZeroIndex 向后移动一位。
  3. 最后,所有的非零元素都保持原来的顺序,且所有的 0 都被移动到了数组的末尾。

输出:

1 3 12 0 0

这个方法的时间复杂度是 O(n),因为我们只遍历数组一次;空间复杂度是 O(1),因为没有使用额外的空间。

.reverse()怎么用的?

std::reverse(vec.begin(), vec.end());
翻转的开头和结尾

Char 13: error: no matching function for call to ‘reverse’

在这里插入图片描述
std::reverse(nums.begin(), nums[k]); 报错的原因是 nums[k] 返回的是 nums 容器中的元素,而 std::reverse 需要的是迭代器范围作为参数,而不是元素本身。

正确的用法应该是传递两个迭代器作为参数,来指定反转范围的开始和结束。要修复这个问题,你需要将 nums[k] 替换为对应位置的迭代器 nums.begin() + k。这样 std::reverse 就可以理解为从 nums.begin() 到 nums.begin() + k 之间的元素进行反转。

!! 原来交换在标准库中自带,不需要另外写lambda函数

std::swap(nums[lastNonZeroIndex], nums[i]);

什么是双指针?

在遍历数组的过程中,维护一个指针 lastNonZeroIndex,该指针始终指向非零元素应该放置的位置。每当遇到非零元素时,将其与 lastNonZeroIndex 处的元素交换,最后将剩余的位置填充为 0。
该指针一直都是指向非0数
双指针(Two Pointers)是一种常用的算法技巧,通常用于解决数组、链表等线性结构的问题。顾名思义,双指针技术是指同时使用两个指针来遍历或操作数据结构。这两个指针可以以不同的速度或者方向移动,以达到特定的效果。双指针的应用场景非常广泛,尤其在查找、排序、去重、滑动窗口等问题中。

双指针的常见类型:

  1. 左右指针(对撞指针)

    • 左右指针分别从数据结构的两端开始,向中间移动,最终在某个位置相遇。常用于查找满足某种条件的区间或组合。
    • 应用场景
      • 判断一个数组是否为回文
      • 两数之和问题(在已排序数组中查找两个数的和为目标值)

    例子:两数之和问题

    bool twoSum(std::vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while (left < right) {int sum = nums[left] + nums[right];if (sum == target) {return true;} else if (sum < target) {left++;} else {right--;}}return false;
    }
    
  2. 快慢指针

    • 快慢指针用于同时遍历数据结构,但两个指针的移动速度不同。通常慢指针每次移动一步,快指针每次移动两步。
    • 应用场景
      • 链表中的环检测(使用快慢指针,如果有环,快指针最终会追上慢指针)
      • 寻找链表的中间节点

    例子:链表中检测环

    struct ListNode {int val;ListNode* next;
    };bool hasCycle(ListNode* head) {ListNode* slow = head;ListNode* fast = head;while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;if (slow == fast) {return true;}}return false;
    }
    
  3. 滑动窗口(窗口指针)

    • 双指针可以用来表示一个动态的窗口,两个指针控制窗口的左右边界,窗口在序列上滑动。这个技术常用于处理子数组或子串问题。
    • 应用场景
      • 寻找满足条件的最长/最短子数组或子串
      • 滑动窗口和字符串匹配问题

    例子:找到满足和为目标值的最小子数组

    int minSubArrayLen(int target, std::vector<int>& nums) {int left = 0, sum = 0, minLength = INT_MAX;for (int right = 0; right < nums.size(); right++) {sum += nums[right];while (sum >= target) {minLength = std::min(minLength, right - left + 1);sum -= nums[left++];}}return minLength == INT_MAX ? 0 : minLength;
    }
    

总结:

  • 左右指针:两个指针从两端出发,向中间移动,适合查找、对撞类型的问题。
  • 快慢指针:两个指针同时从一端出发,速度不同,适合检测周期性结构或者查找中间位置。
  • 滑动窗口:双指针动态表示一个区间,常用于子数组或子串问题。

双指针方法的核心在于通过双重遍历(或单次遍历)减少不必要的重复操作,从而提升算法的时间效率。

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

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

相关文章

88.【C语言】文件操作(5)

目录 文件的随机读写 1.fseek函数 代码示例 运行结果 2.ftell函数 代码示例 运行结果 3.rewind函数 代码示例 运行结果 承接79.【C语言】文件操作(4)文章 文件的随机读写 1.fseek函数 声明:int fseek ( FILE * stream, long int offset, int origin ); 格式:fsee…

APM 3.0.0|二次元味很冲的B站音乐软件

APM是一款专为B站音频设计的第三方播放器&#xff0c;支持从B站获取音频内容&#xff0c;提供桌面小组件&#xff0c;多语言支持&#xff0c;以及针对Android系统的优化。下载安装APK后打开应用&#xff0c;登录B站账号&#xff0c;浏览并播放音频内容。 大小&#xff1a;73M …

13分+文章利用scRNA-Seq揭示地铁细颗粒物引起肺部炎症的分子机制

写在前面 人们乘坐地铁时&#xff0c;不可避免地在地铁站台上吸入细颗粒物&#xff08;PM2.5&#xff09;&#xff0c;但PM2.5对人体又有哪些危害呢&#xff0c;今天和大家分享一篇文章&#xff0c;题目为“单细胞转录组学揭示吸入地铁细颗粒物引起的肺部炎症”&#xff0c;作…

《AI生成式工具使用》之:AI文本生视频(二战!)

目录 背景说明及目标 尝试练手 1、豆包AI之图片生成 总结&#xff1a;豆包AI生成的图片&#xff0c;不太能看细节&#xff0c;涉及到中文的基本上不能细看都是类似乱码的东西&#xff0c;有明显的逻辑性问题&#xff08;比如不符合道路交规&#xff09;。需要根据生成的结果…

Java-继承与多态-上篇

关于类与对象&#xff0c;内容较多&#xff0c;我们分为两篇进行讲解&#xff1a; &#x1f4da; Java-继承与多态-上篇&#xff1a;———— <就是本篇> &#x1f4d5; 继承的概念与使用 &#x1f4d5; 父类成员访问 &#x1f4d5; super关键字 &#x1f4d5; supe…

laravel 查询数据库

数据库准备 插入 三行 不同的数据 自行搭建 laravel 工程 参考 工程创建点击此处 laravel 配置 数据库信息 DB_CONNECTIONmysql #连接什么数据库 DB_HOST127.0.0.1 # 连接 哪个电脑的 ip &#xff08;决定 电脑 本机&#xff09; DB_PORT3306 # 端口 DB_DATABASEyanyu…

【记录】VSCode|自用设置项

文章目录 1 基础配置1.1 自动保存1.2 编辑区自动换行1.3 选项卡换行1.4 空格代替制表符1.5 开启滚轮缩放 2 进阶设置2.1 选项卡不自我覆盖2.2 选项卡限制宽度2.3 选项卡组限制高度2.4 字体设置2.5 字体加粗2.6 侧边栏2.7 沉浸式代码模式 Zen Mode2.8 设置 Zen 模式的选项卡组 3…

filebeat接入nginx和mysql获取日志

下载nginx &#xff08;1&#xff09; 直接下载 yum install nginx -y&#xff08;2&#xff09;查看状态启动 systemctl start nginx systemctl status nginx&#xff08;3&#xff09;配置文件检查 nginx -t&#xff08;4&#xff09;端口检查 netstat -tulpn | grep :80&am…

Flutter项目打包ios, Xcode 发布报错 Module‘flutter barcode_scanner‘not found

报错图片 背景 flutter 开发的 apple app 需要发布新版本&#xff0c;但是最后一哆嗦碰到个报错&#xff0c;这个小问题卡住了我一天&#xff0c;之间的埪就不说了&#xff0c;直接说我是怎么解决的&#xff0c;满满干货 思路 这个报错 涉及到 flutter_barcode_scanner; 所…

携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议

近日&#xff0c;上海和今信息科技有限公司&#xff08;以下简称“和鲸科技”&#xff09;与北京智谱华章科技有限公司&#xff08;以下简称“智谱 AI”&#xff09;签署“101 数智领航计划”战略合作协议。双方将携手营造智能化学科教育与科研环境&#xff0c;提供多种大模型工…

前后端联调需要改ip联调多个后端,用nginx代理

前后端联调需要改ip联调多个后端 Nginx #user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; }http {include mime…

空洞卷积:Atrous/Dilated convolution - 语义分割中多用到

没办法&#xff0c;我还是很多基础的、底层的模块不通透&#xff0c;读论文难免会受到阻碍&#xff0c;而且这现在科研任务很急了&#xff0c;必须要马上动手实验&#xff0c;全给我弄明白、特别是算法&#xff01; 空洞卷积-可变形卷积-这一个个我都要。 空洞卷积据说在语义分…

MySQL企业常见架构与调优经验分享

文章目录 一、选择 PerconaServer、MariaDB 还是 MYSQL二、常用的 MYSQL 调优策略三、MYSOL 常见的应用架构分享四、MYSOL 经典应用架构 观看学习课程的笔记&#xff0c;分享于此~ 课程&#xff1a;MySQL企业常见架构与调优经验分享 mysql官方优化文档 一、选择 PerconaServer、…

机器学习与深度学习2:梯度下降算法和BP反向传播算法

梯度下降算法&#xff1a; 算法原理 上一章我们已知神经网络算法就是求解拟合函数&#xff0c;通过线性变换和非线性变换来得出损失函数最小的模型。那么是如何进行求解的呢&#xff0c;其中之一就是梯度下降算法。 如图&#xff0c;当我们需要求解拟合曲线时&#xff0c;如何…

Verilog基础:层次化标识符的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 一、前言 Verilog HDL中的标识符(identifier)是一个为了引用而给一个Verilog对象起的名字&#xff0c;分为两大类&#xff1a;普通标识符大类和层次化标识符大类。…

HarmonyOS NEXT 应用开发实战(六、组件导航Navigation使用详解)

在鸿蒙应用开发中&#xff0c;Navigation 组件是实现界面间导航的重要工具。本文将介绍如何使用 Navigation 组件实现页面跳转及参数传递&#xff0c;确保你能轻松构建具有良好用户体验的应用。 当前HarmonyOS支持两套路由机制&#xff08;Navigation和Router&#xff09;&…

字典学习算法

分为固定基字典和学习型字典 学习型字典 是指通过训练大量与目标数据相似的数据&#xff0c;学习其特征获得的字典。字典学习主要包括两个阶段&#xff0c;一个是字典构建阶段&#xff0c;一个是利用字典进行样本表示阶段。 首次提出&#xff1a;最优方向法&#xff08;Method …

Euporie 是一款功能强大、使用便捷的终端 Jupyter 交互工具,让Jupyter Notebook在终端下运行

在现代数据科学领域&#xff0c;Jupyter Notebook 已成为不可或缺的工具&#xff0c;它以其强大的交互性、可读性和可移植性而闻名。然而&#xff0c;在某些场景下&#xff0c;例如远程服务器、容器环境或仅仅个人偏好&#xff0c;使用终端进行操作更便捷。 Euporie 应运而生&a…

spring day 1021

ok了家人们&#xff0c;这周学习spring框架&#xff0c;我们一起去看看吧 Spring 一.Spring概述 1.1 Spring介绍 官网&#xff1a; https://spring.io/ 广义的 Spring &#xff1a; Spring 技术栈 &#xff08;全家桶&#xff09; 广义上的 Spring 泛指以 Spring Framework…

STM32L010F4 最小系统设计

画一个 STM32L010F4 的测试板子...... by 矜辰所致前言 最近需要用到一个新的 MCU&#xff1a; STM32L010F4 &#xff0c;上次测试的 VL53L0X 需要移植到这个芯片上&#xff0c;网上一搜 STM32L010F4&#xff0c;都是介绍资料&#xff0c;没有最小系统&#xff0c;使用说明等。…