跳至主要內容

寻找比目标字母大的最小字母

陈宣宗2024年12月24日大约 2 分钟教学文档二分查找

1.寻找比目标字母大的最小字母

给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。

返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。

示例 1

输入:letters = ["c", "f", "j"],target = "a" 输出:"c" 解释:letters 中字典上比 'a' 大的最小字符是 'c'。

示例 2

输入: letters = ["c","f","j"], target = "c" 输出:"f" 解释:letters 中字典顺序上大于 'c' 的最小字符是 'f'。

示例 3

输入:letters = ["x","x","y","y"], target = "z" 输出:"x" 解释: letters 中没有一个字符在字典上大于 'z',所以我们返回 letters[0]。

2. 分析

由于数组是有序的,我们可以使用二分查找来优化搜索过程。二分查找的基本思想是将数组分成两半,然后根据目标值与中间元素的比较结果,决定在左半部分还是右半部分继续搜索。

处理边界条件:在二分查找的过程中,我们需要处理一些边界条件,比如当 target 大于数组中所有字符时,我们应该返回数组的第一个字符。

更新搜索范围:在二分查找中,每次比较后,我们都需要更新搜索范围。如果 target 小于中间元素,我们搜索右半部分;如果 target 大于中间元素,我们搜索左半部分。

找到结果:当我们找到第一个大于 target 的元素时,我们需要检查它是否是数组中的第一个元素。如果不是,我们返回这个元素;如果是,我们需要继续搜索,直到找到下一个大于 target 的元素。

public class BinSearch2 {
    public char nextGreatestLetter(char[] letters, char target) {
        int j=letters.length-1;
        if (letters[j]<=target)return letters[0];
        int i=0;
        while (i<=j){
            int mid=i+(j-i)/2;
            if (letters[mid]>target){
                j=mid-1;
            }else {
                i=mid+1;
            }
        }
        return letters[i];

    }

    public static void main(String[] args) {
        BinSearch2 b=new BinSearch2();
        System.out.println(b.nextGreatestLetter(new char[]{'c', 'f', 'j'}, 'a'));
    }
}

上次编辑于: 2025/1/13 09:18:24
贡献者: zilizhou,黄昱皓