LeetCode笔记:Biweekly Contest 96

  • LeetCode笔记:Biweekly Contest 96
    • 1. 题目一
      • 1. 解题思路
      • 2. 代码实现
    • 2. 题目二
      • 1. 解题思路
      • 2. 代码实现
    • 3. 题目三
      • 1. 解题思路
      • 2. 代码实现
    • 4. 题目四
      • 1. 解题思路
      • 2. 代码实现
  • 比赛链接:https://leetcode.com/contest/biweekly-contest-96

1. 题目一

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

  • 2540. Minimum Common Value

1. 解题思路

这一题我偷了个懒,本来的话两个有序数列应该是考察的滑动指针,但是我算是取巧了吧,直接将一个数组换成了hash表,就可以快速查值了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def getCommon(self, nums1: List[int], nums2: List[int]) -> int:
        nums1 = set(nums1)
        for x in nums2:
            if x in nums1:
                return x
        return -1

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

2. 题目二

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

  • 2541. Minimum Operations to Make Array Equal II

1. 解题思路

这一题其实只要将两个数组进行对位比较即可,然后看一下正负所需的值是否相同。

另外需要注意的是,由于最小变化量是k,因此如果有两个对位的数字对k不同余,那么直接就必然不可变成相同数组。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minOperations(self, nums1: List[int], nums2: List[int], k: int) -> int:
        if k == 0:
            return 0 if all(x == y for x, y in zip(nums1, nums2)) else -1
        res, cnt = 0, 0
        for x, y in zip(nums1, nums2):
            if abs(x-y) % k != 0:
                return -1
            d = (y-x) // k
            cnt += d
            if d >= 0:
                res += d
        return res if cnt == 0 else -1

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

3. 题目三

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

  • 2542. Maximum Subsequence Score

1. 解题思路

这一题我的思路其实有点笨重,就是首先按照nums2进行倒序排序,然后考察每一个值作为最小值时取满足条件的最大的k个nums1中的数,然后计算出score,最后取出这些score当中的最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxScore(self, nums1: List[int], nums2: List[int], k: int) -> int:
        nums = [(x, y) for x, y in zip(nums1, nums2) if y != 0]
        nums = sorted(nums, key=lambda x: (x[1], x[0]), reverse=True)
        res, selected, s = 0, [], 0
        for x, y in nums:
            bisect.insort(selected, x)
            s += x
            if len(selected) > k:
                s -= selected.pop(0)
            if len(selected) == k:
                res = max(res, s * y)
        return res

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

4. 题目四

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

  • 2543. Check if Point Is Reachable

1. 解题思路

这一题坦率地说没想到什么好的思路,结果是看了答案搞定的,然后发现答案极其简单,简单到让我懵逼的地步,其实就是考察题中给出的四个操作,这四个操作都无法减小给出的两个目标值的最大公约数,因此,只需要对两个数全部除2直至变为奇数之后看一下两个数的最大公约数是否是1即可。

不过坦率地说,这里的必要性我能够理解,不过充分性我还没想清楚,不过大佬们就是这么干的,而且确实简单,就先把答案写上了,后面还得再想想这里的充分性的证明。

2. 代码实现

给出python代码实现如下:

class Solution:
    def isReachable(self, targetX: int, targetY: int) -> bool:
        while targetX % 2 == 0:
            targetX = targetX // 2
        while targetY % 2 == 0:
            targetY = targetY // 2
        _gcd = gcd(targetX, targetY)
        return _gcd == 1

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

你可能感兴趣的:(leetcode笔记,双周赛,96,leetcode,2540,leetcode,2541,leetcode,2542,leetcode,2543)