พิจารณาอาร์เรย์ที่เรียงจากน้อยไปมาก แล้วหมุน (rotated) ที่จุด pivot ไหนที่ไม่ทราบล่วงหน้า ตัวอย่าง [0,1,2,4,5,6,7] อาจกลายเป็น [4,5,6,7,0,1,2] ให้ค่า target ต้องค้นหา ถ้าพบคืน index มิฉะนั้นคืน -1 สมมติไม่มี duplicate ตัวอย่าง [4,5,6,7,0,1,2] target 0 ผลลัพธ์ index 4
ขั้นตอนการทำงาน (Modified Binary Search)
low := 0, high := len(array)- วนลูป
while low < high:mid := low + (high - low) // 2- ถ้า
arr[mid] == targetคืนmid - ถ้า
arr[low] <= arr[mid](ซ้ายเรียงแล้ว):- ถ้า
target >= arr[low] and target < arr[mid]:high := midมิฉะนั้นlow := mid + 1
- ถ้า
- มิฉะนั้น (ขวาเรียงแล้ว):
- ถ้า
target <= arr[high-1] and target > arr[mid]:low := mid + 1มิฉะนั้นhigh := mid
- ถ้า
- คืน -1
ตัวอย่างโค้ด (Python)
class Solution(object):
def search(self, nums, target):
low = 0
high = len(nums)
while low < high:
mid = low + (high - low) // 2
if nums[mid] == target:
return mid
if nums[low] <= nums[mid]:
if target >= nums[low] and target < nums[mid]:
high = mid
else:
low = mid + 1
else:
if target <= nums[high-1] and target > nums[mid]:
low = mid + 1
else:
high = mid
return -1
ob1 = Solution()
print(ob1.search([4,5,6,7,8,0,1,2], 0))
อินพุต
[4,5,6,7,0,1,2] 0
เอาต์พุต
5