1.移动零

ops/2025/1/23 17:01:05/

LeetCode 283. 移动零

1. 题目描述

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

注意:必须在 原地 对数组进行操作,不得额外分配新数组。

示例

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示

  • 1 <= nums.length <= 10⁴
  • -2³¹ <= nums[i] <= 2³¹ - 1

2. 解题思路

为了在原地移动数组中的零,我们可以使用双指针法:

在这里插入图片描述

  • 核心思路
    • 定义两个指针:
      1. cur:用于遍历数组。
      2. dest:记录当前非零元素的插入位置。
    • 在遍历过程中:
      • 如果 nums[cur] 为非零,则将其与 nums[dest] 交换,同时 dest 向前移动一位。
      • 如果 nums[cur] 为零,则跳过该元素。
    • 最终所有非零元素会移动到数组前部,dest 后的所有元素自动变为零。
  • 数组区间划分
    • [0, dest]:非零元素。
    • [dest + 1, cur - 1]:处理过的零元素。

此方法只需遍历数组一次,时间复杂度为 O(n)O(n),且在原地完成操作,符合题目要求。

3. 算法代码

以下是 C++ 实现:

class Solution {
public:void moveZeroes(vector<int>& nums) {int n = nums.size();int dest = -1; // 初始化非零元素的插入位置for (int cur = 0; cur < n; ++cur) {if (nums[cur] != 0) { // 遇到非零元素时,交换到 dest 指针的位置swap(nums[++dest], nums[cur]);}}}
};

4. 题目总结

本题考察了数组的 原地操作双指针技巧,关键在于:

  1. 合理划分数组的区间。
  2. 减少无效的数组元素操作。

总结

本题考察了数组的 原地操作双指针技巧,关键在于:

  1. 合理划分数组的区间。
  2. 减少无效的数组元素操作。

通过双指针法,可以高效地解决“移动零”的问题,同时保证代码简洁易读。如果有其他问题或更优解法,欢迎交流讨论!


http://www.ppmy.cn/ops/152512.html

相关文章

试题转excel;word转excel;大风车excel(1.1更新)

更新了大风车excel1.1版本 主要优化在算法层面&#xff1a; 1.0版本试题解析的成功率为95%&#xff0c;现在1.1版本已经优化到解析成功率为99% 一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几…

HippoRAG:受海马体启发的长时记忆模型,提升大语言模型的知识整合能力

论文地址&#xff1a;https://arxiv.org/pdf/2405.14831 1. 背景与挑战 1.1 哺乳动物大脑与长时记忆 进化优势: 哺乳动物的大脑进化出强大的长时记忆系统&#xff0c;能够存储大量关于世界的知识&#xff0c;并不断整合新信息&#xff0c;同时避免灾难性遗忘。知识整合能力: …

代码随想录day15

110. 知道平衡二叉树的概念即可。 /** lc appleetcode.cn id110 langcpp** [110] 平衡二叉树*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nul…

AI赋能前端性能工程:突破技术边界,迈向智能化开发

前端性能工程对于用户体验至关重要。一个加载缓慢、反应迟钝的网站会直接导致用户流失&#xff0c;影响业务转化率。然而&#xff0c;在快速迭代的现代前端开发中&#xff0c;我们常常面临着效率瓶颈&#xff1a;代码冗余、资源加载缓慢、渲染性能低下等问题层出不穷。传统的手…

青少年CTF练习平台 PHP的XXE

访问靶场是个phpinfo()页面 题目提示是PHP的XXE&#xff0c;访问simplexml_load_string.php文件 get请求是空白&#xff0c;要使用post方法请求 尝试读取文件,读取/etc/passwd文件 <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE xxe [ &l…

Qt调用ffmpeg库实时播放rtmp或rtsp视频流

参考链接 https://blog.csdn.net/u012532263/article/details/102736700

并发任务管理:`submit()` 和 `invokeAll()` 的对比

并发任务管理&#xff1a;submit() 和 invokeAll() 的对比 在 Java 中&#xff0c;使用多线程执行并发任务是提高性能的常用手段。本文将深入探讨 submit() 和 invokeAll() 的使用场景、执行方式及其优缺点&#xff0c;并通过示例和对比帮助理解如何在实际开发中选择合适的方法…

机器学习练习day1

使用scikit-learn中的KNN包实现对鸢尾花数据集或者自定义数据集的的预测 KNN算法有三要素&#xff1a;1.K值选择&#xff1b;2.距离选择&#xff1b;3.分类规则选择。 步骤1 导入数据集 步骤2 将数据集设置标签 步骤3 设置超参数 代码 from sklearn.neighbors import KNei…