当前位置: 首页 > news >正文

算法训练篇01 -- 力扣283.移动零

这是小生,第一次写关于算法题目的博客,有什么写的不好的地方,希望各位佬可以在评论区写下需要修改的地方,我包听话的

目录

1.题目链接:283.移动零

2.题目描述:

3.解法(快排思想:数组划分区域)

4.C++算法代码

5.算法总结


1.题目链接:283.移动零

2.题目描述:

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

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

示例 1:

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

示例 2:

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

3.解法(快排思想:数组划分区域)

算法思路:
在本题,我们用两个指针,一个cur,一个dest。cur指针来扫描整个数组,dest指针用来记录非零数序列的最后一个位置。在cur的扫描过程中,我们将数组分成三个区域:

算法流程:

  1. 初始化cur = 0,dest = -1(用来指向非零元素序列的最后一个位置。因为刚开始我们不知道最后一个非零元素在什么位置,因此初始化为-1)
  2. cur遍历的过程我们分为两种情况:
    a.当cur遇到的元素是0:直接让cur++。因为我们[dest+1,cur-1]的区域都是0                  b.当cur遇到非0的元素:直接让dest++(dest是非零元素的最后一个位置,所以dest++可以使得dest指向第一个0),然后用sort函数,使dest和cur位置的元素交换。再让cur++继续扫描数组。

4.C++算法代码

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int cur = 0, dest = -1;
        while(cur<nums.size())
        {
            if(nums[cur] != 0)
            {
                dest++;
                swap(nums[dest],nums[cur]);
            }
            cur++;
        }
    }
};

5.算法总结

这个方法是快排算法中,数据划分过程的重要一步。如果将快排算法拆解的话,这一段小代码就是实现快排算法的核心步骤

http://www.dtcms.com/a/75728.html

相关文章:

  • LogicFlow介绍
  • 0基础 | 上下拉电阻典型应用场景
  • Linux安装JDK17
  • SAP DOI EXCEL应用
  • [HelloCTF]PHPinclude-labs超详细WP-Level 5-http协议-2
  • Mysql:关于命名
  • CPP从入门到入土之类和对象Ⅰ
  • LLM中lora的梯度更新策略公式解析
  • 数据恢复软件有哪些?评测哪款最好用
  • 「清华大学、北京大学」DeepSeek 课件PPT专栏
  • jmeter配件元素
  • 网络编程基础(2)
  • 导出的使用
  • YOLOv11小白的进击之路(九)创新YOLO11损失函数之NWD损失函数源码解读
  • 分布式锁的实现
  • 大数据处理最容易的开源平台
  • 【从零开始学习计算机科学】软件测试(五)白盒测试
  • [K!nd4SUS 2025] Crypto
  • 手写发布订阅模式
  • MySQL使用pxc实现高可用
  • 【软件系统架构】单体架构
  • 突破 HTML 学习瓶颈:表格、列表与表单的学习进度(一)
  • 【Opencv中的Jpeg有损压缩】
  • 功能强大的电脑硬件检测及驱动安装工具
  • 【计算机视觉】工业表计读数(3)--指针及刻度关键点识别
  • Spring Boot 事务详解
  • 滑动数组-定长滑动数组
  • SSH无法使用root用户进行登陆的解决方法
  • 【HarmonyOS Next】鸿蒙应用实现弹框DialogHub详解
  • Excel(函数进阶篇):Vlookup函数进阶、TAKE嵌套SORE函数、SUBTOTAL函数、INDIRECT函数