81. 搜索旋转排序数组 II

思路:因为题目要求了必须尽可能减少整个操作步骤,所以用for循环线性找就不行了,故用二分法。对于当前的中点, 如果它指向的值小于等于右端,那么说明右区间是排好序的;反之,那么说明左区间是排好序的。 如果目标值位于排好序的区间内,我们可以对这个区间继续二分查找;反之,我们对于另一半区间继续二分查找。但数组中可能存在重复数字,所以,如果中点和左端的数字相同,我们并不能确定是左区间全部相同,还是右区间完全相同。在这种情况下,可以将左端点右移一位,然后继续进行二分查找。
bool search(int* nums, int numsSize, int target){
int left,right,mid;
left = 0; right = numsSize - 1;
while(left <= right){
mid = left + (right - left) / 2;
if(nums[mid] == target)
return true;
if(nums[left] == nums[mid])
left++;
else
if(nums[mid] <= nums[right]){//右区间有序
if(target > nums[mid] && target <= nums[right])
left = mid + 1;
else
right = mid - 1;
}
else{//左区间有序
if(target >= nums[left] && target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
}
return false;
}
153. 寻找旋转排序数组中的最小值

int findMin(int* nums, int numsSize){
int left,right,mid;
left = 0; right = numsSize - 1;
while(left < right){
mid = left + (right - left) / 2;
if(nums[mid] < nums[right])
right = mid;//不是mid - 1的原因是:可能nums[mid]即为最小值而被错过
else//而当 nums[mid] >= nums[right]时,nums[mid]必不为最小值
left = mid + 1;
}
return nums[left];
}
本文介绍了如何使用二分查找算法解决搜索旋转排序数组的问题,包括在`search旋转排序数组II`中快速定位目标值和在`findMin`中寻找最小值的具体实现。讨论了面对重复元素和有序区间时的优化策略。

367

被折叠的 条评论
为什么被折叠?



