題目連結:
題目意譯:
你被給定一整數 n 代表著一個長度 n 的陣列 colors,其中所有元素一開始都設為 0,意味著尚未塗色。你同時也被給定一個二維整數陣列 queries,其中 queries[i] = [indexi, colori]。對於第 i 筆詢問:
將 colors[indexi] 設為 colori。
統計 colors 中有多少相鄰對是相同顏色(無論是否為 colori)。
回傳一個與 queries 長度相同的陣列 answer,其中 answer[i] 為第 i 筆詢問的答案。
限制:
1 ≦ n ≦ 10 ^ 5
1 ≦ queries.length ≦ 10 ^ 5
queries[i].length == 2
0 ≦ indexi ≦ n - 1
1 ≦ colori ≦ 10 ^ 5
範例測資:
範例 1:
輸入: n = 4, queries = [[0,2],[1,2],[3,1],[1,1],[2,1]]
輸出: [0,1,1,0,2]
解釋:
一開始陣列 colors = [0,0,0,0],其中 0 代表著陣列中尚未被塗色的元素。
經過第 1 筆詢問後,colors = [2,0,0,0]。有著相同顏色的相鄰對之數量為 0。
經過第 2 筆詢問後,colors = [2,2,0,0]。有著相同顏色的相鄰對之數量為 1。
經過第 3 筆詢問後,colors = [2,2,0,1]。有著相同顏色的相鄰對之數量為 1。
經過第 4 筆詢問後,colors = [2,1,0,1]。有著相同顏色的相鄰對之數量為 0。
經過第 5 筆詢問後,colors = [2,1,1,1]。有著相同顏色的相鄰對之數量為 2。
範例 2:
輸入: n = 1, queries = [[0,100000]]
輸出: [0]
解釋:
經過第 1 筆詢問後,colors = [100000]。有著相同顏色的相鄰對之數量為 0。
解題思維:
用一個實際的 colors 陣列以及一個計數用的變數來模擬即可。
每當在 colors[queries[i][0]](簡稱為 colors[x]) 塗成 queries[i][1](簡稱為 y)時,首先檢查原本 colors[x] 是否為 0;如果是,則塗色只會增加相鄰同色數而不會減少(因為本來就沒有塗色);反之,則需要先檢查 colors[x - 1] 和 colors[x + 1] 各自有無與原先 colors[x] 同色。如果有則需要先扣掉,因為原本顏色會被蓋掉。
接著將 colors[x] 設為 y 時,同樣也檢查現在 colors[x - 1] 和 colors[x + 1] 各自有無與 colors[x] 同色。如果有則需要將計數器 + 1。
當然,x - 1 或是 x + 1 可能不存在,所以記得檢查邊界。而做完上面的過程後,便可以得到 queries[i] 的答案 answer[i],其即為此時計數器的數值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。