2022-08-08:给定一个数组arr,表示从早到晚,依次会出现的导弹的高度。 大炮打导弹的时候,如果一旦大炮定了某个高度去打,那么这个大炮每次打的高度都必须下降一点。 1) 如果只有一个大炮,返回

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-08-08:给定一个数组arr,表示从早到晚,依次会出现的导弹的高度。 大炮打导弹的时候,如果一旦大炮定了某个高度去打,那么这个大炮每次打的高度都必须下降一点。 1) 如果只有一个大炮,返回相关的知识,希望对你有一定的参考价值。

2022-08-08:给定一个数组arr,表示从早到晚,依次会出现的导弹的高度。
大炮打导弹的时候,如果一旦大炮定了某个高度去打,那么这个大炮每次打的高度都必须下降一点。
(1) 如果只有一个大炮,返回最多能拦截多少导弹。
(2) 如果所有的导弹都必须拦截,返回最少的大炮数量。

答案2022-08-08:

问题一:最长递减子序列。网上关于最长递增子序列的代码实在太多了,这里就不写了。
问题二:贪心+有序表。用已存在的最接近的稍高的大炮去打。

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

use std::collections::BTreeMap;
fn main() 
    let mut arr = vec![15, 7, 14, 6, 5, 13, 5, 10, 9];
    println!("ans = ", num_of_cannon(&mut arr));


const MAX_VALUE: i32 = 1 << 31 - 1;

fn num_of_cannon(arr: &mut Vec<i32>) -> i32 
    // key : 某个大炮打的结尾数值
    // value : 有多少个大炮有同样的结尾数值
    // 比如:
    // 一共有A、B、C三个大炮
    // 如果A大炮此时打的高度是17,B大炮此时打的高度是7,C大炮此时打的高度是13
    // 那么在表中:
    // 7, 1
    // 13, 1
    // 17, 1
    // 如果A大炮此时打的高度是13,B大炮此时打的高度是7,C大炮此时打的高度是13
    // 那么在表中:
    // 7, 1
    // 13, 2
    let mut ends: BTreeMap<i32, i32> = BTreeMap::new();
    for num in arr.iter() 
        if ends.range(num + 1..).take(1).last() == None 
            ends.insert(MAX_VALUE, 1);
        
        let ceil_key = *ends.range(num + 1..).take(1).last().unwrap().0;
        let ceil_value = *ends.range(num + 1..).take(1).last().unwrap().1;
        if ceil_value > 1 
            ends.insert(ceil_key, ceil_value - 1);
         else 
            ends.remove(&ceil_key);
        
        ends.insert(
            *num,
            match ends.get(num) 
                Option::Some(v) => v + 1,
                Option::None => 1,
            ,
        );
    
    let mut ans = 0;
    for (_, value) in ends.iter() 
        ans += *value;
    
    return ans;


执行结果如下:


左神java代码

以上是关于2022-08-08:给定一个数组arr,表示从早到晚,依次会出现的导弹的高度。 大炮打导弹的时候,如果一旦大炮定了某个高度去打,那么这个大炮每次打的高度都必须下降一点。 1) 如果只有一个大炮,返回的主要内容,如果未能解决你的问题,请参考以下文章

2023-01-06:给定一个只由小写字母组成的字符串str,长度为N, 给定一个只由01组成的数组arr,长度为N, arr[i] == 0表示str中i位置的字符不许修改, arr[i] ==

2022-11-03:给定一个数组arr,和一个正数k 如果arr[i] == 0,表示i这里既可以是左括号也可以是右括号, 而且可以涂上1~k每一种颜色 如果arr[i] != 0,表示i这里已经确

给定数组表示 S 所需的最小数字计数

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

2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的难度为j。给定一个非负数M。想出一张卷子,对于任何相邻的两道题目,前一题的难度不能超过后一题的难度+M。返回所有可能的卷

2022-11-18:给定一个数组arr,表示连续n天的股价,数组下标表示第几天 指标X:任意两天的股价之和 - 此两天间隔的天数 比如 第3天,价格是10 第9天,价格是30 那么第3天和第9天的指