二分法的思想就是先自己找二分情况,是否包含中点,确定判断条件
leetcode中这一题:
744. Find Smallest Letter Greater Than Target (Easy)
Input: letters = ["c", "f", "j"] target = "d" Output: "f" Input: letters = ["c", "f", "j"] target = "k" Output: "c"
题目描述:给定一个有序的字符数组 letters 和一个字符 target,要求找出 letters 中大于 target 的最小字符,如果找不到就返回第 1 个字符。
如果mid小于等于target的值,范围缩小【mid+1,R】,L=mid+1
如果mid大于target,范围为【L,mid】,R=mid,此时R还是有效的
所以判断条件为L < R,当条件成立,继续找,当不成立,说明此时R=L,随便拿一个出来判断咯。
/*给定一个有序的字符数组 letters 和一个字符 target,要求找出 letters 中大于 target 的最小字符,如果找不到就返回第 1 个字符。
* */
public static char nextGreatestLetter(char[] letters, char target) {
int l = 0;
int r = letters.length - 1;
//不用等于号的情况是 当前这个数还得继续用,从小于的角度来看
while(l < r) {
int m = l + (r-l)/2;
if(letters[m] <= target) {
l = m + 1;
}else {
r = m;
}
}
int k = 0;
System.out.println(l==r);
k = letters[r] > target ? r : 0;
return letters[k];
}
public static void main(String[] args) {
char[] letters = new char[] {'c','f','g'};
char target = 'd';
System.out.println(nextGreatestLetter(letters, target));
}