leetcode:744. 寻找比目标字母大的最小字母(简单,二分)

题目:

在这里插入图片描述

分析,虽然是简单题,但是,准备,面试绝对不能眼高手低。

方法1:调用库函数:

lower_bound()   寻找大于等于
upper_bound()  寻找大于。
返回的是指针:
获取下标:lower_bound() - v.begin
或者 * lower_bound()   直接访问元素。
但是:
如果不存在,那么返回的是最后一个位置的下一个位置,直接* 有些编译器会报错,有些返回0。
所以,一般应该先判断最后一个元素,在使用。

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        int c=upper_bound(letters.begin(),letters.end(),target)-letters.begin();
        if(c==letters.size()) return letters[0];
        return letters[c];
    }
};

方法二:自己实现二分:

推荐模板,不是变态二分细节,均可解决。

在这里插入图片描述

初始值应该考虑没有任何答案的情况,因为不经过ans=。。。这个代码!。很好!

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        int a=0,b=letters.size()-1;
        char ans=letters[0];
        while(a<=b)
        {
            int c=a+(b-a)/2;
            if(letters[c]>target){
                ans=letters[c];
                b=c-1;
            }
            else a=c+1;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值