283. Move Zeroes(C++ 和 Java解法)

本小白华中科技大学在读研究生,自然语言处理方向。现每日一更LeetCode  Top 100 Liked Questions, 旨在于通过通俗易懂的画风和诸位计算机朋友们一起成长呀,不局限某题,争取举一反三,所有Questions均呈上C++和Java解法,不足之处多多指正,共同学习。 

Example:

Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

Note:

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

解题思路:

题目要求不能用额外空间。观察移动规则,我们可以发现所有非零元素移动的距离等于它前面零的个数(如12往前移动2,因为它前面2个零),而所有零则统一移到后面。我们使用offset记录某元素前面0个数,然后移动,最后offset值代表0的总个数。时间复杂度O(n)。

C++版本

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

Java版本 

public void moveZeroes(int[] nums) {
        int offset = 0;
        for(int i = 0;i < nums.length;i++){
            if(nums[i] == 0){
                offset++;
            }
            else{
                nums[i - offset] = nums[i];
            }
        }
        for(int i = 1;i <= offset;i++){
            nums[nums.length - i] = 0;
        }
}

 

你可能感兴趣的:(LeetCode,leetcode,java,算法)