lintcode----最左的1

题目描述:
一个二维数组,每一行都只有0和1,前面部分是0,后一部分是1,找到数组里面所有行中最左边的1所在的列数。

注意事项:
数组的行数,列数不超过1000
为了约束时间复杂度,你的程序将会运行50000次

样例:
给出 arr = [[0,0,0,1],[1,1,1,1]], 返回 0。

解释:
arr[1][0]为所有行中最左边的1,其所在的列为0。
给出 arr = [[0,0,0,1],[0,1,1,1]], 返回 1。

解释:
arr[1][1]为所有行中最左边的1,其所在的列为1。

思路讲解:这个题目不是很难主要的难点就是关于程序会运行50000次,就说明程序会重复的调用,如果我们按照从第一列开始搜索、第二列搜索………….一直到最后一列。这样调用一次不会花费很多时间,但是如果这样的程序调用50000次,时间复杂度就变得很高了,所以我们就需要对这个数组特殊处理,因为我们每次都是判断是那一列,我们只需要将一整列加起来了,如果不是0,就说明其存在1,反之则不存在,这样时间复杂度就变成了o(n)。

代码详解:

class Solution {
public:
    /**
     * @param arr: The 2-dimension array
     * @return: Return the column the leftmost one is located
     */
    int getColumn(vector<vector<int>> &arr) {
        // Write your code here
        vector<int>res;
        i2D_change_1D(arr,res);
        for(int i=0;i<arr[0].size();i++){
            if(res[i]!=0){
                return i;
            }
        }

    }
    void i2D_change_1D(vector<vector<int>> arr,vector<int>&res){
        int m=arr.size();
        int n=arr[0].size();

        for(int i=0;i<n;i++){
            int sum=0;
            for(int j=0;j<m;j++){
                sum=sum+arr[j][i];
            }
            res.push_back(sum);
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34355232/article/details/79668575
今日推荐