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场周赛解题报告
周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...
随机推荐
- node中用的cookie-parser插件设置的max-age,和普通正常设置max-age的计算方式不一样
在cookie-parser中通过max-age设置的cookie的过期时间是按照毫秒计算的; 在普通设置的时候max-age后面的值是按秒计算的;
- mybatisplus 使用案例
案例地址 https://github.com/qixianchuan/SpringBootQD/tree/master/mybatisplus
- C++ 解决文件重复包含
// 如果zzz没有定义就定义zzz,然后执行下面的代码,定义了就不执行 #if !defined(zzz) #define zzz struct PPoint { int x; int y; }; ...
- 记一次渗透某XX站
0X00 前言 团队A师傅发来个站,问我有没有得搞 正好在搞其他的站,卡住了,开干换个思路. 0x01 信息收集 开burp抓了下包,目标设置了url重写,开了报错,我们随意输入一个控制器就直接报错. ...
- docker linux下配置加速器
[root@foundation83 ~]# cd /etc/docker/[root@foundation83 docker]# vim daemon.json{ "registry-mi ...
- springboot系列(九)springboot使用druid数据源
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...
- python之第一对象,函数名的应用,闭包
一.第一对象 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数, 还可以当做函数的返回值,这些特性就是第一类对象 ...
- mysql(单表查询,多表查询,MySQl创建用户和授权,可视化工具Navicat的使用)
单表查询 语法: 一.单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT ...
- Nginx虚拟主机配置--配置Nginx的主配置文件
单台Nginx WEB服务器同时会配置N个网站,也可称之为配置N个虚拟域名的主机,即多个域名对应同一个80端 口. 每个虚拟主机可以是一个独立网站.可以具有独立域名,同一台物理机上面的虚拟主机相互之间 ...
- find 查找文件的命令
find顾名思义就是查找,Linux下find命令提供相当多的查找条件,可以在众多文件或目录下查找你想要的任何文件或目录. 语法: find filename 我当前目录下有aaa.txt和bbb.t ...