2616.最小化数对的最大差值
链接:2616.最小化数对的最大差值
难度:Medium
标签:贪心、数组、二分查找
简介:给你一个下标从 0 开始的整数数组 nums 和一个整数 p 。请你从 nums 中找到 p 个下标对,每个下标对对应数值取差值,你需要使得这 p 个差值的 最大值 最小。同时,你需要确保每个下标在这 p 个下标对中最多出现一次。对于一个下标对 i 和 j ,这一对的差值为 |nums[i] - nums[j]| ,其中 |x| 表示 x 的 绝对值 。请你返回 p 个下标对对应数值 最大差值 的 最小值 。
题解 1 - rust
- 编辑时间:2023-04-09
- 执行用时:24ms
- 内存消耗:3.3MB
- 编程语言:rust
- 解法介绍:同上。
impl Solution {
pub fn minimize_max(mut nums: Vec<i32>, p: i32) -> i32 {
nums.sort();
let n = nums.len();
let (mut l, mut r) = (0, *nums.iter().max().unwrap());
let check = |target: i32| -> bool {
let mut cnt = 0;
let mut i = 0;
while i < n && cnt < p {
if i + 1 < n && nums[i + 1] - nums[i] <= target {
i += 1;
cnt += 1;
}
i += 1;
}
cnt >= p
};
while l < r {
let m = (l + r) / 2;
if check(m) {
r = m;
} else {
l = m + 1;
}
}
l
}
}
题解 2 - python
- 编辑时间:2023-04-09
- 执行用时:1140ms
- 内存消耗:29.6MB
- 编程语言:python
- 解法介绍:同上。
class Solution:
def minimizeMax(self, nums: List[int], p: int) -> int:
nums.sort()
n = len(nums)
def check(target: int) -> bool:
cnt = 0
i = 0
while i < n and cnt < p:
if i + 1 < n and nums[i + 1] - nums[i] <= target:
i += 1
cnt += 1
i += 1
return cnt >= p
l, r = 0, 1000000000+7
while l < r:
m = (l + r) // 2
if check(m):
r = m
else:
l = m+1
return l
题解 3 - cpp
- 编辑时间:2023-04-09
- 执行用时:160ms
- 内存消耗:79.3MB
- 编程语言:cpp
- 解法介绍:最大最小,二分查找。
class Solution {
public:
int minimizeMax(vector<int>& nums, int p) {
sort(nums.begin(), nums.end());
int n = nums.size();
auto check = [&](int target) -> bool {
int cnt = 0;
for(int i = 0; i < n && cnt < p; i++){
if (i + 1 < n && nums[i + 1] - nums[i] <= target) i++, cnt++;
}
return cnt >= p;
};
int l = 0, r = 1e9 + 7;
while(l < r){
int mid = (l + r) / 2;
if(check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
};