C/C++教程

554. Brick Wall

本文主要是介绍554. Brick Wall,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目:

There is a rectangular brick wall in front of you with n rows of bricks. The ith row has some number of bricks each of the same height (i.e., one unit) but they can be of different widths. The total width of each row is the same.

Draw a vertical line from the top to the bottom and cross the least bricks. If your line goes through the edge of a brick, then the brick is not considered as crossed. You cannot draw a line just along one of the two vertical edges of the wall, in which case the line will obviously cross no bricks.

Given the 2D array wall that contains the information about the wall, return the minimum number of crossed bricks after drawing such a vertical line.

 

Example 1:

Input: wall = [[1,2,2,1],[3,1,2],[1,3,2],[2,4],[3,1,2],[1,3,1,1]]
Output: 2

Example 2:

Input: wall = [[1],[1],[1]]
Output: 3

 

Constraints:

  • n == wall.length
  • 1 <= n <= 104
  • 1 <= wall[i].length <= 104
  • 1 <= sum(wall[i].length) <= 2 * 104
  • sum(wall[i]) is the same for each row i.
  • 1 <= wall[i][j] <= 231 - 1

 

 

 

 

思路:

本题首先至少要想到用前面的数列和来记录砖的边缘,这里有个小细节,因为最边缘的两块砖不能计算,因此最后一块砖的最右侧并不需要记录。然后逆向思维,要找穿过最少的砖的列,我们就要找“最厚“的上下相连的砖的边缘。因为这里要找频数,因此用哈希表来作为存储容器。首先遍历每一行的砖,记录下当前行所存在的边缘,存入哈希表,key是边缘的index(即第几列),value是出现的次数。然后遍历哈希表,找出最大的value值,用墙的总高度减去这个最大值即可。

 

 

 

代码:

class Solution {

public:

    int leastBricks(vector<vector<int>>& wall) {

        unordered_map<int,int> record;

        for(auto &w:wall)

        {

            int cur=0;

            int n=w.size();

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

            {

                cur+=w[i];

                record[cur]++;

            }

        }

        int ans=0;

        for(auto &[key, value]:record)

        {

            ans=max(value,ans);

        }

        

        return wall.size()-ans;

    }

};


 

这篇关于554. Brick Wall的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!