2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=相关的知识,希望对你有一定的参考价值。
2022-05-21:给定一个数组arr,长度为n,
表示n个服务员,每个人服务一个人的时间。
给定一个正数m,表示有m个人等位。
如果你是刚来的人,请问你需要等多久?
假设:m远远大于n,比如n<=1000, m <= 10的9次方,该怎么做?
来自谷歌。
答案2022-05-21:
方法一:小根堆。时间复杂度:O(mlogN)。
方法二:二分法。时间复杂度:O(Nlogm)。
代码用rust编写。代码如下:
use rand::Rng;
fn main()
let len: i32 = 50;
let value: i32 = 30;
let m_max: i32 = 3000;
let test_time: i32 = 500;
println!("测试开始");
for _i in 0..test_time
let n: i32 = rand::thread_rng().gen_range(0, len) + 1;
let mut arr = random_array(n, value);
let m = rand::thread_rng().gen_range(0, m_max);
let ans1 = min_waiting_time1(&mut arr, m);
let ans2 = min_waiting_time2(&mut arr, m);
if ans1 != ans2
println!("出错了!");
for num in arr.iter()
println!(" ", num);
println!("");
println!("m = ", m);
println!("ans1 = ", ans1);
println!("ans2 = ", ans2);
break;
println!("测试结束");
fn min_waiting_time1(arr: &mut Vec<i32>, m: i32) -> i32
if arr.len() == 0
return -1;
let mut heap: Vec<Vec<i32>> = vec![];
let n = arr.len() as i32;
for i in 0..n
heap.push(vec![0, arr[i as usize]]);
for _i in 0..m
heap.sort_by(|x, y| y[0].cmp(&x[0]));
let hi = heap.len() - 1;
heap[hi][0] += heap[hi][1];
heap.sort_by(|x, y| y[0].cmp(&x[0]));
return heap[heap.len() - 1][0];
fn min_waiting_time2(arr: &mut Vec<i32>, m: i32) -> i32
if arr.len() == 0
return -1;
let mut best: i32 = 2147483647;
for num in arr.iter()
best = if best < *num best else *num ;
let mut left: i32 = 0;
let mut right: i32 = best * m;
let mut mid: i32 = 0;
let mut near: i32 = 0;
while left <= right
mid = (left + right) / 2;
let mut cover: i32 = 0;
for num in arr.iter()
cover += (mid / *num) + 1;
if cover >= m + 1
near = mid;
right = mid - 1;
else
left = mid + 1;
return near;
// 为了测试
fn random_array(n: i32, v: i32) -> Vec<i32>
let mut arr: Vec<i32> = vec![];
for _i in 0..n
arr.push(rand::thread_rng().gen_range(0, v) + 1);
return arr;
执行结果如下:
以上是关于2022-05-21:给定一个数组arr,长度为n, 表示n个服务员,每个人服务一个人的时间。 给定一个正数m,表示有m个人等位。 如果你是刚来的人,请问你需要等多久? 假设:m远远大于n,比如n<=的主要内容,如果未能解决你的问题,请参考以下文章
2022-08-22:给定一个数组arr,长度为n,最多可以删除一个连续子数组, 求剩下的数组,严格连续递增的子数组最大长度。 n <= 10^6。 来自字节。5.6笔试。
2021-08-03:完美洗牌问题。给定一个长度为偶数的数组arr,假设长度为N*2,左部分:arr[L1……Ln],右部分: arr[R1……Rn],请把arr调整成arr[L1,R1,L2,R2,
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除几个数字能达到目的。 N <= 10^4
给定一个长度为 n 的数组,找到子集的 XOR 等于给定数字的子集数
给定一个长度为 n 的数组,找到子集的 XOR 等于给定数字的子集数
2022-01-12:给定一个正数数组arr,长度为n,下标0~n-1, arr中的0n-1位置不需要达标,它们分别是最左最右的位置, 中间位置i需要达标,达标的条件是 : arr[i-1] >