面试题11 旋转数组的最小数字

    技术2022-07-11  89

    面试题11 旋转数组的最小数字

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

    //#include<bits/stdc++.h> #include<iostream> //#include<vector> //#include<string> //#include<map> //#include<algorithm> using namespace std; int MinOrder(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; } int Min(int* numbers,int length) { if (numbers==nullptr||length<=0) { throw std::exception("invalid parameters"); } int index1 = 0, index2 = length - 1, indexMid = index1; while(numbers[index1]>=numbers[index2]) { if (index2-index1==1) { indexMid = index2; break; } indexMid = (index1 + index2) / 2; if (numbers[index1] == numbers[indexMid]&& numbers[index2] == numbers[indexMid]) { return MinOrder(numbers, index1, index2); } if (numbers[ index1]<= numbers[indexMid]) { index1 = indexMid; } else if (numbers[index2]>= numbers[indexMid]) { index2 = indexMid; } } return numbers[indexMid]; } int main() { int* numbers; int length; cin >> length; numbers = new int[length]; for (size_t i = 0; i < length; i++) { cin >> numbers[i]; } int min; min = Min(numbers, length); cout << min << endl; delete [] numbers; return 0; }

    测试用例:

    3 4 5 1 2 1 ; 1 2 3 4 5 1 ; 1 0 1 1 1 0 ; 1 1 1 0 1 0

    Processed: 0.014, SQL: 9