LeetCode笔记:Weekly Contest 344

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题只需要分别从左到右以及从右到左count一下distinct的元素个数即可,然后将两者相减即是我们所需的答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def distinctDifferenceArray(self, nums: List[int]) -> List[int]:
        pre, post = [], []
        elems = set()
        for i in nums:
            elems.add(i)
            pre.append(len(elems))
        elems = set()
        for i in nums[::-1]:
            post.insert(0, len(elems))
            elems.add(i)
        return [x-y for x, y in zip(pre, post)]

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

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题的思路同样比较直接,我们只需要记录一下当前各个元素的个数,然后用一个有序数组来记录一下当前存在的frequency即可。

2. 代码实现

给出python代码实现如下:

class FrequencyTracker:

    def __init__(self):
        self.cnt = defaultdict(int)
        self.freq = []

    def add(self, number: int) -> None:
        if self.cnt[number] != 0:
            self.freq.pop(bisect.bisect_left(self.freq, self.cnt[number]))
        self.cnt[number] += 1
        bisect.insort(self.freq, self.cnt[number])
        return

    def deleteOne(self, number: int) -> None:
        if self.cnt[number] == 0:
            return 
        self.freq.pop(bisect.bisect_left(self.freq, self.cnt[number]))
        self.cnt[number] -= 1
        if self.cnt[number] != 0:
            bisect.insort(self.freq, self.cnt[number])
        return

    def hasFrequency(self, frequency: int) -> bool:
        idx = bisect.bisect_left(self.freq, frequency)
        return idx < len(self.freq) and self.freq[idx] == frequency

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

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题思路其实也比较单纯,因此我们每次改动一个位置,只会影响其前后两个位置的情形,因此,我们只需要对其变动情况进行一下考察即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def colorTheArray(self, n: int, queries: List[List[int]]) -> List[int]:
        colors = [0 for _ in range(n)]
        
        def is_same_color(i, j):
            if i < 0 or i >= n or j < 0 or j >= n:
                return False
            if colors[i] == 0 or colors[j] == 0:
                return False
            return colors[i] == colors[j]
        
        cnt = 0
        res = [0 for _ in queries]
        for i, (idx, color) in enumerate(queries):
            if is_same_color(idx, idx-1):
                cnt -= 1
            if is_same_color(idx, idx+1):
                cnt -= 1
            colors[idx] = color
            if is_same_color(idx, idx-1):
                cnt += 1
            if is_same_color(idx, idx+1):
                cnt += 1
            res[i] = cnt
        return res

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

4. 题目四

给出题目四的试题链接如下:

1. 解题思路

这一题我们只需要自下而上做一次遍历即可。

显然,对于每一个节点,其左子树和右子树在调整之后的路径和如果还存在和的差,那么我们就必须在少的那一侧加上他们的差值,确保两条子路径的长度相同,而后这个路径加上当前节点的cost就是整条路径的cost。

我们遍历一下即可得到所需加上的最小的cost。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minIncrements(self, n: int, cost: List[int]) -> int:
        res = 0
        
        def dfs(idx):
            nonlocal res
            if idx >= n:
                return 0
            left = dfs(2*idx+1)
            right = dfs(2*idx+2)
            res += abs(left - right)
            return cost[idx] + max(left, right)
        
        dfs(0)
        return res

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值