情人节打卡

算法-刘子函 2024-02-14 15:19:05

LC.384

T1.修改矩阵

class Solution:
    def modifiedMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
        m,n = len(matrix),len(matrix[0])
        maxi = [0]*n
        for i in range(n):
            for j in range(m):
                maxi[i] = max(maxi[i],matrix[j][i])
        
        for i in range(n):
            for j in range(m):
                if matrix[j][i] == -1:
                    matrix[j][i] = maxi[i]
        return matrix

T2.匹配模式数组的子数组个数

暴力

class Solution:
    def countMatchingSubarrays(self, nums: List[int], pattern: List[int]) -> int:
        n,m = len(nums),len(pattern)
        res = 0
        for i in range(n-m):
            cnt = 0
            flag = True
            for j in range(i,i+m):
                if not flag:
                    break
                if pattern[cnt] == 1 and nums[j+1] <= nums[j]:
                    flag = False
                if pattern[cnt] == 0 and nums[j+1] != nums[j]:
                    flag = False
                if pattern[cnt] == -1 and nums[j+1] >= nums[j]:
                    flag = False
                cnt += 1
            if flag:
                res += 1
        return res

T3.回文字符串最大数目

首先哈希统计不同字符出现频数,同时记录奇数长度的字符串个数

关于回文字符串,考虑其组成特性:

如果有若干个出现过多次的字符,且它们的出现个数都是偶数,那么它们一定能够重新组合成n个回文字符串。于是可以把题目条件转化为该条件再进行讨论。利用贪心思想。

对于出现频数不为偶数的字符,抽出其中一个放入长度为奇数字符串的中间位置,这是在不影响字符串为回文串的前提下代价最小的方案一。

若方案一仍然无法使全部字符出现次数均为偶数,那么在此基础上采取方案二:按照方案一的方法抽出字符,放入最长的字符串中,最长的字符串用完后用第二长的,以此类推,每用一个字符串将初始答案n减去1,当全部字符出现次数均为偶数时返回答案。

class Solution:
    def maxPalindromesAfterOperations(self, words: List[str]) -> int:
        group = defaultdict(int)
        cnt = 0#奇数字符串数量
        for word in words:
            cnt += len(word)%2
            for c in word:
                group[c] += 1
        s = 0
        words.sort(key = lambda x:-len(x))
        for i,v in group.items():
            if v%2:
                s += 1
                group[i] = v-1
        n = len(words)
        if s <= cnt:
            return n
        left = [len(x) for x in words]
        for i in range(n-1,-1,-1):
            if left[i]%2:
                left[i] -= 1
                s -= 1
        i = 0
        while s > 0:
            s -= left[i]
            i += 1
        return n-i

 

...全文
164 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

325

社区成员

发帖
与我相关
我的任务
社区描述
一个供Leaders学习交流的地方
c++javapython 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • 叫我胡萝北
  • CheungZzzc
  • szu_gexu
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧