【力扣】第224场周赛
1 可以形成最大正方形的矩形数目
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-rectangles-that-can-form-the-largest-square
给你一个数组 rectangles ,其中 rectangles[i] = [$l_i$, $w_i$] 表示第 i 个矩形的长度为$l_i$ 、宽度为$w_i$ 。
如果存在 k 同时满足 $k <= l_i$ 和 $k <= w_i$ ,就可以将第 i 个矩形切成边长为 k 的正方形。例如,矩形 [4,6] 可以切成边长最大为 4 的正方形。
设 maxLen 为可以从矩形数组 rectangles 切分得到的 最大正方形 的边长。
返回可以切出边长为 maxLen 的正方形的矩形 数目 。
示例 1:
输入:rectangles = [[5,8],[3,9],[5,12],[16,5]]
输出:3
解释:能从每个矩形中切出的最大正方形边长分别是 [5,3,5,5] 。
最大正方形的边长为 5 ,可以由 3 个矩形切分得到。
示例 2:
输入:rectangles = [[2,3],[3,7],[4,3],[3,7]]
输出:3
第一题比较简单,主要是字典的灵活使用,
1 class Solution: 2 def countGoodRectangles(self, rectangles: List[List[int]]) -> int: 3 a = {} 4 for l,r in rectangles: 5 k = min(l,r) 6 a.setdefault(k,0) 7 a[k] += 1 8 return a.get(max(a.keys()))
2 同积元组:
给你一个由 不同 正整数组成的数组 nums ,请你返回满足 a * b = c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素,且 a != b != c != d 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/tuple-with-same-product
示例 1:
输入:nums = [2,3,4,6]
输出:8
解释:存在 8 个满足题意的元组:
(2,6,3,4) , (2,6,4,3) , (6,2,3,4) , (6,2,4,3)
(3,4,2,6) , (4,3,2,6) , (3,4,6,2) , (4,3,6,2)
示例 2:
输入:nums = [1,2,4,5,10]
输出:16
解释:存在 16 个满足题意的元组:
(1,10,2,5) , (1,10,5,2) , (10,1,2,5) , (10,1,5,2)
(2,5,1,10) , (2,5,10,1) , (5,2,1,10) , (5,2,10,1)
(2,10,4,5) , (2,10,5,4) , (10,2,4,5) , (10,2,4,5)
(4,5,2,10) , (4,5,10,2) , (5,4,2,10) , (5,4,10,2)
步骤:
1.用字典保存两两元素的乘积的频率,key 为乘积,value 为该乘积出现的次数。
如:nums[i] = 1, nums[j] = 12, 则 tmp = {12:1}. nums[i] = 2, nums[j] = 6, 则 tmp = {12:2}.
2.根据乘积出现的频率,计算能够得到这个乘积的元组(长度为4)个数。
如:tmp[12] = 2 说明有 2 个长度为 2 的元组可以得到乘积 12,现在要拼成长度为 4 的元组,共有 (2 * 1) / 2 个组合。
公式为: (n * (n-1)) / 2
3.一个元组可以通过不同的顺序排出 8 个不同的元组,所以结果应该等于 元组个数 * 8。
集合 (a,b,c,d) 可以得到 8 个组合:(a,b,c,d), (a,b,d,c), (b,a,c,d), (b,a,d,c), (c,d,a,b), (c,d,b,a), (d,c,a,b), (d,c,b,a)
作者:datoo
链接:https://leetcode-cn.com/problems/tuple-with-same-product/solution/python-shuang-bai-by-datoo-s8qk/
来源:力扣(LeetCode)
1 class Solution: 2 def tupleSameProduct(self, nums: List[int]) -> int: 3 ''' 4 使用库函数版 5 ''' 6 tmp = collections.defaultdict(int) 7 for i in range(len(nums)): 8 for j in range(i+1, len(nums)): 9 pro = nums[i] * nums[j] 10 tmp[pro] += 1 11 res = 0 12 for val in tmp.values(): 13 res += (val * (val-1)) // 2 14 return res * 8 15 16 作者:datoo 17 链接:https://leetcode-cn.com/problems/tuple-with-same-product/solution/python-shuang-bai-by-datoo-s8qk/ 18 来源:力扣(LeetCode)
1 class Solution: 2 def tupleSameProduct(self, nums: List[int]) -> int: 3 ''' 4 不使用库函数版 5 ''' 6 tmp = dict() 7 for i in range(len(nums)): 8 for j in range(i+1, len(nums)): 9 pro = nums[i] * nums[j] 10 if pro not in tmp: #这两句可用 tmp.setdefault(pro,0)代替 11 tmp[pro] = 0 12 tmp[pro] += 1 13 res = 0 14 for val in tmp.values(): 15 res += (val * (val-1)) // 2 16 return res * 8 17 18 作者:datoo 19 链接:https://leetcode-cn.com/problems/tuple-with-same-product/solution/python-shuang-bai-by-datoo-s8qk/ 20 来源:力扣(LeetCode)
3 重新排列后的最大子矩阵
给你一个二进制矩阵 matrix ,它的大小为 m x n ,你可以将 matrix 中的 列 按任意顺序重新排列。
请你返回最优方案下将 matrix 重新排列后,全是 1 的子矩阵面积。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-submatrix-with-rearrangements
示例 1:
输入:matrix = [[0,0,1],[1,1,1],[1,0,1]]
输出:4
解释:你可以按照上图方式重新排列矩阵的每一列。
最大的全 1 子矩阵是上图中加粗的部分,面积为 4 。
示例 2:
输入:matrix = [[1,0,1,0,1]]
输出:3
解释:你可以按照上图方式重新排列矩阵的每一列。
最大的全 1 子矩阵是上图中加粗的部分,面积为 3 。
示例 3:
输入:matrix = [[1,1,0],[1,0,1]]
输出:2
解释:由于你只能整列整列重新排布,所以没有比面积为 2 更大的全 1 子矩形。
示例 4:
输入:matrix = [[0,0],[0,0]]
输出:0
解释:由于矩阵中没有 1 ,没有任何全 1 的子矩阵,所以面积为 0 。
1.参数定义
m/n:矩阵行和列大小
arr;长度为n的数组,记录该行向上连续1的个数
tmp:为arr逆序排序后的数组
res:返回值,最大矩阵面积
2.思路
依次遍历每行结果,如果当前位置matrix[i][j]为1,则arr[j]+=1,否则arr[j]=0
对arr逆序排序后赋值给tmp,从前往后遍历,以当前值为高的矩阵面积即为arr[j]*(j+1)。例如tmp=[5,4,3,2,1],4对应的下标为1,所以以4为高的矩阵面积即为4*(1+1)=8
res记录每次计算的矩阵最大面积即可
3.复杂度分析
时间复杂度:O(mnlogn)
空间复杂度:O(n)
作者:yim-6
链接:https://leetcode-cn.com/problems/largest-submatrix-with-rearrangements/solution/python3-ni-xu-pai-lie-qiu-zui-da-ju-zhen-cbay/
来源:力扣(LeetCode)
这个tmp数组排序,说明arr中按照1的多少进行排序,点明题目中我们可以随意换列的顺序意思。
1 class Solution: 2 def largestSubmatrix(self, matrix: List[List[int]]) -> int: 3 m,n=len(matrix),len(matrix[0]) 4 res=0 5 arr=[0]*(n) 6 for i in range(m): 7 for j in range(n): 8 if matrix[i][j]==1: 9 arr[j]+=1 10 else: 11 arr[j]=0 12 13 tmp=sorted(arr,reverse=True) 14 for j in range(n): 15 res=max(res,tmp[j]*(j+1)) 16 17 return res 18 19 作者:yim-6 20 链接:https://leetcode-cn.com/problems/largest-submatrix-with-rearrangements/solution/python3-ni-xu-pai-lie-qiu-zui-da-ju-zhen-cbay/ 21 来源:力扣(LeetCode)