LeetCode 744 Find Smallest Letter Greater Than Target

  1. 扫描
public char nextGreatestLetter(char[] letters, char target) {
    //1.大于等于所有字母先处理
    if(target>=letters[letters.length-1])
        return letters[0];
    for(int i=0;i<letters.length;i++){
        if(letters[i]>target)
            return letters[i];
    }
    return '\0';
}
  1. 二分查找法
 /*
    1.大于等于所有字母先处理

    2.没有这个字符left就是答案,target一定介于letters[0]-letters[length-1]之间
        letters中如果没有target 由于left最后会大于right   target夹在right和left之间left就是答案
        否则
            对target左侧进行二分(和target相等作为二分的条件)相等右半段 不等左半端
            最后一定是left在不等的位置并且离target最近 
     */
    public char nextGreatestLetter(char[] letters, char target) {

        if(target>=letters[letters.length-1])
            return letters[0];
        int length = letters.length;
        int left = 0;
        int right = length - 1;
        int mid = ( left + right ) >> 1;
        while(left<=right) {
//          System.out.println("i");
            if(letters[mid]==target) {
//              System.out.println("J");
                int left2 = mid+1;
                int right2 = length-1;
                int mid2 = ( left2 + right2 ) >> 1;
                while(left2<=right2) {
                    if(target==letters[mid2]) {
                        left2 = mid2 + 1;
                        mid2 = ( left2 + right2 ) >> 1;
                    }else {
                        right2 = mid2 - 1;
                        mid2 = ( left2 + right2 ) >> 1;
                    }
                }
                return letters[left2];
            }else if(letters[mid]<target) {
//              System.out.println("k");
                left = mid + 1;
                mid = ( left + right ) >> 1;
            }else {
//              System.out.println("g");
                right = mid - 1;
                mid = ( left + right ) >> 1;
            }
        }
        return letters[left];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值