1. Problem Description
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
You may assume no duplicate exists in the array.
麻蛋一开始没看懂题,就是给你一个旋转后的有序数组,让你求这个数组中最小的元素(旋转中心)。
PS:数组中没有重复元素。
2.二分查找的两种形式
一种是:
int BinSearch(int target, int nums[]){
int low = 0, high = nums.length - 1;
while(low <= high){
int mid = (low + high) / 2;
if(nums[mid] == target)
return mid;
if(nums[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
另一种:
int BinSearch(int target, int nums[]){
int low = 0, high = nums.length;
while(low < high){
int mid = (low + high) / 2;
if(nums[mid] == target)
return mid;
if(nums[mid] < target)
low = mid + 1;
else
high = mid;
}
return -1;
}
3. My solution:
本质是一个查找相邻逆序对的过程。
int findMin(vector<int>& nums)
{
int len=nums.size();
if(len==1)
return nums[0];
int left=0,right=len-1;
int mid=(left+right)/2;
while(left<right)
{
mid=(left+right)/2;
//出现逆序说明找到答案
if(nums[mid]>nums[mid+1])
return nums[mid+1];
//逆序在mid和right之间
if(nums[mid]>nums[right])
left=mid+1;
else
right=mid;
}
return nums[mid];
}
4.其他解法(均已AC)
//My solution1 Qsort O[nlogn]
int findMin(vector<int>& nums)
{
sort(nums.begin(),nums.end());
return nums[0];
}
//My solution2 O[n]遍历找最小的数
int findMin(vector<int>& nums)
{
int ans=1<<32-2;
int len=nums.size();
for(int i=0; i<len; i++)
{
if(nums[i]<ans)
ans=nums[i];
}
return ans;
}
//My solution3 找寻断点 O[n]
int findMin(vector<int>& nums)
{
int len=nums.size();
for(int i=0; i<len-1; i++)
{
if(nums[i]>nums[i+1])
return nums[i+1];
}
return nums[0];//本身就是有序的,输出第一个元素
}