Leetcode - 398周赛

embedded/2024/10/21 23:26:50/

目录

一,3151. 特殊数组 I

二,3152. 特殊数组 II

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

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


一,3151. 特殊数组 I

本题就是判断一个数组是否是奇偶相间的,如果是,返回true;否则,返回false,直接暴力

代码如下: 

class Solution {public boolean isArraySpecial(int[] nums) {int n = nums.length;for(int i=1; i<n; i++){if(nums[i]%2 == nums[i-1]%2)return false;}return true;}
}

二,3152. 特殊数组 II

本题就是判断nums数组在 [from,to] 的区间是否满足奇偶相间。由于数据范围太大,无法暴力。其实我们可以预处理一下,先统计出数组pre[i]:表示以 i 为右端点的满足条件的最小左端点。再遍历queries数组,判断这里的左端点是否>=pre[queries[i][1]],如果大于等于,ans[i] = true;如果小于,ans[i] = false;

class Solution {public boolean[] isArraySpecial(int[] nums, int[][] queries) {int n = nums.length;int[] pre = new int[n];for(int r=1; r<n; r++){if(nums[r]%2 != nums[r-1]%2){pre[r] = pre[r-1];}else{pre[r] = r;}}boolean[] ans = new boolean[queries.length];for(int i=0; i<queries.length; i++){ans[i] = pre[queries[i][1]] <= queries[i][0];}return ans;}
}

前缀和做法:

我们定义一个a[i]:表示nums[i] 和 nums[i+1]是否是奇偶相间的,a[i] = 0,表示两个数一奇一偶;a[i] = 1,表示两个数同奇同偶。如果想要得知【from,to】区间是否是特殊数组,就是判断数组a在【from,to-1】区间是否出现过1(即区间和是否>0),这就变成了一个求前缀和的问题。

代码如下:

class Solution {public boolean[] isArraySpecial(int[] nums, int[][] queries) {int[] s = new int[nums.length];//a数组的前缀和数组for(int i=1; i<nums.length; i++){s[i] = s[i-1] + (nums[i-1]%2==nums[i]%2?1:0);}boolean[] ans = new boolean[queries.length];for(int i=0; i<queries.length; i++){ans[i] = s[queries[i][0]] == s[queries[i][1]];}return ans;}
}

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

本题可以从个位,十位,百位.....依次进行计算,而单个位上的计算,就变成了这个问题——给你一个长为 n 的数组 a,只包含数字 0 到 9,其中有多少个不同的数对?我们可以遍历数组a,使用一个数组或哈希表记录<出现过的数字,出现次数>,如果当前数字 d 没有出现过,ans += k,表示d能与前面出现的所有数字组成数对(k表示之前出现了k个数字),如果d出现过,ans += k - cnt[d],表示d能与k - cnt[d] 个数组成数对。

代码如下:

class Solution {public long sumDigitDifferences(int[] nums) {int n = String.valueOf(nums[0]).length();long[][] cnt = new long[n][10];long ans = 0;for(int i=0; i<nums.length; i++){int x = nums[i];int j = 0;while(x > 0){if(cnt[j][x%10]==0){ans += i;}else{ans += i-cnt[j][x%10];}cnt[j][x%10]++;j++;x /= 10;}}return ans;}
}

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

dfs(i,j,flg):在该状态下,到达台阶k的总方案数

  • i:表示当前所处的位置
  • j:表示使用操作二的次数
  • flg:表示前一次操作是否使用操作一,这个参数是为了判断当前能否使用操作一,因为题目中规定不能连续使用操作一

它的转移来源:

  • 使用操作一:前提 flg == false && i > 0,接下来要解决的子问题就是 dfs(i-1,j,true),加入返回值中
  • 使用操作二:随时都能使用,接下来要解决的子问题就是 dfs(i+(1<<j),j+1,false),加入返回值中
  • 因为题目可以在它到达台阶k处继续操作,所以该条件不能作为结束条件,但是它也是一个正确的方案,所以当 i == k 时,返回值+1

结束条件:我们发现操作一最多只能回退一个台阶,而操作二除了第一次上1个台阶,其余都>1,所以可以发现如果 i > k + 1,那么就再也回不到台阶 k 了,因此结束条件是 i > k + 1,返回 0.

代码如下:

class Solution {public int waysToReachStair(int k) {return dfs(1, 0, k, false);}Map<String, Integer> map = new HashMap<>();int dfs(int i, int j, int k, boolean flg){if(i > k+1) return 0;String key = i + " " + j + " " + flg;if(map.containsKey(key)) return map.get(key);int res = i==k?1:0;if(flg == false)res += dfs(i-1, j, k, true);res += dfs(i+(1<<j), j+1, k, false);map.put(key, res);return res;}
}


http://www.ppmy.cn/embedded/43144.html

相关文章

Java中的封装、继承和多态性详解

一、封装 技术难点 封装是面向对象编程的四大基本特性之一&#xff0c;它的主要目标是隐藏对象的内部状态和信息&#xff0c;只对外提供有限的访问接口。技术难点在于如何合理地设计类的私有成员变量和公有方法&#xff0c;以确保数据的安全性和操作的便捷性。封装要求开发者…

webserver服务器从零搭建到上线(六)|Timestamp类和InetAddress类

本节我们重点来谈论&#xff1a; 时间类和我们的初始化链接地址类 文章目录 Timestamp类成员函数实现 InetAddress类具体实现 Timestamp类 我们为什么要封装一个时间类呢&#xff1f; 这也是一个大型项目必须的基础组建&#xff0c;这样我们不仅可以提高代码的可读性&#xf…

Scala 入门介绍和环境搭建

一、简介 Scala 是一门以 Java 虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 (静态语言需要提前编译&#xff0c;如&#xff1a;Java、c、c 等&#xff0c;动态语言如&#xff1a;js)Scala 是一门多范式的编程…

WEB--NeDB

1.定义 NeDB is a lightweight document DBMS written in JavaScript. 全称&#xff1a;Node.js Embedded Database can be used both as embedded嵌入式&#xff08;保存&#xff09; and in-memory 内存式&#xff08;不保存&#xff09; It is a lightweight NoSQL data…

php爬虫之获取淘宝商品数据

爬取淘宝信息数据 首先需要先导入webdriver 1.from selenium import webdriver webdriver支持主流的浏览器&#xff0c;比如说&#xff1a;谷歌浏览器、火狐浏览器、IE浏览器等等 然后可以创建一个webdriver对象&#xff0c;通过这个对象就可以通过get方法请求网站 1.driver…

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件&#xff0c;是许多应用程序&…

CentOS 7安装prometheus

说明&#xff1a;本文介绍如何在CentOS操作系统上安装prometheus Step1&#xff1a;下载安装包 访问Github仓库&#xff0c;下载对应版本的prometheus安装包 https://github.com/prometheus/prometheus/releases 操作系统的版本信息&#xff0c;可通过下面这两个命令查看&am…

10.SpringBoot 统一处理功能

文章目录 1.拦截器1.1在代码中的应用1.1.1定义拦截器1.1.2注册配置拦截器 1.2拦截器的作用1.3拦截器的实现 2.统一数据返回格式2.1 为什么需要统⼀数据返回格式&#xff1f;2.2 统⼀数据返回格式的实现 3.统一异常处理4.SpringBoot专业版创建项目无Java8版本怎么办&#xff1f;…