每日一题——二分查找

题目


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

给定一个 元素升序的、无重复数字的整型数组 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;
    }
};
相关推荐
纪元A梦1 小时前
贪心算法应用:K-Means++初始化详解
算法·贪心算法·kmeans
_不会dp不改名_2 小时前
leetcode_21 合并两个有序链表
算法·leetcode·链表
mark-puls2 小时前
C语言打印爱心
c语言·开发语言·算法
Python技术极客2 小时前
将 Python 应用打包成 exe 软件,仅需一行代码搞定!
算法
睡不醒的kun2 小时前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌2 小时前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
Whisper_long3 小时前
【数据结构】深入理解堆:概念、应用与实现
数据结构
IAtlantiscsdn3 小时前
Redis7底层数据结构解析
前端·数据结构·bootstrap
我星期八休息3 小时前
深入理解跳表(Skip List):原理、实现与应用
开发语言·数据结构·人工智能·python·算法·list
lingran__3 小时前
速通ACM省铜第四天 赋源码(G-C-D, Unlucky!)
c++·算法