力扣每日一题-第51天-744. 寻找比目标字母大的最小字母

2022.8.9今天你刷题了吗?


题目:

给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。

在比较时,字母是依序循环出现的。举个例子:

如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'

分析:

给定一个vector,里面是char类型,以及一个target也是char类型,你需要在vector里面找到一个大于target的字母,且该字母为vector中最小字母。那么就会存在两种情况。

1.找到了存在的字母:直接返回该字母。

2.找不到该字母:直接返回vector第一个字母。

思路:遍历vector数组,每遍历一次判断一次,如果遇到满足条件直接返回,如果不满足最后返回首字母。

解析:

1.暴力法

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
    sort(letters.begin(),letters.end());
    for(auto &ch:letters)
    {
        if(ch-'a'<=target-'a')
        {

        }
        else
        {
            return ch;
        }
    }  
    return letters[0];  
    }
};

2.二分法

延续暴力法思路,区别在于不是直接遍历vector,而是利用二分查找从中间开始找,节约时间。

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        int l=0, r=letters.size()-1;
        int ret = 0;
        while(l <= r){
            int m = l + (r-l)/2;
            if(letters[m] <= target){
                l = m + 1;
            }else{
                ret = m;
                r = m - 1;
            }
        }

        return letters[ret];
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值