2023-03-09 LeetCode:2379. 得到 K 個黑塊的最少涂色次數

2379. 得到 K 個黑塊的最少涂色次數

問題描述

給你一個長度為 n 下標從 0 開始的字符串 blocks ,blocks[i] 要么是 W 要么是 B ,表示第 i 塊的顏色。字符 WB 分別表示白色和黑色。
給你一個整數 k ,表示想要 連續(xù) 黑色塊的數目。
每一次操作中,你可以選擇一個白色塊將它 涂成 黑色塊。
請你返回至少出現 一次 連續(xù) k 個黑色塊的 最少 操作次數。

示例

輸入:blocks = "WBBWWBBWBW", k = 7
輸出:3
解釋:
一種得到 7 個連續(xù)黑色塊的方法是把第 0 ,3 和 4 個塊涂成黑色。
得到 blocks = "BBBBBBBWBW" 。
可以證明無法用少于 3 次操作得到 7 個連續(xù)的黑塊。
所以我們返回 3 。

輸入:blocks = "WBWBBBW", k = 2
輸出:0
解釋:
不需要任何操作,因為已經有 2 個連續(xù)的黑塊。
所以我們返回 0 。

解題思路

滑動窗口
建一個長度為k的窗口,先算出當前窗口內的黑塊數;
然后滑動窗口,根據色塊的進出情況,算出窗口內的黑塊數。
在此過程中,根據窗口內黑塊數,得出min。

代碼示例(JAVA)

class Solution {
    public int minimumRecolors(String blocks, int k) {
        int len = blocks.length();

        // 初始化第一個滑動窗口的"當前黑塊數量"
        int currentB = 0;
        for (int j = 0; j < k; j++) {
            if (blocks.charAt(j) == 'B') {
                currentB++;
            }
        }
        int min = k - currentB;

        for (int i = 1; i <= len - k; i++) {
            // 進一個B,走一個W
            if (blocks.charAt(k + i - 1) == 'B' && blocks.charAt(i - 1) == 'W') {
                currentB++;
                min = Math.min(min, k - currentB);
            } else if (blocks.charAt(k + i - 1) == 'W' && blocks.charAt(i - 1) == 'B') {
                // 進一個W,走一個B
                currentB--;
            }
        }

        return min;
    }
}

時間復雜度:O(n)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容