使用交互函数充当 check 进行二分(附二分专题目录)

简介: 使用交互函数充当 check 进行二分(附二分专题目录)

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 374. 猜数字大小 ,难度为 简单


Tag : 「二分」


猜数字游戏的规则如下:


  • 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
  • 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。


你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):


  • -1:我选出的数字比你猜的数字小 pick < num
  • 1:我选出的数字比你猜的数字大 pick > num
  • 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num


返回我选出的数字。


示例 1:


输入:n = 10, pick = 6
输出:6
复制代码


示例 2:


输入:n = 1, pick = 1
输出:1
复制代码


示例 3:


输入:n = 2, pick = 1
输出:1
复制代码


示例 4:


输入:n = 2, pick = 2
输出:2
复制代码


提示:


  • 1 <= n <= 2^{31}231 - 1
  • 1 <= pick <= n


二分



端午安康呀 🍭🍭🍭


今天的题目表达不太好 🤣,还是逐字阅读才明白是啥意思 🤣


就当做是因为题目本身要比 278. 第一个错误的版本 简单(不需要考虑完全相同,没有二段性的情况),所以在阅读上增加了难度吧 🤣


一道交互题,根据题意可知,是尽可能少调用 guess 方法来找到分割点。


直接使用 guess 当做 check 函数进行二分即可。


另外根据数据范围需要注意计算 mid 时的爆 int 问题,可以通过使用类似 l + (r - l) / 2 的做法解决,也可以通过一个临时 long 来解决。


代码:


public class Solution extends GuessGame {
    public int guessNumber(int n) {
        int l = 1, r = n;
        while (l < r) {
            long tmp = (long)l + r>> 1;
            int mid = (int)tmp;
            if (guess(mid) <= 0) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return r;
    }
}
复制代码


public class Solution extends GuessGame {
    public int guessNumber(int n) {
        int l = 1, r = n;
        while (l < r) {
            long tmp = (long)l + r + 1 >> 1;
            int mid = (int)tmp;
            if (guess(mid) >= 0) {
                l = mid;
            } else {
                r = mid - 1;
            }
        }
        return r;
    }
}
复制代码


  • 时间复杂度:O(\log{n})O(logn)
  • 空间复杂度:O(1)O(1)


其他「二分」相关题解




最后



这是我们「刷穿 LeetCode」系列文章的第 No.374 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
|
Java Apache Maven
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
1548 0
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory解决方法
|
安全 生物认证 网络安全
HTTP 常见认证方式
HTTP 常见认证方式
425 0
|
9月前
|
人工智能 自然语言处理 API
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
UI-TARS Desktop 是一款基于视觉语言模型的 GUI 代理应用,支持通过自然语言控制电脑操作,提供跨平台支持、实时反馈和精准的鼠标键盘控制。
2637 17
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
|
存储 开发框架 .NET
【博士每天一篇文献-综述】A Comprehensive Survey of Continual Learning Theory, Method and Application
本文综述了持续学习的理论基础、方法论和应用实践,探讨了五种主要的解决策略,包括基于回放、架构、表示、优化和正则化的方法,并深入分析了持续学习的不同场景、分类、评价指标以及面临的挑战和解决方案。
516 1
【博士每天一篇文献-综述】A Comprehensive Survey of Continual Learning Theory, Method and Application
|
Linux 网络安全 数据安全/隐私保护
Linux——配置SSH免密登录
Linux——配置SSH免密登录
313 0
|
JSON 小程序 前端开发
towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本
本文介绍了在微信小程序中使用`towxml`库将Markdown格式文本渲染为WXML的方法。文章提供了`towxml`的概述、安装步骤、以及如何在小程序中配置和使用`towxml`进行Markdown解析的详细说明和代码示例。
|
监控 网络协议 IDE
Flink:你绕不过去的 Hello World(一)
在学习技术时,总会有一个简单程序 Demo 带着我们入门,所以参考着官网例子,带大家快速熟悉 Flink 的 Hello World~
Flink:你绕不过去的 Hello World(一)
|
存储 Kubernetes 监控
【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解
【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解
51单片机学习--LCD模块使用
51单片机学习--LCD模块使用
263 0
|
弹性计算 运维 Kubernetes
架构设计:物理部署图
部署图描述的是系统运行时的结构,展示了硬件的配置及其软件如何部署到网络结构中。一个系统模型只有一个部署图,部署图通常用来帮助理解分布式系统。 综上所述:物理部署图更多地是以运维的视角描绘运行时的系统的网络与部署结构。
4552 0