Leetcode 第 398 场周赛题解

Leetcode 第 398 场周赛题解

  • Leetcode 第 398 场周赛题解
    • 题目1:3151. 特殊数组 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3152. 特殊数组 II
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3153. 所有数对中数位不同之和
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3154. 到达第 K 级台阶的方案数
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 398 场周赛题解

题目1:3151. 特殊数组 I

思路

遍历数组 nums,依次比较相邻元素是否奇偶性不同即可。

代码

class Solution {
public:bool isArraySpecial(vector<int>& nums) {if (nums.size() == 1)return true;int n = nums.size();for (int i = 0; i < n - 1; i++)if (!different(nums[i], nums[i + 1]))return false;return true;}bool different(int a, int b) { return abs(a - b) % 2; }
};

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(1)。

题目2:3152. 特殊数组 II

思路

预处理 + 前缀和。

定义一个长为 n−1 的数组 a,其中 a[i] = nums[i] % 2 == nums[i+1] % 2,那么 a 的从 to-1 到 from 的子数组和等于 0,就说明询问的子数组是特殊数组。

计算 a 的前缀和 preSum,可以快速判断子数组和是否为 0。

代码

/** @lc app=leetcode.cn id=3152 lang=cpp** [3152] 特殊数组 II*/// @lc code=start
class Solution
{
public:vector<bool> isArraySpecial(vector<int> &nums, vector<vector<int>> &queries){int n = nums.size();// 定义一个长为 n−1 的数组 a,其中 a[i] = nums[i] % 2 == nums[i+1] % 2// 那么 a 的从 to-1 到 from 的子数组和等于 0,就说明询问的子数组是特殊数组。// 计算 a 的前缀和 preSum,可以快速判断子数组和是否为 0vector<int> preSum(n, 0);for (int i = 1; i < n; i++){// 相邻两数的异或和的最低位取反int a = !((nums[i] ^ nums[i - 1]) & 1);preSum[i] = preSum[i - 1] + a;}int m = queries.size();vector<bool> ans(m);for (int i = 0; i < m; i++){int from = queries[i][0], to = queries[i][1];ans[i] = preSum[to] - preSum[from] == 0;}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n+m),其中 n 是数组 nums 的长度,m 是数组 queries 的长度。

空间复杂度:O(n),其中 n 是数组 nums 的长度。

题目3:3153. 所有数对中数位不同之和

思路

遍历数组 nums, 对每一位的数字进行计数并保存在数组 cnt 中。

遍历完数组得到 cnt 后,cnt[i][j] 表示在第 i 位,数字为 j 的数的个数,那么在第 i 位,数字不为 j 的数的个数为 n−cnt[i][j],其中 n 为数组 nums 的长度。根据乘法原理可以知道,在第 i 位,一共有 cnt[i][j]∗(n−cnt[i][j])/2 对数在该位的数字不相同。累加每一位数字不相同的数对数量,即可得到所需要的答案。

代码

/** @lc app=leetcode.cn id=3153 lang=cpp** [3153] 所有数对中数位不同之和*/// @lc code=start
class Solution
{
public:long long sumDigitDifferences(vector<int> &nums){int n = nums.size();int cnt[9][10];memset(cnt, 0, sizeof(cnt));for (int num : nums){int i = 0;while (num){cnt[i][num % 10]++;i++;num /= 10;}}long long ans = 0LL;for (int i = 0; i < 9; i++)for (int j = 0; j < 10; j++)ans += cnt[i][j] * (n - cnt[i][j]);return ans >> 1;}
};
// @lc code=end

复杂度分析

时间复杂度:O(l*n+l*d),其中 n 为数组 nums 的长度,l 为数组 nums 中数据的十进制位数,l 的最大值为 9,d 为从 0 到 9 共 10 个数字。

空间复杂度:O(l*d),其中 l 为数组 nums 中数据的十进制位数,l 的最大值为 9,d 为从 0 到 9 共 10 个数字。

题目4:3154. 到达第 K 级台阶的方案数

思路

记忆化搜索。

定义 dfs(int i, int jump, bool preDown) 表示当前位于台阶 i,已经使用了 jump 次第二种操作,preDown:上一次操作是否为操作一时,到达台阶 k 的方案数。

枚举当前使用哪个操作:

  1. 使用操作一:前提是 i != 0 && preDown == false。使用操作一后,要解决的子问题是 dfs(i - 1, jump, true),加入返回值中。
  2. 使用操作二:要解决的子问题是 dfs(i + (1 << jump), jump + 1, false),加入返回值中。
  3. 此外,如果 i=k,可以把返回值加一。

递归边界:如果 i>k+1,由于操作一不能连续使用,无法到达 k,返回 0。

递归入口:dfs(1,0,false),即答案。

代码

/** @lc app=leetcode.cn id=3154 lang=cpp** [3154] 到达第 K 级台阶的方案数*/// @lc code=start
class Solution
{
private:unordered_map<long long, int> memo;public:int waysToReachStair(int k){// 当前位于台阶 i,已经使用了 jump 次第二种操作,preDown:上一次操作是否为操作一function<int(int, int, bool)> dfs = [&](int i, int jump, bool preDown) -> int{if (i > k + 1)return 0;long long state = (long long)i << 32 | jump << 1 | preDown;if (memo.contains(state))return memo[state];int res = 0;if (i == k)res++;if (i != 0 && preDown == false){ // 操作一res += dfs(i - 1, jump, true);}res += dfs(i + (1 << jump), jump + 1, false); // 操作二memo[state] = res; // 记忆化return res;};// 从台阶 1 开始,一开始 jump 为 0,前一次操作不为操作二return dfs(1, 0, false);}
};
// @lc code=end

复杂度分析

时间复杂度:O(log2k)。

空间复杂度:O(log2k)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

辩证 逻辑学 | 洞察 事物矛盾及变化规律 在形式逻辑基础上 学会辩证思维(40节课)

课程下载&#xff1a;辩证逻辑学洞察事物矛盾及变化规律在形式逻辑基础上学会辩证思维&#xff08;40节课&#xff09;-课程网盘链接提取码下载.txt资源-CSDN文库 更多资源下载&#xff1a;关注我。 在形式逻辑的基础上&#xff0c;学会 辩证思维 敏锐 洞察事物发展变化的规…

Linux命令篇(一):文件管理部分

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 1、cat命令常用参…

童趣盎然,米香四溢 —— 蒙自源六一儿童节特别献礼

充满欢声笑语的六一儿童节马上就要来了&#xff0c;在这个充满童真和喜悦的时刻&#xff0c;蒙自源米线品牌以一颗童心&#xff0c;为所有大朋友和小朋友准备了一份特别的礼物。 从5月25日开始&#xff0c;蒙自源诚挚邀请您和孩子们一同前往蒙自源旗下各大门店&#xff0c;品尝…

【MySQL数据库】MySQL 高可用搭建方案——MHA实战

MHA&#xff08;Master High Availability&#xff09; MHA实战 MHA&#xff08;Master High Availability&#xff09; 一、MHA简介二、MHA搭建准备要求&#xff1a;mha集群搭建&#xff0c;4台服务器&#xff0c;1主2从&#xff0c;1台mha2.1实验思路2.2实验准备 三、搭建MyS…

每日一题31:数据统计之即时配送食物

一、每日一题 配送表: Delivery -------------------------------------- | Column Name | Type | -------------------------------------- | delivery_id | int | | customer_id | int | | order_date …

HTML5常用标签表格

04-08、表格标签table 概述 表格&#xff1a;是一种行和列组合而成的单元格。一般应用于后台网页设计管理数据使用。 表格的架构部分&#xff1a; tabletable head 表格头 theadtable body - 表格体 tbodytable foot -表格的页脚 tfoot 表格的基本组成部分&#xff1a; t…

Bluetooth Profiles,蓝牙配置文件对应设备

下面的常量是蓝牙各种配置文件的标识符。 每个常量代表一个特定的蓝牙配置文件&#xff0c;这些配置文件定义了蓝牙设备之间通信的特定方式。以下是每个常量的解释&#xff1a; HEADSET (1): 代表耳机和免提配置文件&#xff0c;通常用于蓝牙耳机或车载免提系统。A2DP (2): 代…

opencv-python(三)

马赛克 face img[162:428,297:527] # 人脸坐标区域face face[::10,::10] # 每10个中取出一个像素&#xff0c;马赛克face np.repeat(face, 10, axis0) # 行方向重复10次face np.repeat(face, 10, axis1) # 列方向重复10次img[162:428,297:527] face[:266,:230] # 填充&a…

计算机科学与技术和软件工程专业有什么区别?应该怎么选?

计算机科学与技术和软件工程都是就业前景较好的计算机类专业&#xff0c;二者密切相关但侧重点不同&#xff0c;同学们应该如何选择呢&#xff1f; 一、学习内容 1.学科定位 ● 计算机科学与技术 侧重于计算机科学的理论研究和基础技术&#xff0c;包括算法、数据结构、人工…

lnmp平台部署web应用,安装Discuz社区平台详细文章——更新中

Nginx网站service 详细相关介绍-特点-http状态码-配置文件、将nginx添加永久环境变量 访问网站404是什么&#xff1f;_nginx 稳定版-CSDN博客文章浏览阅读1.2k次&#xff0c;点赞33次&#xff0c;收藏24次。开源Web服务器软件。_nginx 稳定版https://blog.csdn.net/2301_771619…

数据结构--数组(详细分析)

目录 &#x1f349;引言 &#x1f349;数组 &#x1f348;数组的特性 &#x1f348;数组的优缺点 &#x1f34d;优点&#xff1a; &#x1f34d;缺点&#xff1a; &#x1f348;数组的声明与初始化 &#x1f348;数组的常见操作 &#x1f34d; 插入操作 &#x1f34d;…

Touch Camera PRO 2024 Easy Mobile Desktop Camera Controller(触控相机专业版)

一个真正易于使用的移动+台式摄像机控制器,具有视角切换功能! Touch Camera PRO 是一款非常易于使用的移动+桌面相机控制器,具有透视切换功能!它在 Home Designer、Runtime Level Editor 和 Floor Map Designer 等其他插件中使用! 在桌面和移动设备上工作! 一个干…

WIireShark使用教程

文章目录 目录 文章目录 一.入门抓包示例 一.入门抓包示例 先介绍一下如何使用wireshark抓取相应网卡的流量&#xff0c;让读者可以先上手操作感受一下抓包的具体过程。 1.打开wireshark的主界面如下 2.选择需要抓包的网卡&#xff0c;鼠标左键双击&#xff0c;即可抓取该网…

Mysql常见问题总结

1、MySQL初始化报错 mysqld --initialize --usermysql --console 2024-06-02T15:52:22.645557Z 0 [System] [MY-013169] [Server] D:\installSoft\mysql-8.0.21-winx64\bin\mysqld.exe (mysqld 8.0.21) initializing of server in progress as process 8980 2024-06-02T15:52:2…

02-2.3.2_1 单链表的插入和删除

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏&#xff0c;今后还会不断更新。 此外&#xff0c;《程序员必备技能》专栏和《程序员必备工具》专栏&#xff08;该专栏暂未开设&#xff09;日后会逐步更新&#xff0c; 插入 按位序插入 &#xff08;1&#xff09;带头结点 L…

量子加速超级计算简介

本文转载自&#xff1a;量子加速超级计算简介(2024年 3月 13日) By Mark Wolf https://developer.nvidia.cn/zh-cn/blog/an-introduction-to-quantum-accelerated-supercomputing/ 文章目录 一、概述二、量子计算机的构建块&#xff1a;QPU 和量子位三、量子计算硬件和算法四、…

代码随想录算法训练营第三十七 | ● 738.单调递增的数字 ● 968.监控二叉树

738.单调递增的数字 讲解链接&#xff1a;https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html class Solution { public:int monotoneIncreasingDigits(int n) {//整数转字符串&#xff0c;变为字符串访问比诸位取出数字要…

项目集成过程中的makefile记录

项目集成过程中的makefile记录 文章目录 项目集成过程中的makefile记录1.基础概念注释打印赋值方式常用变量$ 伪目标函数wildcard 多目录、文件操作 2.思路梳理**需求分析**目录结构 3.可行示例 持续更新中1.基础概念 注释 # 示例&#xff1a; # 项目名称打印 echo "H…

控制台相关

输入输出 输出 Console.WriteLine("123123");//光标空行 Console.Write("123123123123");//不空行输入 string str Console.ReadLine(); //如果在ReadKey(true)不会把输入的内容显示在控制台上 char c Console.ReadKey(true).KeyChar; Console.WriteL…

ACM实训第25天

第四套 第一道&#xff08;修改&#xff09; #include<stdio.h> #include<string.h> int cnt[10]; void count_digits(int n,int* cnt){for(int i1;i<n;i){int numi;while(num){cnt[num%10];num/10;}} } int main(){int t;scanf("%d\n",&t);whi…