leetCode 81 搜索旋转排序数组( 二分查找 )

题目链接:点击查看

题目描述:

一个原本增序的数组被首尾相连后按某个位置断开(如 [1,2,2,3,4,5] [2,3,4,5,1,2] ,在第一 位和第二位断开),我们称其为旋转数组。给定一个值,判断这个值是否存在于这个为旋转数组中
 
输入输出:
 
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false

题目分析:

本题最简单的方法为一般的顺序遍历 ,但题目的本意是让我们使用二分查找,即便数组被旋转过,但它某些区间还是有递增性,对于当前的中点, 如果它指向的值小于等于右端,那么说明右区间是排好序的;反之,那么说明左区间是排好序的。 如果目标值位于排好序的区间内,我们可以对这个区间继续二分查找;反之,我们对于另一半区 间继续二分查找。

注意,因为数组存在重复数字,如果中点和左端的数字相同,我们并不能确定是左区间全部相同,还是右区间完全相同。在这种情况下,我们可以简单地将左端点右移一位,然后继续进行二分查找。
 
代码:
bool search(vector& nums, int target) 
{
     int start = 0,end = nums.size()-1;
	 while(start<=end)
	 {
	    int mid=(start+end)/2;
		if(nums[mid]==target)
		{
		    return true;	
		}
		if(nums[start]==nums[mid])//无法判断哪个区间是增序的 
		{
		       ++start;	
		}
		else if(nums[mid]<=nums[end])//可以判断出右区间是增序的 因为题目条件为原本增序的数组从某一位置断开 
		{
		   if(target>nums[mid]&&target<=nums[end])
		   {
		           start=mid+1;   	
		   }
		   else
		   {
		       end=mid-1;	
		   }	
		}
		else //左区间为增序的 
		{
		    if(target>=nums[start]&&target

 

你可能感兴趣的:(早年算法竞赛学过的知识点,leetcode,二分法,二分查找,算法,c++)