283. 移动零

题目来源

leetcode

题目描述

283. 移动零_第1张图片

题目解析

双指针

慢指针(lastnonzerofoundat)之前的所有元素都是非零的。
当前指针和慢速指针之间的所有元素都是零。

    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1){
            return;
        }
        int pre = -1; // 初始时还没有指向任何0
        int cur = 0; // 初始时指向第一个元素
        for (; cur < nums.length; cur++){
            if (nums[cur] == 0){
                if (pre == -1){
                    pre = cur;
                }
            }else{
                if (pre != -1){
                    nums[pre] = nums[cur];
                    pre++;
                    nums[cur] = 0;
                }
            }
        }
    }

在这里插入图片描述

两次遍历

我们创建两个指针i和j,第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。
第二次遍历的时候,起始位置就从j开始到结束,将剩下的这段区域内的元素全部置为0。

public 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;
		}
	}

在这里插入图片描述

快排

快速排序首先要确定一个待分割的元素做中间点x,然后把所有小于等于x的元素放到x的左边,大于x的元素放到其右边。
这里我们可以用0当做这个中间点,把不等于0(注意题目没说不能有负数)的放到中间点的左边,等于0的放到其右边。

// 注意:快排是非稳定排序

    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1){
            return;
        }

        int j = 0;
        for (int i = 0; i < nums.length; i++){
            if (nums[i] != 0){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j++] = temp;
            }
        }
    }

在这里插入图片描述
优化

    public static void moveZeroes(int[] nums) {
        if (nums == null || nums.length == 0 || nums.length == 1){
            return;
        }

        int j = 0;
        for (int i = 0; i < nums.length; i++){
            if (nums[i] != 0){
                if (i > j){
					nums[j] = nums[i];
                	nums[i] = 0;
                }
                j++;
            }
        }
    }

你可能感兴趣的:(算法与数据结构)