Leetcode第253场周赛解题分享 第二题 java堆没学呢,先空着...

简介: Leetcode第253场周赛解题分享 第二题 java堆没学呢,先空着...

5838.检查字符串是否为数组前缀


https://leetcode-cn.com/problems/check-if-string-is-a-prefix-of-array/

难度:简单


题目

给你一个字符串 s 和一个字符串数组 words ,请你判断 s 是否为 words 的 前缀字符串 。

字符串 s 要成为 words 的 前缀字符串 ,需要满足:s 可以由 words 中的前 k(k 为 正数 )个字符串按顺序相连得到,且 k 不超过 words.length 。

如果 s 是 words 的 前缀字符串 ,返回 true ;否则,返回 false 。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 20
  • 1 <= s.length <= 1000
  • words[i] 和 s 仅由小写英文字母组成


示例

示例 1:
输入:s = "iloveleetcode", words = ["i","love","leetcode","apples"]
输出:true
解释:
s 可以由 "i"、"love" 和 "leetcode" 相连得到。
示例 2:
输入:s = "iloveleetcode", words = ["apples","i","love","leetcode"]
输出:false
解释:
数组的前缀相连无法得到 s 。


分析

初始看错题目以为只要数组中的元素能构造出S即可,结果走了一边双端队列,自信提交错误。

结果发现想多了,只需要按照word顺序与s比较即可...是一道简单的字符串检索题目。

这里注意下,当拼接的长度已经比s的长度大,还不能构造s时,就无需再继续操作了,直接返回False节省时间


解题

class Solution:
    def isPrefixString(self, s, words):
        ret,lg = "",len(s)
        for i in words:
            ret += i
            if ret == s:
                return True
            elif len(ret) > lg:
                return False
        return False

class Solution {
    public boolean isPrefixString(String s, String[] words) {
        String comp = "";
        int lg = s.length();
        for (String i : words) {
            comp += i;
            if (comp.equals(s)) {
                return true;
            } else if (comp.length() > lg) {
                return false;
            }
        }
        return false;
    }
}


5839.移除石子使总数最小


https://leetcode-cn.com/problems/remove-stones-to-minimize-the-total/

难度:中等


题目

给你一个整数数组 piles ,数组 下标从 0 开始 ,其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k ,请你执行下述操作 恰好 k 次:

选出任一石子堆 piles[i] ,并从中 移除 floor(piles[i] / 2) 颗石子。

注意:你可以对 同一堆 石子多次执行此操作。

返回执行 k 次操作后,剩下石子的 最小 总数。

floor(x) 为 小于 或 等于 x 的 最大 整数。(即,对 x 向下取整)。

提示:

  • 1 <= piles.length <= 105
  • 1 <= piles[i] <= 104
  • 1 <= k <= 105


示例

示例 1:
输入:piles = [5,4,9], k = 2
输出:12
解释:可能的执行情景如下:
- 对第 2 堆石子执行移除操作,石子分布情况变成 [5,4,5] 。
- 对第 0 堆石子执行移除操作,石子分布情况变成 [3,4,5] 。
剩下石子的总数为 12 。
示例 2:
输入:piles = [4,3,6,7], k = 3
输出:12
解释:可能的执行情景如下:
- 对第 2 堆石子执行移除操作,石子分布情况变成 [4,3,3,7] 。
- 对第 3 堆石子执行移除操作,石子分布情况变成 [4,3,3,4] 。
- 对第 0 堆石子执行移除操作,石子分布情况变成 [2,3,3,4] 。
剩下石子的总数为 12 。


分析

这是一道基础的堆排序问题.

但由于python没有大根堆,需要将其转化为小根堆后再进行计算即可。

类似题目:


解题

import heapq
class Solution():
    def minStoneSum(self, piles, k):
        piles = [-i for i in piles]
        heapq.heapify(piles)
        while k:
            p = heapq.heappop(piles)
            heapq.heappush(piles, p + (-p // 2))
            k -= 1
        return -sum(piles)


5840.使字符串平衡的最小交换次数


https://leetcode-cn.com/problems/minimum-number-of-swaps-to-make-the-string-balanced/solution/5840shi-zi-fu-chuan-ping-heng-de-zui-xia-7mg5/

难度:中等


题目

给你一个字符串 s ,下标从 0 开始 ,且长度为偶数 n 。字符串 恰好 由 n / 2 个开括号 '[' 和 n / 2 个闭括号 ']' 组成。

只有能满足下述所有条件的字符串才能称为 平衡字符串 :

  • 字符串是一个空字符串,或者
  • 字符串可以记作 AB ,其中 A 和 B 都是 平衡字符串 ,或者
  • 字符串可以写成 [C] ,其中 C 是一个 平衡字符串 。

你可以交换 任意 两个下标所对应的括号 任意 次数。

返回使 s 变成 平衡字符串 所需要的 最小 交换次数。

提示:

  • n == s.length
  • 2 <= n <= 10^6
  • n 为偶数
  • s[i] 为'[' 或 ']'
  • 开括号 '[' 的数目为 n / 2 ,闭括号 ']' 的数目也是 n / 2


示例

示例 1:
输入:s = "][]["
输出:1
解释:交换下标 0 和下标 3 对应的括号,可以使字符串变成平衡字符串。
最终字符串变成 "[[]]" 。
示例 2:
输入:s = "]]][[["
输出:2
解释:执行下述操作可以使字符串变成平衡字符串:
- 交换下标 0 和下标 4 对应的括号,s = "[]][[]" 。
- 交换下标 1 和下标 5 对应的括号,s = "[[][]]" 。
最终字符串变成 "[[][]]" 。
示例 3:
输入:s = "[]"
输出:0
解释:这个字符串已经是平衡字符串。


分析

我们需要了解一个关键点,什么时候需要调整顺序:

  • 当循环s[i]点时,所有右括号的数量大于左括号时,才需要调整。
    知道了这点就可以轻松解题了!
  1. 循环字符串s
  2. 记录左括号l和有括号r的大小
  3. 当s[i]为左括号,l无脑+1
  4. 当s[i]为右括号,需要判断当前r是否大于等于l,
  • 如果r > l: l+1,同时ret+1
  • 否则r+1
  1. 最终返回ret


解题

class Solution:
    def minSwaps(self, s):
        ret = 0
        l = r = 0
        for i in s:
            if i == '[':
                l += 1
            else:
                if l <= r:
                    l += 1
                    ret += 1
                else:
                    r += 1
        return ret

class Solution {
    public int minSwaps(String s) {
        int l = 0;
        int r = 0;
        int ret = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '[') {
                l++;
            } else {
                if (l <= r) {
                    l++;
                    ret++;
                } else {
                    r++;
                }
            }
        }
        return ret;
    }
}




相关文章
|
3天前
|
算法 Java
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
[Java·算法·简单] LeetCode 27. 移除元素 详细解读
27 1
|
3天前
|
算法 Java C语言
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
C++和Java中的随机函数你玩明白了吗?内附LeetCode470.rand7()爆改rand10()巨详细题解,带你打败LeetCode%99选手
|
3天前
|
算法 Java
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
[Java·算法·简单] LeetCode 13. 罗马数字转整数 详细解读
25 0
|
3天前
|
算法 Java
[Java·算法·中等] LeetCode15. 三数之和
[Java·算法·中等] LeetCode15. 三数之和
35 0
|
3天前
|
存储
Leetcode第382场周赛
```markdown 给定字符串`s`,计算按键变更次数,即使用不同键的次数,不考虑大小写差异。例如,`&quot;aAbBcC&quot;`变更了2次。函数`countKeyChanges`实现此功能。另外,求满足特定模式子集最大元素数,`maximumLength`函数使用`TreeMap`统计次数,枚举并构建子集,返回最大长度。最后,Alice和Bob玩鲜花游戏,Alice要赢需满足鲜花总数奇数、顺时针在[1,n]、逆时针在[1,m],返回满足条件的(x, y)对数,可通过奇偶性分类讨论求解。 ```
13 1
|
3天前
|
存储
Leetcode第383场周赛
在LeetCode第383场周赛中,选手完成了3道题目。第一题是关于边界上的蚂蚁,蚂蚁根据非零整数数组nums的值移动,返回蚂蚁返回边界上的次数。解题方法是计算数组累加和为0的次数。第二题涉及计算网格的区域平均强度,给定一个灰度图像和阈值,返回每个像素所属区域的平均强度。解题关键在于理解相邻像素和区域定义,并计算平均强度。第三题是恢复单词初始状态的最短时间问题,通过移除前k个字符并添加k个字符,求恢复原词所需的最短时间。解题策略是检查去除前k个字符后的子串是否能作为原词的前缀。
12 1
Leetcode第383场周赛
|
3天前
|
存储 Java C++
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
leetcode 2525 根据规则将箱子分类 c++ pyhton java c题解
14 1
|
3天前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
27 0
|
3天前
|
算法 Java
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
[Java·算法·简单] LeetCode 14. 最长公共前缀 详细解读
22 0
|
3天前
|
算法 Java 索引
[Java·算法·简单] LeetCode 141. 环形链表 详细解读
[Java·算法·简单] LeetCode 141. 环形链表 详细解读
29 0

热门文章

最新文章