leetcode-744-Find Smallest Letter Greater Than Target(改进的二分查找)
题目描述:
Given a list of sorted characters letters
containing only lowercase letters, and given a target letter target
, find the smallest element in the list that is larger than the given target.
Letters also wrap around. For example, if the target is target = 'z'
and letters = ['a', 'b']
, the answer is 'a'
.
Examples:
- Input:
- letters = ["c", "f", "j"]
- target = "a"
- Output: "c"
- Input:
- letters = ["c", "f", "j"]
- target = "c"
- Output: "f"
- Input:
- letters = ["c", "f", "j"]
- target = "d"
- Output: "f"
- Input:
- letters = ["c", "f", "j"]
- target = "g"
- Output: "j"
- Input:
- letters = ["c", "f", "j"]
- target = "j"
- Output: "c"
- Input:
- letters = ["c", "f", "j"]
- target = "k"
- Output: "c"
Note:
letters
has a length in range[2, 10000]
.letters
consists of lowercase letters, and contains at least 2 unique letters.target
is a lowercase letter.
要完成的函数:
char nextGreatestLetter(vector<char>& letters, char target)
说明:
1、给定一个只含有小写字母且排好序的vector,里面至少含有两个不同的小写字母,给定target,要求返回一个比target大的最小元素。如果vector中所有元素都比target小,那么由于设定vector是“环绕”的,此时返回vector中的第一个元素。
2、这道题直接暴力解法,从首个元素开始迭代,也是做得出来的。但是很明显这道题要二分查找才是比较快的方法。
我们先放出二分查找的经典代码,如下:(代码未彻底完成)
- char nextGreatestLetter(vector<char>& letters, char target)
- {
- int s1=letters.size();
- int first=,last=s1-,mid;
- while(first<=last)
- {
- mid=(first+last)/;
- if(letters[mid]==target)
- break;
- else if(letters[mid]<target)
- first=mid+;
- else
- last=mid-;
- }
- }
如果target的元素在vector中,那么将会返回mid,而我们之后只需要返回mid+1这一位的元素,当然如果mid已经是vector中的最后一位了,我们需要返回vector的第一个元素。
如果target的元素不在vector中,那么first对应的就是刚好大于target元素的最小元素,如果first已经超出了vector,那么返回vector的第一个元素。
逻辑清晰,我们继续构造代码如下:(未彻底完成)
- char nextGreatestLetter(vector<char>& letters, char target)
- {
- int s1=letters.size();
- int first=,last=s1-,mid;
- while(first<=last)
- {
- mid=(first+last)/;
- if(letters[mid]==target)
- break;
- else if(letters[mid]<target)
- first=mid+;
- else
- last=mid-;
- }
- if(letters[mid]==target)
- {
if(mid+==s1)- return letters[];
- else
- return letters[mid+];
- }
- else
- {
- if(first==s1)
- return letters[];
- else
- return letters[first];
- }
- }
上述代码在普通情况下可以运行,但是测试样例中出现了重复的元素,比如['e','e','e','e','e','e','n','n','n','n'],target是'e',上述代码就只能输出'e'了。
笔者最开始想到的处理方法是利用set,但后来想到vector是排序好的,所以可以做一个循环,定义一个新的vector,先插入第一个元素,然后比较下一个元素和当前元素相不相等,如果相等就continue,如果不相等就插入到新的vector中,最后得到一个不包含重复元素的vector。接着再用上述方法处理。
这样做也可以,但是如果给定的vector不包含重复元素,我们就白白做了一番复制的功夫。太浪费时间了。
想到其实上面的例子,最后输出的是'e',那我们可以mid++,一直到mid对应的元素不等于'e',这样就可以了。
完整代码如下:(附解释)
- char nextGreatestLetter(vector<char>& letters, char target)
- {
- int s1=letters.size();
- int first=,last=s1-,mid;
- while(first<=last)//二分查找经典算法
- {
- mid=(first+last)/;
- if(letters[mid]==target)
- break;
- else if(letters[mid]<target)
- first=mid+;
- else
- last=mid-;
- }
- if(letters[mid]==target)//如果在vector中有对应的元素
- {
- while(letters[mid+]==letters[mid])//如果出现重复的
- mid++;
- if(mid+==s1)//如果到达最后一个元素了
- return letters[];
- else
- return letters[mid+];
- }
- else
- {//如果vector中没有对应的元素
- if(first==s1)//如果已经超出了vector
- return letters[];
- else
- return letters[first];
- }
- }
上述代码实测16ms,beats 99.41% of cpp submissions。
leetcode-744-Find Smallest Letter Greater Than Target(改进的二分查找)的更多相关文章
- LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)
题目标签:Binary Search 题目给了我们一组字母,让我们找出比 target 大的最小的那个字母. 利用 binary search,如果mid 比 target 小,或者等于,那么移到右半 ...
- LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
题目 太简单了,直接上代码: class Solution { public: char nextGreatestLetter(vector<char>& letters, cha ...
- 【Leetcode_easy】744. Find Smallest Letter Greater Than Target
problem 744. Find Smallest Letter Greater Than Target 题意:一堆有序的字母,然后又给了一个target字母,让求字母数组中第一个大于target的 ...
- 【LeetCode】744. Find Smallest Letter Greater Than Target 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 线性扫描 二分查找 日期 题目地址:https:// ...
- 744. Find Smallest Letter Greater Than Target 查找比目标字母大的最小字母
[抄题]: Given a list of sorted characters letters containing only lowercase letters, and given a targe ...
- 744. Find Smallest Letter Greater Than Target
俩方法都是用二分查找,一个调库,一个自己写而已. 方法一,调库 static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NUL ...
- [LeetCode&Python] Problem 744. Find Smallest Letter Greater Than Target
Given a list of sorted characters letters containing only lowercase letters, and given a target lett ...
- Python 解LeetCode:744. Find Smallest Letter Greater Than Target
思路:二分法,时间复杂度o(logn) class Solution(object): def nextGreatestLetter(self, letters, target): "&qu ...
- [LeetCode] 744. Find Smallest Letter Greater Than Target_Easy tag: **Binary Search
Given a list of sorted characters letters containing only lowercase letters, and given a target lett ...
- Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target)
Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target) 给定一个只包含小写字母的有序数组letters ...
随机推荐
- Asp.net core 项目实战 新闻网站+后台 源码、设计原理 、视频教程
首先说明,视频教程.源码并非本人原创 本人将项目分割开,并写了一些说明. 该视频教程 地址 https://study.163.com/course/courseMain.htm?courseId= ...
- http状态码汇总及问题经验总结
我们经常会遇到404.500.302等提示,它们究竟是什么意思呢?除了这几个常见的状态码外,还有哪些我们没有遇到过的但有可能出现的状态码呢?这里本人做了一个汇总,与大家分享一下. 常见的HTTP错误可 ...
- CopyrightHelper—开源VS插件辅助插入版权注释
前言 有很多时候,我们在写代码的时候需要在代码文件头加上描述和版权信息等,如果使用代码项目模板又得为每种文件定模板,而已不方便,如果从某个地方复制过来,又嫌麻烦... 为了能解决这种懒人的需求,我开始 ...
- 学习EChart.js(四) 移动端显示
ECharts.js 移动端显示 现在很多时候,我们是在用手机.pad等一些移动端设备来进行办公获取数据.所以我们的图表很多时候是需要用移动端设置来查看的,而我们的图表有时候因为数据的偏多,会出现遮挡 ...
- 自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法
1. 内部拦截法: 父容器不拦截事件,所有的事件全部都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器进行处理. 这种方法和Android中的事件分发机制不一样,需要配合request ...
- 真实世界中的 Swift 性能优化
那么有什么因素会导致代码运行缓慢呢?当您在编写代码并选择架构的时候,深刻认识到这些架构所带来的影响是非常重要的.我将首先谈一谈:如何理解内联.动态调度与静态调度之间的权衡,以及相关结构是如何分配内存的 ...
- 【转+修改】容联云通讯api调用短信发送调用
转自 https://my.oschina.net/u/1995134/blog/814540 需要荣联云通讯 的 相对应SDKjar包. CCP_REST_SMS_SDK_JAVA_v2.6.3 ...
- 【题解】前k大子段和
题目描述 Peter喜欢玩数组.NOIP这天,他从Jason手里得到了一个大小为\(n\)的数组. Peter求出了这个数组的所有子段和,并将这\(\frac{n(n+1)}{2}\)个数降序排列,他 ...
- windows下使用Git
如何在windows下使用Git? 通过这里下载Git bash,你就可以像在Linux命令行一样操作git工具. 进入Git bash环境,默认是在当前用户路径下. 在Linux下,我们有根目录,在 ...
- Spring(十二)之JDBC框架
JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...