开启我的LeetCode刷题日记:744. 寻找比目标字母大的最小字母

52 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:744. 寻找比目标字母大的最小字母

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

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

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

示例 1:

输入: letters = ["c", "f", "j"],target = "a" 输出: "c"

示例 2:

输入: letters = ["c","f","j"], target = "c" 输出: "f"

示例 3:

输入: letters = ["c","f","j"], target = "d" 输出: "f"

我的思路

1、先把target push 进 letters;

2、letters排序;

3、声明一个新数组tar,将letters去重push进tar

4、循环判断出返回值

代码实现

/**
 * @param {character[]} letters
 * @param {character} target
 * @return {character}
 */
var nextGreatestLetter = function(letters, target) {
    letters.push(target);
    letters.sort();
    let tar = [];
    for (let i = 0; i < letters.length; i++) {
        if(tar.indexOf(letters[i]) === -1) {
            tar.push(letters[i])
        }
    }
    for (let j = 0; j< tar.length; j++) {
        if (tar[j] === target) {
            return j === tar.length - 1 ? tar[0] : tar[j+1]
        }
    }
};

或者二分法思路,难的是边界条件
此处首先整体的边界条件,大于最右边的值或者小于最左边的值,都返回左边的值

/**
 * @param {character[]} letters
 * @param {character} target
 * @return {character}
 */
var nextGreatestLetter = function(letters, target) {
    if(letters.length == 0){return ''}
    if(target < letters[0] || target >= letters[letters.length -1]){ return letters[0] }
    let l = 0, r = letters.length -1
    while(l <= r ){
        let mid = Math.floor(l + (r- l)/2)
       if(letters[mid] > target){ 
            r = mid - 1
        }else if(letters[mid] < target){
            l = mid + 1
        }else if(letters[mid] == target){
            l = mid + 1
        }
    }
    if(r < 0 ){return -1}
    return letters[r + 1]
};

总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹