[力扣] 第90场双周赛 回顾

P1: 差值数组不同的字符串

给你一个字符串数组 words ,每一个字符串长度都相同,令所有字符串的长度都为 n 。

每个字符串 w o r d s [ i ] words[i] words[i] 可以被转化为一个长度为 n − 1 n - 1 n1 的 差值整数数组 d i f f e r e n c e [ i ] difference[i] difference[i]
其中对于 0 ≤ j ≤ n − 2 0 \le j\le n - 2 0jn2 d i f f e r e n c e [ i ] [ j ] = w o r d s [ i ] [ j + 1 ] − w o r d s [ i ] [ j ] difference[i][j] = words[i][j+1] - words[i][j] difference[i][j]=words[i][j+1]words[i][j]

注意:
两个字母的差值定义为它们在字母表中 位置 之差,也就是说 ‘a’ 的位置是 0 ,‘b’ 的位置是 1 ,‘z’ 的位置是 25 。

比方说,字符串 “acb” 的差值整数数组是 [2 - 0, 1 - 2] = [2, -1] 。
words 中所有字符串 除了一个字符串以外 ,其他字符串的差值整数数组都相同。你需要找到那个不同的字符串。

请你返回 words中 差值整数数组 不同的字符串。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/odd-string-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:

  1. 送分题,按照题意翻译成代码就可以了。

P2. 距离字典两次编辑以内的单词

给你两个字符串数组 queries 和 dictionary 。数组中所有单词都只包含小写英文字母,且长度都相同。

一次 编辑 中,你可以从 queries 中选择一个单词,将任意一个字母修改成任何其他字母。从 queries 中找到所有满足以下条件的字符串:不超过 两次编辑内,字符串与 dictionary 中某个字符串相同。

请你返回 queries 中的单词列表,这些单词距离 dictionary 中的单词 编辑次数 不超过 两次 。单词返回的顺序需要与 queries 中原本顺序相同。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/words-within-two-edits-of-dictionary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解:

  1. 看数据范围三个维度都是100以内, 直接暴力解.

P3 摧毁一系列目标

给你一个下标从 0 开始的数组 nums ,它包含若干正整数,表示数轴上你需要摧毁的目标所在的位置。同时给你一个整数 space 。

你有一台机器可以摧毁目标。给机器 输入 nums[i] ,这台机器会摧毁所有位置在 nums[i] + c * space 的目标,其中 c 是任意非负整数。你想摧毁 nums 中 尽可能多 的目标。

请你返回在摧毁数目最多的前提下,nums[i] 的 最小值 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/destroy-sequential-targets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:

  1. 数学题。 取模分组, 找出数量最多的组,可能多个组都有相同数量,这时候取最小值。
class Solution:
    def destroyTargets(self, nums: List[int], space: int) -> int:
        c = collections.Counter(list(map(lambda x: x % space, nums)))
        m = max(c.values())
        cs = [k for k, v in c.items() if v == m]
        s = set(cs)
        ret = 10 ** 9
        for x in nums:
            if (x % space) in s: 
                ret = min(ret, x)
        return ret

P4 下一个更大元素 IV

给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。

如果 nums[j] 满足以下条件,那么我们称它为 nums[i] 的 第二大 整数:

j > i
nums[j] > nums[i]
恰好存在 一个 k 满足 i < k < j 且 nums[k] > nums[i] 。
如果不存在 nums[j] ,那么第二大整数为 -1 。

比方说,数组 [1, 2, 4, 3] 中,1 的第二大整数是 4 ,2 的第二大整数是 3 ,3 和 4 的第二大整数是 -1 。
请你返回一个整数数组 answer ,其中 answer[i]是 nums[i] 的第二大整数

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/next-greater-element-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解:

  1. 处理下一个最大的元素,可以用单调栈。 这题是要第二个大的。那就先用单调栈,然后弹出的时候,把元素放最小堆。
  2. 具体操作就是,遇到一个新元素,先检查堆顶元素,直到没有比新元素小的。然后进单调栈。
import bisect
class Solution:
    def secondGreaterElement(self, nums: List[int]) -> List[int]:
        n = len(nums)
        stack = []
        A = [-1 for _ in range(n)]
        sa = []
        for i, x in enumerate(nums):
            while sa and x > sa[0][0]:
                A[sa[0][1]] = i
                del sa[0]
            while stack and x > stack[-1][1]:
                j, y = stack.pop()
                bisect.insort(sa, (y, j))
            stack.append((i, x))    
        return [nums[x]if x != -1 else -1 for x in A]
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值