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
    

执行结果如下:


左神java代码

创作打卡挑战赛 赢取流量/现金/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不大,怎么算最快? 来自亚马逊。