Leetcode热题——移动零

一,题目

https://leetcode.cn/problems/move-zeroes/submissions/594915685

其实就是考察随机快排那部分知识点。

二,答案

1,逐个交换(类似冒泡法)

准备两个函数,一个负责交换向量元素位置,一个负责将非零元素向前移动(最初我是想将0往后移,发现如果在移动过程中遇到0有点麻烦,所以转换思路改为移动非零元素)

代码

cpp 复制代码
class Solution {
public:
    void swap(int& a,int& b)
    {
        int x = a;
        a = b;
        b = x;
    }

    void moveHead(vector<int>& nums,int i)
    {
        while(i >= 1)
        {
            if(nums[i - 1])break;
            else swap(nums[i - 1],nums[i--]);
        }
    }
    void moveZeroes(vector<int>& nums)
    {
        for(int i = 0;i < nums.size();i++)
        {
            if(nums[i]) moveHead(nums,i);
        }
    }
};

效果

2,双指针

我的思路是直接赋值将非零数拷贝到向量前面,记录0的个数,最后将最后几个全部变为0就行了。

代码

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums)
    {
        int count = 0;
        int first = 0;
        int index = 0;
        int len = nums.size();
        while(index < len)
        {
            if(nums[index]) nums[first++] = nums[index];
            else count++;
            index++;
        }

        for(int i = 1;i <= count;i++)
        {
            nums[len - count - 1 + i] = 0;
        }
    }
};

效果

3,标准答案

cpp 复制代码
class Solution 
{
public:
    void moveZeroes(vector<int>& nums) 
    {
        // 方法二 : 前后指针的快排思想
        int prv = -1, cur = 0;
        while (cur < nums.size())
        {
            if(nums[cur] != 0)
            {
                swap(nums[++prv], nums[cur]);
            }
            cur++;
        }
    }
};
相关推荐
好学且牛逼的马9 分钟前
【Hot100 | 2 LeetCode49 字母异位词分组问题】
算法
2301_7951672019 分钟前
Rust 在内存安全方面的设计方案的核心思想是“共享不可变,可变不共享”
算法·安全·rust
czhc114007566330 分钟前
Java117 最长公共前缀
java·数据结构·算法
java 乐山34 分钟前
蓝牙网关(备份)
linux·网络·算法
云泽80840 分钟前
快速排序算法详解:hoare、挖坑法、lomuto前后指针与非递归实现
算法·排序算法
数字化脑洞实验室41 分钟前
智能决策算法的核心原理是什么?
人工智能·算法·机器学习
流烟默42 分钟前
机器学习中拟合、欠拟合、过拟合是什么
人工智能·算法·机器学习
Brianna Home43 分钟前
现代C++:从性能泥潭到AI基石
开发语言·c++·算法
再卷也是菜44 分钟前
算法基础篇(10)递归型枚举与回溯剪枝
算法·深度优先·剪枝
吃着火锅x唱着歌1 小时前
LeetCode 2016.增量元素之间的最大差值
数据结构·算法·leetcode