Skip to content

Commit 03dbaa6

Browse files
committed
feat: add solutions to lc problem: No.1855
No.1855.Maximum Distance Between a Pair of Values
1 parent a71e487 commit 03dbaa6

File tree

9 files changed

+296
-122
lines changed

9 files changed

+296
-122
lines changed

solution/1800-1899/1855.Maximum Distance Between a Pair of Values/README.md

Lines changed: 133 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,17 @@
5959

6060
**方法一:二分查找**
6161

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)$。
6373

6474
<!-- tabs:start -->
6575

@@ -70,16 +80,24 @@
7080
```python
7181
class Solution:
7282
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
83101
return ans
84102
```
85103

@@ -109,25 +127,50 @@ class Solution {
109127
}
110128
```
111129

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+
112146
### **C++**
113147

114148
```cpp
115149
class Solution {
116150
public:
117151
int maxDistance(vector<int>& nums1, vector<int>& nums2) {
118152
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) {
119167
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;
129172
}
130-
ans = max(ans, left - i);
173+
ans = max(ans, j - i - 1);
131174
}
132175
return ans;
133176
}
@@ -157,6 +200,22 @@ func maxDistance(nums1 []int, nums2 []int) int {
157200
}
158201
```
159202

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+
160219
### **JavaScript**
161220

162221
```js
@@ -186,6 +245,26 @@ var maxDistance = function (nums1, nums2) {
186245
};
187246
```
188247

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+
189268
### **TypeScript**
190269

191270
```ts
@@ -210,6 +289,21 @@ function maxDistance(nums1: number[], nums2: number[]): number {
210289
}
211290
```
212291

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+
213307
### **Rust**
214308

215309
```rust
@@ -236,6 +330,24 @@ impl Solution {
236330
}
237331
```
238332

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+
239351
### **...**
240352

241353
```

0 commit comments

Comments
 (0)