题目

在这里插入 描述

①二分查找(条件+思路)

 条件:
 被查找的序列是有序的。(升序、降序),而本题是升序的
 大致思路:
 用 left 、 right 两个游标指针维护整个序列。折中查找,折中的位置 (left+right)/2,
 记作mid。比较nums[mid]与target的大小关系(三种关系:大于,小于,等于),等于时return mid。
 详细思路的分析:
 分析大于和小于。(等于的情况在上面说了,直接return,注意题目要求返回下标)
 前面提过,是使用left和right游标维护整个序列,所以变动的是left和right游标!
 只有三个变量,所以是分析left,mid,right。
   
   1、小于时:
   nums[mid]<target。说明left与right折中的结果太小了,应该让left所代表的值变大,
   因为nums序列是升序,所以left要在mid的位置上右移。(如果是降序,就是right在mid位置左移)
   结果就是:
   left = mid+1;//nums升序
   
   2、大于时:
   分析情况也同理就不赘述,给出结论
   nums序列升序,
	right = mid-1;//nums//升序1

动画简单演示:

二分查找

②代码展示(C++11版本)


class Solution {
public:
    int search(vector<int>& nums, int target)
    {
    	int left = 0;
    	int right = nums.size()-1;
    	
    	while(left<=right){
    		int mid = (left+right)/2;
    		
    		if(nums[mid]<target){
				left = mid+1;
			}
			else if(nums[mid]>target){
				right = mid-1;
			}
			else{
				return mid;
			}
			
		}
		return -1;
		
    }
};
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐