Bài toán
Link đến bài toán: 1535. Find the Winner of an Array Game
Phân tích
Vẫn như mấy bài trước của tháng 11 này, bài này khó hiểu nhất là phần đọc đề.
Bài này là một bài dạng simulation
, tức là ta sẽ giả lập lại quá trình thực hiện của bài toán.
Để làm được điều này, mình có thể dùng một deque
để lưu trữ các giá trị của mảng, và một biến max
để lưu giá trị lớn nhất của mảng.
Tuy nhiên, nếu để ý kĩ, ta có thể nhận ra ta không cần phải stimulate
đầy đủ.
Nếu k < n
, ta stimulate
như bình thường, nhưng nếu k >= n
, ta chỉ cần tìm giá trị lớn nhất của mảng là được.
Giải thuật
- Đặt
max = arr[0]
- Đặt
count = 0
để đếm streak - Duyệt mảng từ
arr[1:]
:- Nếu
count == k
:- Trả về
max
- Trả về
- Nếu
v > max
:- Gán
max = v
- Gán
count = 1
- Gán
- Nếu không:
- Tăng
count
lên 1
- Tăng
- Nếu
- Trả về
max
func getWinner(arr []int, k int) int {
max := arr[0]
count := 0
for _, v := range arr[1:] {
if count == k {
return max
}
if v > max {
max = v
count = 1
} else {
count++
}
}
return max
}