leetcode 第166场周赛

5279. 整数的各位积和之差

给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差
示例 1:

输入:n = 234
输出:15
解释:
各位数之积 = 2 * 3 * 4 = 24
各位数之和 = 2 + 3 + 4 = 9
结果 = 24 - 9 = 15
示例 2:

输入:n = 4421
输出:21
解释:
各位数之积 = 4 * 4 * 2 * 1 = 32
各位数之和 = 4 + 4 + 2 + 1 = 11
结果 = 32 - 11 = 21

直接取每一位之和和每一位之积求差值

class Solution(object):
    def subtractProductAndSum(self, n):
        """
        :type n: int
        :rtype: int
        """
        cnt = 0
        tmp = 1
        while n>0:
            tmp *= n%10;
            cnt += n%10
            n = n//10
        return tmp - cnt

5280. 用户分组

有 n 位用户参加活动,他们的 ID 从 0 到 n - 1,每位用户都 恰好 属于某一用户组。给你一个长度为 n 的数组 groupSizes,其中包含每位用户所处的用户组的大小,请你返回用户分组情况(存在的用户组以及每个组中用户的 ID)。

你可以任何顺序返回解决方案,ID 的顺序也不受限制。此外,题目给出的数据保证至少存在一种解决方案。

示例 1:

输入:groupSizes = [3,3,3,3,3,1,3]
输出:[[5],[0,1,2],[3,4,6]]
解释:
其他可能的解决方案有 [[2,1,6],[5],[0,4,3]] 和 [[5],[0,6,2],[4,3,1]]。
示例 2:

输入:groupSizes = [2,1,3,3,3,2]
输出:[[1],[0,5],[2,3,4]]

水题,相同的分在一组,如果满了另起一组

class Solution(object):
    def groupThePeople(self, groupSizes):
        """
        :type groupSizes: List[int]
        :rtype: List[List[int]]
        """
        n = len(groupSizes)
        ans = []
        for i in range(1,n+1):
            tmp = []
            now = 0
            for j in range(0,n):
                if groupSizes[j]==i:
                    tmp.append(j)
                    now += 1
                if now == i:
                    ans.append(tmp[:])
                    now = 0
                    tmp = []
        return ans

5281. 使结果不超过阈值的最小除数

给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。

请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。

每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。

题目保证一定有解。

题目保证有结果的情况下直接二分答案,判断是否成立

class Solution(object):
    def smallestDivisor(self, nums, threshold):
        """
        :type nums: List[int]
        :type threshold: int
        :rtype: int
        """
        def cnt(x):
            test = 0
            for i in nums:
                test += i//x
                if i%x != 0:
                    test+=1
            print x,test
            return test<=threshold
        l,r = 1,10**6+1
        while l<=r:
            mid = (l+r)//2
            if cnt(mid):
                r = mid-1
            else:
                l = mid+1
        return r+1

5282. 转化为全零矩阵的最少反转次数

给你一个 m x n 的二进制矩阵 mat。

每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。(注:相邻的两个单元格共享同一条边。)

请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 。

二进制矩阵的每一个格子要么是 0 要么是 1 。

全零矩阵是所有格子都为 0 的矩阵。

这道题深搜广搜都行,因为状态比较少,状态数最多只有,翻转点最多为9个.
但是要记忆化一下, mp[status] 代表从status->全零矩阵的距离.
最后没做出来 因为dis写错了... 方向居然搞错了...

class Solution(object):
    def minFlips(self, mat):
        def check(m):
            for arr in m:
                for i in arr:
                    if i:
                        return False
            return True
        mp = {}
        def hash(now):
            enc = 0
            for arr in now:
                for i in arr:
                    enc = enc*2+i
            return enc
        lx = len(mat)
        ly = len(mat[0])
        pos = []
        for i in range(lx):
            for j in range(ly):
                pos.append([i,j])
        dis = [[0,0],[0,1],[1,0],[-1,0],[0,-1]]
        limit = lx*ly+1
        def dfs(start,now):
            if check(now):
                return 0
            now_hash = hash(now)
            if now_hash in mp.keys():
                return mp[now_hash]
            mp[now_hash] = limit
            tmp = limit
            for i in range(start,lx*ly):
                x = pos[i][0]
                y = pos[i][1]
                for d in dis:
                    if x+d[0]>=0 and x+d[0]=0 and y+d[1]=0 and x+d[0]=0 and y+d[1]

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