MoonBoat - 每日一题 - python

3/17 - leetcode - 1963
1、遍历字符串,专注于右括号的匹配
2、遍历过程中,遇到右括号时有两种情况:
2.1、没有左括号匹配,这意味着必须要做出交换,以便腾出一个左括号给匹配到的右括号,则交换加入一个左括号,记作left += 1,答案也要加一,记作 ans += 1
2.2、存在左括号匹配,则直接匹配左括号,左括号减一,记作left - 1,不存在交换则答案不变
3、遍历过程中,遇到左括号只需要直接加一即可,记作 left += 1

class Solution:
    def minSwaps(self, s: str) -> int:
        n = len(s)
        ans = 0
        left = 0

        for i in range(n):
            if(s[i] == ']'):
                if(left == 0):
                    left += 1
                    ans += 1
                else:
                    left -= 1
            else:
                left += 1
        
        return ans

3/18 - leetcode - 2614
1、静态方法的调用
2、质数的判断 int(sqrt(num)) + 1 需要强制转换,因为sqrt返回的是浮点数

from math import sqrt
from typing import List

class Solution:
    @staticmethod
    def judge(num: int) -> bool:
        if num < 2:
            return False
        for i in range(2, int(sqrt(num)) + 1):
            if num % i == 0:
                return False
        return True

    def diagonalPrime(self, nums: List[List[int]]) -> int:
        n = len(nums)  # 预存矩阵大小,避免重复计算
        ans = 0
        for i in range(n):
            ans = max(ans, nums[i][i] if self.judge(nums[i][i]) else 0)
            ans = max(ans, nums[i][n - i - 1] if self.judge(nums[i][n - i - 1]) else 0)
        return ans


3/19 - leetcode - 2610
1、字典的创建与添加操作
2、 Python 不允许在遍历字典时直接删除元素
2.1、将字典的键单独提取转换为list【】对象
2.2、收集需要删除的字典,在循环外修改

class Solution:
    def findMatrix(self, nums: List[int]) -> List[List[int]]:
        ans = []
        dics = {}
        n = len(nums)

        for i in range(n):
            if nums[i] in dics.keys():
                dics[nums[i]] += 1
            else:
                dics.setdefault(nums[i], 1)

        while dics :
            a = []
            for key in list(dics.keys()):
                a.append(key)
                dics[key] -= 1
                if dics[key] == 0:
                    dics.pop(key)
            ans.append(a)
        return ans



3/21 - leetcode - 35
二分查找
1、左闭右闭:left = right存在意义
2、左闭右开“left = right不存在意义

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        # 左开又开区间
        n = len(nums)
        left = 0
        right = n - 1

        while left <= right:
            mid = left + (right - left) // 2

            if nums[mid] < target:
                left = mid + 1
            
            elif nums[mid] > target:
                right = mid - 1

            else:
                return mid

        return right + 1
        

3/22 - leetcode - 26 - 27
双指针算法

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0

        n = len(nums)

        fast = 1
        slow = 1

        while fast < n :
            if nums[fast] != nums[fast - 1]:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1

        return slow

3/24 - leetcode - 977
双指针算法(头尾双指针)

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        n = len(nums)

        left = 0
        right = n - 1
        ans = [ x*0 for x in range(n)]
        i = n - 1
        while left <= right :
            a = nums[left] ** 2
            b = nums[right] ** 2

            if a < b:
                ans[i] = b
                right -= 1
                i -= 1
            else:
                ans[i] = a
                left += 1
                i -= 1

        return ans