本文已参与「新人创作礼」活动,一起开启掘金创作之路。
| 每日一题做题记录,参考官方和三叶的题解 |
题目要求
思路一:线性查找
遍历整个字符串查找,没有就返回第一个。
Java
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
for(char let : letters)
if(let > target)
return let;
return letters[0];
}
}
- 时间复杂度:,为的长度
- 空间复杂度:
C++
【和Java甚至是可以直接cv的一模一样】
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
for(char let : letters)
if(let > target)
return let;
return letters[0];
}
};
- 时间复杂度:
- 空间复杂度:
思路二:二分查找
Java
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int n = letters.length;
int l = 0, r = n - 1;
while(l < r) {
int m = l + r >> 1;
if(letters[m] > target)
r = m;
else
l = m + 1;
}
return letters[r] > target ? letters[r] : letters[0];
}
}
- 时间复杂度:
- 空间复杂度:
C++
一行结束!C++站起来了!
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
return target < letters.back() ? *upper_bound(letters.begin(), letters.end() - 1, target) : letters[0];
}
};
- 时间复杂度:
- 空间复杂度:
upper_bound
- 学习参考链接
- 用于在一个已排好序的序列范围中查找第一个大于目标的值,返回指向其的正向迭代器,若没有找到则指向序列末尾迭代器。
- 也可以自定义比较规则。
- 底层基于二分查找实现,类似函数还有
lower_bound。 - 在Java中数组是没有类似功能的函数,但是TreeSet结构中的
lower、higher、floor、ceiling四个方法还挺类似的,其复杂度也是,所以合理怀疑底层也基于二分查找。
总结
一道光速做完的简单题,但是确实没想到C++有这么方便的二分查找函数,涨知识了。
| 欢迎指正与讨论! |