2019 năm 07 tháng 23 Máy m88vin - cổng game quốc tế tính
1. Mô tả bài toán Cho trước một mảng số nguyên nums đã được sắp xếp theo thứ tự tăng dần và một giá trị mục tiêu target, hãy tìm vị trí bắt đầu và kết thúc của giá trị mục tiêu trong mảng.
Yêu cầu độ phức tạp thời gian chạy của thuật toán phải đạt O(log n). Nếu không tìm thấy giá trị mục tiêu, trả về [-1, -1].
Ví Rio88 Game Bài Twin dụ 1:
Đầu vào: nums = [5,7,7,8,8,10], target = 8
Đầu ra: [3,4]
Ví dụ 2:
Đầu vào: nums = [5,7,7,8,8,10], target = 6
Đầu ra: [-1,-1]
Nguồn gốc bài toán: LeetCode
2. Ý tưởng giải quyết Bắt đầu bằng cách áp dụng phương pháp tìm kiếm nhị phân (binary search) để xác định vị trí mà giá trị mục tiêu có thể xuất hiện. Sau khi tìm thấy giá trị mục tiêu lần đầu tiên, ta sẽ di chuyển ngược lại từ vị trí đó để tìm vị trí xuất hiện đầu tiên của mục tiêu và tiếp tục di chuyển về phía trước để tìm vị trí xuất hiện cuối cùng. Cuối cùng, trả về danh sách chứa hai vị trí này.
3. Mã Net79 Club Game Bài Uy Tín Nhất 2024 nguồn Golang
func searchRange(nums []int, target int) []int {
start, end := 0, len(nums)-1
for start <= end {
mid := (start + end) / 2
if target == nums[mid] {
r := make([]int, 2)
i := mid
// Tìm vị trí xuất hiện đầu tiên
for i >= 0 && target == nums[i] {
i--
}
i++
r[0] = i
// Tìm vị trí xuất hiện cuối cùng
for i <= len(nums)-1 && target == nums[i] {
i++
}
r[1] = i - 1
return r
}
if target > nums[mid] {
start = mid + 1
continue
}
end = mid - 1
}
return []int{-1, -1}
}
Ghi chú thêm: Phương pháp này tận dụng lợi thế của việc mảng đã được sắp xếp để giảm thiểu số lần lặp qua các phần tử. Bằng cách sử dụng tìm kiếm nhị phân, chúng ta đảm bảo rằng độ phức tạp của thuật toán luôn ở mức tối ưu là O(log n), phù hợp với yêu cầu bài toán.
#Golang #Thuật_lệ