59
59
60
60
** 方法一:二分查找**
61
61
62
- 遍历数组 nums1,对于每个数字 ` nums1[i] ` ,二分查找 nums2 ` [i, len(nums2)- 1] ` 范围内的数字,找到最后一个大于等于 ` nums1[i] ` 的位置,计算此位置与 i 的距离,并更新最大距离值 ans。
62
+ 假设 ` nums1 ` 、` nums2 ` 的长度分别为 $m$ 和 $n$。
63
+
64
+ 遍历数组 ` nums1 ` ,对于每个数字 ` nums1[i] ` ,二分查找 ` nums2 ` 在 $[ i,n)$ 范围内的数字,找到** 最后一个** 大于等于 ` nums1[i] ` 的位置 $j$,计算此位置与 $i$ 的距离,并更新最大距离值 ` ans ` 。
65
+
66
+ 时间复杂度 $O(m\log n)$,其中 $m$ 和 $n$ 分别为 ` nums1 ` 和 ` nums2 ` 的长度。
67
+
68
+ ** 方法二:双指针**
69
+
70
+ 在方法一中,我们只利用到 ` nums2 ` 是非递增数组这一条件,实际上,` nums1 ` 也是非递增数组,我们可以用双指针 $i$ 和 $j$ 来遍历 ` nums1 ` 和 ` nums2 ` 。
71
+
72
+ 时间复杂度 $O(m+n)$。
63
73
64
74
<!-- tabs:start -->
65
75
70
80
``` python
71
81
class Solution :
72
82
def maxDistance (self , nums1 : List[int ], nums2 : List[int ]) -> int :
73
- ans, n = 0 , len (nums2)
74
- for i, num in enumerate (nums1):
75
- left, right = i, n - 1
76
- while left < right:
77
- mid = (left + right + 1 ) >> 1
78
- if nums2[mid] >= num:
79
- left = mid
80
- else :
81
- right = mid - 1
82
- ans = max (ans, left - i)
83
+ ans = 0
84
+ nums2 = nums2[::- 1 ]
85
+ for i, v in enumerate (nums1):
86
+ j = len (nums2) - bisect_left(nums2, v) - 1
87
+ ans = max (ans, j - i)
88
+ return ans
89
+ ```
90
+
91
+ ``` python
92
+ class Solution :
93
+ def maxDistance (self , nums1 : List[int ], nums2 : List[int ]) -> int :
94
+ m, n = len (nums1), len (nums2)
95
+ ans = i = j = 0
96
+ while i < m:
97
+ while j < n and nums1[i] <= nums2[j]:
98
+ j += 1
99
+ ans = max (ans, j - i - 1 )
100
+ i += 1
83
101
return ans
84
102
```
85
103
@@ -109,25 +127,50 @@ class Solution {
109
127
}
110
128
```
111
129
130
+ ``` java
131
+ class Solution {
132
+ public int maxDistance (int [] nums1 , int [] nums2 ) {
133
+ int m = nums1. length, n = nums2. length;
134
+ int ans = 0 ;
135
+ for (int i = 0 , j = 0 ; i < m; ++ i) {
136
+ while (j < n && nums1[i] <= nums2[j]) {
137
+ ++ j;
138
+ }
139
+ ans = Math . max(ans, j - i - 1 );
140
+ }
141
+ return ans;
142
+ }
143
+ }
144
+ ```
145
+
112
146
### ** C++**
113
147
114
148
``` cpp
115
149
class Solution {
116
150
public:
117
151
int maxDistance(vector<int >& nums1, vector<int >& nums2) {
118
152
int ans = 0;
153
+ reverse(nums2.begin(), nums2.end());
154
+ for (int i = 0; i < nums1.size(); ++i) {
155
+ int j = nums2.size() - (lower_bound(nums2.begin(), nums2.end(), nums1[ i] ) - nums2.begin()) - 1;
156
+ ans = max(ans, j - i);
157
+ }
158
+ return ans;
159
+ }
160
+ };
161
+ ```
162
+
163
+ ```cpp
164
+ class Solution {
165
+ public:
166
+ int maxDistance(vector<int>& nums1, vector<int>& nums2) {
119
167
int m = nums1.size(), n = nums2.size();
120
- for (int i = 0; i < m; ++i) {
121
- int left = i, right = n - 1;
122
- while (left < right) {
123
- int mid = (left + right + 1) >> 1;
124
- if (nums2[ mid] >= nums1[ i] ) {
125
- left = mid;
126
- } else {
127
- right = mid - 1;
128
- }
168
+ int ans = 0;
169
+ for (int i = 0, j = 0; i < m; ++i) {
170
+ while (j < n && nums1[i] <= nums2[j]) {
171
+ ++j;
129
172
}
130
- ans = max(ans, left - i);
173
+ ans = max(ans, j - i - 1 );
131
174
}
132
175
return ans;
133
176
}
@@ -157,6 +200,22 @@ func maxDistance(nums1 []int, nums2 []int) int {
157
200
}
158
201
```
159
202
203
+ ``` go
204
+ func maxDistance (nums1 []int , nums2 []int ) int {
205
+ m , n := len (nums1), len (nums2)
206
+ ans := 0
207
+ for i , j := 0 , 0 ; i < m; i++ {
208
+ for j < n && nums1[i] <= nums2[j] {
209
+ j++
210
+ }
211
+ if ans < j-i-1 {
212
+ ans = j - i - 1
213
+ }
214
+ }
215
+ return ans
216
+ }
217
+ ```
218
+
160
219
### ** JavaScript**
161
220
162
221
``` js
@@ -186,6 +245,26 @@ var maxDistance = function (nums1, nums2) {
186
245
};
187
246
```
188
247
248
+ ``` js
249
+ /**
250
+ * @param {number[]} nums1
251
+ * @param {number[]} nums2
252
+ * @return {number}
253
+ */
254
+ var maxDistance = function (nums1 , nums2 ) {
255
+ let ans = 0 ;
256
+ const m = nums1 .length ;
257
+ const n = nums2 .length ;
258
+ for (let i = 0 , j = 0 ; i < m; ++ i) {
259
+ while (j < n && nums1[i] <= nums2[j]) {
260
+ j++ ;
261
+ }
262
+ ans = Math .max (ans, j - i - 1 );
263
+ }
264
+ return ans;
265
+ };
266
+ ```
267
+
189
268
### ** TypeScript**
190
269
191
270
``` ts
@@ -210,6 +289,21 @@ function maxDistance(nums1: number[], nums2: number[]): number {
210
289
}
211
290
```
212
291
292
+ ``` ts
293
+ function maxDistance(nums1 : number [], nums2 : number []): number {
294
+ let ans = 0 ;
295
+ const m = nums1 .length ;
296
+ const n = nums2 .length ;
297
+ for (let i = 0 , j = 0 ; i < m ; ++ i ) {
298
+ while (j < n && nums1 [i ] <= nums2 [j ]) {
299
+ j ++ ;
300
+ }
301
+ ans = Math .max (ans , j - i - 1 );
302
+ }
303
+ return ans ;
304
+ }
305
+ ```
306
+
213
307
### ** Rust**
214
308
215
309
``` rust
@@ -236,6 +330,24 @@ impl Solution {
236
330
}
237
331
```
238
332
333
+ ``` rust
334
+ impl Solution {
335
+ pub fn max_distance (nums1 : Vec <i32 >, nums2 : Vec <i32 >) -> i32 {
336
+ let m = nums1 . len ();
337
+ let n = nums2 . len ();
338
+ let mut res = 0 ;
339
+ let mut j = 0 ;
340
+ for i in 0 .. m {
341
+ while j < n && nums1 [i ] <= nums2 [j ] {
342
+ j += 1
343
+ }
344
+ res = res . max ((j - i - 1 ) as i32 )
345
+ }
346
+ res
347
+ }
348
+ }
349
+ ```
350
+
239
351
### ** ...**
240
352
241
353
```
0 commit comments