【力扣周赛】第341场周赛
【力扣周赛】第341场周赛
-
- 6376:一最多的行
-
- 题目描述
- 解题思路
- 6350:找出可整除性得分最大的整数
-
- 题目描述
- 解题思路
6376:一最多的行
题目描述
描述:给你一个大小为m x n的二次制作矩阵mat,请你找出包含最多1行的下标(从0开始)以及这一行中1的数字目标。
如果有多行包包含最多的 1 ,只需要选择行下标最小的那一行。
返回一个由行下标和应该行中 1 的数量组组成的数量组。
输入: mat = [[0,1],[1,0]]
输出: [0,1]
解释:两行中 1 的数量相同。所以返回下标最小的行,下标为 0 。该行 1的数量为 1 。所以,答案为 [0,1] 。
输入: mat = [[0,0,0],[0,1,1]]
输出: [1,2]
解释:下标为 1 的行中 1 的数量最多。应该行 1 的数量为 2 。所以,答案为[1,2 ] 。
输入: mat = [[0,0],[1,1],[0,0]]
输出: [1,2]
解释:下标为 1 的行中 1 的数量最多。该行 1 的数量为 2 。所以,答案为[ 1,2] 。
解题思路
思路:使用一个包含两个元素的vector<int>类型数组res存储结果,其中res[0]存储最小行下标,res[1]存储最大1的数量。使用两层for循环,外层遍历行,内层遍历列,统计该行中1的数量num,如果num大于res[1],则将res[0]设置为i,反之不变,同时更新最大1的数量res[1],最后返回res即可。
vector<int> rowAndMaximumOnes(vector<vector<int>>& mat) {// 存储最大1数 vector<int> res[1]// 存储最小行下标 vector<int> res[0]vector<int> res(2,0);int m=mat.size();int n=mat[0].size();// 按照行遍历for(int i=0;i<m;i++){// 记录该行1的个数int num=0;for(int j=0;j<n;j++){if(mat[i][j]==1)num++;}res[0]=num>res[1]?i:res[0];res[1]=max(res[1],num);}return res;}
6350:找出可整除性得分最大的整数
题目描述
描述:给你两个下标从0开始的整数组nums和divisors。
divisors[i]的可整除性取决于满足能力nums[j]被divisors[i]整除的下j标的数量。
返回可整除性得分最大的整数divisors[i]。
输入: nums = [4,7,9,3,9], divisors = [5,2,3]
输入: 3
解释: divisors 中每个元素的可去除性得分为:
divisors[0] 的可整除性得分为 0 ,因为 nums 中没有任何数字能被 5 整除。
divisors[1] 的可整除性得分为 1 ,因为 nums[0] 能被 2 整除。
divisors[2] 的可整除性得分为 3 ,因为 nums[2]、nums[3] 和 nums[4] 都能够被 3 整除。
因此,返回 divisors[2] ,它的可去除性得分数最大。
输入: nums = [20,14,21,10], divisors = [5,7,5]
输入: 5
解释: divisors 中每个元素的可去除性得分为:
divisors[0] 的可整除性得分为 2 ,因为 nums[0] 和 nums[3] 都能够被 5 整除。
divisors[1] 的可整除性得分为 2 ,因为 nums[1] 和 nums[2] 都能够被 7 整除。
divisors[2] 的可整除性得分为 2 ,因为 nums[0] 和 nums[3] 都可以被5整除。
由于divisors[0]、divisors[1] 和 divisors[2] 的可整除性得分都是最大的,因此,我们返回数值最小的一个,即divisors[2] 。
输入: nums = [12], divisors = [10,16]
输入: 10
解释: divisors 中每个元素的可去除性得分为:
divisors[0] 的可整除性得分为 0 ,因为 nums 中没有任何数字能被 10 整除。
divisors[1] 的可整除性得分为 0 ,因为 nums 中没有任何数字能被 16 整除。
由于divisors[0]和divisors[1]的可去除性都是最大的,因此,我们返回值最小的一个,即divisors[0]。
解题思路
思路:使用一个函数divide_num判断当前元素能被nums数组元素整除的数量num,使用res记录最大得分,使用data记录最大得分的最小元素值,注意,res和data均初始化为-1,我一开始初始化为0,但是发现其中仅有两个得分为0的元素,其也是返回的得分为0的最小元素值。遍历divisors数组,调用divide_num函数,得到当前元素得分num,如果num大于res则data取当前最大得分值,反之如果num等于res则data取两者中值最小的元素值,更新最大得分,最后返回data。
int divide_num(vector<int>& nums,int d){int n=nums.size();int num=0;for(int i=0;i<n;i++){if(nums[i]%d==0)num++;}return num;}int maxDivScore(vector<int>& nums, vector<int>& divisors) {int n=divisors.size();int res=-1;int data=-1;for(int i=0;i<n;i++){int num=divide_num(nums,divisors[i]);// 取得分最大值if(num>res)data=divisors[i];// 取相同得分最小值else if(num==res)data=min(data,divisors[i]);// 更新得分res=max(res,num);}return data;}