Leetcode - 398周赛

news/2024/6/16 20:34:30

目录

一,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.tangninghui.cn.cn/item-12958.htm

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

相关文章

H800基础能力测试

H800基础能力测试 参考链接A100、A800、H100、H800差异H100详细规格H100 TensorCore FP16 理论算力计算公式锁频安装依赖pytorch FP16算力测试cublas FP16算力测试运行cuda-samples 本文记录了H800基础测试步骤及测试结果 参考链接 NVIDIA H100 Tensor Core GPU Architecture…

海外私人IP和原生IP有什么区别,谁更有优势?

一、什么是海外私人IP&#xff1f;什么是原生IP&#xff1f; 1、海外私人IP&#xff1a; 海外私人IP是由专门的服务提供商提供的IP地址&#xff0c;这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP通常用于绕过地理限制&#…

交换机连接方式

一、级联方式 级联是将多个交换机或其他网络设备依次连接&#xff0c;形成一个层次结构&#xff0c;从而扩展网络的覆盖范围和端口数量。 在级联连接中&#xff0c;数据信号会从一个设备依次传递到下一个设备。每个设备都会接收并处理来自上级设备的数据&#xff0c;并将其转…

键盘盲打是练出来的

键盘盲打是练出来的&#xff0c;那该如何练习呢&#xff1f;很简单&#xff0c;看着屏幕提示跟着练。屏幕上哪里有提示呢&#xff1f;请看我的截屏&#xff1a; 截屏下方有8个带字母的方块按钮&#xff0c;这个就是提示&#xff0c;也就是我们常说的8个基准键位&#xff0c;我…

当代人工智能三教父——深度学习三巨头

文章目录 引言 人物介绍 突出贡献 专业名词解释 引言 今天下午闲来无事翻阅了一下csdn首页的头条文章——《27 岁天才创始人 Joel Hellermark 分享了自己和“AI 教父” Geoffery Hinton 的最新采访》 感觉挺有意思&#xff0c;就从头到尾的看了一遍&#xff0c;里面有很多…

【源码】区块链交易系统/区块链买卖系统/区块链交易所系统

区块链交易系统/区块链买卖系统/区块链交易所系统 k线死了&#xff0c;自行修复 区块链交易系统/区块链买卖系统/区块链交易所系统 - 吾爱资源网