移动零算法求解

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 移动零算法求解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、题目要求

在这里插入图片描述

二、解体思路

1.双指针法

思路:左指针代表0元素的起始位置,右指针代表数组的遍历位置;
在没有遇到0之前,左指针和右指针的位置是相同的,此时什么都不需要做;
在遇到0之后,左指针和右指针的位置不在相同,此时需要调换位置,即把右指针的值赋值给左指针,右指针改为0,同时左指针左移一位
代码如下:

    public static void moveZeroes(int[] nums) {
        int left = 0;
        for (int right = 0;right<nums.length;right++) {
            if(nums[right]!=0){
                if(left!=right){

                    nums[left] =nums[right];
                    nums[right]=0;
                }
                left++;
            }
        }
    }

时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1)。只需要常数的空间存放若干变量

2.移除法

思路:第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j];
非0元素统计完了,剩下的都是0了,所以第二次遍历把末尾的元素都赋为0即可
代码:

        public static void moveZeroes(int[] nums) {
            if(nums==null) {
                return;
            }
            //第一次遍历的时候,j指针记录非0的个数,只要是非0的统统都赋给nums[j]
            int j = 0;
            for(int i=0;i<nums.length;++i) {
                if(nums[i]!=0) {
                    nums[j++] = nums[i];
                }
            }
            //非0元素统计完了,剩下的都是0了
            //所以第二次遍历把末尾的元素都赋为0即可
            for(int i=j;i<nums.length;++i) {
                nums[i] = 0;
            }
        }

复杂度分析
时间复杂度:O(n),其中 n 为序列长度。每个位置至多被遍历两次。
空间复杂度:O(1),只需要常数的空间存放若干变量。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/130216.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!