[LeetCode283算法题]移动0元素(冒泡思想)

发布于 / 算法 / 0条评论 / Tags: none / 42 次浏览

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数

解题思路1---暴力解法

1.遍历nums,碰到0,位置i,记录为第j个0,
2.如现在为第一个0
3.把i+1 和n-j-1 个元素前移
4.把第n-j个元素设置为0
5.继续从第i个位置查找0 ,重复1-4
6.直到i ==n-j,终止

static void moveZeroes(int[] nums){
        int j = 0;
        int i = 0;
        int n = nums.length;
        //寻找非0
        while(  i < n-j ){
            if(nums[i] != 0){
                i++;
                continue;
            }
            j++;
            //碰到0 ,前移
            for(int k = i;k < n-j;k++){
                 nums[k] = nums[k+1];
            }
            nums[n-j] =0;
        } 
    }
  • 这种解法为O(n^2),肯定不是最优解
解题思路2---优化---类似冒泡思想

1.i,j=0,从第i个开始遍历数组,j表示前面j-1个都已经替换为非0了
2.1判断num[i]为非0,把num[i] 放入nums[j],j++,然后把nums[i]置为0
2.2这里要注意i==j的情况,表示第i个前面一直都是非0,不要把nums[i]置为0
3.遍历到结束

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

    评论区(暂无评论)