数组移动元素算法详解

举报
Linux猿 发表于 2021/12/17 22:42:09 2021/12/17
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)🚀 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬



🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏:LeetCode面试必备100题 (优质好文持续更新中……)🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


一、题目描述

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

约束:

(1)必须在原数组上操作,不能拷贝额外的数组;

(2)尽量减少操作次数;

二、测试样例

输入: [0,1,0,3,12]

输出: [1,3,12,0,0]

说明: 将输入中的两个 0 移动到数组最后,其它元素顺序不变

三、算法思路

本题在限制条件中约束较多,从约束中不难看出,实际采用的算法不需要额外的数组来存储,只能通过遍历有限次数组来解决。

使用变量 num 统计已访问元素中 0  的个数,如果当前元素非 0,那么,前面 num 个元素必定也为 0,将 nums[i] 与 nums[i - num] 交换即可,交换后继续遍历剩余的元素,直到遍历完所有元素。

四、代码实现

#include <iostream>
#include <vector>
using namespace std;


class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int num = 0;
        for(int i = 0; i < nums.size(); ++i) {
            if(nums[i]) {
                swap(nums[i], nums[i-num]);
            } else {
                num++;
            }
        }
    }
};

int main()
{
    int a[] = {0, 1, 0, 3, 12};
    vector<int>nums(a, a+5);
    Solution obj;
    obj.moveZeroes(nums);
    for(int i = 0; i < nums.size(); ++i) {
        cout<<nums[i]<<" ";
    }
    cout<<endl;
    return 0;
}

五、复杂度分析

5.1 时间复杂度

时间复杂度为:O(n),其中,n 为 数组长度,在上述算法中,只遍历了一遍数组,故时间复杂度为O(n)。

5.2 空间复杂度

空间复杂度为:O(1),在上述算法中仅仅使用到了变量 num 来统计已遍历元素 0 的个数,可以忽略,故空间复杂度为 O(1)。

六、总结

​本题主要考查对数组操作的理解,比较简单!


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。