首页 > 其他分享 >LeetCode 704. 二分查找 题解

LeetCode 704. 二分查找 题解

时间:2023-05-05 15:35:13浏览次数:34  
标签:二分 704 题解 mid check int 区间 LeetCode left

本题考查的就是一个基本的整数二分查找问题

对于整数二分,有单调性一定可以二分,没有单调性的有时候也可以二分。

算法思想(分为两种方法):

  1. 查找结果是在左边区间的情况
    区间被划分为[l,mid]和[mid+1,r]
    1、确定分界点,mid=q[(l+r)/2]
    2、判断是否满足
    是:区间变成[l,mid] 因此:r=mid
    否:区间变成[mid+1,r] 因此 l=mid+1

  1. 查找结果在右边区间的情况
    区间被划分为[l,mid-1]和[mid,r]
    1、确定分界点,mid=q[(l+r+1)/2]
    2、判断是否满足
    是:区间变成[mid,r] 因此:l=mid
    否:区间变成[l,mid-1] 因此 r=mid-1
    两种方法都可以,那么如何选择呢?:
    先写check函数,当为check为真时,如果答案在mid左边,则不加1,答案在右边,则加1 (即右加左不加)
    mid一定是变到有答案的区间,即左边有答案则往左边变,不加1,右边有答案,往右边变,加1

以下是代码模板
方法一:

bool check(int x) {/* ... */} // 检查x是否满足某种性质

// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}

方法二:

// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

本题代码:

func search(nums []int, target int) int {

    left := 0 
    right := len(nums)-1
    res := -2
    for left < right {
        mid :=  (left + right ) / 2
        if nums[mid] >= target{
            right = mid
        }else {
            left = mid + 1
        }
    }
    if nums[left] != target {
        res = -1
    }else{
       res = left
    }
    return res
}

标签:二分,704,题解,mid,check,int,区间,LeetCode,left
From: https://www.cnblogs.com/lxing-go/p/17374263.html

相关文章

  • LeetCode 1049. 最后一块石头的重量 II
    思路任何时刻,某个石头的重量永远都是若干石头加减运算的绝对值如a-b+c合并石头都是减法,但仍可能出现+运算符,如a-(b-c)=a-b+c任何一种合并方法,最后一个石头的重量都可以表示成一种代数形式,如a+b-c+d+e+f-g不是所有的代数形式都可以转换为一种合并方法,如a+b+c因此......
  • [Leetcode] 0697.数组的度
    697.数组的度点击上方标题跳转至leetcode题目描述给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在nums中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 示例1:输入:nums=[1,2,2,3,1]输......
  • LeetCode 416 分割等和子集
    LeetCode|416.分割等和子集给你一个只包含正整数的非空数组 nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例1:输入:nums=[1,5,11,5]输出:true解释:数组可以分割成[1,5,5]和[11]。示例2:输入:nums=[1,2,3,5]输出:false解......
  • [Leetcode] 0693. 交替位二进制数
    693.交替位二进制数点击上方标题跳转至leetcode题目描述给定一个正整数,检查它的二进制表示是否总是0、1交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。 示例1:输入:n=5输出:true解释:5的二进制表示是:101示例2:输入:n=7输出:false解释:7的二进制表示......
  • [Leetcode] 0696. 计数二进制子串
    696.计数二进制子串点击上方链接跳转至leetcode题目描述给定一个字符串 s,统计并返回具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是成组连续的。重复出现(不同位置)的子串也要统计它们出现的次数。 示例1:输入:s="00110011"输......
  • [Leetcode] 0674. 最长连续递增序列
    674.最长连续递增序列题目描述给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该序列的长度。连续递增的子序列可以由两个下标l和r(l<r)确定,如果对于每个l<=i<r,都有nums[i]<nums[i+1],那么子序列[nums[l],nums[l+1],...,nums[r-1],nums[......
  • [Leetcode] 0680. 验证回文串 II
    680.验证回文串II点击上方标题跳转至leetcode题目描述给你一个字符串 s,最多可以从中删除一个字符。请你判断s是否能成为回文字符串:如果能,返回true;否则,返回false。 示例1:输入:s="aba"输出:true示例2:输入:s="abca"输出:true解释:你可以删除字符'c'。示......
  • 洛谷P4824题解
    题面题意:给出字符串s和t,每次操作将s中出现的第一个t删去,直到不能删为止。求最后的串。|s|<=1e6题解:hash做法。(此题也有kmp和权值线段树做法)因为涉及到删除操作,所以我们要动态的实现这个过程。所以考虑开一个栈来存储当前留下的字符。然后每有一个字符入栈,就拿当前......
  • [Leetcode] 0661. 图片平滑器
    661.图片平滑器题目描述图像平滑器是大小为 3x3的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。每个单元格的 平均灰度定义为:该单元格自身及其周围的8个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中9个单元格的平均......
  • Linux IMX6ULL RTC掉电不保存问题解决
    背景:公司临时派发的小任务,解决项目中RTC实时时钟的问题,在为解决这个问题之前,项目的实时时钟老是一断电重启就会出现出现恢复到一个固定的时间。琢磨了许久,终于解决了,特此记录一下,给读者如遇到相关问题提供一下思路拓展。平台:imx6ull开发板加Linux系统。解决步骤:1.删除Linux......