askri79
Đã tốn tiền
Bài này tự chế được hướng giả nên không quay cóp. Tự chế:
- Một mảng đẹp thì nó có k phần tử lẻ, vd k = 2: [2, 2, 2, 1, 2, 1, 2, 2, 2]
Thì nó sẽ có 16 trường hợp:
[1, 2, 1], [2, 1, 2, 1, 2]...
Công thức: (Số phần tử chẵn bên trái + 1) * (Số phần tử chẵn bên phải + 1) = (3 + 1) * (3 + 1) = 16.
Mình start biến đếm từ 1 luôn để đỡ cộng 1.
Lúc đầu mình chỉ xài biến để lưu left, right, nhưng trường hợp mấy số chẵn len giữa số lẻ thì nảy sinh ra nhu cầu cần xài mảng để lưu lại số lượng số chẵn.
Bây giờ hình dung ta có mảng đếm số lượng số chẵn kẹp giữa số lẻ, start biến đếm là 1. Theo như vd trên:
[2, 2, 2, 1, 2, 1, 2, 2, 2] => evens = [4, 2, 4]
Hình dung có 1 số lẻ kẹp giữa 2 phần tử mảng even trên. 4 (1) 2 (1) 4. Để ra kết quả: Khi số lượng của mảng count even đã > k (lúc này có k số lẻ kẹp giữa). Lấy left = đầu mảng, right = cuối mảng.
Nhân left với right, đưa vào result.
Nhớ bỏ phần tử đầu tiên của mảng even vì nó đã hết tác dụng.
Sau cùng, duyệt xong mảng nums thì gọi một lần nữa ở bên ngoài. Trong trường hợp mảng kết thúc bằng số chẵn và số lượng số lẻ đã đạt k.
- Một mảng đẹp thì nó có k phần tử lẻ, vd k = 2: [2, 2, 2, 1, 2, 1, 2, 2, 2]
Thì nó sẽ có 16 trường hợp:
[1, 2, 1], [2, 1, 2, 1, 2]...
Công thức: (Số phần tử chẵn bên trái + 1) * (Số phần tử chẵn bên phải + 1) = (3 + 1) * (3 + 1) = 16.
Mình start biến đếm từ 1 luôn để đỡ cộng 1.
Lúc đầu mình chỉ xài biến để lưu left, right, nhưng trường hợp mấy số chẵn len giữa số lẻ thì nảy sinh ra nhu cầu cần xài mảng để lưu lại số lượng số chẵn.
Bây giờ hình dung ta có mảng đếm số lượng số chẵn kẹp giữa số lẻ, start biến đếm là 1. Theo như vd trên:
[2, 2, 2, 1, 2, 1, 2, 2, 2] => evens = [4, 2, 4]
Hình dung có 1 số lẻ kẹp giữa 2 phần tử mảng even trên. 4 (1) 2 (1) 4. Để ra kết quả: Khi số lượng của mảng count even đã > k (lúc này có k số lẻ kẹp giữa). Lấy left = đầu mảng, right = cuối mảng.
Nhân left với right, đưa vào result.
Swift:
result += left * right
//4 * 4 = 16
Nhớ bỏ phần tử đầu tiên của mảng even vì nó đã hết tác dụng.
Sau cùng, duyệt xong mảng nums thì gọi một lần nữa ở bên ngoài. Trong trường hợp mảng kết thúc bằng số chẵn và số lượng số lẻ đã đạt k.
Swift:
class Solution {
func numberOfSubarrays(_ nums: [Int], _ k: Int) -> Int {
var result = 0
var countOdd = 0
var storeListEvens:[Int] = []
var storeEven = 1
for (index, value) in nums.enumerated() {
if value%2 == 1 {
countOdd += 1
// Add storeEven in to list & reset counter
storeListEvens.append(storeEven)
storeEven = 1
// Now we have enough k odds.
if storeListEvens.count > k {
let left = storeListEvens.first!
let right = storeListEvens.last!
storeListEvens.removeFirst()
result += left * right
countOdd -= 1
}
} else {
storeEven += 1
}
}
if storeListEvens.count == k {
let left = storeListEvens.first!
let right = storeEven // List nums doesn't end by an odd, so the even count remain here.
result += left * right
}
return result
}
}
Last edited: