题目描述:

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:

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

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

    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(改进的二分查找)的更多相关文章

  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. July 31st 2017 Week 31st Monday

    Elegance is the only beauty that never fades. 优雅是唯一不会褪色的美. Even the most beautiful apperace would be ...

  2. MySQL语法相关其一

    一篇基础语法相关的笔记 // 参考资料: MySQL入门很简单 黄缙华等编著 清华大学出版社 北京 建议进入官网下载对应版本后安装:https://dev.mysql.com/downloads/my ...

  3. 在Eclipse中通过build.xml导入工程

    http://www.zihou.me/html/2012/10/18/7868.html

  4. [Assignment] C++2

    作业要求:PAT1025 翻转链表 代码在这里

  5. iOS的图片:解码(CPU)与内存(缓存)

    图片的数据:资源数据(地址).原始数据(Data).显示数据(解码后的数据) 解压图片 - PNG或者JPEG压缩之后的图片文件会比同质量的位图小得多.但是在图片绘制到屏幕上之前,必须把它扩展成完整的 ...

  6. iOS离屏渲染的解释:渲染与cpu、gpu

    重开一个环境(内存.资源.上下文)来完成(部分)图片的绘制 指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作 意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作. ...

  7. 2456. mode【乱搞】

    Description 给你一个n个数的数列,其中某个数出现了超过n div 2次即众数,请你找出那个数. Input 第1行一个正整数n. 第2行n个正整数用空格隔开. Output 一行一个正整数 ...

  8. bzoj4403:序列统计

    我好傻啊 题目 先来看看长度只能为\(n\)的情况 那么答案非常显然是\(\binom{m+n-1}{n}\) 其中\(m=R-L+1\) 因为我们要构造一个非降序列,显然可能一个数会被选择多次,组合 ...

  9. Kali-linux破解纯文本密码工具mimikatz

    mimikatz是一款强大的系统密码破解获取工具.该工具有段时间是作为一个独立程序运行.现在已被添加到Metasploit框架中,并作为一个可加载的Meterpreter模块.当成功的获取到一个远程会 ...

  10. concatenate

    concatenate函数的作用是对numpy数组或tensor进行拼接 >>> a = np.array([[1, 2], [3, 4]]) >>> b = np ...