题目链接:744. 寻找比目标字母大的最小字母(简单)
算法原理:
模板题👇
优选算法-二分:18.在排序数组中查找元素的第一个和最后一个位置
解法一:二分查找-求最左端点模型
击败100.00%
时间复杂度O(LogN)
①最左端点目标位置:target,如果没有target,就是小于target且紧靠target的位置
②mid靠左:int mid=left+(right-left)/2;
③if(mid在左端点的左边) 让左端点的左边往里靠,还要超过:
if(s[mid]<t) left=mid+1;
④else 另一边靠过来就行:right=mid
⑤left和right重合:即最左端点目标位置
⑥解决小问题:存在多个连续等于目标字符
t时,需要让left移动到最右位置:while(left+1<n&&s[left]==t) left++;
⑦返回值:
目标位置大于target直接返回目标位置
目标位置不大于target且目标位置右侧有值时返回目标位置右侧的值
目标位置右侧没有值就按题意返回第一个位置
解法二:二分查找-求最右端点模型
击败100.00%
时间复杂度O(LogN)
①最右端点目标位置:target,如果没有target,就是大于target且紧靠target的位置
②mid靠左:int mid=left+(right-left+1)/2;
③if(mid在右端点的右边) 让右端点的右边往里靠,还要超过:
if(s[mid]>t) right=mid-1;
④else 另一边靠过来就行:left=mid
⑤left和right重合:即最右端点目标位置
⑥由于目标位置即靠近target的最右位置了,所以无需再移动
⑦返回值:
目标位置大于target直接返回目标位置
目标位置不大于target且目标位置右侧有值时返回目标位置右侧的值
目标位置右侧没有值就按题意返回第一个位置
Java代码:
java
class Solution {
public char nextGreatestLetter(char[] s, char t) {
int n=s.length;
int left=0,right=n-1;
//求最左端点模型
while(left<right){
int mid=left+(right-left)/2;
if(s[mid]<t) left=mid+1;
else right=mid;
}
while(left+1<n&&s[left]==t) left++;
return s[left]>t?s[left]:(left+1<n?s[left+1]:s[0]);
}
}
java
class Solution {
public char nextGreatestLetter(char[] s, char t) {
int n=s.length;
int left=0,right=n-1;
//求最右端点模型
while(left<right){
int mid=left+(right-left+1)/2;
if(s[mid]>t) right=mid-1;
else left=mid;
}
return s[left]>t?s[left]:(left+1<n?s[left+1]:s[0]);
}
}