Java&C++题解与拓展——leetcode744.寻找比目标字母大的最小字母【upper_bounnd学习与使用】

134 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路一:线性查找

遍历整个字符串查找,没有就返回第一个。

Java

class Solution {
    public char nextGreatestLetter(char[] letters, char target) {
        for(char let : letters)
            if(let > target)
                return let;
        return letters[0];
    }
}
  • 时间复杂度:O(n)O(n)nnlettersletters的长度
  • 空间复杂度:O(1)O(1)

C++

【和Java甚至是可以直接cv的一模一样】

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        for(char let : letters)
            if(let > target)
                return let;
        return letters[0];
    }
};
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

思路二:二分查找

Java

class Solution {
    public char nextGreatestLetter(char[] letters, char target) {
        int n = letters.length;
        int l = 0, r = n - 1;
        while(l < r) {
            int m = l + r >> 1;
            if(letters[m] > target)
                r = m;
            else
                l = m + 1;
        }
        return letters[r] > target ? letters[r] : letters[0];
    }
}
  • 时间复杂度:O(logn)O(\log n)
  • 空间复杂度:O(1)O(1)

C++

一行结束!C++站起来了!

class Solution {
public:
    char nextGreatestLetter(vector<char>& letters, char target) {
        return target < letters.back() ? *upper_bound(letters.begin(), letters.end() - 1, target) : letters[0];
    }
};
  • 时间复杂度:O(logn)O(\log n)
  • 空间复杂度:O(1)O(1)

upper_bound

  • 学习参考链接
  • 用于在一个已排好序的序列范围中查找第一个大于目标的值,返回指向其的正向迭代器,若没有找到则指向序列末尾迭代器。
  • 也可以自定义比较规则。
  • 底层基于二分查找实现,类似函数还有lower_bound
  • Java中数组是没有类似功能的函数,但是TreeSet结构中的lowerhigherfloorceiling四个方法还挺类似的,其复杂度也是O(logn)O(\log n),所以合理怀疑底层也基于二分查找。

总结

一道光速做完的简单题,但是确实没想到C++有这么方便的二分查找函数,涨知识了。


欢迎指正与讨论!