算法:寻找比目标字母大的最小字母

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”

提示:

  • 2 <= letters.length <= 104
  • letters[i] 是一个小写字母
  • letters 按非递减顺序排序
  • letters 最少包含两个不同的字母
  • target 是一个小写字母

解题思路一

定义一个变量存放最小值,默认第一个元素,因为本来就是有序数组,所以第一个符合条件的值存入变量,退出循环,再返回

var nextGreatestLetter = function(letters, target) {
    let min = letters[0]
    for(let i = 0; i < letters.length; i++)
        if (letters[i] > target) {
            min = letters[i]
            break; 
        }
        return min;
};

在这里插入图片描述

解题思路二

其实跟上边一样,只是不管怎么都会会先循环,符合条件返回值,否则返回数组第一个

var nextGreatestLetter = function(letters, target) {
    for (let i = 0; i < letters.length; i++) {
            if (letters[i] > target) {
                return letters[i];
            }
        }
        return letters[0];
    }
}

在这里插入图片描述

解题思路三

二分查找
1.目标字母大于列表最后一个字母时,直接返回第一个字母
2.目标字母小于列表最后一个字母时,列表中一定存在比目标字母大字母
3.每次都把列表二分,比较当前下标处的字母和目标字母,如果当前下标处的字母大于目标字母,则从当前下标左侧部分继续查找,否则在右侧查找

var nextGreatestLetter = function(letters, target) {
	let len = letters.len;
	if (letters.length - 1 >= target) {
		return letters[0]
	}
	let low = 0, high = len -1
	while(low < high) {
		const mid = (low + hight) / 2  + low
		if (letters[mid] > target) {
			high = mid
		} else {
			low = mid + 1
		}
	}
	return letters[low]
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值