leetcode力扣_二分查找

news2024/11/14 2:24:02

69.x的平方根

        给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4
输出:2

示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

 解题思路:

① 第一种就是暴力解法,因为 x 开方之后的值肯定是小于等于其本身的,所以定义一个变量 i 让它从 0~i 遍历并比较i*i 和 x 的大小,注意返回的值是 i 还是 i+1 。代码如下

class Solution {
public:
    int mySqrt(int x) {
        //这里使用long long int是防止i*i的计算结果产生溢出
        long long int i ;
        //这样解法的复杂度是O(根号x)
        while((i*i) <= x){
            i++ ;
        }
        return i-1 ;
    }
};

② 第二种是二分查找法,二分查找的下界设置为 0 ,上界设置为 x ,定义一个中间变量 mid ,然后将 mid 做如下定义,这样定义的目的是防止越界,如果直接定义为 (right + left) / 2 在计算过程中,(right + left) 的结果可能会超出 int 所能表达的最大数字。

int mid = left + (right - left) / 2 ;

         当然可以直接将 min 定义成 long long int 型,个人感觉这样更好一点,后面计算 mid * mid 的时候也不用在前面加上 long long 了。代码如下:

class Solution {
public:
    int mySqrt(int x) {
        int left = 0 ;
        int right = x ;
        int ans = -1 ;
        while(left<=right){
            long long int mid = left + (right - left) / 2 ;
            if(mid * mid == x){
                ans = mid ;
                break ;//没有break就会超时,因为这里后面的语句没有执行也就没有更新left和right
            }else if(mid * mid > x){
                right = mid-1 ;
            }else{
                left = mid+1 ;
                ans = mid;
            }
        }
        return ans ;
    }
};

 ③ 官方题解中还有一个牛顿迭代法,大概看了一下,涉及了函数求零点问题,还要求导啥的感觉太麻烦了。正常估计也想不到要用这个方法。

744.寻找比目标字母大的最小字母

        给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 targetletters 里至少有两个不同的字符。返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。

示例 1:

输入: letters = ["c", "f", "j"],target = "a"
输出: "c"
解释:letters 中字典上比 'a' 大的最小字符是 'c'。

示例 2:

输入: letters = ["c","f","j"], target = "c"
输出: "f"
解释:letters 中字典顺序上大于 'c' 的最小字符是 'f'。

示例 3:

输入: letters = ["x","x","y","y"], target = "z"
输出: "x"
解释:letters 中没有一个字符在字典上大于 'z',所以我们返回 letters[0]。

提示:

  • 2 <= letters.length <= 104
  • letters[i] 是一个小写字母
  • letters 按非递减顺序排序
  • letters 最少包含两个不同的字母
  • target 是一个小写字母

解题思路:

① 同样可以使用二分查找,思路和上一个题目基本一模一样。

代码如下:

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        int right = letters.size() - 1 ;
        int left = 0;
        if(target >= letters[right]){
            return letters[0] ;
        }
        while(left < right){
            int mid = (left + right) / 2 ;
            if(letters[mid] > target){
                //这里下标为mid的字符已经比target大了
                //所以可能是目标字符也可能不是(因为不保证它是第一个比它大的)
                //所以更新时不能将它直接跳过,要以它为有边界
                right = mid  ;
            }else{
                //这里为什么是mid+1,因为这里else的潜在条件是letters[mid] <= target
                //而我们要找的是第一个‘大于’target的字符,所以下标为mid的字符一定不会是目标字符
                //因此更新left时就可以跳过这一个,直接将mid+1作为左边界重新寻找
                left = mid + 1;
            }
        }
        return letters[left] ;
    }
};

另外还有一个版本的代码,和上一个区别就是while的条件不一样了,然后right的更新情况不一样。emmm...其实感觉很费解,有点转不过来弯儿,为什么是这个样子。

好好意会一下其实也能想通,就是不知道以后遇到了能不能想起来,哈哈

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        int right = letters.size() - 1 ;
        int left = 0;
        if(target >= letters[right]){
            return letters[0] ;
        }
        while(left <= right){
            int mid = (left + right) / 2 ;
            if(letters[mid] > target){
                right = mid - 1 ;
            }else{
                left = mid + 1;
            }
        }
        return letters[left] ;
    }
};

 ② 还有一种就是直接解咯,当然上面用二分查找法是为了练习一下这个算法,直接解就非常easy,遍历一下就完事了,毫无技巧。

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        int len = letters.size() ;
        int i = 0;
        for( ; i<len ;i++){
            if(letters[i] > target){
                return letters[i] ;
            }
        }
        return letters[0] ;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1932561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络构造

目录 一、神经网络骨架&#xff1a;二、卷积操作&#xff1a;三、卷积层&#xff1a;四、池化层&#xff1a;五、激活函数&#xff08;以ReLU为例&#xff09;&#xff1a; 一、神经网络骨架&#xff1a; import torch from torch import nn#神经网络 class CLH(nn.Module):de…

微信小程序 vant-weapp的 SwipeCell 滑动单元格 van-swipe-cell 滑动单元格不显示 和 样式问题 滑动后删除样式不显示

在微信小程序开发过程中 遇到个坑 此处引用 swipeCell 组件 刚开始是组件不显示 然后又遇到样式不生效 首先排除问题 是否在.json文件中引入了组件 {"usingComponents": {"van-swipe-cell": "vant/weapp/swipe-cell/index","van-cell-gro…

视频共享融合赋能平台LntonCVS视频监控业务平台技术方案详细介绍

LntonCVS国标视频综合管理平台是一款智慧物联应用平台&#xff0c;核心技术基于视频流媒体&#xff0c;采用分布式和负载均衡技术开发&#xff0c;提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台功能丰富&#xff0c;包括视频直播、录像、回放、检索、云存储、告警上…

【C++开源】GuiLite:超轻量UI框架-入门

开发环境说明 使用visual Studio 2022进行开发 下载源码 从如下的网址进行源码和示例代码的下载: GitHub源码网址为:idea4good/GuiLite示例代码路径为:idea4good/GuiLiteExample使用方法 GuiLite是一个仅有头文件的一个库,使用的时候直接include到自己的UIcode.cpp文件…

Golang面试题整理(持续更新...)

文章目录 Golang面试题总结一、基础知识1、defer相关2、rune 类型3、context包4、Go 竞态、内存逃逸分析5、Goroutine 和线程的区别6、Go 里面并发安全的数据类型7、Go 中常用的并发模型8、Go 中安全读写共享变量方式9、Go 面向对象是如何实现的10、make 和 new 的区别11、Go 关…

Elasticsearch 企业级实战 01:Painless 脚本如何调试?

在企业级应用中&#xff0c;Elasticsearch 常常被用来处理复杂的数据查询和操作。 Painless 是 Elasticsearch 的内置脚本语言&#xff0c;虽然强大&#xff0c;但调试起来并不容易。 本文将详细介绍如何在实战中有效调试 Painless 脚本&#xff0c;以提高开发和运维效率。 本文…

打印室预约小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;附近打印店管理&#xff0c;文件打印管理&#xff0c;当前预约管理&#xff0c;预约历史管理&#xff0c;打印记录管理 开发系统&#xff1a;Windows 架构模式&#xff1a;SSM JD…

微分段Microsegmentation简介

目录 微分段Microsegmentation简介什么是微分段&#xff1f;微分段的防范措施微分段的防护层级 基于网络的微分段微分段基本工作机制微分段的角色VxLAN的额外字段 业务链分组与传输策略场景1&#xff1a;三层报文本地转发场景场景2&#xff1a;三层报文跨设备转发场景 微分段的…

微信小程序与本地MySQL数据库通信

微信小程序与本地MySQL数据库通信 因为本地MySQL服务器没有域名&#xff0c;也没有进行相应的请求操作封装&#xff0c;因此微信小程序没办法和数据库通信。 但是对于开发人员来说&#xff0c;没有数据库&#xff0c;那还能干撒&#xff1f;虽然我尝试过用json-server&#x…

Android音视频—OpenGL 与OpenGL ES简述,渲染视频到界面基本流程

文章目录 OpenGL 简述特点和功能主要组件OpenGL ES当前状态 OpenGL ES 在 Android 上进行视频帧渲染总体流程 OpenGL 简述 OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的、语言无关的应用程序编程接口&#xff08;API&#xff09;&#xff0c;用于开发生…

关于 Redis 中分布式锁

什么是分布式锁 在一个分布式系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况。此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于“线程安全”的问题。 而 Java 中的 synchronized 或者 C 中的 std::mutex&#xff0c;这样的锁都只能在当前进程中生效…

allure_pytest:AttributeError: ‘str‘ object has no attribute ‘iter_parents‘

踩坑记录 问题描述&#xff1a; 接口自动化测试时出现报错&#xff0c;报错文件是allure_pytest库 问题分析&#xff1a; 自动化测试框架是比较成熟的代码&#xff0c;报错也不是自己写的文件&#xff0c;而是第三方库&#xff0c;首先推测是allure_pytest和某些库有版本不兼…

Hadoop3:RPC通信原理及简单案例实现

一、场景介绍 我们知道&#xff0c;Hadoop中存在多种服务&#xff0c;那么&#xff0c;服务之间是如何通信的了&#xff1f; 比如&#xff0c;DN和NN之间如何通信&#xff1f; 这里&#xff0c;实际上是通过RPC实现进程间通信的了。 RPC属于Java网络编程范畴 需要编写客户端和…

Apache POI 使用Java处理Excel数据 进阶

1.POI入门教程链接 http://t.csdnimg.cn/Axn4Phttp://t.csdnimg.cn/Axn4P建议&#xff1a;从入门看起会更好理解POI对Excel数据的使用和处理 记得引入依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactI…

Java中锁的全面详解(深刻理解各种锁)

一.Monitor 1. Java对象头 以32位虚拟机位例 对于普通对象,其对象头的存储结构为 总长为64位,也就是8个字节, 存在两个部分 Kclass Word: 其实也就是表示我们这个对象属于什么类型,也就是哪个类的对象.而对于Mark Word.查看一下它的结构存储 64位虚拟机中 而对于数组对象,我…

阿里云开源 Qwen2-Audio 音频聊天和预训练大型音频语言模型

Qwen2-Audio由阿里巴巴集团Qwen团队开发&#xff0c;它能够接受各种音频信号输入&#xff0c;对语音指令进行音频分析或直接文本回复。与以往复杂的层次标签不同&#xff0c;Qwen2-Audio通过使用自然语言提示简化了预训练过程&#xff0c;并扩大了数据量。 喜好儿网 Qwen2-Au…

六边形动态特效404单页HTML源码

源码介绍 动态悬浮的六边形,旁边404文字以及跳转按钮,整体看着像科技二次元画风,页面简约美观,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 完整源码 <!DOCTYPE html> <html><head…

【VScode】安装【ESP-IDF】插件及相关工具链

一、ESP-IDF简介 二、VScode安装ESP-IDF插件 三、安装ESP-IDF、ESP-IDF-Tools以及相关工具链 四、测试例程&编译烧录 一、ESP-IDF简介 二、VScode安装ESP-IDF插件 【VScode】安装配置、插件及远程SSH连接 【VSCode】自定义配置 打开VScode&#xff0c;在插件管理搜索esp…

关于Linux的面试题(实时更新中~)

一、软连接和硬连接的区别&#xff1a; 软连接创建方式 ln -s 被链接文件 链接文件 &#xff08;1&#xff09;软链接是一个链接文件&#xff1b; &#xff08;2&#xff09;软链接有着自己的 inode 号&#xff08;文件编号&#xff09;&#xff1b; &#xff08;3&#…

怎么压缩pdf文件大小?分享8款便捷的PDF压缩工具分享

当用户上传PDF文件到网站时&#xff0c;常常会遇到文件大小的限制问题。尤其是当PDF文件包含大量图片、图形和丰富内容时&#xff0c;文件体积会变得很大。这时&#xff0c;为了符合网站的大小要求并成功上传&#xff0c;我们需要对PDF文件进行压缩。那么&#xff0c;如何将PDF…