剑指offer11.旋转数组的最小数字P82

mac2024-05-07  29

剑指offer11. 旋转数组的最小数字 P82

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

看到有序两个字,要条件反射的想到二分。 这题应该注意的二分的划分依据是:中间值mid和子序列首尾大小比较(注意三者相等时的特殊情况),首先,i总是指向前面递增数组的元素,j总是指向后面递增数组的元素。 如果i和j相差是1的话,那么索引i指向第一个递增数组的末尾,j指向后一个递增数组的开头。自然j指的就是答案了

int Min(int *num, int length) { if (num == NULL || length < 1) throw ("Invalid Input"); if (length == 1 || num[0] < num[length - 1]) return num[0]; // 递增 int i = 0, j = length -1, mid = 0; while (i <= j ) { // 所有的二分条件都可以用= mid = ((j - i) >> 1) + i; //三个指针值一样,不能二分,只有从头遍历 if (num[mid] == num[i] && num[mid] ==num[j]){ for (int i = 1; i < length; ++i) { if (num[i] < num[i - 1]) return num[i]; } }else if (num[mid] >= num[i]) i = mid; //往右二分,不能从mid+1开始, // 因为如果mid此时刚好是答案,刚好错过正确的答案 else if (num[mid] <= num[j]) j = mid; // 往左二分 ,同样必须从mid开始 if (j - i == 1 ) return num[j]; // i指向前一个递增数组结尾,j指向后一个开头 } }
最新回复(0)