LeetCode 1089. 复写零

题目描述

1089. 复写零

思路分析

解法一:双指针从后向前写入(推荐)

核心思路

  • 统计在“扩展数组”中能写入的元素数量。
  • 使用双指针从后向前写入,避免覆盖未处理元素。
  • 遇到 0 时写入两次。


复杂度分析

  • 时间复杂度:O(n),其中 n 表示数组长度。
  • 空间复杂度:O(1),原地修改。
class Solution {
    public void duplicateZeros(int[] arr) {
        int n = arr.length;
        int i = 0;
        int j = 0;

        while (j < n) {
            if (arr[i] == 0) {
                j += 2;
            } else {
                j += 1;
            }
            i++;
        }

        i--;
        j--;

        while (i >= 0) {
            if (j < n) {
                arr[j] = arr[i];
            }
            if (arr[i] == 0) {
                j--;
                if (j < n) {
                    arr[j] = 0;
                }
            }
            i--;
            j--;
        }
    }
}
func duplicateZeros(arr []int) {
	n := len(arr)
	i, j := 0, 0

	for j < n {
		if arr[i] == 0 {
			j += 2
		} else {
			j += 1
		}
		i++
	}

	i--
	j--

	for i >= 0 {
		if j < n {
			arr[j] = arr[i]
		}
		if arr[i] == 0 {
			j--
			if j < n {
				arr[j] = 0
			}
		}
		i--
		j--
	}
}

相似题目

题目 难度 考察点
1089. 复写零 简单 原地数组
283. 移动零 简单 双指针
80. 删除有序数组中的重复项 II 中等 双指针
26. 删除有序数组中的重复项 简单 双指针
905. 按奇偶排序数组 简单 双指针
本文作者:
本文链接: https://hgnulb.github.io/blog/2022/41436715
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!