LeetCode笔记:Weekly Contest 301

Posted Espresso Macchiato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 301相关的知识,希望对你有一定的参考价值。

1. 题目一

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

1. 解题思路

这一题其实仔细分析一下的话答案是比较明显的,就是总数的一半。

但是其中存在一个特例,就是如果某一个元素的个数大于总数的一半时,那么它就是答案。

因此,我们只需要取总数的一半与最大元素的两者较大值进行返回即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def fillCups(self, amount: List[int]) -> int:
        return max(max(amount), (sum(amount)+1) // 2)

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

2. 题目二

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

1. 解题思路

这一题其实也简单,只要每一次都确保当前的记录当中有数字且有序即可。

2. 代码实现

给出python代码实现如下:

class SmallestInfiniteSet:

    def __init__(self):
        self.nums = [i for i in range(1, 1001)]
        self.max_elem = 1000

    def popSmallest(self) -> int:
        if self.nums == []:
            self.nums = [i + self.max_elem for i in range(1, 1001)]
            self.max_elem += 1000
        return self.nums.pop(0)


    def addBack(self, num: int) -> None:
        while num > self.max_elem:
            self.nums.extend([i + self.max_elem for i in range(1, 1001)])
            self.max_elem += 1000
        idx = bisect.bisect_left(self.nums, num)
        if idx >= len(self.nums) or self.nums[idx] != num:
            self.nums.insert(idx, num)
        return

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

3. 题目三

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

1. 解题思路

这一题要想能够成功其实只需要满足如下三个条件即可:

  1. LR的数目两字符串相同;
  2. 对于任意一个位置,目标字符串左侧的L总是不少于起始字符串,同样的,目标字符串右侧的R也有总是不多于起始字符串;
  3. 对于任意一个对应的L,在两字符串的左侧总是有相同个数的R

2. 代码实现

给出python代码实现如下:

class Solution:
    def canChange(self, start: str, target: str) -> bool:
        cnt1, cnt2 = Counter(start), Counter(target)
        if cnt1["L"] != cnt2["L"] or cnt1["R"] != cnt2["R"]:
            return False
        
        lcnt, rcnt = 0, 0
        for ch1, ch2 in zip(start, target):
            if ch1 == "L":
                lcnt += 1
            elif ch1 == "R":
                rcnt +=1
            
            if ch2 == "L":
                lcnt -= 1
            elif ch2 == "R":
                rcnt -=1
            
            if lcnt > 0 or rcnt < 0:
                return False
        
        lr1, lr2 = [], []
        cnt1, cnt2 = 0, 0
        for ch1, ch2 in zip(start, target):
            if ch1 == "R":
                cnt1 += 1
            elif ch1 == "L":
                lr1.append(cnt1)
            
            if ch2 == "R":
                cnt2 += 1
            elif ch2 == "L":
                lr2.append(cnt2)
        
        return all(x == y for x, y in zip(lr1, lr2))

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

4. 题目四

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

这一题坦率地说挺伤人的,因为大佬们9分钟就能够搞定4道题,我却悲剧地做了一下午依然没有搞定,甚至说到最后跑去看大佬们的解答思路都没有看得太明白,真的挺伤的,唉……

如果有哪位读者大佬知道这题的思路的话,请务必在评论区告知一下,万分感谢!

以上是关于LeetCode笔记:Weekly Contest 301的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314