【力扣周赛】第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类型数组res存储结果,其中res[0]存储最小行下标,res[1]存储最大1的数量。使用两层for循环,外层遍历行,内层遍历列,统计该行中1的数量num,如果num大于res[1],则将res[0]设置为i,反之不变,同时更新最大1的数量res[1],最后返回res即可。

    vector rowAndMaximumOnes(vector>& mat) {
        // 存储最大1数 vector res[1]
        // 存储最小行下标 vector res[0]
        vector res(2,0);
        int m=mat.size();
        int n=mat[0].size();
        // 按照行遍历
        for(int i=0;ires[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& nums,int d)
    {
        int n=nums.size();
        int num=0;
        for(int i=0;i& nums, vector& divisors) {
        int n=divisors.size();
        int res=-1;
        int data=-1;
        for(int i=0;ires)
                data=divisors[i];
            // 取相同得分最小值
            else if(num==res)
                data=min(data,divisors[i]);
            // 更新得分
            res=max(res,num);
        }
        return data;
    }

你可能感兴趣的:(力扣周赛,力扣周赛,c++,算法)