学到了
//比照书上敲的代码,数据比较难看
int minArray(int* numbers, int numbersSize){
if(numbersSize <= 0 || numbers == NULL)//invalid input
exit(-1);
int left = 0;
int right = numbersSize-1;
int mid = (left+right)/2;
/*考虑单调数组*/
if(numbers[right] > numbers[left])
return numbers[left];
/*非纯单调数组*/
while(left+1 < right)
{
if(numbers[left] == numbers[right] && numbers[left] == numbers[mid])
return findMin(numbers,left,right);//无法判定前后,遍历查找
if(numbers[mid] >= numbers[left])//排除遍历的那种情况,必在左增
{
left = mid;//在左半增区间
}
else
{
right = mid;//在右半增区间
}
mid = (right+left)/2;
}
return numbers[right];
}
int findMin(int* numbers,int left,int right)
{
//哈哈,正道的光,图书馆旁的广告音响终于停了哈哈哈哈哈
int min = numbers[left];
for(int i = left + 1;i <= right;i++)
{
if(min > numbers[i])
min = numbers[i];
}
return min;
}
接下来是研究题解的思路
思路还是二分,不过有一说一,代码短了不少
int minArray(int* numbers, int numbersSize){
if(!numbers || numbersSize <= 0)//invalid input
exit(-1);
int low = 0;
int high = numbersSize-1;
int mid;
while(low < high)
{
// mid = (low+high)/2;
mid = low + (high-low)/2;//放在low和high过大时发生溢出
if(numbers[mid] > numbers[high])
{
low = mid+1;//mid一定不是最小的啦所以加一
}
else if(numbers[mid] < numbers[high])
{
high = mid;
}
else
{
--high;
}
}
return numbers[low];
}