zoukankan      html  css  js  c++  java
  • 66砖墙(554)

    作者: Turbo时间限制: 1S章节: 哈希表

    晚于: 2020-08-19 12:00:00后提交分数乘系数50%

    截止日期: 2020-08-26 12:00:00

    问题描述 :

    你的面前有一堵矩形的、由多行砖块组成的砖墙。 这些砖块高度相同但是宽度不同。你现在要画一条自顶向下的、穿过最少砖块的垂线。

    砖墙由行的列表表示。 每一行都是一个代表从左至右每块砖的宽度的整数列表。

    如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你需要找出怎样画才能使这条线穿过的砖块数量最少,并且返回穿过的砖块数量。

    你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。 

    示例:

    输入: [[1,2,2,1],

          [3,1,2],

          [1,3,2],

          [2,4],

          [3,1,2],

          [1,3,1,1]]

    输出: 2

    解释:

    砖墙如下: 

    可使用以下main函数:

    #include <iostream>

    #include<sstream>

    #include <vector>

    #include<unordered_map>

    using namespace std;

    vector<int> string2int(string str)

    {

        vector<int> nums;

        int num;

        stringstream sstream(str);

        while(sstream >> num)

        {

            nums.push_back(num);

        }

        return nums;

    }

    int main()

    {

        vector<vector<int> > wall;

        vector<int> v;

        string aLine;

        int n,k,data;

        cin>>n;

        getchar();

        for(int i=0; i<n; i++)

        {

            getline(cin,aLine);

            v=string2int(aLine);

            wall.push_back(v);

        }

        int res=Solution().leastBricks(wall);

        cout<<res<<endl;

        return 0;

    }

    输入说明 :

    首先输入砖墙的行数n,

    然后输入n行,每行包含若干整数,表示砖的宽度,整数之间用空格分隔。

    每一行砖块的宽度之和应该相等,并且不能超过 INT_MAX。

    每一行砖块的数量在 [1,10000] 范围内, 墙的高度n在 [1,10000] 范围内, 总的砖块数量不超过 20,000。

    输出说明 :

    输出一个整数,表示穿过的最少的砖块数量

    输入范例 :

    输出范例 :

    #include <iostream>
    #include<sstream>
    #include <vector>
    #include<unordered_map>
    using namespace std;
    class Solution {
    public:
        int leastBricks(vector<vector<int>>& wall) 
        {
            //我们使用哈希表 map来保存记录 (sum,count)(sum, count)(sum,count) ,
            //这里 sumsumsum 是当前行累积的砖头宽度, countcountcount 是 sumsumsum 对应的穿过砖头数目。
            unordered_map<int,int> map;
    
            for(int i=0;i<wall.size();i++)
            {
                int sum=0;
                for(int j=0;j<wall[i].size()-1;j++)//墙的最后一列不用遍历 
                {
                    sum+=wall[i][j];
                    if(map[sum])
                        map[sum]++;
                    else
                        map[sum]=1;
                }
            }
            int m=0;
            for(auto i=map.begin();i!=map.end();i++)
            {
                m=max(m,i->second);//不能用点 ,因为上面取得是指针 
            }
            return wall.size()-m;
        }
    };
    vector<int> string2int(string str)
    {
        vector<int> nums;
        int num;
        stringstream sstream(str);
        while(sstream >> num)
        {
            nums.push_back(num);
        }
        return nums;
    }
    
    int main()
    {
        vector<vector<int> > wall;
        vector<int> v;
        string aLine;
        int n,k,data;
        cin>>n;
        getchar();
        for(int i=0; i<n; i++)
        {
            getline(cin,aLine);
            v=string2int(aLine);
            wall.push_back(v);
        }
        int res=Solution().leastBricks(wall);
        cout<<res<<endl;
        return 0;
    }
    /*
    作者:LeetCode
    链接:https://leetcode-cn.com/problems/brick-wall/solution/zhuan-qiang-by-leetcode/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    */
  • 相关阅读:
    libeXosip2(1-2) -- How-To initiate, modify or terminate calls.
    libeXosip2(1-1) -- How-To initialize libeXosip2.
    libeXosip2(1) -- Modules
    麦田的守望者背景与分析
    statfs函数说明
    c++ 14
    c++ 13
    URAL 2078~2089
    2018 Multi-University Training Contest 1
    Codeforces Round #502
  • 原文地址:https://www.cnblogs.com/zmmm/p/13645441.html
Copyright © 2011-2022 走看看