2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不相关的知识,希望对你有一定的参考价值。

2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k,
你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务,
只不过,难度差距绝对值不超过k的任务,可以在一天之内都完成。
返回完成所有任务的最少天数。
来自微软。

答案2022-05-20:

动态规划+窗口内最大值最小值更新结构。

代码用rust编写。代码如下:

fn main() 
    let arr: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7];
    let ans = min_days2(&arr, 5);
    println!("ans = ", ans);


fn min_days2(arr: &Vec<i32>, k: i32) -> i32 
    let n = arr.len() as i32;
    let mut dp: Vec<i32> = vec![];
    let mut window_max: Vec<i32> = vec![];
    let mut window_min: Vec<i32> = vec![];
    for _i in 0..n 
        dp.push(0);
        window_max.push(0);
        window_min.push(0);
    
    let mut max_l: i32 = 0;
    let mut max_r: i32 = 0;
    let mut min_l: i32 = 0;
    let mut min_r: i32 = 0;
    let mut l: i32 = 0;
    for i in 0..n 
        while max_l < max_r && arr[window_max[(max_r - 1) as usize] as usize] <= arr[i as usize] 
            max_r -= 1;
        
        window_max[max_r as usize] = i;
        max_r += 1;
        while min_l < min_r && arr[window_min[(min_r - 1) as usize] as usize] >= arr[i as usize] 
            min_r -= 1;
        
        window_min[min_r as usize] = i;
        min_r += 1;
        while arr[window_max[max_l as usize] as usize] - arr[window_min[min_l as usize] as usize]
            > k
        
            if window_max[max_l as usize] == l 
                max_l += 1;
            
            if window_min[min_l as usize] == l 
                min_l += 1;
            
            l += 1;
        
        dp[i as usize] = 1 + if l - 1 >= 0  dp[(l - 1) as usize]  else  0 ;
    
    return dp[(n - 1) as usize];

执行结果如下:


左神java代码

以上是关于2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不的主要内容,如果未能解决你的问题,请参考以下文章

[程序员代码面试指南]数组和矩阵问题-未排序正数数组中累加和为给定值的最长子数组长度

2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。

2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0n-1位置不需要达标,它们分别是最左最右的位置, 中间位置i需要达标,达标的条件是 : arr[i-1] >

[算法]最长子数组问题

2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=

2021-08-28:给定一个正数数组arr,长度一定大于6(>=7),一定要选3个数字做分割点,从而分出4个部分,并且每部分都有数,分割点的数字直接删除,不属于任何4个部分中的任何一个。 返回有没有