力扣744. 寻找比目标字母大的最小字母(二分查找比一个数大的最小数)

744. 寻找比目标字母大的最小字母

给你一个排序后的字符列表 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长度范围在[2, 10000]区间内。
letters 仅由小写字母组成,最少包含两个不同的字母。
目标字母target 是一个小写字母。

题解:

众所周知,对于有序的数组进行遍历寻找时通常使用二分查找能很大的提升速度。
因此本题可以使用二分查找。
但是要明确我们要找的是比目标字母大的最小字母
所以二分查找时注意查找的

代码:

char nextGreatestLetter(char* letters, int lettersSize, char target){
    
    
    int left = 0;
    int right = lettersSize-1;
    int mid;
    if(target>=letters[lettersSize-1])
    {
    
    
        return letters[0];
    }
    while(left<right)//所以退出循环的时候为left=right
    {
    
    
        mid = left+(right-left)/2;//mid要在里面定义
        if(letters[mid]>target)//此为符合题意,所以mid要保留
        {
    
    
            right = mid;//保留
        }
        else if(letters[mid]<=target)//此不符合
        {
    
    
            left = mid+1;//所以mid直接去除即可
        }
    }
    return letters[left]; //最后我们要得到的目标值在left-right里,又因二者相等,所以输出任何一个即可
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/115037039