给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。 数组里字母的顺序是循环的。 举个例子,如果目标字母target = 'z' 并且有序数组为 letters = ['a', 'b'],则答案返回 'a'。
注:
输入:
输出:
输入: letters = ["c", "f", "j"] target = "a" 输出: "c"
输入: letters = ["c", "f", "j"] target = "c" 输出: "f"
输入: letters = ["c", "f", "j"] target = "d" 输出: "f"
输入: letters = ["c", "f", "j"] target = "g" 输出: "j"
输入: letters = ["c", "f", "j"] target = "j" 输出: "c"
输入: letters = ["c", "f", "j"] target = "k" 输出: "c"
比如输入:letters = ["c", "f", "j"],target = "j" 第一遍扫描后有:dict["c"]=1, dict["f"]=1, dict["j"]=1, 其余字符的dict都是0; 第二遍扫描从 "h" 开始环形扫描,扫到 "c" 时发现其出现过,于是返回 "c" 。
//函数中涉及到的c++知识
//vector<char> 是个长度可变的 char 数组,c++里面称为容器
//vector<int> 是个长度可变的 int 数组,c++里面称为容器
//vector<int> dict(26, 0) 初始化包含26个元素的可变数组为0
char nextGreatestLetter(vector<char>& letters, char target) {
//字符初始化为未出现
vector<int> dict(26, 0);
//一遍扫描记录出现的字符
int cnt_valid_letter = 0;
int len = letters.size();
for( int i = 0; i < len; i++ ){
if(cnt_valid_letter == 26) continue;
if(dict[letters[i] - 'a'] == 0){
dict[letters[i] - 'a'] = 1;
cnt_valid_letter++;
}
}
//环形扫描比目标字母大的最小字母
int start = (target - 'a' + 1) % 26;
for( int i = 0; i < 26; i++ ){
if(dict[(i+start)%26]) return ((i+start)%26+'a');
}
return -1;
}
本题利用求模操作实现环形扫描,再配合常见的两遍扫描法即可解决该问题。
无。
方法 | 空间复杂度 | 时间复杂度 |
---|---|---|
两遍扫描法 | O(1) | O(n) |
如果给你的数据是链表或者数组数据呢?