当前位置: 首页 > 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.算法总结

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

相关文章:

  • 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实现高可用
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 九江宜春领导干部任前公示,3人拟提名为县(市、区)长候选人
  • 辽宁盘山县一乡镇幼儿园四名老师被指多次殴打一女童,均被行拘
  • 商务部:长和集团出售港口交易各方不得规避审查
  • 缅甸内观冥想的历史漂流:从“人民鸦片”到东方灵修
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议