题解 | #二分查找-I#

二分查找-I

https://www.nowcoder.com/practice/d3df40bd23594118b57554129cadf47b

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
     //试试可不可以用find-> find可以  但是本题要求的是用二分查找
     //
    // int search(vector<int>& nums, int target) {
    //     auto it = find(nums.begin(),nums.end(),target);
    //     if(it == nums.end()){
    //         return -1;
    //     }
    //     return it-nums.begin();
    //     // write code here
    // }
    //二分查找 指针
        int search(vector<int>& nums, int target) {
        int left,right,mid;
        left = 0,right = nums.size()-1,mid =(right + left) /2;
        //vector数组可以用下标随意访问
        while(left<=right)
        {
            if(target == nums[mid]) return mid;
            if(target < nums[mid]){right = mid-1;}
            else{
                left = mid+1;
            }
            mid = (right+left)/2;
        }
        return -1;
        // write code here
    }
};

二分查找: 用指针的思想。

定义三个指针,分别指向数组起始位置(left)、数组的中间位置(mid)、数组最后一元素的位置(right)。

因为给的nums是一个有序的数组,可以用“二分” 的思想。

每次比较target和mid位置。会有两种情况

1.target和nums[mid]的值相同,则直接返回mid,程序退出;

2.target<nums[mid],说明想要查找的值在mid的左半区,此时则需要更新right和mid的位置,right = mid-1,

target>nums[mid],说明想要查找的值在mid的右半区,此时则需要更新left和mid的位置,left= mid+1,

再更新mid的位置。

#C++面试题#
全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务