leetcode 第168场周赛

5291. 统计位数为偶数的数字

给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。

范围比较小 只有三种位数,所以暴力统计

class Solution(object):
    def findNumbers(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        ans = 0
        chk = [10,1000,100000]
        for i in nums:
            for j in chk:
                tmp = i//j
                if tmp>=1 and tmp<=9:
                    ans+=1
                    break
        return ans

5292. 划分数组为连续数字的集合

给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合。
如果可以,请返回 True;否则,返回 False。

也是暴力统计的题目,可行集合必然可以分割,我们模拟分割的过程,如果不能分割说明集合不可行

class Solution(object):
    def isPossibleDivide(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: bool
        """
        if len(nums)%k != 0:
            return False
        mp = {}
        for i in nums:
            mp[i] = mp.get(i,0)+1
        keys = mp.keys()
        keys.sort()
        for i in keys:
            tmp = mp[i]
            if tmp:
                for j in range(i,i+k):
                    if mp.get(j,0)>=tmp:
                        mp[j]-=tmp
                    else:
                        return False
        for i in keys:
            if mp[i] != 0:
                return False
        return True

5293. 子串的最大出现次数

给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:

  • 子串中不同字母的数目必须小于等于 maxLetters 。
  • 子串的长度必须大于等于 minSize 且小于等于 maxSize 。

题意比较恶心,我的做法就是暴力统计,因为maxSize 只有26

class Solution(object):
    def maxFreq(self, s, maxLetters, minSize, maxSize):
        """
        :type s: str
        :type maxLetters: int
        :type minSize: int
        :type maxSize: int
        :rtype: int
        """
        ans = 0
        mp = {}
        for i in range(0,len(s)-minSize+1):
            cnt = [0]*300
            tmpcnt = 0
            tmpstr = ""
            for j in range(0,minSize-1): # i ~ i+minSize-2
                cnt[ord(s[i+j])]+=1
                if cnt[ord(s[i+j])] == 1:
                    tmpcnt+=1
                tmpstr += s[i+j]
            for j in range(minSize-1,maxSize):# i ~ i+maxSize-1
                if i+j>=len(s):
                    break
                cnt[ord(s[i+j])]+=1
                if cnt[ord(s[i+j])] == 1:
                    tmpcnt+=1
                tmpstr += s[i+j]
                if tmpcnt <= maxLetters:
                    mp[tmpstr] = mp.get(tmpstr,0)+1
                    ans = max(ans,mp[tmpstr])
                else:
                    break
        return ans

5294. 你能从盒子里获得的最大糖果数

给你 n 个盒子,每个盒子的格式为 [status, candies, keys, containedBoxes] ,其中:

  • 状态字 status[i]:整数,如果 box[i] 是开的,那么是 1 ,否则是 0 。
  • 糖果数 candies[i]: 整数,表示 box[i] 中糖果的数目。
  • 钥匙 keys[i]:数组,表示你打开 box[i] 后,可以得到一些盒子的钥匙,每个元素分别为该钥匙对应盒子的下标。
  • 内含的盒子 containedBoxes[i]:整数,表示放在 box[i] 里的盒子所对应的下标。
    给你一个 initialBoxes 数组,表示你现在得到的盒子,你可以获得里面的糖果,也可以用盒子里的钥匙打开新的盒子,还可以继续探索从这个盒子里找到的其他盒子。

请你按照上述规则,返回可以获得糖果的 最大数目 。

很显然可以搜索,从初始化的盒子集合开始处理,无法处理的就留着,打开的盒子就拿走糖果,获得新盒子和钥匙,然后再从现有盒子处理重复这个过程
特殊情况下,部分盒子没法打开,如果我们发现某次钥匙且盒子没有更新我们就不再继续处理

class Solution(object):
    def maxCandies(self, status, candies, keys, containedBoxes, initialBoxes):
        """
        :type status: List[int]
        :type candies: List[int]
        :type keys: List[List[int]]
        :type containedBoxes: List[List[int]]
        :type initialBoxes: List[int]
        :rtype: int
        """
        vis = [0]*1010
        def dfs(ownedboxs,ownedkeys):
            tmpans = 0
            if ownedboxs:
                mark = False
                tmpboxs = []
                for j in ownedboxs:
                    if vis[j]:
                        continue
                    if status[j] or j in ownedkeys:
                        vis[j] = 1
                        tmpans += candies[j]
                        ownedkeys.extend(keys[j])
                        tmpboxs.extend(containedBoxes[j])
                        mark = True
                    else:
                        tmpboxs.append(j)
                if mark:
                    return tmpans + dfs(tmpboxs,ownedkeys)
            return tmpans
        return dfs(initialBoxes,[])

你可能感兴趣的:(leetcode 第168场周赛)