2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,相关的知识,希望对你有一定的参考价值。

2022-05-30:给定一个n*2的二维数组,表示有n个任务。
一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数,
你作为单线程的人,不能并行处理任务,但是每个任务都只需要一个单位时间完成,
你需要将所有任务的执行时间,位于开始做的时间和最后期限之间。
返回你能否做到这一点。
来自华为。

答案2022-05-30:

小根堆。先做最紧迫的任务。

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

fn main() 
    let mut arr: Vec<Vec<i32>> = vec![vec![1, 4], vec![1, 4], vec![1, 4], vec![1, 4]];
    let ans = can_do(&mut arr);
    println!("ans = ", ans);


// 1 开 7
// 5 闭 end没有用!
pub struct TimePoint 
    // 时间
    time: i32,
    end: i32,
    // add = true time 任务的添加时间
    // add = false time 任务的结束时间
    add: bool,


impl TimePoint 
    pub fn new(t: i32, e: i32, a: bool) -> Self 
        Self 
            time: t,
            end: e,
            add: a,
        
    


fn can_do(jobs: &mut Vec<Vec<i32>>) -> bool 
    if jobs.len() < 2 
        return true;
    
    let n = jobs.len() as i32;
    let mut arr: Vec<TimePoint> = vec![];
    for _i in 0..n << 1 
        arr.push(TimePoint::new(0, 0, false));
    
    for i in 0..n 
        arr[i as usize] = TimePoint::new(jobs[i as usize][0], jobs[i as usize][1], true);
        arr[(i + n) as usize] = TimePoint::new(jobs[i as usize][1], jobs[i as usize][1], false);
    
    arr.sort_by(|a, b| a.time.cmp(&b.time));
    let mut heap: Vec<i32> = vec![];
    // 经过一个一个的时间点,遭遇事件:添加时间、检查时间
    let mut i: i32 = 0;
    let mut last_time = arr[0].time;
    while i < arr.len() as i32 
        if arr[i as usize].add 
            heap.push(arr[i as usize].end);
         else 
            // 检查时间
            let cur_time = arr[i as usize].time;
            for _j in last_time..cur_time 
                if heap.len() == 0 
                    break;
                
                heap.sort_by(|a, b| b.cmp(&a));
                heap.pop();
            
            heap.sort_by(|a, b| b.cmp(&a));
            if heap.len() > 0 && heap[heap.len() - 1] <= cur_time 
                return false;
            
            last_time = cur_time;
        
        i += 1;
    
    return true;


执行结果如下:


左神java代码

以上是关于2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,的主要内容,如果未能解决你的问题,请参考以下文章

2022-06-25:给定一个正数n, 表示有0~n-1号任务, 给定一个长度为n的数组time,time[i]表示i号任务做完的时间, 给定一个二维数组matrix, matrix[j] = {a,

二维数组打印

面向对象(继承,多态)

🗡指offer-2-二维数组中的查找

🗡指offer-2-二维数组中的查找

如何将二维数组复制到第三维,N次?