题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
知识点:查找(二分查找)
思路:
题上说明数组是一个旋转的非减排序数组,即1:参数数组为一个有序非递减数组;2.数组旋转后分为两部分,即原始位置和旋转位置。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,则{3,4,5}为原始数组,{1,2}为旋转数组。我们可以利用二分查找,设置两个指针来查找原始数组的尾部和旋转数组的头部,进而判定最小位置。
如果中间位置位于原始数组,那么它应该大于等于头指针,此时数组中最小的元素应该位于该中间元素的后面;如果中间元素位于后面的旋转数组,那么它应该小于等于尾指针,此时该数组的最小元素应该位于该中间元素的前面。
最终头指针会指向原始数组的尾部,尾指针会指向旋转数组的头部。
如果遇到头指针、尾指针和中间元素相等的情况,即{1,0,1,1,1},无法判断,只能利用顺序查找方法。
代码:
class Solution: def minNumberInRotateArray(self, rotateArray): ‘‘‘ :param rotateArray: 输入的旋转数组 :return: 数组中的最小值 ‘‘‘ # write code here #设置两个指针,指向数组下标 index_1 = 0#设置头指针 index_2 = len(rotateArray) - 1#设置尾指针 min = index_1 #尾指针始终指向后面的递增数组,头指针始终指向前面的递增数组 #最终头指针指向前面数组的最后一个元素,尾指针指向后面数组的最后一个元素 while rotateArray[index_1] >= rotateArray[index_2]:#当头指针超过尾指针时,跳出循环 if index_2 - index_1 ==1:#判断输出条件 min = index_2 break min = int((index_1+index_2)/2)#找出中间元素 #无法判断位置时,(当头指针、尾指针和中间相同时)采用顺序查找 if rotateArray[index_1] ==rotateArray[index_2] and rotateArray[index_1]==rotateArray[min]: for i in range(index_1, index_2 + 1): if rotateArray[i] < rotateArray[min]: min = i return rotateArray[min] #开始使用二分查找 if rotateArray[index1] <= rotateArray[min]: index1 = min elif rotateArray[min] <= rotateArray[index2]: index2 = min return rotateArray[min]
原文地址:https://www.cnblogs.com/wobushangwangl/p/10920052.html
时间: 2024-10-28 21:57:18