Transpose Matrix
Kamu menerima matriks bilangan bulat sebagai list baris: matrix[i][j] adalah nilai pada baris i, kolom j. Kembalikan transposenya: nilai pada baris i, kolom j berpindah ke baris j, kolom i, sehingga setiap baris menjadi kolom. Matriks tidak harus berbentuk persegi: matriks m × n menjadi matriks n × m.
Fungsi
- matrixinteger-2d-array
- matriks m × n, sebagai list yang terdiri dari m baris berisi n bilangan bulat
- Mengembalikaninteger-2d-array
- transpose berukuran n × m, sebagai list yang terdiri dari n baris berisi m bilangan bulat
Batasan
1 ≤ m, n ≤ 1000, denganm = matrix.lengthdann = matrix[i].lengthm × n ≤ 5000- Setiap baris memiliki panjang yang sama, yaitu
n. -1000 ≤ matrix[i][j] ≤ 1000
Contoh
- Input
- matrix = [[1, 2, 3], [4, 5, 6]]
- Output
- [[1, 4], [2, 5], [3, 6]]
- Penjelasan
- Baris
[1, 2, 3]menjadi kolom pertama dan[4, 5, 6]menjadi kolom kedua. Jika dibaca baris demi baris, hasilnya adalah[1, 4],[2, 5],[3, 6]: matriks 3 × 2.
- Input
- matrix = [[1, 2], [3, 4]]
- Output
- [[1, 3], [2, 4]]
- Penjelasan
- Nilai diagonal 1 dan 4 tetap di tempatnya. Dua nilai lainnya bertukar tempat: 2 berpindah dari baris 0, kolom 1 ke baris 1, kolom 0, dan 3 berpindah ke arah sebaliknya.
Pertanyaan lanjutan
Misalkan matriks disimpan sebagai satu array datar yang berisi m × n nilai, baris demi baris. Bisakah kamu mentransposisi matriks nonpersegi di dalam array tersebut tanpa array kedua?
Petunjuk
Buka satu per satu. Setiap petunjuk mengungkap sedikit lebih banyak.
Jika input memiliki
mbaris dannkolom, berapa banyak baris dan kolom yang dimiliki jawabannya?Bandingkan posisi nilai sebelum dan sesudah: nilai pada baris
i, kolomjberpindah ke barisj, kolomi.Buat hasil dengan
nbaris yang masing-masing berisimnilai, lalu lakukan perulangan pada setiap sel input dan salinmatrix[i][j]ke dalamresult[j][i].
Solusi
Transposisi tidak menghitung apa pun: nilai pada (i, j) berpindah ke (j, i). Yang berubah adalah bentuknya. Hasilnya memiliki n baris dengan panjang m, jadi list baris yang tidak berbentuk persegi tidak dapat ditransposisikan langsung; buat matriks baru dengan ukuran yang ditukar, lalu isi.
Baca matriks satu kolom setiap kali
Intuisi
Baris j pada jawaban adalah kolom j pada input, dibaca dari atas ke bawah. Untuk [[1, 2, 3], [4, 5, 6]], kolom 0 dibaca 1 lalu 4, jadi baris pertama jawaban adalah [1, 4].
Setiap nilai dibaca sekali dan ditulis sekali: waktu O(m × n), dan ruang O(m × n) untuk hasilnya. Saat membangun setiap baris baru, kamu melompati setiap baris input alih-alih membacanya satu per satu, yang merupakan cara lebih lambat untuk mengakses memori.
Algoritma
- Misalkan
madalah jumlah baris dannadalah panjang satu baris. - Untuk setiap kolom
jdari0hinggan-1, mulai dengan list kosong. - Tambahkan
matrix[i][j]ke dalamnya untuk setiapidari0hinggam-1. - Tambahkan list tersebut ke hasil sebagai baris
j, lalu kembalikan hasil setelah kolom terakhir.
def transpose(matrix):
m, n = len(matrix), len(matrix[0])
result = []
for j in range(n):
# Column j, read top to bottom, becomes row j of the answer.
column = []
for i in range(m):
column.append(matrix[i][j])
result.append(column)
return resultIsi grid n × m baru dengan mencerminkan setiap sel
Intuisi
Buat hasil berukuran n × m terlebih dahulu, lalu baca input sesuai urutan penyimpanannya, baris demi baris, dan tempatkan setiap nilai pada alamat cerminnya: result[j][i] = matrix[i][j]. Ini benar karena transposisi tepat merupakan pertukaran indeks ini, yang diterapkan sekali pada setiap sel.
Setiap nilai disalin satu kali, jadi waktunya adalah O(m × n), dan matriks memerlukan ruang O(m × n) untuk output. Membaca sepanjang baris mengunjungi memori sesuai urutan penyimpanannya, dan setiap baris hasil dialokasikan satu kali dengan ukuran akhirnya.
Algoritma
- Misalkan
madalah jumlah baris dannadalah panjang satu baris. - Buat
resultdengannbaris, masing-masing berisimnilai. - Untuk setiap baris
idan setiap kolomjpada input, tetapkanresult[j][i] = matrix[i][j]. - Kembalikan
result.
def transpose(matrix):
m, n = len(matrix), len(matrix[0])
# The answer has n rows of m values each.
result = [[0] * m for _ in range(n)]
for i in range(m):
for j in range(n):
result[j][i] = matrix[i][j]
return result
Jebakan dan kasus tepi
- Membuat hasil dengan bentuk yang sama seperti input. Untuk contoh 2 × 3, menulis
result[2][0]mengakses indeks di luar batas: hasilnya memerlukannbaris yang masing-masing memiliki panjangm. - Menukar
matrix[i][j]denganmatrix[j][i]secara langsung. Cara ini hanya berlaku jikam = n, dan hanya untuk sel denganj > i; perulangan pada setiap sel akan menukar setiap pasangan dua kali dan mengembalikan matriks seperti semula. - Di Python,
[[0] * m] * nmembuatnreferensi ke satu list, jadi menulis satu sel akan mengubah seluruh kolom. Buat setiap baris secara terpisah. - Di C, pemanggil membaca
*returnSizesebagai jumlah baris hasil,n, dan(*returnColumnSizes)[j]sebagai panjang setiap baris,m.
Pertanyaan yang sering diajukan3
Apa transpose dari sebuah matriks?
Ini adalah matriks yang kamu dapatkan dengan menukar baris dan kolom: nilai pada baris i, kolom j berpindah ke baris j, kolom i. Matriks 2 × 3 menjadi 3 × 2, dan mentranspos matriks dua kali akan menghasilkan matriks semula.
Berapa kompleksitas waktu untuk mentransposisi matriks?
O(m × n): setiap nilai m × n disalin satu kali, dan tidak ada yang lebih sedikit yang dapat menghasilkan jawaban. Matriks baru membutuhkan ruang O(m × n), sebesar ukuran output itu sendiri.
Bisakah kamu melakukan transpose matriks secara langsung?
Untuk matriks persegi, ya: tukar matrix[i][j] dengan matrix[j][i] untuk setiap sel di atas diagonal, dengan memori tambahan O(1). Matriks yang tidak persegi berubah bentuk, jadi jika menggunakan list baris, kamu memerlukan matriks baru.
Soal serupa
Soal yang memakai ide yang sama. Mengerjakan dua atau tiga di antaranya membuat polanya melekat.
def transpose(matrix):
# Tulis kodemu di siniTes #1
Tes #2
Argumen
matrix = [[1, 2, 3], [4, 5, 6]]
Output yang diharapkan
[[1, 4], [2, 5], [3, 6]]