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个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数, 你作为单线程的人,不能并行处理任务,的更多相关文章

  1. 存在一个足够大的二维数组,每个数组中的值都是整数,使用javascript如何实现按每个数组中的平均值,从大到小排序这个二维数组?

    这是牛客网上的一道题~ 题意:对数组排序,顺序是按照数组的平均值,即按照一个元素和平均值相减的绝对值的大小来排序...本例按这个绝对值递增排序 解题思想:先求出这个数组的平均值,如果 a<b,那 ...

  2. 一个for循环打印二维数组

    #include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...

  3. 一个有用的排序函数,array_multisort(),下面的一个用法是根据二维数组里的一个字段值的大小,对该二维数组进行重新排序

    从二维数组$cashes中取出一列 'store_id'(二维数组中的每个一维数组都有的字段),按照这个的大小排序,对二维数组$caches里面的一维数组进行重新排序 实际应用如下 想让相同部门的排在 ...

  4. Java练习小题_求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。

    要求说明: 题目:求一个3*3矩阵对角线元素之和,矩阵的数据用行的形式输入到计算机中 程序分析:利用双重for循环控制输入二维数组,再将 a[i][i] 累加后输出. 实现思路: [二维数组]相关知识 ...

  5. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  6. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  7. c语言题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点

    //题目:找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小.也可能没有鞍点. // #include "stdio.h" #include <stdli ...

  8. 旋转图像 给定一个 n × n 的二维矩阵表示一个图像。

    给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像. 示例 : 给定 ma ...

  9. 剑指offer1: 组类型——二维数组中的查找(给定一个数字,查找是否在该数组中)

    1. 思路: 缩小范围 2. 方法: (1)要查找的数字等于数组中的数字,结束查找过程: (2)要查找的数字小于数组中的数字,去除该数字右边的数字,在剩下的数字里查找: (3)要查找的数字大于数组中的 ...

  10. 第3章 Java数组(上): 一维数组和二维数组

    3.数组及排序算法(2天) 3.1 数组的概述 2课时 3.2 一维数组的使用 3课时 3.3 多维数组的使用 3课时 3.4 数组中涉及到的常见算法 3课时 3.5 Arrays工具类的使用 3课时 ...

随机推荐

  1. C++ accumulate()函数的用法

    accumulate定义在 numeric 中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理. 头文件 #include <numeric> 原型 默认求累加和 templat ...

  2. Unity安卓端文件写在外部设置

  3. WinForm分辨率适应-高DPI自动缩放

    https://www.cnblogs.com/alittlecooing/p/WinForm-HighDPI.html 新建app.manifest文件后,去掉注释就可

  4. [极客大挑战 2019]BuyFlag 1

    好吧,又是一道违背我思想的题目,哦不哦不不对,是本人操作太傻了 首先进入主页面 没有发现什么奇怪的东西,查看源代码,搜索.php 可以看到有一个pay.php,访问查看 给我们了一些提示 FLAG N ...

  5. Android进度表示

    在连接上数据库之后,一切都变得简单了呢! 开心,很轻松地就能够将APP里面的相关内容写完啦! 尝试了好久的连接Mysql数据库,最后还是没有成功: 虽然Android studio里面自带的SQLit ...

  6. Spring--案例:测试业务层接口万次执行效率

    案例来袭 这样,并不能够分辨出哪个的效率是哪个 可以利用pjp进行这样的操作: 结果:

  7. Fiddler一些用法学习记录

    最近项目中用Fiddler较多,只会之前掌握的一些最简单的用法显得有点不太够.记录一下学习到的新用法. 一.需要mock.打开AutoResponder,Add Rule,填上需要mock的网址,需要 ...

  8. 如何获取obs视频帧的二进制数据

    前面几篇文章梳理了obs的录屏和推流流程,几条纵线整理下来,算是基本理清了obs的工作流程. 现在回到第一个目标:捕捉桌面的帧数据,用rendertarget显示并输出到UE5材质. 那么,帧数据到底 ...

  9. python---滚动条操作

    """ 1.让元素滚动到可见区域后,再操作.(大部分的网页自己会滚,直接找元素---下一页) drive.find_element("id",&quo ...

  10. Ansible 安装并简单使用

    Ansible 简介 Ansible 是一款 IT 自动化工具.主要应用场景有配置系统.软件部署.持续发布及不停服平滑滚动更新的高级任务编排. Ansible 本身非常简单易用,同时注重安全和可靠性, ...