《剑指Offer》之面试题旋转数组的最小数字

来源:互联网 发布:其怒乎的其是什么意思 编辑:程序博客网 时间:2024/05/16 02:49
把数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转,输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素,例如{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.int Min(int *number, int len){if (number += NULL || len <= 0){throw exception("Invaild input!");}int index1, index2;index1 = 0;//指向数组第一个元素index2 = len - 1;//指向数组最后一个元素int indexMid = index1;//当数组没有反转时也就是翻转的元素个数为0,则第一个元素最小直接返回第一个元素;while (number[index1] > number[index2]){if (index2-index1==1)//当两个指针的间隔是1时,中间数指定为index2;{indexMid = index2;break;}if (number[index1]==number[index2]&&number[index1]==number[indexMid])//如果第一个元素和最后一个元素以及中间数相等的情况时无法判断,则只能用顺序查找{return MinInOrder(number, index1, index2);}indexMid = (index2 + index1) / 2;if (number[indexMid]>=number[index1])//中间数大于index1指的元素时,说明中间数属于前一个子数组则index1指向indexMid{index1 = indexMid;}if (number[indexMid]<=number[index2])//中间数小于index1指的元素时,说明中间数属于后一个子数组则index1指向indexMid{index2 = indexMid;}}}int MinInOrder(int *numbers, int index1, int index2)//顺序查找{int result = numbers[index1];for (int i = index1 + 1; i < index2; ++i){if (result>numbers[i]){result = numbers[i];}}return result;}

0 0