【C/C++牛客每日必刷】--- 二分查找

在这里插入图片描述
【C/C++牛客每日必刷】--- 二分查找_第1张图片


在这里插入图片描述

个人名片:

作者简介:一名大一在校生
‍❄️个人主页:小新爱学习.
个人WeChat:hmmwx53
️系列专栏:零基础学java ----- 重识c语言
每日一句:


文章目录

    • 题目一:BM17 二分查找-I✨✨
      • 描述
      • 示例1:
      • 示例2:
      • 示例3:
    • 题解分析:✨✨
    • 代码展示:C/C++✨✨
      • C语言实现:✨✨
      • C++实现:✨✨
  • 想要快速刷题,了解更多欢迎访问 : [牛客网](https://www.nowcoder.com/link/pc_csdncpt_xxaxx_c)


前言:

最近有许多小伙伴问小新有没有好用的刷题网站,想提升一下自我能力
经过小新缜密的思考与亲身体验,推荐超实用的点击直接访问牛客网
里面用丰富的大厂面试真题、各类算法由易到难层层递进、专项题库应有尽有,还不快来体验体验


题目一:BM17 二分查找-I✨✨

描述

请实现无重复数字的升序数组的二分查找

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
数据范围: 0≤len(nums)≤2×10^5
, 数组中任意值满足 ∣val∣≤10^9
进阶:时间复杂度 O(logn) ,空间复杂度 O(1)

示例1:

输入:
[-1,0,3,4,6,10,13,14],13
返回值:
6
说明:
13 出现在nums中并且下标为 6

示例2:

输入:
[ ],3
返回值:
-1
说明:
nums为空,返回-1

示例3:

输入:
[-1,0,3,4,6,10,13,14],2
返回值:
-1
说明:
2 不存在nums中因此返回 -1

题解分析:✨✨

本来我们可以遍历数组直接查找,每次检查当前元素是不是要找的值。

for(int i = 0; i < nums.length; i++)
    if(nums[i] == target)
        return i;

”但是这样这个有序的数组我们就没有完全利用起来。我们想想,若是目标值比较小,肯定在前半区间,若是目标值比较大,肯定在后半区间,怎么评价大小?我们可以用中点值作为一个标杆,将整个数组分为两个区间,目标值与中点值比较就能知道它会在哪个区间,这就是分治的思维。

具体做法:

step 1:从数组首尾开始,每次取中点值。
step 2:如果中间值等于目标即找到了,可返回下标,如果中点值大于目标,说明中点以后的都大于目标,因此目标在中点左半区间,如果中点值小于目标,则相反。
step 3:根据比较进入对应的区间,直到区间左右端相遇,意味着没有找到。

图示:
【C/C++牛客每日必刷】--- 二分查找_第2张图片

代码展示:C/C++✨✨

C语言实现:✨✨

 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @param target int整型 
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int search(int* nums, int numsLen, int target ) {
    if(numsLen<=0)return -1;                          
    int low=0,high=numsLen-1;                           //初始化双指针
    int mid=(low+high)/2;
    while(target!=nums[mid]&&low<=high){                //若当前mid值不为查找值,更新查找区域。
        if(target>nums[mid]){
            low=mid+1;
            mid=(low+high)/2;
        }
        else{
            high=mid-1;
            mid=(low+high)/2;
        }
    }
    if(low>high)return -1;
    else return mid;
}

C++实现:✨✨

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        int len = nums.size();
        if (len == 0) {
            return -1;
        }
        int left = 0, right = len - 1;
        while(left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }
        return -1;
        // write code here
    }
};


想要快速刷题,了解更多欢迎访问 : 牛客网

【C/C++牛客每日必刷】--- 二分查找_第3张图片
【C/C++牛客每日必刷】--- 二分查找_第4张图片

你可能感兴趣的:(牛客刷题系列,c语言,c++,面试)