File tree Expand file tree Collapse file tree 3 files changed +139
-0
lines changed
solution/0700-0799/0744.Find Smallest Letter Greater Than Target Expand file tree Collapse file tree 3 files changed +139
-0
lines changed Original file line number Diff line number Diff line change 53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
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
+
56
79
<!-- tabs:start -->
57
80
58
81
### ** Python3**
@@ -112,6 +135,23 @@ function nextGreatestLetter(letters: string[], target: string): string {
112
135
}
113
136
```
114
137
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
+
115
155
### ** C++**
116
156
117
157
``` cpp
@@ -149,6 +189,40 @@ func nextGreatestLetter(letters []byte, target byte) byte {
149
189
}
150
190
```
151
191
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
+
152
226
### ** ...**
153
227
154
228
```
Original file line number Diff line number Diff line change @@ -102,6 +102,23 @@ function nextGreatestLetter(letters: string[], target: string): string {
102
102
}
103
103
```
104
104
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
+
105
122
### ** C++**
106
123
107
124
``` cpp
@@ -139,6 +156,40 @@ func nextGreatestLetter(letters []byte, target byte) byte {
139
156
}
140
157
```
141
158
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
+
142
193
### ** ...**
143
194
144
195
```
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments