554. Brick Wall

Description

There is a brick wall in front of you. The wall is rectangular and has several rows of bricks. The bricks have the same height but different width. You want to draw a vertical line from the top to the bottom and cross the least bricks.

The brick wall is represented by a list of rows. Each row is a list of integers representing the width of each brick in this row from left to right.

If your line go through the edge of a brick, then the brick is not considered as crossed. You need to find out how to draw the line to cross the least bricks and return the number of crossed bricks.

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.

Example:

Input:
[[1,2,2,1],
[3,1,2],
[1,3,2],
[2,4],
[3,1,2],
[1,3,1,1]]
Output: 2
Explanation:

Wall

Note:

  1. The width sum of bricks in different rows are the same and won't exceed INT_MAX.
  2. The number of bricks in each row is in range [1,10,000]. The height of wall is in range [1,10,000]. Total number of bricks of the wall won't exceed 20,000.

Solution

HashMap, time O(mk), space O(wallWidth)

  • m: wall height (wall.size())
  • k: average bricks count in each row

橫穿幾個磚頭如果不好做的話,不如考慮鉆過幾個空隙。

class Solution {
    public int leastBricks(List<List<Integer>> wall) {
        Map<Integer, Integer> map = new HashMap<>();
        int maxEdges = 0;
        
        for (List<Integer> bricks : wall) {
            for (int i = 0, len = 0; i < bricks.size() - 1; ++i) {
                len += bricks.get(i);
                map.put(len, map.getOrDefault(len, 0) + 1);
                maxEdges = Math.max(map.get(len), maxEdges);
            }
        }
        
        return wall.size() - maxEdges;
    }
}

PriorityQueue, time time O(mk * log m), space O(m)

m: wall height (wall.size())
k: average bricks count in each row
這種解法也挺直觀的,比上面解法的好處就是所需要的空間比較小,壞處就是時間復(fù)雜度略高一些。

class Solution {
    public int leastBricks(List<List<Integer>> wall) {
        PriorityQueue<int[]> queue = new PriorityQueue<>((a, b) -> a[2] - b[2]);
        for (int i = 0; i < wall.size(); ++i) {
            if (wall.get(i).size() > 1) {
                queue.offer(new int[] {i, 0, wall.get(i).get(0)});   
            }
        }
        
        int maxEdges = 0;
        int len = 0;
        int count = 0;
        
        while (!queue.isEmpty()) {
            int[] tuple = queue.poll();
            if (tuple[2] > len) {
                len = tuple[2];
                count = 0;
            }
            
            maxEdges = Math.max(++count, maxEdges);
            if (++tuple[1] == wall.get(tuple[0]).size() - 1) {
                continue;
            }
            
            tuple[2] += wall.get(tuple[0]).get(tuple[1]);
            queue.offer(tuple);    
        }
        
        return wall.size() - maxEdges;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 行走于世 總有一些人要生來相伴 總有一些人在后天遇見 生來相伴的都成了親人 后天遇見的卻歸路不同 有的成了至交 有...
    春耕秋實(shí)閱讀 201評論 0 0
  • 嗯嗯是膽好吧(∩_∩) .
    一只很萌的對手閱讀 149評論 0 0
  • 剛才那篇文章有一半是昨晚寫的,不小心寫的睡著所以剛才補(bǔ)完。因此做的夢大概與它有些關(guān)系。 早上七點(diǎn)醒過一次,鬧鐘叫的...
    嫏嬛素素閱讀 297評論 1 0
  • 早上沒有跑步 昨天一共室內(nèi)跑了7公里,是我第一次記步達(dá)到2萬,早上跑了25分鐘,晚上跑了40多分鐘,感覺小腿和腳腕...
    晨暉暮雪閱讀 152評論 0 0

友情鏈接更多精彩內(nèi)容