题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。
思路:最简单的思路当然就是o(n)时间遍历数组,如果数组中出现分界点,即前面大后面小,则为该最小值
代码
#include "stdio.h"
int main()
{
//int data[] = {3, 4, 5, 1, 2};
int data[] = {1, 0, 1, 1, 1};
int len = sizeof(data)/sizeof(data[0]);
int i;
int mid;
int d = data[0]; mid=data[0];
for(i=1;i<len;i++)
{
if(data[i]>=d)
{
d = data[i];
}
else
{
mid =data[i];
break;
}
}
printf("%d\n",mid);/*测试 1 已排序未旋转 2 前后相等 3 正常排序*/
return 0;
}
看了海涛的思路 二分查找,这里就会产生不少问题,虽然时间复杂度降低,但是程序看起来就很复杂了
主要考虑 1 0 1 1 1情况
二分代码如下
int binasearch(int *data,int len)
{
int length = len-1;
int index1 = 0;
int index2 = length;
int mid=index1;
while(data[index1]>=data[index2])
{
if(index2-index1==1)
{
mid =index2;
break;
}
mid = (index1+index2)/2;
if(data[mid]>=data[index1])
{
index1=mid;
}
else if(data[mid]<=data[index2])
{
index2=mid;
}
}
return data[mid];
}
产生问题 在 1 0 1 1 1情况
分析如下
step 1 :data[0]=1 data[4]=1 mid=2
step 2: index1 = mid data[2]=1 然后 data[4]=1
step 3 :index1 =2 index2 =4 然后 index1=3 index2=4
step 4 :index1=3 index2=4 则只能算出出现 1
这就出现问题,主要是当mid 和前后两个索引对应值相等的情况下 就有问题。
解决办法 就是再这种情况下, 使用o(n)的方法来处理