LeetCode 第 150 场周赛
一、拼写单词(LeetCode-1160)
1.1 题目描述
1.2 解题思路
由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArray[0]代表字符a可以使用的次数,charsArray[25]代表字符z可以使用的次数),存放某字符的可使用的个数。
遍历单词列表,复制一份charsArray,使用一次,就将单词可使用次数减1。
若需要用到的字符时,该在charsArray的数量为0,则该单词不符合条件
。
1.3 实现代码
class Solution {
public int countCharacters(String[] words, String chars) {
int[] charLib = new int[26];
int res = 0;
for (Character character : chars.toCharArray()) {
charLib[character - 'a']++;
}
OK:
for (String word : words) {
int len = word.length();
if (len > chars.length()) {
continue;
}
int[] wordLib = Arrays.copyOf(charLib, 26);
for (Character character:word.toCharArray()){
if(--wordLib[character - 'a'] <0){
continue OK;
}
}
res += len;
}
return res;
}
}
二、最大层内元素和(LeetCode-1161)
2.1 题目描述
2.2 解题思路
使用BFS完成树的层次遍历,计算层的节点值之和
,找到最大的值,返回对应的最小的层数。
2.3 实现代码
public int maxLevelSum(TreeNode root) {
if (root == null) {
throw new IllegalArgumentException("invalid parameters");
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int index = 0;
int sum = 0;
//当队列不是空的时候,将队列头移除,将其儿子节点加入队列
int ceng = 1;
while (!queue.isEmpty()) {
int size = queue.size();//记录当前层节点的个数
TreeNode temp;
int result = 0;
//循环size次
for (int i = 0; i < size; i++) {
temp = queue.poll();
result += temp.val;
if (temp.left != null) {
queue.offer(temp.left);
}
if (temp.right!= null) {
queue.offer(temp.right);
}
}
if (result > sum) {
index = ceng;
sum = result;
}
ceng++;
}
return index;
}
三、地图分析(LeetCode-1162)
3.1 题目描述
3.2 解题思路
使用BFS的思想解决
- 先找到所有
陆地
的坐标,放到队列
中 - 从队列中取出陆地坐标,找到
离陆地最近的海洋
- 若找到海洋,则层数level加1,找到的海洋都当陆地算,海洋的坐标值
grid[i][j]
变为1,重新放到队列,重复2操作
- 若未找到任何海洋,则结束,返回level
3.3 实现代码
public class Solution {
class Position {
public int x;
public int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
}
public int maxDistance(int[][] grid) {
int[] direction = {0, 1, 0, -1, 0};
int N = grid.length;
int res = 0;
Queue<Position> queue = new ArrayDeque<>();
//找到陆地
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (grid[i][j] == 1) {
queue.offer(new Position(i, j));
}
}
}
//全是海洋或陆地
if (queue.size() == N * N || queue.isEmpty()) {
return -1;
}
//使用BFS
while (!queue.isEmpty()) {
int size = queue.size();
int r = 0;
while (size != 0) {
Position position = queue.poll();
for (int i = 0; i < direction.length-1; i++) {
int nx = position.x + direction[i];
int ny = position.y + direction[i + 1];
if (nx < 0 || ny < 0 || nx >= N || ny >= N || grid[nx][ny] == 1) {
continue;
}
//将找到的海洋当做陆地,放到队列中
grid[nx][ny] = 1;
queue.offer(new Position(nx, ny));
r++;
}
size--;
}
//当前层的陆地能找到距离最近的海洋,则结果值+1
if(r > 0){
res++;
}
}
return res;
}
}
四、按字典序排在最后的子串(LeetCode-1163)
4.1 题目描述
4.2 解题思路
根据题意。
截取的字符串,只需要选择一个位置k,截取k及之后的字符串
即为最终答案(res = s.subString(k))
。
如何找到这个k?
例如zzaazcc,按照字典排序,肯定是要找到最大的字符z
存在两种情况:
- 只有一个最大字符z,返回z及之后的所有字符,作为答案
- 有多个最大字符z,例如存在2个最大字符z,对应的位置分别是x,y,则比较最大字符后面的第一位字符,即比较charArray[x+1]、charArray[y+1],根据k新的位置。
需要考虑一种特殊情况即,两个最大字符是邻位(zz)
,出现这种情况,我们只取index最小的(zz取前面的z的坐标)。通过charArray[i] != charArray[i-1],来排除。
4.3 实现代码
public class Solution {
public String lastSubstring(String s) {
//应该截取的字符串的起始位置res = k
int k = 0;
char[] charArray = s.toCharArray();
int len = charArray.length;
//找到最大字符首先出现位置k
for (int i = 1; i < len; i++) {
if (charArray[i] > charArray[k]) {
k = i;
}
}
//从k开始找到与k相等的字符,比较字符所在位置之后的第一个字符大小
for (int i = k + 1; i < len; i++) {
//考虑 zaazzcc的情况,两个相同字符串z出现,取index最小
if (charArray[i] == charArray[k] && charArray[i] != charArray[i - 1]) {
for (int j = 1; k + j < i && i+j < len; j++) {
if (charArray[k + j] < charArray[i + j]) {
k = i;
break;
}
if (charArray[k + j] > charArray[i + j]) {
break;
}
}
}
}
return s.substring(k);
}
public static void main(String[] args) {
String str = "zzaazcc";
str = "abab";
str = "leetcode";
Solution solution = new Solution();
String res = solution.lastSubstring(str);
System.out.println(res);
}
}
LeetCode 第 150 场周赛的更多相关文章
- LeetCode 第 165 场周赛
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...
- LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)
5452. 判断能否形成等差数列 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...
- Leetcode 第137场周赛解题报告
今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...
- 【LeetCode第 313 场周赛】忘光光
比赛链接 最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了... 6192. 公因子的数目 题意: 给定 \(a\) 和 \(b\),问两者的公因子数量 数据范围:\(1\leq a,b\ ...
- Leetcode 第136场周赛解题报告
周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...
随机推荐
- php json_encode()函数返回对象和数组问题
php json_encode() 函数格式化数据时会根据不同的数组类型格式化不同类型的json数据 索引数组时 <?php $arr = [1,2,3,4,5]; print_r(json_e ...
- React Native 开发豆瓣评分(一)环境搭建&配置模拟器
详细可参考 官方文档,这里进记录一些重要过程. 安装环境 下载 Android Studio 选择 Custom 进行安装: Android SDK Android SDK Platform Perf ...
- How to change SAPABAP1 schema password In HANA
Symptom How to change SAPABAP1 schema password Environment HANA 1.x HANA 2.x Resolution Shutdown the ...
- [LeetCode] 137. 只出现一次的数字,其余三次 II ☆☆☆
描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输 ...
- AJAX中错误代码解释以及http中的错误代码解释
xmlhttp.readyState的值及含义: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...
- DB2新建编目及删除编目
场景:在添加一个新数据库的连接时,需要先建立此数据库的编目信息 新建: 1.获取数据库IP.端口.数据库名称 2.打开DB2客户端的“DB2命令窗口” 3.按以下命令执行 db2 catalog tc ...
- 软件测试_Loadrunner_性能测试_脚本优化_关联_手动关联
在写文章之前写一下自己的心路历程,录制脚本主要是上传图片并返回查询结果的过程.录制完脚本后发现函数中URl地址中有图片ID后台随机生成的32位随机数,并且每次上传图片id都会变化.我就上网搜索了一些解 ...
- AlexNet网络的Pytorch实现
1.文章原文地址 ImageNet Classification with Deep Convolutional Neural Networks 2.文章摘要 我们训练了一个大型的深度卷积神经网络用于 ...
- 配置Cisco网络设备
了解就行,不用记 电脑管理路由器软件 路由器显示命令: router#show run :显示配置信息 router#show interface :显示接口信息 router#show ip r ...
- 进程间的通信----队列queue
import multiprocessing def download_from_web(q): """下载数据""" # 模拟下载数据 d ...