Menu
CoddyTech

Search in Rotated Sorted Array

Một danh sách số nguyên phân biệt được sắp xếp theo thứ tự tăng dần rồi xoay: một số phần tử, có thể là không phần tử nào, được lấy từ đầu danh sách và chuyển về cuối theo cùng thứ tự. Ví dụ, [2, 5, 8, 11, 15, 19, 23] sau khi xoay 4 vị trí sẽ thành [15, 19, 23, 2, 5, 8, 11]. Bạn nhận được danh sách đã xoay nums và một số nguyên target. Hãy trả về chỉ số của target trong nums, tính từ 0, hoặc -1 nếu không có, với thời gian O(log n).

Hàm

search(nums: integer-array, target: integer) → integer
numsinteger-array
danh sách số nguyên phân biệt đã được xoay
targetinteger
giá trị cần tìm
Trả vềinteger
chỉ số của target trong nums, hoặc -1 nếu không tìm thấy

Ràng buộc

  • 1 ≤ nums.length ≤ 5000
  • -104 ≤ nums[i], target ≤ 104
  • Tất cả giá trị trong nums đều khác nhau.
  • nums là một danh sách tăng dần được xoay đi một số vị trí k, với 0 ≤ k < nums.length; k = 0 thì danh sách không bị xoay.

Ví dụ

Đầu vào
nums = [15, 19, 23, 2, 5, 8, 11]target = 5
Đầu ra
4
Giải thích
Phần tử giữa đầu tiên, ở chỉ số 3, có giá trị 2, nên nửa bên phải [2, 5, 8, 11] đã được sắp xếp và có giá trị 5. Phần tử giữa tiếp theo, ở chỉ số 5, có giá trị 8; phần bên trái đã sắp xếp [5, 8] có giá trị 5, dẫn đến chỉ số 4.
challenge icon

Câu hỏi mở rộng

Nếu nums có thể chứa các phần tử trùng lặp, không thuật toán (algorithm) nào có thể đảm bảo O(log n). Bạn có thể chứng minh điều này bằng một danh sách các số 1 đã xoay, che giấu một số 0 duy nhất không?

Đặt lại code
def search(nums, target):
    # Viết code tại đây

Kiểm thử #1

Kiểm thử #2

Kiểm thử #3

Đối số

nums = [15, 19, 23, 2, 5, 8, 11]
target = 5

Đầu ra mong đợi

4