Cho mảng số nguyên độ dài cố định. Nhân bản mỗi số 0: chèn thêm 0 ngay sau nó, dịch các phần tử phía phải. Phần tử vượt quá độ dài mảng gốc bị loại bỏ.
Ví dụ: [1,0,2,3,0,4,5,0] → [1,0,0,2,3,0,0,4] (2 zero đầu nhân bản, zero cuối bị cắt do hết chỗ).
Thuật toán (O(n) time, O(n) space - dễ hiểu)
- Sao chép mảng gốc →
arr2 - Duyệt
arr2với con trỏj, ghi vàoarrvới con trỏi - Nếu
arr2[j] == 0: ghi 2 lần 0 vàoarr[i],arr[i+1](nếu còn chỗ) - Ngược lại: ghi
arr2[j]
Ví dụ (Python)
class Solution(object):
def duplicateZeros(self, arr):
arr2 = arr[:] # copy
i = j = 0
n = len(arr)
while i < n:
if arr2[j] == 0:
arr[i] = 0
i += 1
if i < n:
arr[i] = 0
else:
arr[i] = arr2[j]
i += 1
j += 1
return arr
ob1 = Solution()
print(ob1.duplicateZeros([1,0,2,3,0,4,5,0])) # [1, 0, 0, 2, 3, 0, 0, 4]
Thuật toán O(1) space (In-place, 2 pass)
def duplicateZeros(arr):
n = len(arr)
zeros = arr.count(0)
# Pass 1: xác định vị trí cuối cùng sẽ được ghi
i = n - 1
j = n + zeros - 1
# Pass 2: ghi từ cuối về đầu
while i >= 0:
if j < n:
arr[j] = arr[i]
if arr[i] == 0:
j -= 1
if j < n:
arr[j] = 0
i -= 1
j -= 1
Độ phức tạp
- Cách 1 (copy):
O(n)time,O(n)space - Cách 2 (in-place):
O(n)time,O(1)space
Đầu vào / Đầu ra
Input: [1,0,2,3,0,4,5,0] Output: [1,0,0,2,3,0,0,4]