LeetCode --- 398周赛

news2024/12/24 3:13:17

题目列表

3151. 特殊数组 I

3152. 特殊数组 II

3153. 所有数对中数位不同之和

3154. 到达第 K 级台阶的方案数

一、特殊数组I

遍历数组,看相邻元素的奇偶性是否相同即可,代码如下

class Solution {
public:
    bool isArraySpecial(vector<int>& nums) {
        int n = nums.size();
        for(int i = 1; i < n; i++){
            if((nums[i]+nums[i-1])%2==0) // 奇 + 偶 = 奇
                return false;
        }
        return true;
    }
};

二、特殊数组II

这一题是第一题的升级版,需要回答所给的询问的区间是否是特殊数组,如果每次询问都是遍历数组来判断是否满足条件,会超时。那么如何做?这里我们可以用前缀和来做,pre[i]用来记录前i个数中的相邻元素奇偶性相同的个数,给定区间[l,r],我们就可以用pre[r]-pre[l]是否等于0来判断该区间内是否有相邻元素奇偶性相同的情况,代码如下

class Solution {
public:
    vector<bool> isArraySpecial(vector<int>& nums, vector<vector<int>>& queries) {
        int n = nums.size();
        vector<int> pre(n);
        for(int i=1;i<n;i++){
            pre[i] = pre[i-1] + (nums[i]%2==nums[i-1]%2);
        }
        int m = queries.size();
        vector<bool>ans(m);
        for(int i=0;i<m;i++){
            int l = queries[i][0], r = queries[i][1];
            ans[i] = pre[r] == pre[l];
        }
        return ans;
    }
};

三、所有数对中数位不同之和

这题就是统计,可以先统计出每一位上0-9出现的次数,然后在去分别计算每一位上数位不同的对数,求和就能得到答案,代码如下

// 两次遍历
class Solution {
public:
    long long sumDigitDifferences(vector<int>& nums) {
        int n = nums.size();
        int m = to_string(nums[0]).size(); // 计算是几位数
        vector<vector<int>> cnt(m,vector<int>(10));
        // 统计各个数位上0 - 9出现的次数
        for(auto x:nums){
            int k = 0;
            while(x){
                cnt[k++][x%10]++;
                x/=10;
            }
        }
        
        long long ans = 0;
        for(auto v:cnt){
            // 计算每个数位上不同的数对的个数,即使两层for暴力两两组合也能过(一共才10个数进行组合)
            long long pre = 0;
            for(auto x:v){
                ans += x*pre;
                pre += x;
            }
        }
        return ans;
    }
};


// 一次遍历
class Solution {
public:
    long long sumDigitDifferences(vector<int>& nums) {
        int n = nums.size();
        int m = to_string(nums[0]).size();
        vector<vector<int>> cnt(m,vector<int>(10));
        long long ans = 0;
        for(int i=0;i<n;i++){
            int x = nums[i];
            for(int k=0;x;x/=10,k++){
                ans += i - cnt[k][x%10]++;
            }
        }
        
        return ans;
    }
};

四、到达第K级台阶的方案数

这题我们可以用记忆化搜索来做,来暴力查找所有可能的情况。根据题目所给的条件,我们需要记录三个参数,分别为

  • i:代表当前数字为几
  • j:记录到目前为止操作2执行了多少次,下一次操作二,可以跳2^j
  • flag:用来表示上一次操作是操作一/操作二,0 - 操作1,1 - 操作2

递归方程:dfs(i,j,flag) = (flag ? dfs(i-1,j,0) : 0) + dfs(i+(1<<j),j+1,1) + i==k

递归出口:当i>k && j>0时,flag = 0,则无法在往下走了,直接放回0,flag = 1,则可以往回退1个,返回 i-1==k

这题的时间复杂度其实很低,因为操作一不能连续使用,而操作二最多只能进行31次,所以我们的记忆化状态其实很少,具体是多少有兴趣的可以去算一算,下面给出大致的时间复杂度:

1 - m + 1+2^1+...+2^(j-1) = 2^j - m,其中m表示操作1的次数,j表示操作2的次数

如果2^j - m > k,递归退出,m相对于2^j可以直接忽略,所以2^j <= k => j <=logk,而操作一不能连续使用,所以最多也只能使用<=logk次,直接两两暴力组合一下,只有O((logk)^2)

代码如下

class Solution {
public:
    int waysToReachStair(int k) {
        // dfs(i,j,flag)
        // flag = 0 表示上一次操作为操作一
        // flag = 1 表示上一次操作为操作二
        unordered_map<long long,int> mp;
        function<int(int,int,int)>dfs=[&](int i,int j,int flag)->int{
            if(i>k && j>0) return flag?i-1==k:0; // 注意:i-1=k&&flag=1的情况
            long long mask = flag|j<<1|(long long)i<<32;
            if(mp.count(mask)) return mp[mask];
            int res = i==k;
            res += dfs(i+(1<<j),j+1,1); // 进行操作二
            if(flag) res += dfs(i-1,j,0); //进行操作一
            return mp[mask]=res;
        };
        return dfs(1,0,true);
    }
};

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

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

相关文章

LangChain - 为何我们选择 ClickHouse 作为 LangSmith 的动力

本文字数&#xff1a;4742&#xff1b;估计阅读时间&#xff1a;12 分钟 作者&#xff1a;Ankush Gola 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 “我们在使用 ClickHouse 方面有着良好的经历。它使我们能够将 LangSmith 扩展到…

centos7.9用docker运行一个nginx容器

首先你的linux 系统里面已经安装好了docker&#xff0c;docker的安装教程看这个 1&#xff0c;下载nginx镜像 有很多文章会把镜像下载说成是拉取镜像&#xff0c; 我觉得就是下载的意思啊&#xff0c;搞不懂为什么要说拉取&#xff1f; docker pull nginx 下载最新版 Nginx …

PostgreSQL基础(二):PostgreSQL的安装与配置

文章目录 PostgreSQL的安装与配置 一、PostgreSQL的安装 二、PostgreSQL的配置 1、远程连接配置

Springboot+Vue项目-基于Java+MySQL的酒店管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

知识分享:大数据信用花导致的评分不足多久能恢复

随着金融风控领域越来越科技化&#xff0c;基于大数据技术的金融风控成为了贷前风控不可或缺的重要环节&#xff0c;相信很多人在申贷的时候都听说过大数据信用和综合评分等词语&#xff0c;那大数据信用花导致的评分不足多久能恢复呢?本文带大家一起去了解一下。 首先&#x…

公认最好用的随身wifi品牌推荐!欧本VS闪鱼VS格行随身wifi哪款更好用?欧本随身wifi靠谱吗?

最近小编后台私信快被问爆了&#xff0c;都想让测评一下自己相中的随身wifi到底行不行。该说不说随身wifi品牌真是越来越多了&#xff0c;今天就挑选咨询量最多的三款&#xff1a;格行&#xff0c;欧本&#xff0c;闪鱼&#xff01;咱们各方面都实测一下&#xff0c;看看哪款更…

WORD、PPT技巧

WORD技巧 编辑设置 word标题导航窗口怎么调出word2016&#xff0c;缩小了页面&#xff0c;可是怎么是竖着的一页一页排列啊&#xff1f;以前不是好几页横排着的么&#xff1f;怎么设置&#xff0c;求救&#xff1a;在Word标题栏那一行找到“视图”&#xff0c;点击“显示比例…

Android Compose 九:常用组件列表 简单使用

遇事不决 先看官方文档 列表和网格 如果不需要任何滚动&#xff0c;通过Column 或 Row可以使用verticalScroll() 使Column滚动 Column(modifier Modifier.verticalScroll(rememberScrollState())) {for (i in 0..50){Text(text "条目>>${i}")}}显示大量列表…

音视频学习规划

文章目录 概述闲聊点 小结 概述 最近在学习音视频&#xff0c;觉得还是要先写个提纲&#xff0c;给自己制定下学习路线及目标。先写下我的个人流程及思路。 ffmpeg的命令ffmpeg api播放器流媒体RTMP&#xff0c;HLS 闲聊点 先说下学习命令行吧&#xff0c;学习命令行是为了…

FreeRTOS任务间通信“IPC”

---------------信号量--------------- 信号量的定义&#xff1a; 操作系统中一种解决问题的机制&#xff0c;可以实现 “共享资源的访问” 信号&#xff1a;起通知作用量&#xff1a;还可以用来表示资源的数量当"量"没有限制时&#xff0c;它就是"计数型信…

pycharm找不到conda可执行文件解决办法

解决办法 1、第一种 按照以下步骤&#xff0c;找到condabin文件下面&#xff0c;conda.bat 文件&#xff0c;把路径给复制下来&#xff0c;粘贴到 Conda 可执行文件&#xff0c;即可。 然后再点击加载环境&#xff0c;我这里是已经汉化了 pycharm &#xff0c;如何汉化&…

提取 Chrome、Firefox 中储存的用户密码用于凭据发现

操作环境 Chrome 浏览器 Version 125.0.6422.112 (Official Build) (64-bit)Firefox 浏览器 Version 126.0 (64 位) Chrome 浏览器储存密钥原理 新的 Chrome 浏览器储存密码的方案是使用 Chrome 生成的 AES 密钥对用户密码进行加密之后储存在 Sqlite 数据库文件中&#xff0c;A…

c++入门的基础知识

c入门 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习有一定的帮助&#xff0c;本章节主要目标&#xff1a; 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计…

C++ 数据结构算法 学习笔记(32) -五大排序算法

C 数据结构算法 学习笔记(32) -五大排序算法 选择算法 如下若有多个女生的身高需要做排序: 常规思维: 第一步先找出所有候选美女中身高最高的&#xff0c;与最后一个数交换 第二步再找出除最后一位美女外其它美女中的最高者&#xff0c;与倒数第二个美女交换位置 再找出除最…

ASE60P06-ASEMI场效应MOS管ASE60P06

编辑&#xff1a;ll ASE60P06-ASEMI场效应MOS管ASE60P06 型号&#xff1a;ASE60P06 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 批号&#xff1a;2024 沟道&#xff1a;N沟道 导通内阻RDS&#xff08;ON&#xff09;Max&#xff1a;19mΩ 启动电压&#xff1a;2V-4…

【启明智显技术分享】SOM2D02-2GW核心板适配ALSA(适用Sigmastar ssd201/202D)

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…

【代码随想录】二分查找算法总结篇

目录 前言二分查找例题一例题二例题三例题四 前言 本篇文章记录了代码随想录二分查找算法的总结笔记&#xff0c;下面我们一起来学习吧&#xff01;&#xff01; 二分查找 关于二分查找算法&#xff0c;我在之前的这篇博客里面做了非常多的分析&#xff0c;但是后面做题做着…

Leetcode | 5-21| 每日一题

2769. 找出最大的可达成数字 考点: 暴力 数学式子计算 思维 题解 通过式子推导: 第一想法是二分确定区间在区间内进行查找是否符合条件的, 本题最关键的便是 条件确定 , 第二种方法: 一般是通过数学公式推导的,这种题目我称为数学式编程题 代码 条件判断式 class Solution { …

长文处理更高效:一键章节拆分,批量操作轻松搞定,飞速提升工作效率!

在当今信息爆炸的时代&#xff0c;我们时常需要处理大量的文本内容。无论是阅读长篇小说、整理专业资料还是编辑大型文档&#xff0c;TXT文本文件的普遍性不言而喻。然而&#xff0c;当TXT文本内容过于庞大时&#xff0c;阅读、编辑和管理都变得异常繁琐。此时&#xff0c;一款…

齐护K210系列教程(三十一)_视觉小车

视觉小车 齐护编程小车端程序动作说明联系我们 在经常做小车任务项目时会用的K210的视觉与巡线或其它动作结合&#xff0c;这就关系到要将K210的识别结果传送给小车的主控制器&#xff0c;K210为辅助传感器&#xff08;视觉采集&#xff09;。 这节课我们用K210识别图像&#x…