【一次过】Lintcode 1056. 请找出大于目标的最小字母

给定一串只含有小写形式的、排序过的 letters,并且给定一个目标字母 target ,请找出在给定字母串中,大于目标字母的最小的那一个字母。

在本题中,字母是绕回编址的(即“z”后一位重新变为“a”)。比如说,如果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"

注意事项

1.letters 长度范围为 [2, 10000].
2.letters 只含有小写字母,并且其中至少含有两个互不相同的字母。
3.target 也是一个小写字母。


解题思路:

看到有序就想到二分查找,此题先处理特殊情况后,可应用二分查找。

public class Solution {
    /**
     * @param letters: a list of sorted characters
     * @param target: a target letter
     * @return: the smallest element in the list that is larger than the given target
     */
    public char nextGreatestLetter(char[] letters, char target) {
        // Write your code here
        //若目标字符比数组中最大的元素还要大,则直接返回最小的字母
        if(letters[letters.length-1] <= target)
            return letters[0];
        
        int l = 0;
        int r = letters.length-1;
        
        while(l < r){
            int mid = l + (r-l)/2;
            
            if(letters[mid] <= target)
                l = mid + 1;
            else
                r = mid;
        }
        
        return letters[l];
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值