Di komentar, kalian menyajikan hampir semua cara untuk menyelesaikan masalah yang bisa dibayangkan.
Tentu saja, pola klasik untuk menyelesaikannya di sini adalah dua pointer.
Inilah solusi ideal dengan kompleksitas
O(n) dalam waktu dan O(1) dalam memori:def move_zeroes(nums: list[int]) -> None:
insert_pos = 0
for i in range(len(nums)):
if nums[i] != 0:
# Tukar elemen bukan nol dengan nol "kiri"
nums[insert_pos], nums[i] = nums[i], nums[insert_pos]
insert_pos += 1Tidak ada alokasi. Tidak ada
pop() dari tengah daftar. Kita melintasi array tepat satu kali. Variabel insert_pos selalu menunjuk ke nol pertama yang tersedia. Begitu kita menemukan angka yang bukan nol — kita cukup menukarnya berkat mekanisme pembongkaran tuple bawaan Python.🐍 Tapi akan kurang menarik tanpa sesuatu yang lebih licik. Berikut ini fleks Python dalam satu baris tanpa generator:
nums.sort(key=bool, reverse=True)Bagaimana cara kerjanya?
bool(0) menghasilkan False, angka lainnya — True. Pengurutan bawaan Timsort di Python stabil — ia mempertahankan urutan asli elemen yang sama. Semua True (angka) akan bergerak ke kiri, mempertahankan urutannya, dan semua False (nol) akan terbang ke kanan. Ya, secara formal kompleksitasnya O(n log n), yang secara algoritmik lebih buruk daripada dua pointer. Namun karena Timsort ditulis dalam C yang sangat cepat, pada daftar nyata dengan volume kecil, kode ini secara fisik akan mengalahkan loop Python murni dalam kecepatan eksekusi.
#algosobes
Komentar
0Belum ada komentar.
Masuk untuk ikut berdiskusi.