力扣算法刷题

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

2021-08-08  本文已影响0人  清风Python

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:
输入: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 = [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 个闭括号 ']' 组成。

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

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

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

提示:

示例

示例 1:
输入:s = "][]["
输出:1
解释:交换下标 0 和下标 3 对应的括号,可以使字符串变成平衡字符串。
最终字符串变成 "[[]]" 。

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

示例 3:
输入:s = "[]"
输出:0
解释:这个字符串已经是平衡字符串。

分析

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

  1. 循环字符串s
  2. 记录左括号l和有括号r的大小
  3. 当s[i]为左括号,l无脑+1
  4. 当s[i]为右括号,需要判断当前r是否大于等于l,
  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

上一篇下一篇

猜你喜欢

热点阅读