LeetCode笔记:Weekly Contest 316

1. 题目一

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

1. 解题思路

这一题思路很直白,就是看一下就没有时间的重叠即可,因此,我们只需要将时间转换为分钟,就可以直接用数值进行比较了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def haveConflict(self, event1: List[str], event2: List[str]) -> bool:
        
        def fn(t):
            h, m = t.split(":")
            return 60*int(h) + int(m)
        if fn(event1[0]) < fn(event2[0]):
            return fn(event2[0]) <= fn(event1[1])
        else:
            return fn(event1[0]) <= fn(event2[1]) 

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

2. 题目二

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

1. 解题思路

这一题我的思路还是非常暴力的,就是一个二重循环。

2. 代码实现

给出python代码实现如下:

class Solution:
    def subarrayGCD(self, nums: List[int], k: int) -> int:
        res = 0
        n = len(nums)
        
        for i in range(n):
            if nums[i] == k:
                res += 1
            s = nums[i]
            for j in range(i+1, n):
                s = gcd(nums[j], s)
                if s % k != 0:
                    break
                if s == k:
                    res += 1
        return res

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

3. 题目三

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

1. 解题思路

这一题思路上来说还是比较暴力地考察以每一个数作为目标值的情况下所需要的调整的cost,然后取出最小值。

于是问题就在于说当以每一个值作为目标值的情况下如何快速地计算出cost。

这个问题的话可以采用累积数组的方式来进行实现,具体来说,我们首先对于nums进行排序,当以nums[i]作为最终的target的情况下,其产生的cost当中来自于增加的那一部分等于之前变换到nums[i-1]为目标时的cost和对于之前所有数的单位cost之和变换nums[i] - nums[i-1]的增值。

同样的,我们也可以通过相同的方式求得cost当中来自于减少的部分带来的cost。两者相加,即是变换为nums[i]时所需的全部cost。

从中,我们取出最小值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minCost(self, nums: List[int], cost: List[int]) -> int:
        n = len(nums)
        ids = sorted(range(n), key=lambda x: nums[x])
        nums = [nums[i] for i in ids]
        cost = [cost[i] for i in ids]
        scost = list(accumulate(cost))
        
        increase = [0 for _ in range(n)]
        for i in range(1, n):
            increase[i] = increase[i-1] + scost[i-1] * (nums[i] - nums[i-1])
        
        decrease = [0 for _ in range(n)]
        for i in range(n-2, -1, -1):
            decrease[i] = decrease[i+1] + (scost[-1] - scost[i]) * (nums[i+1] - nums[i])
            
        return min(increase[i] + decrease[i] for i in range(n))

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

4. 题目四

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

1. 解题思路

这一题我自己没能搞定,看别人的思路倒是可以理解思路,但是思路的正确性上始终感觉存疑。

这里就简单介绍一下其他大佬们的思路。

大佬们的思路还是比较直接的,首先,由于变换的单位为2,因此奇偶性是不会因为变换而发生改变的,因此,我们只要分别考虑奇偶数序列的结果,然后把两个结果相加即可。

因此,我们只需要考虑只有比如只有偶数的情况下的变换数目即可。

这一个问题,大佬们的思路就非常的暴力,就是对原数组和目标数组进行排序,然后逐一对比考察,只考虑两边的向上加和或者向下加和的距离即可。认为是在题目的可实现性基础上,只要考虑向上加和就一定存在对应的构造实现方式可以实现对应的构造,但是这个问题我还是有点没想清楚。

2. 代码实现

给出python代码实现如下:

class Solution:
    def makeSimilar(self, nums: List[int], target: List[int]) -> int:
        odds1 = sorted([x for x in nums if x % 2 == 1])
        evens1 = sorted([x for x in nums if x % 2 == 0])
        
        odds2 = sorted([x for x in target if x % 2 == 1])
        evens2 = sorted([x for x in target if x % 2 == 0])
        
        def cnt(src, tgt):
            return sum(max(0, x-y) for x, y in zip(src, tgt)) // 2
        
        return cnt(odds1, odds2) + cnt(evens1, evens2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值