旋转数组中的最小元素
旋转数组中的最小元素
http://www.nowcoder.com/questionTerminal/7dd312bb4e7c4546a9aa8a001c2b11f5
题解
题目难度:简单
知识点:排序、查找
解题思路:这道题看起来就是找最小值,如果从头到尾进行比较是一种思路,缺点时总体的计算次数较多;进一步思考由于数是有一定大小规则进行排序的,所以可以使用二分法进行计算。
方法一(简单粗暴一个一个比较)
这道题就是输出较小数据,直接一个一个比较大小,然后输出符合要求的数据即可。
#include<bits/stdc++.h> using namespace std; int main() { int temp; cin>>temp; int num; while(cin>>num) { if(temp>num) temp=num; } cout<<temp<<endl; }
方法二
使用二分法进行查找
注意:使用二分法时,要考虑数据可能存在的前后重复性;假设原始数据为“567811111”,这时需要进行特别的二分处理。
#include<bits/stdc++.h> using namespace std; int main(){ vector<int>array; int n; while(cin>>n) array.push_back(n); int l=0; int r=array.size()-1; while(l<r) { int mid=(l+r)/2; if(array[mid]>array[r]) l=mid+1; else if(array[mid]<array[r]) r=mid; //需要注意的是必须考虑数据重复的可能性 else r=r-1; } cout<<array[l]<<endl; return 0; }