首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2022-10-30:给你一个长度为 n 的整数数组 rolls 和一个整数 k 。 你扔一个 k 面的骰子 n 次,骰子的每个面分别是 1 到 k , 其中第

2022-10-30:给你一个长度为 n 的整数数组 rolls 和一个整数 k 。 你扔一个 k 面的骰子 n 次,骰子的每个面分别是 1 到 k , 其中第

原创
作者头像
福大大架构师每日一题
发布2022-10-30 22:44:21
发布2022-10-30 22:44:21
5650
举报

2022-10-30:给你一个长度为 n 的整数数组 rolls 和一个整数 k 。

你扔一个 k 面的骰子 n 次,骰子的每个面分别是 1 到 k ,

其中第 i 次扔得到的数字是 rollsi 。

请你返回 无法 从 rolls 中得到的 最短 骰子子序列的长度。

扔一个 k 面的骰子 len 次得到的是一个长度为 len 的 骰子子序列 。

注意 ,子序列只需要保持在原数组中的顺序,不需要连续。

输入:rolls = 4,2,1,2,3,3,2,4,1, k = 4。

输出:3。

答案2022-10-30:

这道题很难想到。一次遍历,一套一套收集。

力扣2350。力扣上测试了好几门语言。这次java的运行速度最高,比rust都强了不少。c++表现不好,不见运行速度低,而且内存占用大。rust内存占用最小,go语言次之。

时间复杂度:O(n+k)。

空间复杂度:O(k)。

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

代码语言:rust
复制
use std::iter::repeat;
impl Solution {
    // 所有数字1~k
    pub fn shortest_sequence(rolls: Vec<i32>, k: i32) -> i32 {
        // 1~k上,某个数字是否收集到了!
        // set[i] == true
        // set[i] == false
        // boolean[] set = new boolean[k + 1];
        let mut set: Vec<bool> = repeat(false).take((k + 1) as usize).collect();
        // 当前这一套,收集了几个数字了?
        let mut size = 0;
        let mut ans = 0;
        for num in rolls.iter() {
            if !set[*num as usize] {
                set[*num as usize] = true;
                size += 1;
            }
            if size == k {
                ans += 1;
                set = repeat(false).take((k + 1) as usize).collect();
                size = 0;
            }
        }
        return ans + 1;
    }
}

fn main() {
    let rolls = vec![4, 2, 1, 2, 3, 3, 2, 4, 1];
    let k = 4;
    let ans = Solution::shortest_sequence(rolls, k);
    println!("ans = {:?}", ans);
}

struct Solution {}

执行结果如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档