Leetcode 3321. Find X-Sum of All K-Long Subarrays II

  • [Leetcode 3321. Find X-Sum of All K-Long Subarrays II](#Leetcode 3321. Find X-Sum of All K-Long Subarrays II)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题同样虽然是一道hard的题目,但也是比较常规的,就是通过一个滑动窗口不断地维护当前长度为k的滑动窗口内所有数字的出现次数,进而维护一个按照出现次数和大小从大到小排列的数组,最后使用这个数组维护top x的频次的数字的总和即可。

2. 代码实现

给出python代码实现如下:

python 复制代码
class Solution:
    def findXSum(self, nums: List[int], k: int, x: int) -> List[int]:
        n = len(nums)
        cnt = Counter(nums[:k])
        q = sorted([(-v, -k) for k, v in cnt.items()])
        s = sum(it[0] * it[1] for it in q[:x])

        ans = [s]
        for i in range(k, n):
            key, val = nums[i-k], cnt[nums[i-k]]
            idx = bisect.bisect_left(q, (-val, -key))
            q.pop(idx)
            if idx < x:
                s -= val * key
                if x <= len(q):
                    s += q[x-1][0] * q[x-1][1]

            cnt[key] -= 1
            if cnt[key] > 0:
                bisect.insort(q, (-val+1, -key))
                nidx = bisect.bisect_left(q, (-val+1, -key))
                if nidx < x:
                    s += key * (val-1)
                    if x < len(q):
                        s -= q[x][0] * q[x][1]

            key, val = nums[i], cnt[nums[i]]
            cnt[key] += 1
            if val == 0:
                bisect.insort(q, (-val-1, -key))
                idx = bisect.bisect_left(q, (-val-1, -key))
                if idx < x:
                    s += (val+1) * key
                    if x < len(q):
                        s -= q[x][0] * q[x][1]
            else:
                idx = bisect.bisect_left(q, (-val, -key))
                q.pop(idx)
                if idx < x:
                    s -= val * key
                    if x <= len(q):
                        s += q[x-1][0] * q[x-1][1]

                bisect.insort(q, (-val-1, -key))
                idx = bisect.bisect_left(q, (-val-1, -key))
                if idx < x:
                    s += (val+1) * key
                    if x < len(q):
                        s -= q[x][0] * q[x][1]

            ans.append(s)
        return ans

提交代码评测得到:耗时3055ms,占用内存42.3MB。

相关推荐
All for pursuit.5 小时前
【二叉树-10】114.二叉树展开为链表
数据结构·c++·算法·leetcode·链表
旖旎夜光6 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
CoderYanger6 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
圣保罗的大教堂6 天前
leetcode 3524. 求出数组的 X 值 I 中等
leetcode
Tim_106 天前
【LeetCode】338、比特位计数
c++·算法·leetcode
mmmmath_36 天前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
Navigator_Z6 天前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
All for pursuit.6 天前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
开开心心就好6 天前
安卓手写文字生成工具,多种纸张一直免费
网络·网络协议·tcp/ip·leetcode·智能手机·电脑·模拟退火算法
All for pursuit.6 天前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode