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

题目:给定一个只包含小写字母的有序数组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

你可能感兴趣的:(Leetcode)