Skip to content

Commit 719a7d0

Browse files
committed
feat: add solutions to lc problem: No.0744
No.0744.Find Smallest Letter Greater Than Target
1 parent 8ca0f20 commit 719a7d0

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,29 @@
5353

5454
<!-- 这里可写通用的实现逻辑 -->
5555

56+
方法一:遍历
57+
58+
遍历 `letters`,返回第一个满足 `letters[i] > target` 条件的元素。若是遍历结束还未找到,则返回 `letters[0]`
59+
60+
> 至少存在两个不同的字母,所以不会返回 `target`
61+
62+
方法二:二分
63+
64+
利用 `letters` 有序的特点,可以使用二分来快速查找。
65+
66+
在返回值方面相比传统二分不一样,需要对结果进行取余操作:`letters[l % letters.length]`
67+
68+
为什么?如题描述,字母是重复出现的,当索引过界时,不是没有结果,而是需要返回前面的元素。
69+
70+
一个容易理解的版本,使用减法:
71+
72+
```c
73+
if (l < n) {
74+
return letters[l];
75+
}
76+
return letters[l - n];
77+
```
78+
5679
<!-- tabs:start -->
5780

5881
### **Python3**
@@ -112,6 +135,23 @@ function nextGreatestLetter(letters: string[], target: string): string {
112135
}
113136
```
114137

138+
```ts
139+
function nextGreatestLetter(letters: string[], target: string): string {
140+
const n = letters.length;
141+
let l = 0;
142+
let r = n;
143+
while (l < r) {
144+
const mid = (l + r) >>> 1;
145+
if (target < letters[mid]) {
146+
r = mid;
147+
} else {
148+
l = mid + 1;
149+
}
150+
}
151+
return letters[l % n];
152+
}
153+
```
154+
115155
### **C++**
116156

117157
```cpp
@@ -149,6 +189,40 @@ func nextGreatestLetter(letters []byte, target byte) byte {
149189
}
150190
```
151191

192+
### **Rust**
193+
194+
```rust
195+
impl Solution {
196+
pub fn next_greatest_letter(letters: Vec<char>, target: char) -> char {
197+
for c in letters.iter() {
198+
if c > &target {
199+
return *c;
200+
}
201+
}
202+
letters[0]
203+
}
204+
}
205+
```
206+
207+
```rust
208+
impl Solution {
209+
pub fn next_greatest_letter(letters: Vec<char>, target: char) -> char {
210+
let n = letters.len();
211+
let mut l = 0;
212+
let mut r = n;
213+
while l < r {
214+
let mid = l + r >> 1;
215+
if letters[mid] <= target {
216+
l = mid + 1;
217+
} else {
218+
r = mid;
219+
}
220+
}
221+
letters[l % n]
222+
}
223+
}
224+
```
225+
152226
### **...**
153227

154228
```

solution/0700-0799/0744.Find Smallest Letter Greater Than Target/README_EN.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,23 @@ function nextGreatestLetter(letters: string[], target: string): string {
102102
}
103103
```
104104

105+
```ts
106+
function nextGreatestLetter(letters: string[], target: string): string {
107+
const n = letters.length;
108+
let l = 0;
109+
let r = n;
110+
while (l < r) {
111+
const mid = (l + r) >>> 1;
112+
if (target < letters[mid]) {
113+
r = mid;
114+
} else {
115+
l = mid + 1;
116+
}
117+
}
118+
return letters[l % n];
119+
}
120+
```
121+
105122
### **C++**
106123

107124
```cpp
@@ -139,6 +156,40 @@ func nextGreatestLetter(letters []byte, target byte) byte {
139156
}
140157
```
141158

159+
### **Rust**
160+
161+
```rust
162+
impl Solution {
163+
pub fn next_greatest_letter(letters: Vec<char>, target: char) -> char {
164+
for c in letters.iter() {
165+
if c > &target {
166+
return *c;
167+
}
168+
}
169+
letters[0]
170+
}
171+
}
172+
```
173+
174+
```rust
175+
impl Solution {
176+
pub fn next_greatest_letter(letters: Vec<char>, target: char) -> char {
177+
let n = letters.len();
178+
let mut l = 0;
179+
let mut r = n;
180+
while l < r {
181+
let mid = l + r >> 1;
182+
if letters[mid] <= target {
183+
l = mid + 1;
184+
} else {
185+
r = mid;
186+
}
187+
}
188+
letters[l % n]
189+
}
190+
}
191+
```
192+
142193
### **...**
143194

144195
```
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function nextGreatestLetter(letters: string[], target: string): string {
2+
let left = 0,
3+
right = letters.length;
4+
let x = target.charCodeAt(0);
5+
while (left < right) {
6+
let mid = (left + right) >> 1;
7+
if (x < letters[mid].charCodeAt(0)) {
8+
right = mid;
9+
} else {
10+
left = mid + 1;
11+
}
12+
}
13+
return letters[left % letters.length];
14+
}

0 commit comments

Comments
 (0)