Richest Customer Wealth
Sebuah bank menyimpan grid accounts dengan m baris, satu untuk setiap nasabah, dan n kolom, satu untuk setiap bank: accounts[i][j] adalah jumlah uang yang dimiliki nasabah i di bank j. Kekayaan seorang nasabah adalah total nilai pada barisnya. Kembalikan kekayaan nasabah terkaya.
Fungsi
- accountsinteger-2d-array
- tabel saldo, satu baris untuk setiap pelanggan dan satu kolom untuk setiap bank
- Mengembalikaninteger
- total baris terbesar
Batasan
1 ≤ accounts.length ≤ 1001 ≤ accounts[i].length ≤ 100, dan setiap baris memiliki panjang yang sama.0 ≤ accounts[i][j] ≤ 104
Contoh
- Input
- accounts = [[2, 8, 1], [5, 5, 4], [7, 0, 3]]
- Output
- 14
- Penjelasan
- Jumlah setiap baris adalah
11,14, dan10. Pelanggan di tengah memiliki kekayaan terbesar dengan14, meskipun saldo tunggal terbesar,8, dimiliki orang lain.
- Input
- accounts = [[3], [9], [4]]
- Output
- 9
- Penjelasan
- Setiap pelanggan menggunakan satu bank, jadi totalnya adalah
3,9, dan4, dan jawabannya adalah9.
Petunjuk
Buka satu per satu. Setiap petunjuk mengungkap sedikit lebih banyak.
Angka mana yang termasuk milik satu pelanggan, satu baris atau satu kolom pada kisi?
Jumlahkan setiap baris untuk mengetahui kekayaan satu pelanggan. Kamu tidak perlu menggunakan dua baris secara bersamaan.
Simpan satu variabel untuk total terbesar sejauh ini. Jumlahkan satu baris, bandingkan, lalu lanjutkan ke baris berikutnya.
Solusi
Setiap saldo hanya dimiliki oleh satu pelanggan, jadi kamu harus membaca seluruh grid: tidak ada pendekatan yang lebih cepat daripada waktu O(m × n). Pilihannya adalah seberapa banyak yang kamu simpan saat membaca. Hanya total terbesar yang ditemukan sejauh ini yang penting, jadi satu angka sudah cukup.
Daftarkan semua total, lalu pilih yang terbesar
Intuisi
Telusuri setiap baris, jumlahkan saldo di dalamnya, lalu simpan satu total untuk setiap pelanggan: [11, 14, 10] untuk contoh pertama. Lalu telusuri list itu untuk mencari nilai terbesarnya, 14.
Setiap saldo dari m × n dijumlahkan satu kali, jadi waktunya tidak masalah. Biayanya adalah list tersebut, m angka tambahan yang kamu simpan hanya untuk membuang semua kecuali satu.
Algoritma
- Buat list kosong
totals. - Untuk setiap baris, jumlahkan saldonya dan tambahkan hasilnya ke
totals. - Mulai dengan
richestyang berisi total pertama. - Ganti
richestdengan total yang lebih besar, lalu kembalikan nilainya.
def maximumWealth(accounts):
# First pass: every customer's total wealth.
totals = []
for customer in accounts:
wealth = 0
for money in customer:
wealth += money
totals.append(wealth)
# Second pass: the largest total.
richest = totals[0]
for wealth in totals:
if wealth > richest:
richest = wealth
return richestPertahankan nilai maksimum saat ini
Intuisi
Setelah total suatu baris diketahui, satu-satunya pertanyaan adalah apakah total itu lebih besar daripada total terbaik sejauh ini. Segera bandingkan dan simpan satu angka, richest. Pada contoh pertama, nilai richest berubah menjadi 0 → 11 → 14 dan tetap 14 saat jumlah baris terakhir adalah 10.
Memulai richest dari 0 aman karena tidak ada saldo yang negatif, jadi setiap total setidaknya 0 dan grid yang berisi nol akan menghasilkan 0. Jika saldo bisa negatif, kamu akan memulai dari total baris pertama.
Algoritma
- Atur
richestke0. - Untuk setiap baris, jumlahkan semua saldonya ke dalam
wealth. - Jika
wealth > richest, aturrichestkewealth. - Setelah baris terakhir, kembalikan
richest.
def maximumWealth(accounts):
richest = 0 # money is never negative, so 0 is a safe start
for customer in accounts:
richest = max(richest, sum(customer))
return richest
Jebakan dan kasus tepi
- Menjumlahkan kolom, bukan baris. Satu kolom mewakili satu bank untuk semua pelanggan. Dalam contoh pertama, jumlah setiap kolom adalah
14,13, dan8, dan jumlah kolom pertama cocok dengan jawaban hanya karena kebetulan. - Mengembalikan saldo tunggal terbesar.
8adalah angka terbesar dalam grid pertama, tetapi pemiliknya memiliki total11, lebih kecil daripada14milik pelanggan yang saldo di satu bank pun tidak lebih dari5. - Mengatur ulang total baris di tempat yang salah. Atur
wealthmenjadi0di dalam perulangan baris, sebelum perulangan bagian dalam. Atur sekali di luar perulangan, dan setiap pelanggan akan mewarisi uang pelanggan sebelumnya.
Pertanyaan yang sering diajukan3
Apa kompleksitas waktu dari Richest Customer Wealth?
O(m × n) untuk m pelanggan dan n bank, karena setiap saldo dijumlahkan satu kali. Tidak ada algoritma yang bisa melewatkan sel, karena saldo yang dilewatkan bisa saja membuat pemiliknya menjadi yang terkaya. Nilai maksimum yang terus diperbarui menggunakan ruang tambahan O(1).
Bagaimana cara mencari jumlah baris maksimum dari array 2D?
Lakukan perulangan pada setiap baris, jumlahkan setiap baris, lalu simpan jumlah terbesar dalam sebuah variabel. Banyak bahasa mempersingkat perulangan bagian dalam dengan sum bawaan, seperti max(sum(row) for row in accounts) dalam Python. Apa pun caranya, kamu membaca setiap sel satu kali.
Apakah jumlahnya dapat melampaui batas bilangan bulat 32-bit?
Bukan di sini. Satu baris memiliki paling banyak 100 saldo, masing-masing paling banyak 10^4, jadi totalnya paling banyak 10^6, jauh di bawah 2^31 - 1. Dengan batas yang lebih besar, kamu akan menjumlahkannya ke dalam bilangan bulat 64-bit.
Soal serupa
Soal yang memakai ide yang sama. Mengerjakan dua atau tiga di antaranya membuat polanya melekat.
def maximumWealth(accounts):
# Tulis kodemu di siniTes #1
Tes #2
Argumen
accounts = [[2, 8, 1], [5, 5, 4], [7, 0, 3]]
Output yang diharapkan
14