2022-05-02:给定一个数组arr,一个正数num,一个正数k, 可以把arr中的某些数字拿出来组成一组,要求该组中的最大值减去最小值<=num, 且该组数字的个数一定要正好等于k, 每个数字只
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-05-02:给定一个数组arr,一个正数num,一个正数k, 可以把arr中的某些数字拿出来组成一组,要求该组中的最大值减去最小值<=num, 且该组数字的个数一定要正好等于k, 每个数字只相关的知识,希望对你有一定的参考价值。
2022-05-02:给定一个数组arr,一个正数num,一个正数k,
可以把arr中的某些数字拿出来组成一组,要求该组中的最大值减去最小值<=num,
且该组数字的个数一定要正好等于k,
每个数字只能选择进某一组,不能进多个组。
返回arr中最多有多少组。
来自微软。
答案2022-05-02:
排序+动态规划。滑动窗口有陷阱,不一定行,可能可以。
第一种情况,包含i,dp[i]跟dp[i-k]相关。
第二种情况,不包含i,dp[i]=dp[i-1]。
时间复杂度O(N * logN)。
代码用rust编写。代码如下:
fn main()
let mut arr: Vec<isize> = vec![1, 2, 3, 3, 3, 10, 10, 10, 100, 100, 100];
let ans = max_teams2(&mut arr, 3, 3);
println!("ans = ", ans);
// 时间复杂度O(N * logN)
fn max_teams2(arr: &mut Vec<isize>, num: isize, k: isize) -> isize
let n: isize = arr.len() as isize;
if k > n
return 0;
arr.sort_unstable();
let mut dp: Vec<isize> = vec![];
for _ in 0..n
dp.push(0);
dp[(k - 1) as usize] = if arr[(k - 1) as usize] - arr[0] <= num
1
else
0
;
for i in k..n
let p1 = dp[(i - 1) as usize];
let p2 = if arr[i as usize] - arr[(i - k + 1) as usize] <= num
1
else
0
+ dp[(i - k) as usize];
dp[i as usize] = get_max(p1, p2);
return dp[(n - 1) as usize];
fn get_max(a: isize, b: isize) -> isize
if a > b
a
else
b
执行结果如下:
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖
以上是关于2022-05-02:给定一个数组arr,一个正数num,一个正数k, 可以把arr中的某些数字拿出来组成一组,要求该组中的最大值减去最小值<=num, 且该组数字的个数一定要正好等于k, 每个数字只的主要内容,如果未能解决你的问题,请参考以下文章
2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.
2022-05-19:给定一个数组arr,给定一个正数M, 如果arr[i] + arr[j]可以被M整除,并且i < j,那么(i,j)叫做一个M整除对。 返回arr中M整除对的总数量。 来自微软。
2021-06-27:给定一个正数数组arr,代表若干人的体重。再给定一个正数limit,表示所有船共同拥有的载重量。每艘船最多坐两人,且不能超过载重,想让所有的人同时过河,并且用最好的分配方法让船尽
2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;(
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。