题目描述:

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:

  1. Input:
  2. letters = ["c", "f", "j"]
  3. target = "a"
  4. Output: "c"
  5.  
  6. Input:
  7. letters = ["c", "f", "j"]
  8. target = "c"
  9. Output: "f"
  10.  
  11. Input:
  12. letters = ["c", "f", "j"]
  13. target = "d"
  14. Output: "f"
  15.  
  16. Input:
  17. letters = ["c", "f", "j"]
  18. target = "g"
  19. Output: "j"
  20.  
  21. Input:
  22. letters = ["c", "f", "j"]
  23. target = "j"
  24. Output: "c"
  25.  
  26. Input:
  27. letters = ["c", "f", "j"]
  28. target = "k"
  29. Output: "c"

Note:

  1. letters has a length in range [2, 10000].
  2. letters consists of lowercase letters, and contains at least 2 unique letters.
  3. target is a lowercase letter.

要完成的函数:

char nextGreatestLetter(vector<char>& letters, char target)

说明:

1、给定一个只含有小写字母且排好序的vector,里面至少含有两个不同的小写字母,给定target,要求返回一个比target大的最小元素。如果vector中所有元素都比target小,那么由于设定vector是“环绕”的,此时返回vector中的第一个元素。

2、这道题直接暴力解法,从首个元素开始迭代,也是做得出来的。但是很明显这道题要二分查找才是比较快的方法。

我们先放出二分查找的经典代码,如下:(代码未彻底完成)

  1. char nextGreatestLetter(vector<char>& letters, char target)
  2. {
  3. int s1=letters.size();
  4. int first=,last=s1-,mid;
  5. while(first<=last)
  6. {
  7. mid=(first+last)/;
  8. if(letters[mid]==target)
  9. break;
  10. else if(letters[mid]<target)
  11. first=mid+;
  12. else
  13. last=mid-;
  14. }
  15. }

如果target的元素在vector中,那么将会返回mid,而我们之后只需要返回mid+1这一位的元素,当然如果mid已经是vector中的最后一位了,我们需要返回vector的第一个元素。

如果target的元素不在vector中,那么first对应的就是刚好大于target元素的最小元素,如果first已经超出了vector,那么返回vector的第一个元素。

逻辑清晰,我们继续构造代码如下:(未彻底完成)

  1. char nextGreatestLetter(vector<char>& letters, char target)
  2. {
  3. int s1=letters.size();
  4. int first=,last=s1-,mid;
  5. while(first<=last)
  6. {
  7. mid=(first+last)/;
  8. if(letters[mid]==target)
  9. break;
  10. else if(letters[mid]<target)
  11. first=mid+;
  12. else
  13. last=mid-;
  14. }
  15. if(letters[mid]==target)
  16. {
           if(mid+==s1)
  17. return letters[];
  18. else
  19. return letters[mid+];
  20. }
  21. else
  22. {
  23. if(first==s1)
  24. return letters[];
  25. else
  26. return letters[first];
  27. }
  28. }

上述代码在普通情况下可以运行,但是测试样例中出现了重复的元素,比如['e','e','e','e','e','e','n','n','n','n'],target是'e',上述代码就只能输出'e'了。

笔者最开始想到的处理方法是利用set,但后来想到vector是排序好的,所以可以做一个循环,定义一个新的vector,先插入第一个元素,然后比较下一个元素和当前元素相不相等,如果相等就continue,如果不相等就插入到新的vector中,最后得到一个不包含重复元素的vector。接着再用上述方法处理。

这样做也可以,但是如果给定的vector不包含重复元素,我们就白白做了一番复制的功夫。太浪费时间了。

想到其实上面的例子,最后输出的是'e',那我们可以mid++,一直到mid对应的元素不等于'e',这样就可以了。

完整代码如下:(附解释)

  1. char nextGreatestLetter(vector<char>& letters, char target)
  2. {
  3. int s1=letters.size();
  4. int first=,last=s1-,mid;
  5. while(first<=last)//二分查找经典算法
  6. {
  7. mid=(first+last)/;
  8. if(letters[mid]==target)
  9. break;
  10. else if(letters[mid]<target)
  11. first=mid+;
  12. else
  13. last=mid-;
  14. }
  15. if(letters[mid]==target)//如果在vector中有对应的元素
  16. {
  17. while(letters[mid+]==letters[mid])//如果出现重复的
  18. mid++;
  19. if(mid+==s1)//如果到达最后一个元素了
  20. return letters[];
  21. else
  22. return letters[mid+];
  23. }
  24. else
  25. {//如果vector中没有对应的元素
  26. if(first==s1)//如果已经超出了vector
  27. return letters[];
  28. else
  29. return letters[first];
  30. }
  31. }

上述代码实测16ms,beats 99.41% of cpp submissions。

leetcode-744-Find Smallest Letter Greater Than Target(改进的二分查找)的更多相关文章

  1. LeetCode 744. Find Smallest Letter Greater Than Target (寻找比目标字母大的最小字母)

    题目标签:Binary Search 题目给了我们一组字母,让我们找出比 target 大的最小的那个字母. 利用 binary search,如果mid 比 target 小,或者等于,那么移到右半 ...

  2. LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))

    题目 太简单了,直接上代码: class Solution { public: char nextGreatestLetter(vector<char>& letters, cha ...

  3. 【Leetcode_easy】744. Find Smallest Letter Greater Than Target

    problem 744. Find Smallest Letter Greater Than Target 题意:一堆有序的字母,然后又给了一个target字母,让求字母数组中第一个大于target的 ...

  4. 【LeetCode】744. Find Smallest Letter Greater Than Target 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 线性扫描 二分查找 日期 题目地址:https:// ...

  5. 744. Find Smallest Letter Greater Than Target 查找比目标字母大的最小字母

    [抄题]: Given a list of sorted characters letters containing only lowercase letters, and given a targe ...

  6. 744. Find Smallest Letter Greater Than Target

    俩方法都是用二分查找,一个调库,一个自己写而已. 方法一,调库 static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NUL ...

  7. [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 ...

  8. Python 解LeetCode:744. Find Smallest Letter Greater Than Target

    思路:二分法,时间复杂度o(logn) class Solution(object): def nextGreatestLetter(self, letters, target): "&qu ...

  9. [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 ...

  10. Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target)

    Leetcode之二分法专题-744. 寻找比目标字母大的最小字母(Find Smallest Letter Greater Than Target) 给定一个只包含小写字母的有序数组letters  ...

随机推荐

  1. Asp.net core 项目实战 新闻网站+后台 源码、设计原理 、视频教程

    首先说明,视频教程.源码并非本人原创 本人将项目分割开,并写了一些说明. 该视频教程 地址  https://study.163.com/course/courseMain.htm?courseId= ...

  2. http状态码汇总及问题经验总结

    我们经常会遇到404.500.302等提示,它们究竟是什么意思呢?除了这几个常见的状态码外,还有哪些我们没有遇到过的但有可能出现的状态码呢?这里本人做了一个汇总,与大家分享一下. 常见的HTTP错误可 ...

  3. CopyrightHelper—开源VS插件辅助插入版权注释

    前言 有很多时候,我们在写代码的时候需要在代码文件头加上描述和版权信息等,如果使用代码项目模板又得为每种文件定模板,而已不方便,如果从某个地方复制过来,又嫌麻烦... 为了能解决这种懒人的需求,我开始 ...

  4. 学习EChart.js(四) 移动端显示

    ECharts.js 移动端显示 现在很多时候,我们是在用手机.pad等一些移动端设备来进行办公获取数据.所以我们的图表很多时候是需要用移动端设置来查看的,而我们的图表有时候因为数据的偏多,会出现遮挡 ...

  5. 自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法

    1. 内部拦截法: 父容器不拦截事件,所有的事件全部都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器进行处理. 这种方法和Android中的事件分发机制不一样,需要配合request ...

  6. 真实世界中的 Swift 性能优化

    那么有什么因素会导致代码运行缓慢呢?当您在编写代码并选择架构的时候,深刻认识到这些架构所带来的影响是非常重要的.我将首先谈一谈:如何理解内联.动态调度与静态调度之间的权衡,以及相关结构是如何分配内存的 ...

  7. 【转+修改】容联云通讯api调用短信发送调用

    转自   https://my.oschina.net/u/1995134/blog/814540 需要荣联云通讯 的 相对应SDKjar包. CCP_REST_SMS_SDK_JAVA_v2.6.3 ...

  8. 【题解】前k大子段和

    题目描述 Peter喜欢玩数组.NOIP这天,他从Jason手里得到了一个大小为\(n\)的数组. Peter求出了这个数组的所有子段和,并将这\(\frac{n(n+1)}{2}\)个数降序排列,他 ...

  9. windows下使用Git

    如何在windows下使用Git? 通过这里下载Git bash,你就可以像在Linux命令行一样操作git工具. 进入Git bash环境,默认是在当前用户路径下. 在Linux下,我们有根目录,在 ...

  10. Spring(十二)之JDBC框架

    JDBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等.但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQ ...