力扣题目744:
题目描述:
给你一个字符数组 letters
,该数组按非递减顺序排序,以及一个字符 target
。letters
里至少有两个不同的字符。
返回 letters
中大于 target
的最小的字符。如果不存在这样的字符,则返回 letters
的第一个字符。
解题思路:
二分法:就是将给出的数组进行一分为二,尽可能的缩小查找范围。题目提到,要求找到大于target的最小字符,给出的数组又是非递减,因此可以得到,最后我们二分得到的一个最接近正确答案的坐标
left
如果小于或等于target,证明在此组数组中,没有符合的答案。
java code:耗时:0s,内存占用:41.5MB
public class 寻找比目标字母大的最小字母 {
public static void main(String[] args) {
char[] letters = new char[] {'x', 'x', 'y', 'z'};
char target = 'z';
System.out.println(nextGreatestLetter(letters, target));
}
// b c d e f target:c
// b c d f
//二分法:取中间和目标值进行比较,再对左边和右边的分别进行二分求解
public static char nextGreatestLetter(char[] letters, char target) {
if (letters[0] > target) {
return letters[0];
} else {
int right = letters.length - 1;
int left = 0;
// int mid = letters.length / 2;
while (left < right) {
int mid = (left + right) / 2;
if (letters[mid] <= target) {
left = mid + 1;
} else if (letters[mid] > target) {
right = mid;
}
}
//如果已经是最后一个元素且这个元素的值小于或等于给出的目标值,则证明无解,返回数组第一个元素
if (left == letters.length - 1 && letters[left] <= target)
return letters[0];
else
return letters[left];
}
}
}