在Leetcode上看到一道题目,觉得很有意思。就拿出来分享给大家。
题目:
Given a list of sorted characters letters containing only lowercase letters, and given a target letter target, find the smallest element in the list that is larger than the given target.
Letters also wrap around. For example, if the target is target = ‘z’ and letters = [‘a’, ‘b’], the answer is ‘a’.
Note:
- Letters has a length in range [2, 10000]
- Letters consists of lowercase letters, and contains at least 2 unique letters.
- Target is a lowercase letter.
再给个例子:
Letters = [‘c’, ‘f’, ‘j’]
target = ‘a’
Output: ‘c’
因为是给的是有顺序的,所以就立刻想到一次遍历就行了。下面是 C 代码:
char nextGreatestLetter(char* letters, int lettersSize, char target) {
int index;
for(index; index < lettersSize; index++){
if(letters[index] > target) {
return letters[index];
}
}
return letters[0];
}
下面是Java 代码,也是一次遍历
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
for(char result : letters){
if(result > letters)
return result;
}
return letters[0];
}
}
虽然用一次遍历就可以算出来了,但是想另外一种方法。想了一会,就想到用二分法来解决这个问题。因为是给有顺序的字母序列。
下面就直接上 C 代码:
char nextGreatestLetter(char* letters, int lettersSize, char target) {
int low = 0, high = lettersSize;
while(low < high) {
int middle = low + (high - low) / 2;
if(letters[middle] <= target){
low = middle + 1;
} else {
high = middle;
}
}
return letters[low % lettersSize];
}
下面是Java 代码:
class Solution {
public char nextGreatestLetter(char[] letters, char target) {
int low = 0, high = letters.length;
while(low < high) {
int middle = low + (high - low) / 2;
if(letters[middle] <= target) {
low = middle + 1;
} else {
high = middle;
}
}
return letters[low % letters.length];
}
}
下面来解释代码的原理:
举例:Letters = [‘a’, ‘c’, ‘d’, ‘h’, ‘k’]
Target = ‘z’
第一步:
Low = 0, high = 5
middle = low + (high - low) / 2 = 0 + 5/2 = 2
Letters[middle] = ‘d’ <= ‘z’
low = middle + 1 = 2 + 1 = 3
第二步:
low = 3, high = 5
middle = low + (high - low)/2 = 3 +2/2 = 4
Letters[middle] = ‘k’ < ‘z’
low = middle + 1 = 4 + 1 = 5
第三步:
low = 5, high = 5
return letters[low % letters.length] = letters[5 % 5] = letters[0] = ‘a’
博主就不举其他例子了,反正原理就是定义两个变量,一个低位,一个高位来进行移位来判断。
如果哪里写的不对,各位就指出来哦! 会虚心更改的!