第一场力扣周赛(339场周赛)
写在前面
第一场参加力扣周赛,还是比较好奇和兴奋的,不过我是看别人做我才做的,可能开始的时候已经过了一二十分钟了,但是总体还好,做出来了三道题,题目和代码如下
6362.最长平衡子字符串
题目:
思路:
有点类似于最长回文子串,我们直接从i开始遍历左右如果左边i的位置是0,右边j的位置是0就让i–,j++
代码:
func findTheLongestBalancedSubstring(s string) int {
res := 0
n := len(s)
for i := 1; i < n; i++ {
res = max(res, dfs(s, i-1, i))
}
return res
}
func dfs(a string, i, j int) int {
for i >= 0 && j < len(a) && a[i] == '0' && a[j] == '1' {
i--
j++
}
return j - i - 1
}
func max(i, j int) int {
if i > j {
return i
}
return j
}
6363.转换二维数组
题目:
思路:
先排序,然因为要求每一行都有不重复的,所以统计出最多的那个元素的个数,每一行都必须有那个元素,然后其他随意排就行了,注意:如果使用元素之后元素size要–
代码:
func findMatrix(nums []int) [][]int {
temp := make([]int, 210)
n := len(nums)
for i := 1; i <= n; i++ {
temp[nums[i-1]]++
}
count := 0
for i := 1; i <= n; i++ {
count = max(count, temp[i])
}
res := [][]int{}
for count > 0 {
t := []int{}
for i := 1; i <= n; i++ {
if temp[i] != 0 {
t = append(t, i)
temp[i]--
}
}
res = append(res, t)
count--
}
return res
}
func max(i, j int) int {
if i > j {
return i
}
return j
}
6364.老鼠和奶酪
题目:
思路:
因为要恰好吃掉k块奶酪,所以我们希望取出reward1[i]-reward2[i]最大的前k个数,其他数则按原样输出
代码:
func miceAndCheese(reward1 []int, reward2 []int, k int) int {
res := 0
n1 := len(reward1)
n2 := len(reward2)
if k == 0 {
for i := 0; i < n2; i++ {
res += reward2[i]
}
return res
} else if k == n2 {
for i := 0; i < n1; i++ {
res += reward1[i]
}
return res
}
dif := make([]int, n1)
for i := 0; i < n1; i++ {
dif[i] = reward1[i] - reward2[i]
}
for i := 0; i < n1; i++ {
min := 0
if reward1[i] < reward2[i] {
min = reward1[i]
} else {
min = reward2[i]
}
res += min
}
//记录下标
sort.Ints(dif)
for i := 0; i < n1; i++ {
if i < n1-k {
if dif[i] > 0 {
dif[i] = 0
}
res += -dif[i]
} else {
if dif[i] < 0 {
dif[i] = 0
}
res += dif[i]
}
}
return res
}