【LeetCode】Move Zeroes 解题报告

Move Zeroes

[LeetCode]

https://leetcode.com/problems/move-zeroes/

Total Accepted: 77443 Total Submissions: 175420 Difficulty: Easy

Question

Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.

For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].

Note:
You must do this in-place without making a copy of the array.
Minimize the total number of operations.

Ways

in-place的把0放到数组的最后,其他顺序不变。用两个指针。

方法一

两个指针,一个指向开始,一个指向结尾。开始这个判断是否为零,如果是零,就把其余的数据往前排,零放到末尾,开始和结尾指针向中间移动。开始这个不是零的话,就开始指针后移,结尾不变。直到两个指针重合为止。

算法效率较低,原因在于所有的数据往前移动,需要耗时。

public class Solution {
    public void moveZeroes(int[] nums) {
        int start=0;
        int end=nums.length-1;
        while(start!=end){
            if(nums[start]==0){
                 for(int j=start+1;j<=end;j++){
                     nums[j-1]=nums[j];
                 }
                 nums[end]=0;
                 end--;
            }else{
                start++;
            }
        }

    }
}

AC:21ms

方法二

使用两个指针遍历数组,一个指向数值为0的元素,另一个指向数值不为0的元素,在遍历的过程中,不断交换两个指针的值。

【LeetCode】Move Zeroes 解题报告_第1张图片

这个比我的算法一简单,以为不需要把所有的数据进行搬移,只需要搬移正的数据。

public class Solution {
    public void moveZeroes(int[] nums) {
        int zero = 0;
        while (zero < nums.length && nums[zero] != 0) {
            zero++;
        }
        int non_zero = zero + 1;//非零的数值开始的位置应该在零值的后头,这样交换才有意义
        while (non_zero < nums.length && nums[non_zero] == 0) {
            non_zero++;
        }
        while (zero < nums.length && non_zero < nums.length) {
            int temp = nums[zero];
            nums[zero] = nums[non_zero];
            nums[non_zero] = temp;
            while (nums[non_zero] == 0) {//寻找下一个非零数值
                non_zero++;
                if (non_zero >= nums.length) {
                    return;//找不到说明已经排好序了
                }
            }
            zero++;
        }
    }
}

AC:1ms

这个算法竟然写了一个小时。。崩溃。主要注意while里边进行判断,不要溢出。

Date

2016/4/30 0:17:23

你可能感兴趣的:(LeetCode)