一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
寻找比目标字母大的最小字母
该题出自力扣的744题——寻找比目标字母大的最小字母【简单题】,作为清明假期的最后一天,既想要休息又想不颓废自己,刚好就是每日一题的简单题,简直就是瞌睡来了枕头,哈哈哈
审题
给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
在比较时,字母是依序循环出现的。举个例子:
如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
- 该题的题意相对比较简单,就是给出一个字符数组,并且给出一个目标的字符,找出当前数组内比目标字符大的最小字符
- 因为是简单题,所以题目给出数组是有序的,因为是有序的,所以只需要找出比目标字符大的第一位即可
- 暴力解法:
- 遍历当前字符数组
- 找到比目标字符大的即可直接返回
- 如果不存在,即直接返回数组第一位(有序)
- 正因为是有序,题目就可以转型为查找算法的代入,为了降低时间复杂度,可以使用二分查找算法。
- 暴力的时间复杂度为O(n),二分的时间复杂度为O(lgn),在数据量小的时候并不太明显,但是数据量大的时候,差距就十分明显了。
编码
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
for(char c: letters){
if(c> target)return c;
}
return letters[0];
}
}
二分查找实现
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int length = letters.length;
if (target >= letters[length - 1]) {
return letters[0];
}
int low = 0, high = length - 1;
while (low < high) {
int mid = (high - low) / 2 + low;
if (letters[mid] > target) {
high = mid;
} else {
low = mid + 1;
}
}
return letters[low];
}
}