每日一题——二分查找

题目


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

给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1

数据范围:0≤len(nums)≤2×105 , 数组中任意值满足 ∣val∣≤109

进阶:时间复杂度 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

思路


从数组的中间元素开始搜索,如果该元素为目标元素,则搜索过程结束,否则就进入下一个步骤,如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复判断是为目标值,如果在最后一步还是没有找到中间元素,则返回-1,表示找不到目标元素。

解答代码


cpp 复制代码
class Solution {
public:
    /**
     * @param nums int整型vector 
     * @param target int整型 
     * @return int整型
     */
    int search(vector<int>& nums, int target) {
        // write code here
        if (nums.size() == 0) {
            return -1;
        } 

        int start = 0;
        int end = nums.size() - 1;
        while (start <= end) {
            int mid = (start + end) / 2;
            if (nums[mid] == target) {
                return mid;
            } else if (nums[mid] < target) {
                start = mid + 1;
            } else if (nums[mid] > target) {
                end = mid - 1;
            }
        }
    
        return -1;
    }
};
相关推荐
CoderYanger13 小时前
D.二分查找-基础-2529. 正整数和负整数的最大计数
java·开发语言·数据结构·算法·leetcode·职场和发展
想唱rap13 小时前
Linux下进程的控制
linux·运维·服务器·c++·算法
夏乌_Wx13 小时前
练题100天——DAY25:升序合并文件+相交链表+多数元素
数据结构·算法·哈希算法
南_山无梅落13 小时前
8.Python3字典(dict):键值的增删改查_入门到进阶
python·算法
柒.梧.13 小时前
数据结构:二叉排序树,平衡二叉树,红黑树的介绍
数据结构·算法
Xの哲學13 小时前
Linux ALSA音频架构: 从内核驱动到应用开发的全面解析
linux·服务器·算法·架构·边缘计算
Queenie_Charlie13 小时前
小明统计数组
数据结构·c++·set
是毛毛吧13 小时前
数据结构与算法11种排序算法全面对比分析
数据结构·算法
郝学胜-神的一滴13 小时前
Separate Buffer、InterleavedBuffer 策略与 OpenGL VAO 深度解析
开发语言·c++·程序人生·算法·游戏程序·图形渲染
蒙奇D索大13 小时前
【数据结构】考研408 | B树收官:插入与删除的平衡艺术——分裂、合并与借位
数据结构·笔记·b树·考研·改行学it