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

79 阅读1分钟

题目:
给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。 返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。
算法:

方法一:二分查找,注意边界条件

  1. 大于,小于是否包括等于
  2. left==right时应该如何处理
func nextGreatestLetter(letters []byte, target byte) byte {
	left, right := 0, len(letters) - 1
	for left < right {
		mid := (left + right) / 2
		if letters[mid] <= target {
			left = mid + 1
		} else if letters[mid] > target {
			if mid - 1 < 0 || letters[mid - 1] <= target {
				return letters[mid]
			} else {
				right = mid - 1
			}
		} 
	}
	if letters[left] > target {
		return letters[left]
	}
	return letters[0]
}

逼近思想,另一种比较简洁的二分写法:

func nextGreatestLetter(letters []byte, target byte) byte {
    left, right := 0, len(letters) - 1
    for left < right {
        mid := (left + right) / 2
        if letters[mid] > target {
            right = mid
        } else {
            left = mid + 1
        }
    }
    if letters[left] > target {
        return letters[left] 
    }
    return letters[0] 
}