LeetCode笔记:Weekly Contest 321

Posted Espresso Macchiato

tags:

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

1. 题目一

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

1. 解题思路

这一题思路其实也简单,显然在分割当中,只有pivot前后段都用到了,因此,只需要前面到pivot的累加求和的两倍刚好是总的累加求和加上pivot,那么这个值就是目标的pivot。

2. 代码实现

给出python代码实现如下:

class Solution:
    def pivotInteger(self, n: int) -> int:
        s = n * (n+1) // 2
        t = 0
        for i in range(1, n+1):
            t += i
            if t * 2 == s + i:
                return i
        return -1

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

2. 题目二

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

1. 解题思路

这一题就是贪婪法一个个去匹配t中的字符,直到遍历完s。

剩下的没有被匹配到的子串就是最后需要append到s末尾的子串。

2. 代码实现

给出python代码实现如下:

class Solution:
    def appendCharacters(self, s: str, t: str) -> int:
        i, n = 0, len(t)
        for ch in s:
            if i >= n:
                break
            if ch == t[i]:
                i += 1
        return n - i

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

3. 题目三

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

1. 解题思路

这一题我其实取巧了,我用了一个额外地数组来规避了链表复杂的删除操作。

但是这一题的思路本身确实很简单的,就是一个类有序数列的思路就是了,就不怎么多做展开了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def removeNodes(self, head: Optional[ListNode]) -> Optional[ListNode]:
        s = []
        while head:
            while s != [] and s[-1] < head.val:
                s.pop()
            s.append(head.val)
            head = head.next
        
        ret = ListNode(s[0])
        p = ret
        for v in s[1:]:
            node = ListNode(v)
            p.next = node
            p = node
        return ret

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

4. 题目四

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

1. 解题思路

这一题思路上其实也还好,虽然是一道hard的题目,就是先找到目标值k,然后要使得这个数为中位数,那么就要求:

  1. 这个子序列包含k;
  2. 这个子序列当中大于k的元素与小于k的元素数目最多差1,取决于这个数组长度是奇数还是偶数。

因此,我们只需要找到k的位置,然后分别往前后考察大于k与小于k的元素个数之差,要使得k恰好为中位数,那么这两者必为相反数或者相差一。

由此,我们就能够获得我们的最终答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        n = len(nums)
        idx = nums.index(k)
        if idx == -1:
            return 0
        left = defaultdict(list)
        right = defaultdict(list)
        d = 0
        left[d].append(idx)
        for i in range(idx-1, -1, -1):
            if nums[i] > k:
                d -= 1
            else:
                d += 1
            left[d].append(i)
        d = 0
        right[d].append(idx)
        for i in range(idx+1, n):
            if nums[i] > k:
                d += 1
            else:
                d -= 1
            right[d].append(i)
        
        res = 0
        for d in left:
            res += len(left[d]) * len(right[d])
            lodd = len([x for x in left[d] if x % 2 == 1])
            leven = len(left[d]) - lodd
            rodd = len([x for x in right[d+1] if x % 2 == 1])
            reven = len(right[d+1]) - rodd
            res += lodd * reven + leven * rodd
        return res

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

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314