LeetCode --- 401周赛

题目列表

3178. 找出 K 秒后拿着球的孩子

3179. K 秒后第 N 个元素的值

3180. 执行操作可获得的最大总奖励 I

3181. 执行操作可获得的最大总奖励 II

一、找出K秒后拿着球的孩子

这题可以直接模拟,从前往后,再从后往前走k次,最后直接返回下标。或者我们可以直接计算,先算出球是从前往后走,还是从后往前走,然后判断球是第几个,返回下标即可,代码如下

//数学
class Solution {
public:
    int numberOfChild(int n, int k) {
        int m = k/(n-1), left = k%(n-1); // 因为起始下标是0,所以只要走n-1步就能到最后
        // m如果是奇数,说明是从后往前,如果是偶数,说明是从前往后
        return m&1 ? n - left - 1 : left; 
    }
};

// 模拟
class Solution {
public:
    int numberOfChild(int n, int k) {
        int i = 0, dir = -1;
        while(k){
            if(i <= 0|| i >= n-1) dir *= -1;
            i += dir;
            k--;
        }
        return i;
    }
};

二、K秒后第N个元素的值

这题可以直接模拟,就是求k次前缀和,返回最后一个元素,也可以直接用数学,去观察它,本质是在求一个组合数C(n+k-1,n-1),具体过程如下

代码如下

// 数学
const int MOD = 1e9+7;
int C[2001][2001]{};
int init=[]()->int{
    C[0][0] = 1;
    for(int i = 1; i < 2001; i++){
        C[i][0] = C[i][i] = 1;
        for(int j = 1; j <= i/2; j++){
            C[i][j] = C[i][i-j] = (C[i-1][j] + C[i-1][j-1])%MOD;
        }
    }
    return 0;
}();

class Solution {
public:
    int valueAfterKSeconds(int n, int k) {
        return C[n+k-1][k];
    }
};

// 模拟
class Solution {
    const int MOD = 1e9+7;
public:
    int valueAfterKSeconds(int n, int k) {
        vector<int> v(n,1);
        while(k--){
            for(int i=1;i<n;i++){
                v[i] = (v[i] + v[i-1])%MOD;
            }
        }
        return v.back();
    }
};

三、执行操作可获得的最大总奖励 I & II

这题和0-1背包很相似,状态定义为:dp[i][j]表示能否在前i个数中选出一些数使得它们的和为j

状态转移方程为

  • 不选nums[i],dp[i][j] = dp[i-1][j]
  • 选nums[i],dp[i][j] = dp[i-1][j-nums[i]],其中 0 <= j - nums[i] < nums[i]
  • 故dp[i][j] = dp[i-1][j] | dp[i-1][j-nums[i]]

代码如下

class Solution {
public:
    int maxTotalReward(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        nums.erase(unique(nums.begin(),nums.end()),nums.end()); // 无法选择多个相同的数
        int n = nums.size(), mx = ranges::max(nums);
        vector<vector<bool>> dp(n+1,vector<bool>(mx*2));
        dp[0][0] = true;
        int ans = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < 2*nums[i]; j++){ // 当 j >= 2*nums[i] 时,dp[i+1][j] = dp[i][j],根据递推,它们都是false,没必要更新
                dp[i+1][j] = dp[i][j];
                if(j >= nums[i]) dp[i+1][j] = dp[i+1][j] | dp[i][j - nums[i]];
            }
        }
        for(int i=mx*2-1;i>=0;i--)
            if(dp[n][i])
                return i;
        return -1;
    }
};
// 优化
class Solution {
public:
    int maxTotalReward(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        nums.erase(unique(nums.begin(),nums.end()),nums.end());
        int n = nums.size(), mx = ranges::max(nums);
        vector<bool>dp(mx*2);
        dp[0] =true;
        int ans = 0;
        for(int i = 0; i < n; i++){
            for(int j = nums[i]; j < 2*nums[i]; j++){
                dp[j] = dp[j] | dp[j - nums[i]];
            }
        }
        for(int i=mx*2-1;i>=0;i--)
            if(dp[i])
                return i;
        return -1;
    }
};

第四问的数据范围变大,我们还需要对时间复杂度进行优化,如何做???

根据上面的代码,我们只要维护一个2*mx大小的bool数组就可以,但是维护true / false其实只需要一个二进制位就能表示,我们可以将数组大小进行压缩,同时,一旦它用二进制来表示,我们的状态转移,就可以用二进制的 | 运算进行,即可以批量的进行,因为整数在cpu上计算时是以32位整型/64位整型进行或运算的,即速度会提升32倍/64倍,代码如下

class Solution {
public:
    int maxTotalReward(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        nums.erase(unique(nums.begin(),nums.end()),nums.end());
        int n = nums.size(), mx = ranges::max(nums);
        bitset<100000> f = 1;
        for(auto v:nums){
            int shift = f.size() - v;
            f |= f << shift >> shift << v;
        }
        for(int i = mx*2 - 1; i >= 0; i--)
            if(f.test(i))
                return i;
        return -1;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)

【尚庭公寓SpringBoot Vue 项目实战】公寓管理&#xff08;十一&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】公寓管理&#xff08;十一&#xff09;1、业务介绍2、逻辑模型介绍3、接口开发3.1、保存或更新公寓信息3.2、根据条件分页查询详细信息3.3、根据ID获…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

目录 1. 前言 2. EasyExcel简介 3. EasyExcel简单导出案例讲解 3.1 EasyExcel依赖引入 3.2 测试类创建 3.3 Excel导出实现 4. EasyExcel合并单元案例讲解 4.1 实现自定义合并策略 4.2 使用自定义合并策略 5. 总结 1. 前言 项目上&#xff0c;需将一个列表数据导出Ex…

16. 第十六章 类和函数

16. 类和函数 现在我们已经知道如何创建新的类型, 下一步是编写接收用户定义的对象作为参数或者将其当作结果用户定义的函数. 本章我会展示函数式编程风格, 以及两个新的程序开发计划.本章的代码示例可以从↓下载. https://github.com/AllenDowney/ThinkPython2/blob/master/c…

(源码)供应商电子招投标管理系统实现方案和功能说明

采购在线招投标供应商管理系统是一个集成了多个关键功能的综合性系统&#xff0c;旨在优化采购流程、提高效率和确保透明度。以下是关于您提到的五个核心功能的详细解释&#xff1a; 供应商管理 此功能允许企业记录和管理供应商的基本信息&#xff0c;如公司名称、联系方式、主…

了解并解决 Flutter 中的灰屏问题

生产中的 flutter 应用程序中的灰屏是一种通用占位符&#xff0c;当框架遇到问题无法渲染预期用户界面时就会显示。是的&#xff0c;所以基本上是出现问题时的后备指示器。 有趣的是&#xff0c;这只出现在发布模式下。在任何其他模式下运行都会显示红色错误屏幕&#xff0c;并…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说&#xff0c;做了以下事情&#xff1a; ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源&#xff0c;并下载最新的软件包列表。 ③将…

前端老古董execCommand——操作 选中文本 样式

文章目录 ⭐前言⭐exe command api用法&#x1f496; example示例&#x1f496; 测试效果 ⭐execommand和getSelection 的联系⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端老古董execCommand——操作选中文本。 execommand 当一个 HTML 文…

【Linux】进程_4

文章目录 五、进程4. 进程状态5. 进程优先级6. 进程的调度和转换 未完待续 五、进程 4. 进程状态 当进程属于挂起状态时&#xff0c;进程的可执行程序代码和数据均会被从内存中换入到磁盘中&#xff0c;此时进程的PCB并没有消失&#xff0c;只要操作系统还需要管理这个进程&a…

ChatGPT关联技术

ChatGPT关联技术 一、前馈神经网络二、序列到序列模型&#xff08;Seq2Seq&#xff09;三、自注意力机制四、多头自注意力机制五、自监督学习六、Transformer模型七、语言生成技术八、多语种语言模型九、预训练语言模型十、生成式预训练模型&#xff08;GPT&#xff09;十一、近…

【odoo】odoo.conf文件配置

概要 odoo.conf 文件是 Odoo 服务器的配置文件&#xff0c;它用于定义和管理 Odoo 运行时的各种参数。这个文件包含了许多配置选项&#xff0c;可以帮助管理员根据特定的需求和环境来调整 Odoo 服务器的行为。 主要功能 数据库连接设置&#xff1a;定义 Odoo 连接到 PostgreSQL…

使用tkinter创建带有图标的菜单栏

使用tkinter创建带有图标的菜单栏 效果代码代码解析创建主窗口加载图标创建菜单栏添加文件菜单添加带图标的菜单项 Tkinter 的默认菜单外观较为简单&#xff0c;可以通过自定义和添加图标&#xff0c;让菜单显示更好看。 效果 代码 import tkinter as tk from tkinter import …

【SpringBoot】SpringBoot:构建安全的Web应用程序

文章目录 引言为什么需要安全Spring Security概述配置Spring Security添加依赖基本配置 用户认证创建用户实体类创建用户存储库自定义用户服务更新安全配置 用户授权更新用户实体类更新自定义用户服务更新安全配置 防护措施防止SQL注入使用参数化查询 防止跨站脚本&#xff08;…

Java17 --- RabbitMQ之插件使用

目录 一、Federation插件 1.1、运行两个rabbitmq实例 1.2、启用插件 1.3、在下游端点添加上游端点 1.4、创建策略 1.6、测试 二、联邦队列 2.1、创建策略 2.2、创建交换机与队列 2.2.1、创建52000的队列与交换机 2.2.2、创建62000的队列 三、Shovel 3.1、启…

WNR最便捷美观的开源桌面计时器工具

华丽外观&#xff0c;功能全面。工作和休息的完美计时器。跨平台支持&#xff0c;无论是Windows、Mac还是Linux&#xff0c;WNR都能轻松驾驭。 超强全屏专注模式 对于寻找高效工作/休息管理工具却屡屡受挫的用户&#xff0c;WNR的“全屏专注模式”无疑是终极解决方案。它确保在…

Android 蓝牙配对Settings应用里面的简要流程记录

Android 蓝牙配对Settings应用里面的简要流程记录 文章目录 Android 蓝牙配对Settings应用里面的简要流程记录一、前言二、Settings蓝牙配对的关键代码1、接收蓝牙请求的地方 AndroidManifest.xml2、BluetoothPairingRequest3、BluetoothPairingService4、BluetoothPairingDial…

利用机器学习重构视频中的人脸

引言 中国与英国的研究团队携手合作&#xff0c;开创了一种创新的视频面孔重塑技术。这项技术能够以极高的一致性对视频中的面部结构进行逼真的放大和缩小&#xff0c;且避免了常见伪影的产生。 从研究人员选取的YouTube视频样例中可见&#xff0c;经过处理后&#xff0c;女演…

LC1020:飞地的数量

题目 给你一个大小为 m x n 的二进制矩阵 grid &#xff0c;其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻&#xff08;上、下、左、右&#xff09;的陆地单元格或跨过 grid 的边界。 返回网格中 无法 在任意次数的移动…

在ubuntu中启动docker的mysql8镜像

首先查看docker是否启动&#xff1a; docker ps #出现信息就是启动成功 启动命令&#xff1a; sudo systemctl start docker 设置开机自启&#xff1a; sudo systemctl enable docker 查询下载好的mysql8的镜像文件&#xff1a; docker images 在启动查询好的镜像文件&#…

Oracle--19C在Centos7上的静默安装(rpm版)

一、Oracle 19c Linux安装&#xff08;Centos 7&#xff09; 1.查看磁盘可用空间及配置ip地址 [rootlocalhost /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 1.4G 0 1.4G 0% /dev tmpfs 1.4G …