估计要刷很久才能突破三道题了。还是刷的太少。尽管对了前两题,但是我觉得写的不怎么样。还是将所有题目都写一下吧。


5189. “气球” 的最大数量

题目比较简单。就是找出一个字符串中,balloon 中每个字母出现的次数,次数最小的就是结果。注意,lo 要除以 2。

定义一个数组统计每个字母的个数。

int[] count = new int[26];// 统计每个字母的个数

时间复杂度:只有一个循环,故为 O(n)O(n)O(n)。

空间复杂度:只有一个一维数组大小恒为 26,故为 O(1)O(1)O(1)。

代码如下:
class Solution {
public int maxNumberOfBalloons(String text) {
char[] arr = text.toCharArray(); int[] count = new int[26];// 统计每个字母的个数
for (char ch : arr) {
++count[ch - 'a'];// 字母ch个数加1
} int ans = 10001;
ans = Math.min(ans, count['b' - 'a']);
ans = Math.min(ans, count['a' - 'a']);
ans = Math.min(ans, count['l' - 'a'] >> 1);
ans = Math.min(ans, count['o' - 'a'] >> 1);
ans = Math.min(ans, count['n' - 'a']);
return ans;
}
}
提交结果:


5190. 反转每对括号间的子串

基本思路:找一对括号,将之间的字符串反转,再和括号外边的字符串重新组合成一个字符串赋给 s,如果找不到括号,说明结束,返回 s 即可。上述过程循环。

方法 int[] find(String s) 查找字符串 s 中的括号,返回左括号和右括号下标,如果未找到,则返回的数组的值为 -1。

找到括号,就将字符串分成三段,括号左边,括号之间,括号右边。将之间的反转后,重组成字符串赋给 s。直到未找到括号为止。

时间复杂度: Emmm,还不会算这个的时间复杂度。。。

空间复杂度: 与字符串长度无关,O(1)O(1)O(1)。

代码如下:
class Solution {
public String reverseParentheses(String s) {
int[] index = find(s);// 查找括号
while (index[0] != -1) {// 若有括号,循环反转括号内字符串
// 左括号左边的内容
String outLeft = s.substring(0, index[0]);
// 反转前括号之间的内容
String inBefore = s.substring(index[0] + 1, index[1]);
// 反转后括号之间的内容
StringBuilder sb = new StringBuilder(inBefore);
String inAfter = sb.reverse().toString();
// 右括号右边的内容
String outRight = s.substring(index[1] + 1, s.length());
// 重组字符串s,由三部分组成
s = outLeft + inAfter + outRight;
index = find(s);// 查找括号
}
return s;// 返回结果
} // 查找括号
// 若未找到,数组的值为-1
// 若找到,index[0]为左括号下标,index[1]为右括号下标
private int[] find(String s) {
char[] arr = s.toCharArray();
int[] index = new int[2];
index[0] = index[1] = -1;
for (int i = 0; i < arr.length; ++i) {
if (arr[i] == '(') {
index[0] = i;
} else if (arr[i] == ')') {
index[1] = i;
break;// 找到右括号,退出循环
}
}
return index;
}
}
提交结果:


1191. K 次串联后最大子数组之和

基本思路:k 次修改其实就是 k 个数组 arr 首尾相连,当 k 小于 2 的时候,我们只需要找到数组 arr 的最大子序列就行,当 k 大于等于 2 时,我们将两端的 arr 连起来,中间的是 k - 2 个数组 arr 的和是固定的为 (k - 2) × sumArr,其中 sumArr 表示数组 arr 的和。

因此问题就变成两组 arr 拼接起来的最大子序列问题。

第 1 个循环是计算从第 1 个数到第 i 个数的和。

第 2 个循环是计算从第 1 个数到第 i 个数的和的最大值。

第 3 个循环是计算从最后一个数到从后往前数的第 i 个数的和的最大值。(与第 2 个循环意思一样,只不过是从后往前而已)

第 4 个循环是计算数组 arr 的子序列的和的最大值。

然后取相应的最大值即可。

时间复杂度: 只有一层循环,O(n)O(n)O(n)。

空间复杂度: 一维数组,O(n)O(n)O(n)。

代码如下:
class Solution {
public int kConcatenationMaxSum(int[] arr,
int k) {
int n = arr.length; int[] sumpi = new int[n + 1];// 前(pre)i个数的和(sum)
for (int i = 0; i < n; ++i) {
sumpi[i + 1] = sumpi[i] + arr[i];
} int maxsumpi = 0;// 前i个数的和的最大值,全为负数则最大值为0
for (int i = 1; i <= n; ++i) {
maxsumpi = Math.max(maxsumpi, sumpi[i]);
} int maxsumri = 0;// 后(n-i)个数的和的最大值,全为负数则最大值为0
for (int i = n; i >= 0; --i) {
// sumpi[n]表示前n个数的和,即所有数的和
maxsumri = Math.max(maxsumri, sumpi[n] - sumpi[i]);
} // 后面j个数的最大值和前面i个数的最大值的和
int maxsumpr = maxsumpi + maxsumri; int maxsubsum = 0;// 最大子序列的和
int minsumpi = 0;// 前i个数的和的最小值
for (int i = 1; i <= n; ++i) {
maxsubsum = Math.max(maxsubsum, sumpi[i] - minsumpi);
minsumpi = Math.min(minsumpi, sumpi[i]);
} // 10^(5+5+4)=10^14,超过int(10^10)范围,但是未超过long(10^18)范围
long maxsum = maxsubsum;
if (k >= 2) {// 重复
// 则取子序列最大值和拼接序列的最大值中的较大者
maxsum = Math.max(maxsum, maxsumpr);
}
if (k >= 2) {
// 取两组的最大值和全部的最大值中的较大者
maxsum = Math.max(maxsum, maxsumpr + (long) (k - 2) * sumpi[n]);
} return (int) (maxsum % 1000000007);// 取模
}
}
提交结果:

LeetCode第154场周赛(Java)的更多相关文章

  1. LeetCode 第 154 场周赛

    一."气球" 的最大数量(LeetCode-5189) 1.1 题目描述 1.2 解题思路 统计各个字母的出现的次数,然后根据"木桶最短板"返回就好. 1.3 ...

  2. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  3. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  4. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  5. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  6. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  7. LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)

    5452. 判断能否形成等差数列   给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...

  8. Leetcode 第137场周赛解题报告

    今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...

  9. LeetCode 第 153 场周赛

    一.公交站间的距离(LeetCode-5181) 1.1 题目描述 1.2 解题思路 比较简单的一题,顺时针.逆时针两次遍历,就能解决. 1.3 解题代码 class Solution { publi ...

随机推荐

  1. 小胖的奇偶(Viojs1112)题解

    原题: 题目描述 huyichen和xuzhenyi在玩一个游戏:他写一个由0和1组成的序列. huyichen选其中的一段(比如第3位到第5位),问他这段里面有奇数个1 还是偶数个1.xuzheny ...

  2. JAVA基础--MySQL(二)

     数据库约束 1.基础限制 ① 单一表内字节量总和不能超过65535,null 占用一个字节空间 ② varchar存储255 以内字节占用一个字节表示长度,255以上自己则占用两个字节表示长度 ③ ...

  3. 机器学习之决策树原理和sklearn实践

    1. 场景描述 时间:早上八点,地点:婚介所 '闺女,我有给你找了个合适的对象,今天要不要见一面?' '多大?' '26岁' '长的帅吗?' '还可以,不算太帅' '工资高吗?' '略高于平均水平' ...

  4. Tecplot——为动画添加求解时间(翻译)

    翻译自:<Tecplot 360 Getting Started Manual>中的Scenic Detour: Add Solution Time Caption 首先展示效果: 在画图 ...

  5. 解决wordpress修改固定链接后出现404错误不能访问文章的方法

    首先,建议大家安装完wordpress网站程序之后第一时间设置一下固定链接,避免以后修改出错.在wp后台仪表盘左侧导航里找到“设置——固定链接”即可配置你的wordpress固定链接,通常我习惯使用的 ...

  6. 【MonkeyRunner】[技术博客]用python编写脚本查看设备信息

    [MonkeyRunner]用python编写脚本查看设备信息 原以为是个简单的操作,在实践的时候发现了一些问题. python脚本 test.py: from com.android.monkeyr ...

  7. Unity制作出《超级马里奥》的2D和3D混合效果

    现在来做点别的东西.Nintendo Switch上刚推出的<超级马里奥>中,有一些关卡混合了2D和3D的画面,这种效果十分让人印象深刻.如何在Unity中实现这个效果呢? 正常情况下,摄 ...

  8. java join()基本用法与说明解释

    join()方法的作用,是等待这个线程结束: 也就是说,t.join()方法阻塞调用此方法的线程(calling thread)进入 TIMED_WAITING 状态,直到线程t完成,此线程再继续: ...

  9. 超实用!手把手教你如何用MSF进行后渗透测试!

    在对目标进行渗透测试的时候,通常情况下,我们首先获得的是一台web服务器的webshell或者反弹shell,如果权限比较低,则需要进行权限提升:后续需要对系统进行全面的分析,搞清楚系统的用途:如果目 ...

  10. Anaconda用conda创建python虚拟环境

    Anaconda用conda创建python虚拟环境 一.简介 conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理.包管理与pip的使用类似,环境管理则允许用户方便地安装不 ...