Leetcode-第154场周赛
1189.”气球”的最大数量
给你一个字符串 text
,你需要使用 text
中的字母来拼凑尽可能多的单词 “balloon”(气球)。
字符串 text
中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 **”balloon”**。
示例 1:
1 | 输入:text = "nlaebolko" |
示例 2:
1 | 输入:text = "loonbalxballpoon" |
示例 3:
1 | 输入:text = "leetcode" |
提示:
1 <= text.length <= 10^4
text
全部由小写英文字母组成
解法1:
简单题。
思路:
创建一个hash表来存各个字母的出现次数,找a,b,l/2,o/2,n的最小值
1 | class Solution { |
1190.反转每对括号间的子串
给出一个字符串 s
(仅含有小写英文字母和括号)。
请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。
注意,您的结果中 不应 包含任何括号。
示例 1:
1 | 输入:s = "(abcd)" |
示例 2:
1 | 输入:s = "(u(love)i)" |
示例 3:
1 | 输入:s = "(ed(et(oc))el)" |
示例 4:
1 | 输入:s = "a(bcdefghijkl(mno)p)q" |
提示:
0 <= s.length <= 2000
s
中只有小写英文字母和括号- 我们确保所有括号都是成对出现的
解法1:栈
思路:用栈存左括号出现位置,当遇见右括号时,翻转从栈顶值左括号到这个右括号的子串。
再遍历一遍字符串,将不是左右括号的字符挨个存入结果字符串。
1 | class Solution { |
1191.K次串联后最大子数组之和
给你一个整数数组 arr
和一个整数 k
。
首先,我们要对该数组进行修改,即把原数组 arr
重复 k
次。
举个例子,如果
arr = [1, 2]
且k = 3
,那么修改后的数组就是[1, 2, 1, 2, 1, 2]
。
然后,请你返回修改后的数组中的最大的子数组之和。
注意,子数组长度可以是 0
,在这种情况下它的总和也是 0
。
由于 结果可能会很大,所以需要 模(mod) 10^9 + 7
后再返回。
示例 1:
1 | 输入:arr = [1,2], k = 3 |
示例 2:
1 | 输入:arr = [1,-2,1], k = 5 |
示例 3:
1 | 输入:arr = [-1,-2], k = 7 |
提示:
1 <= arr.length <= 10^5
1 <= k <= 10^5
-10^4 <= arr[i] <= 10^4
解法1:前缀和,后缀和
先计算出arr数组的总和,然后分两种情况进行讨论
1.若sum>0&&k>2
这种情况我们可以求出arr数组的最大前缀和(即复制到最右边的数组应该取的值)和最大后缀和(即最左边数组应该取的值)因为中间每个arr的和sum>0所以我们肯定要加上每个sum。
2.
(1).若k>1,我们复制一次arr。
(2)找到arr这个数组的最大子序和即为所求结果。
注意:中间数字用int会溢出,所以我们用long long 存数组,最后结果mod10^9+7.
1 | class Solution { |
1192.查找集群内的「关键连接」
力扣数据中心有 n
台服务器,分别按从 0
到 n-1
的方式进行了编号。
它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群,其中连接 connections
是无向的。
从形式上讲,connections[i] = [a, b]
表示服务器 a
和 b
之间形成连接。任何服务器都可以直接或者间接地通过网络到达任何其他服务器。
「关键连接」是在该集群中的重要连接,也就是说,假如我们将它移除,便会导致某些服务器无法访问其他服务器。
请你以任意顺序返回该集群内的所有 「关键连接」。
示例 1:
1 | 输入:n = 4, connections = [[0,1],[1,2],[2,0],[1,3]] |
提示:
1 <= n <= 10^5
n-1 <= connections.length <= 10^5
connections[i][0] != connections[i][1]
- 不存在重复的连接
解法1:Tarjan算法
找到图中的割点问题。用Tarjan算法实现。
算法实现步骤:
1.定义dfn[i]数组表示dfs遍历时的i点的次序从1开始
2.定义low[i]数组表示i点不经过父节点能到达编号最小的点的数值
3.定义father[i]数组表示i点的父节点
4.遍历connections数组将每个边的两端记录下来。然后进行tarjan算法。
tarjan算法:
对每个点设置父节点,dfs遍历次序dfn[i]的值,默认low[i]值为dfs[i],对与i直接相连的点进行遍历,设为to,
(1)to为父节点跳过,
(2)dfn[to]==-1表示还未遍历,进行tarjan(to,i),然后low[i]在low[i]和low[to]选择一个最小值
(3)若已经遍历dfn[to] low[i]在low[i]和dfn[to]选择一个最小值
5.进行完tarjan算法,遍历所有点,判断父节点dfn[f]和low[i]关系,若low[i]>dfn[f]表示i点必须经过父节点f才能访问到f也就意味着(i,f)这条边是一个割边。
1 | class Solution { |