【刷题日记】744. 寻找比目标字母大的最小字母

简介: 本次刷题日记的第 23 篇,力扣题为:744. 寻找比目标字母大的最小字母 ,简单

【刷题日记】744. 寻找比目标字母大的最小字母

本次刷题日记的第 23 篇,力扣题为:744. 寻找比目标字母大的最小字母简单

一、题目描述:

image.png

清明小长假第一天,leetcode 给我们准备了一个简单题,我们一起来看看,查看一下记录,之前写 C/C++ 的时候原来也刷过这道题,本次可以使用 golang 再来回顾一下


二、这道题考察了什么思想?你的思路是什么?

说是回顾这道题,实际上也是重新做这道题,xdm 自己刷题的情况是不是也是这样呢

不过没有关系,只要我们曾经思考过并实际解决过,哪怕再次遇到类似的问题,我们肯定是可以很快的找到感觉,找到正确的解决方式


一起来看看本题给出的重点信息吧:

  • letters 数组给出的是一个从小到大有序的 byte 数组,且其中字符全部都是小写字母
  • letters 数组的长度是 2 -- 104 ,最小都会有 2 个元素
  • 题目给出 target 字符也是小写的,要求在 letters 数组中找到比 target 字符大的最小字符

根据上述情况,我们需要明白的,找出比 target 字符大的最小字符的含义

例如 letters 数组中是 [a,f,g] ,如果 target 是 b此时 我们识别到 f 和 g 都是大于 b 的,但是 f 才是满足要求的

我们分析一下这个题,实际就是有 2 种 情况

第一种

就是按照题意,当 target 给出的字符是大于或者等于 letters 的最后一个字符的时候,那么得到的结果是 letters[0] 才是满足要求的 , 因为题目中有说到,这个数组是依次循环出现的

第二种

剩余的情况就是不考虑依次循环的情况,默认是在当前给出的 letters 数组中去找符合要求的字符

当然,这个时候,我们是可以使用遍历 letters 数组的方式去一个一个对比的,但是这个方式也太挫了,我们来使用二分法吧

二分法一般是用在一个有序的数组中查找期望元素的场景,本次的问题正好是符合这个场景,所以理应我们往这个方向去思考

举一个例子:

示例: letters = ["c","f","j","k","m","o","q"], target = "n"

使用二分法进行处理,第一次:

left = 0,right = len(letters) = 6, mid = 3,此时 letters[3] == “k” < "n" ,则进行第二轮

left = 4 , right = 6 , mid = 5 , 此时 letters[5] == "o" > "n" ,则进行第三轮

left = 4, right = 5, 此时 letters[4] == "m" < "n" ,则进行第四轮

left = 5, right = 5 , 校验到 left 已经满足 大于或者等于 right ,则最终的需要找的目标字符就是 letters[5] == “o”

按照上述逻辑和思路,相信编码的话就不是什么难事了吧


三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码 , 这里需要注意当 target 大于等于 letters[len(letters) -1] 的情况,此处直接返回结果即可

编码如下:

func nextGreatestLetter(letters []byte, target byte) byte {
    // 因为 letters 是有序的,如果 target 大于 letters 数组的最后一位,那么 letters[0] 就是符合要求的字符
    if target >= letters[len(letters)-1] {
        return letters[0]
    }
    // 初始化左边界,右边界 ,和 mid 
    left := 0
    right := len(letters)
    mid := 0
    for left<right {
        mid = (left + right) /2
        // 如果 target 小于 letters 目前边界的中间位置的数字,说明符合要求的字母是在偏左的一侧
        if letters[mid] > target {
            right = mid
        }else{
            // 反之亦然
            left = left + 1
        }
    }
    // 当然 left边界等于 right 或者大于 right 的那一刻,letters[left] 就是我们需要找的比目标大的最小字母
    return letters[left]
}

根据上述编码的话,应该就很清晰了,需要分清咱们需要查找的字符应该是在左边还是右边

四、总结:

本次题目的时间复杂度是 O(logn) ,空间复杂度是 O(1),因为我们引入了常熟级别的空间消耗

原题地址:744. 寻找比目标字母大的最小字母

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~


相关文章
|
6月前
|
存储 编解码 资源调度
鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)
本文分享鸿蒙相机开发经验,从环境准备到核心逻辑实现,涵盖权限声明、模块导入、Surface关联与分辨率匹配,再到录制控制及设备适配法则。通过实战案例解析,如旋转补偿、动态帧率调节和编解码优化,帮助开发者掌握功能实现、设备适配与体验设计三大要点,减少开发坑点。适合鸿蒙新手及希望深化硬件交互能力的工程师参考收藏。
229 2
|
网络协议 网络安全
Powershell免杀(无文件落地免杀)
无文件落地 顾名思义,无需将恶意文件传到目标服务器/机器上,直接利用powershell的特性加载到内存执行。为了在红队行动中更隐蔽的实施攻击以及横向移动,同时还可以解决目标不出网只能通过dns上线时的棘手问题,利用powershell可以避免一行行echo。 通过两种方式进行无文件落地的免杀,一种是出网的情况,另一种为不出网情况。 声明: 文章内容仅供网络安全爱好者学习使用,请勿用文章中提到的技术或工具做违法的事情,否则后果自负。
1381 0
|
9月前
|
人工智能 自然语言处理 API
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
Mathtutor on Groq 是一款基于 Groq 架构的 AI 数学辅导工具,支持语音输入数学问题,实时计算并渲染解题过程,适用于代数、微积分等领域的学习和教学辅助。
714 5
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
【MCP教程系列】当阿里云百炼智能体携带MCP,超级GitHub运营即刻上岗
阿里云百炼提供了一系列预置的MCP服务,无需自行部署或支付资源费用。通过简单几步,即可在智能体中添加MCP服务,自动实现调用兼容。
738 0
|
7月前
|
缓存 算法
函数递归超详解!
递归是解决许多计算机科学问题的强大工具。通过将问题分解为更小的子问题,递归提供了一种简洁且自然的解决方法。本文详细解释了递归的基本概念、类型、优缺点,并通过示例展示了如何应用递归解决实际问题。掌握递归技术对于编写高效、清晰的代码至关重要。希望本文能帮助读者更好地理解和应用递归,提升编程技巧。
181 8
|
数据采集 数据挖掘 大数据
数据处理利器:使用Pandas进行数据清洗与转换
【4月更文挑战第12天】在大数据时代,Pandas是Python数据分析的关键工具,提供高效的数据清洗和转换功能。本文介绍了如何使用Pandas处理缺失值(删除或填充)、异常值(Z-Score法和IQR法)以及重复值(检测和删除)。此外,还涵盖了数据转换,包括数据类型转换、数据标准化(Min-Max和Z-Score)以及类别数据的one-hot编码。通过学习这些方法,可以为数据分析和挖掘奠定坚实基础。
383 0
|
定位技术 Apache
Echarts——Invalid geoJson format Cannot read property 'length' of undefined
Echarts——Invalid geoJson format Cannot read property 'length' of undefined
206 0
汇编指令学习(CMP,TEST)
汇编指令学习(CMP,TEST)
263 0
|
机器学习/深度学习 存储 编解码
【数据挖掘】网格聚类STING、概念聚类COBWEB和模糊聚类的讲解(图文解释)
【数据挖掘】网格聚类STING、概念聚类COBWEB和模糊聚类的讲解(图文解释)
661 0
|
前端开发 容器
清除浮动的几种方式?各自的优缺点?
清除浮动的几种方式?各自的优缺点?