美文网首页力扣算法刷题
Leetcode第253场周赛解题分享 第二题 java堆没学呢

Leetcode第253场周赛解题分享 第二题 java堆没学呢

作者: 清风Python | 来源:发表于2021-08-08 13:34 被阅读0次

    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;
        }
    }
    

    欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

    我的个人博客:https://qingfengpython.cn

    力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown

    相关文章

      网友评论

        本文标题:Leetcode第253场周赛解题分享 第二题 java堆没学呢

        本文链接:https://www.haomeiwen.com/subject/tbcovltx.html