每天一道leetcode——《一最多的行》

第一天开始写leetcode,今天是一道简单的编程题——一最多的行。

下面是具体的题目:

给你一个大小为 m x n 的二进制矩阵 mat ,请你找出包含最多 1 的行的下标(从 0 开始)以及这一行中 1 的数目。

如果有多行包含最多的 1 ,只需要选择 行下标最小 的那一行。

返回一个由行下标和该行中 1 的数量组成的数组。

刚开始是用Python写的,因为最近在学Python,所以打算用Python试试:

class Solution:
    def rowAndMaximumOnes(self, mat: List[List[int]]) -> List[int]:
        max_count = 0
        max_index = 0
        for i , row in enumerate(mat):
            count = sum(row)
            if count > max_count:
                max_count = count
                max_index = i
        return [max_index,max_count]

也就是用了一个循环,计算每一行所有数的和(因为这个矩阵只出现0和1),然后记录下最大的一行,最后返回最多1的一行的下标和个数。但是提交的时候,发现虽然通过了,但是执行时间用了12ms,然后就想到老师说过,Python尽量别用循环,尽量调用自带的模块,用循环的话效率比不上c和c++,所以我就想能不能不用明显用循环的方法,借助大模型,然后就有了下面的方式:

class Solution:
    def rowAndMaximumOnes(self, mat: List[List[int]]) -> List[int]:
        counts = list(map(sum,mat))
        max_index = max(enumerate(counts), key=lambda x: (x[1], -x[0]))[0]
        max_count = counts[max_index]
        return [max_index, max_count]

这样的方式好像是调用了一个匿名函key=lambda x: (x[1], -x[0]),来实现。具体的我也不太清楚,也是刚开始学Python。这样的执行时间虽然短了点,但还是有8ms。

后面我就想着用C++来试一下,看看执行时间是不是要好一些:

#include 
using namespace std;

class Solution {
public:
    vector rowAndMaximumOnes(vector>& mat) {
        int maxOnesCount = 0;
        int maxRowIndex = 0;
        for (int i = 0; i < mat.size(); ++i) {
            int currentOnesCount = 0;
            for (int num : mat[i]) {
                currentOnesCount += num;
            }
            if (currentOnesCount > maxOnesCount) {
                maxOnesCount = currentOnesCount;
                maxRowIndex = i;
            }
        }
        return {maxRowIndex, maxOnesCount};
    }
};

也就是比较常见的双循环,发现这样的执行时间在提交分析的时候显示的0ms,执行时间要比用Python的好不少,也有可能是用的Python方式不对吧。

欢迎大家发表自己的看法,也开阔下我的眼界。

你可能感兴趣的:(leetcode,算法,数据结构)