题目来源:牛客网
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:二分法。
C++:35ms 608k
#include <vector> #include <iostream> #include <sstream> #include <string> using namespace std; class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if (rotateArray.empty()){return 0;} // 二分法 int arr_len = rotateArray.size(); int left=0, right = arr_len-1; if (rotateArray[left]<rotateArray[right]){return rotateArray[left];}// without rotate // with rotate while (left!=right){ int media = (left+right)/ 2; if (rotateArray[media]>rotateArray[left]){ left = media; } else if (rotateArray[media]<rotateArray[left]){ right = media; } else{ left++; } } return rotateArray[left]; } }; int main() { Solution obj; string x_in; vector<int> vec_x; while(getline(cin,x_in)){ istringstream line(x_in); while(line){ int temp=0; line>>temp; vec_x.push_back(temp); } vec_x.pop_back(); //cout<<vec_x.size()<<endl; cout << obj.minNumberInRotateArray(vec_x)<<endl; vec_x.clear(); } cin.get(); cin.get(); }
Python:994ms 5624k
# -*- coding:utf-8 -*- import sys class Solution: def minNumberInRotateArray(self, rotateArray): arr_len = len(rotateArray) if arr_len == 0: return 0; else: # 二分法 left = 0 right = arr_len-1 media = (left+right)/2 if rotateArray[left]<rotateArray[right]: return rotateArray[left] while not (media==left): if rotateArray[media]>rotateArray[left]: left = media elif rotateArray[media]<rotateArray[left]: right = media else: left += 1 media = (left+right)/2 if rotateArray[left]>rotateArray[right]: return rotateArray[right] else: return rotateArray[left] if __name__ == '__main__': obj = Solution() while (1): x = raw_input().split() print obj.minNumberInRotateArray(x)