一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode
刷题之旅
第一阶段目标是:200
道,每天1
到2
篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目: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]
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹