2022.8.9今天你刷题了吗?
题目:
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
分析:
给定一个vector,里面是char类型,以及一个target也是char类型,你需要在vector里面找到一个大于target的字母,且该字母为vector中最小字母。那么就会存在两种情况。
1.找到了存在的字母:直接返回该字母。
2.找不到该字母:直接返回vector第一个字母。
思路:遍历vector数组,每遍历一次判断一次,如果遇到满足条件直接返回,如果不满足最后返回首字母。
解析:
1.暴力法
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
sort(letters.begin(),letters.end());
for(auto &ch:letters)
{
if(ch-'a'<=target-'a')
{
}
else
{
return ch;
}
}
return letters[0];
}
};
2.二分法
延续暴力法思路,区别在于不是直接遍历vector,而是利用二分查找从中间开始找,节约时间。
class Solution {
public:
char nextGreatestLetter(vector<char>& letters, char target) {
int l=0, r=letters.size()-1;
int ret = 0;
while(l <= r){
int m = l + (r-l)/2;
if(letters[m] <= target){
l = m + 1;
}else{
ret = m;
r = m - 1;
}
}
return letters[ret];
}
};