Python旋转数组的最小数字

本文阅读 2 分钟
首页 Python笔记 正文

二分查找的变形,注意到旋转数组的首元素肯定不小于旋转数组的尾元素,设置中间点。如果中间点大于首元素,说明最小数字在后面一半,如果中间点小于尾元素,说明最小数字在前一半。依次循环。同时,当一次循环中首元素小于尾元素,说明最小值就是首元素。但是当首元素等于尾元素等于中间值,只能在这个区域顺序查找。

  1. '''
  2. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
  3. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
  4. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
  5. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
  6. '''
  7. # -*- coding:utf-8 -*-
  8. class Solution:
  9. def minNumberInRotateArray(self, rotateArray):
  10. if len(rotateArray) == 0:
  11. return 0
  12. front = 0
  13. rear = len(rotateArray) - 1
  14. minVal = rotateArray[0]
  15. if rotateArray[front] < rotateArray[rear]:
  16. return rotateArray[front]
  17. else:
  18. while (rear - front) > 1:
  19. mid = (rear + front)//2
  20. if rotateArray[mid] > rotateArray[rear]:
  21. front = mid
  22. elif rotateArray[mid] < rotateArray[front]:
  23. rear = mid
  24. elif rotateArray[mid] == rotateArray[front] and rotateArray[front] == rotateArray[rear]:
  25. for i in range(1, len(rotateArray)):
  26. if rotateArray[i] < minVal:
  27. minVal = rotateArray[i]
  28. rear = i
  29. minVal = rotateArray[rear]
  30. return minVal
  31. # 书上方法
  32. def minNumberInRotateArray2(self, rotateArray):
  33. if len(rotateArray) == 0:
  34. return 0
  35. front, rear = 0, len(rotateArray) - 1
  36. midIndex = 0
  37. while rotateArray[front] >= rotateArray[rear]:
  38. if rear - front == 1:
  39. midIndex = rear
  40. break
  41. midIndex = (front + rear) // 2
  42. if rotateArray[front] == rotateArray[rear] and rotateArray[front] == rotateArray[midIndex]:
  43. return self.MinInOrder(rotateArray, front, rear)
  44. if rotateArray[midIndex] >= rotateArray[front]:
  45. front = midIndex
  46. elif rotateArray[midIndex] <= rotateArray[rear]:
  47. rear = midIndex
  48. return rotateArray[midIndex]
  49. def MinInOrder(self, array, front, end):
  50. result = array[0]
  51. for i in array[front:end+1]:
  52. if i < result:
  53. result = i
  54. return result
  55. Test = Solution()
  56. print(Test.minNumberInRotateArray([3, 4, 5, 1, 2]))
  57. print(Test.minNumberInRotateArray([1, 2, 3, 4, 5]))
  58. print(Test.minNumberInRotateArray([1, 1, 1, 0, 1]))
  59. print(Test.minNumberInRotateArray([1, 0, 1, 1, 1]))
  60. print(Test.minNumberInRotateArray([]))
  61. print(Test.minNumberInRotateArray([1]))
解压密码: detechn或detechn.com

免责声明

本站所有资源出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。

本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户自行鉴别,做一个有主见和判断力的用户。

本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。

Python用两个栈实现队列
« 上一篇 01-21
Python斐波那契数列
下一篇 » 01-21

发表评论

惪特博客
  • 文章总数:
    18496 篇
  • 评论总数:
    53283 条
  • 标签总数:
    8869 个
  • 总浏览量:
    22006898 次
  • 最后更新:
    2天前

最多点赞

随便看看

标签TAG