search_in_rotated.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. # Search in a rotated sorted list, require time complexity O(logn)
  2. import pytest
  3. def test_search_in_rotated():
  4. case1 = [5,7,0,3,4]
  5. assert search_in_rotated(case1, 7) == 1
  6. assert search_in_rotated(case1, 6) == -1
  7. assert search_in_rotated(case1, 5) == 0
  8. def search_in_rotated(l, target):
  9. left = 0
  10. right = len(l) - 1
  11. while right > left:
  12. m = (right - left) // 2
  13. if l[m] == target:
  14. return m
  15. if l[right] == target:
  16. return right
  17. if l[left] == target:
  18. return left
  19. # right portion is sorted
  20. if l[m] < l[right] and l[m] < l[left]:
  21. if target < l[right] and target > l[m]:
  22. left = m + 1
  23. else:
  24. right = m - 1
  25. # left portion is sorted
  26. elif l[m] > l[right] and l[m] > l[left]:
  27. if target > l[left] and target < l[m]:
  28. right = m - 1
  29. else:
  30. left = m + 1
  31. # list is sorted
  32. else:
  33. if target > l[m]:
  34. left = m + 1
  35. else:
  36. right = m - 1
  37. return -1