0704. Tìm kiếm nhị phân

  • Thẻ: Mảng, Tìm kiếm nhị phân
  • Độ khó: Dễ

Tóm tắt đề bài

Mô tả: Cho một mảng đã được sắp xếp tăng dần và một giá trị mục tiêu .

Yêu cầu: Trả về vị trí của trong mảng, nếu không tìm thấy thì trả về -1.

Giải thích:

  • Có thể giả sử tất cả các phần tử trong mảng đều không trùng lặp.
  • Độ dài của mảng nằm trong khoảng từ .
  • Mỗi phần tử trong mảng nằm trong khoảng từ .

Ví dụ:

  • Ví dụ 1:
Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 xuất hiện trong mảng nums và có chỉ số là 4
  • Ví dụ 2:
Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 không tồn tại trong mảng nums nên trả về -1

Ý tưởng giải quyết

Ý tưởng: Tìm kiếm nhị phân

Đặt hai biến leftright là hai đầu mút của mảng, tức là left = 0right = len(nums) - 1, đại diện cho khoảng tìm kiếm là (đóng ở bên trái và đóng ở bên phải).

Lấy vị trí giữa của hai biến leftright, tức là mid = (left + right) // 2, trước tiên so sánh giá trị tại vị trí giữa nums[mid] với giá trị mục tiêu target.

  • Nếu target == nums[mid], trả về vị trí giữa trực tiếp.
  • Nếu target > nums[mid], đặt left = mid + 1, sau đó tiếp tục tìm kiếm trong khoảng bên phải .
  • Nếu target < nums[mid], đặt right = mid - 1, sau đó tiếp tục tìm kiếm trong khoảng bên trái .

Ý tưởng: Mã giả

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        
        # Tìm kiếm target trong khoảng [left, right]
        while left <= right:
            # Lấy vị trí giữa của khoảng
            mid = (left + right) // 2
            # Nếu tìm thấy giá trị mục tiêu, trả về vị trí giữa
            if nums[mid] == target:
                return mid
            # Nếu nums[mid] nhỏ hơn giá trị mục tiêu, tiếp tục tìm kiếm trong khoảng [mid + 1, right]
            elif nums[mid] < target:
                left = mid + 1
            # Nếu nums[mid] lớn hơn giá trị mục tiêu, tiếp tục tìm kiếm trong khoảng [left, mid - 1]
            else:
                right = mid - 1
        # Không tìm thấy phần tử, trả về -1
        return -1

Ý tưởng: Phân tích độ phức tạp

  • Độ phức tạp thời gian: .
  • Độ phức tạp không gian: .