leetcode-寻找比目标字母大的最小的字母(分治法)

本文介绍了一种算法,用于在给定的有序小写字母数组中找到比指定目标字母大的最小字母。通过示例展示了如何处理循环数组的情况,并提供了一个Java实现,包括输入处理和二分查找算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。

数组里字母的顺序是循环的。举个例子,如果目标字母target = ‘z’ 并且有序数组为 letters = [‘a’, ‘b’],则答案返回 ‘a’。

示例:

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

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

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

输入:
letters = [“c”, “f”, “j”]
target = “g”
输出: “j”

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

输入:
letters = [“c”, “f”, “j”]
target = “k”
输出: “c”

注:
letters长度范围在[2, 10000]区间内。
letters 仅由小写字母组成,最少包含两个不同的字母。
目标字母target 是一个小写字母。

package com.ljq.fenzhi;

import java.util.Scanner;

/** 
* @author 作者 Your-Name: 
* @version 创建时间:2019年8月28日 下午5:13:58 
* 类说明 
*/
public class NextLetter {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()) {
			char[] letters = scanner.nextLine().toCharArray();
			char target = scanner.nextLine().charAt(0);
			
			char ret = nextGreatestLetter(letters,target);
			System.out.println(ret);
		}
		
		scanner.close();
	}
	
	public static char nextGreatestLetter(char[] letters,char target) {
		int n = letters.length;
		int l=0,h=letters.length-1;
		while(l<=h) {
			int m = l+(h-l)/2;
			if(letters[m]<=target) {
				l = m+1;
			}else {
				h = m-1;
			}
		}
		/*
		 * 解决循环问题
		 */
		return l<n?letters[l]:letters[0];
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值