LeetCode笔记:Weekly Contest 269

1. 题目一

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

1. 解题思路

这一题的解题思路还是比较直接的,就是按照题意先进行排序,然后直接找target所处的位置。

2. 代码实现

给出python代码实现如下:

class Solution:
    def targetIndices(self, nums: List[int], target: int) -> List[int]:
        nums = sorted(nums)
        return [i for i, x in enumerate(nums) if x == target]

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

2. 题目二

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

1. 解题思路

这一题的思路也非常的直接,就是维护一个窗口,然后计算其总和之后然后除以窗口长度即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def getAverages(self, nums: List[int], k: int) -> List[int]:
        n = len(nums)
        res = [-1 for _ in range(n)]
        if n < 2*k+1:
            return res
        tot = sum(nums[:2*k+1])
        for i in range(k, n-k):
            res[i] = tot // (2*k+1)
            if i != n-k-1:
                tot += nums[i + k+1] - nums[i-k]
        return res

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

3. 题目三

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

1. 解题思路

这一题反而简单了,由于元素是unique的,因此,我们只需要找到最大和最小元素的位置。

然后要把他们删除事实上就只有三种可能性,从左删,从右删或者是两头一起删,我们只需要比较三者中的最小值返回即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumDeletions(self, nums: List[int]) -> int:
        i = nums.index(max(nums))
        j = nums.index(min(nums))
        i, j = (i, j) if i <= j else (j, i)
        n = len(nums)
        return min(j+1, n-i, i+1+n-j)

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

4. 题目四

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

1. 解题思路

这题的主要思路就是一个DSU的变种,感觉也没啥好多说的……

而有关DSU的说明,网上已经够多了,我自己也写过一个博客(经典算法:并查集(DSU)结构简介),感觉也更加没啥好多说的了……

2. 代码实现

给出python代码实现如下:

class DSU:
    def __init__(self, flag):
        self.dsu = {flag: flag, 0: flag}
        self.flag = flag
        
    def add(self, val):
        if val not in self.dsu:
            self.dsu[val] = val
        
    def find(self, x):
        self.add(x)
        if self.dsu[x] != x:
            self.dsu[x] = self.find(self.dsu[x])
        return self.dsu[x]
    
    def union(self, x, y, known):
        x = self.find(x)
        y = self.find(y)
        if x in known:
            self.dsu[y] = x
        else:
            self.dsu[x] = y
        
class Solution:
    def findAllPeople(self, n: int, meetings: List[List[int]], firstPerson: int) -> List[int]:
        known = {firstPerson, 0}
        meetings = sorted(meetings, key=lambda x: x[2])
        
        i, m = 0, len(meetings)
        while i < m:
            j = i
            dsu = DSU(firstPerson)
            while j < m and meetings[j][2] == meetings[i][2]:
                dsu.union(meetings[j][0], meetings[j][1], known)
                j += 1
            for x in dsu.dsu:
                if dsu.find(x) in known:
                    known.add(x)
            i = j
        return list(known)           

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

KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值