LeetCode 1943. 描述绘画结果(差分思想)
文章目錄
- 1. 題目
- 2. 解題
1. 題目
給你一個細長的畫,用數軸表示。
這幅畫由若干有重疊的線段表示,每個線段有 獨一無二 的顏色。
給你二維整數數組 segments ,其中 segments[i] = [starti, endi, colori] 表示線段為 半開區間 [starti, endi) 且顏色為 colori 。
線段間重疊部分的顏色會被 混合 。
如果有兩種或者更多顏色混合時,它們會形成一種新的顏色,用一個 集合 表示這個混合顏色。
比方說,如果顏色 2 ,4 和 6 被混合,那么結果顏色為 {2,4,6} 。
為了簡化題目,你不需要輸出整個集合,只需要用集合中所有元素的 和 來表示顏色集合。
你想要用 最少數目 不重疊 半開區間 來 表示 這幅混合顏色的畫。這些線段可以用二維數組 painting 表示,其中 painting[j] = [leftj, rightj, mixj] 表示一個 半開區間[leftj, rightj) 的顏色 和 為 mixj 。
比方說,這幅畫由 segments = [[1,4,5],[1,7,7]] 組成,那么它可以表示為 painting = [[1,4,12],[4,7,7]] ,因為:
[1,4) 由顏色 {5,7} 組成(和為 12),分別來自第一個線段和第二個線段。
[4,7) 由顏色 {7} 組成,來自第二個線段。
請你返回二維數組 painting ,它表示最終繪畫的結果(沒有 被涂色的部分不出現在結果中)。
你可以按 任意順序 返回最終數組的結果。
半開區間 [a, b) 是數軸上點 a 和點 b 之間的部分,包含 點 a 且 不包含 點 b 。
示例 1:
示例 2:
示例 3:
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/describe-the-painting
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
參考:差分思想題目
class Solution { public:vector<vector<long long>> splitPainting(vector<vector<int>>& segments) {map<int, long long> m;vector<vector<long long>> ans;for(auto &s : segments){m[s[0]] += s[2];m[s[1]] -= s[2];}long long sum = 0;for(auto it = m.begin(); it != m.end(); ++it){int start = it->first, end;auto it1 = it;if(++it1 == m.end())break;elseend = it1->first;//下一個端點sum += it->second;//求各個端點的和if(sum) // 不為 0ans.push_back({start, end, sum});}return ans;} };388 ms 100.8 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1943. 描述绘画结果(差分思想)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Chapter7-4_來自獵人暗黑大陸的
- 下一篇: 天池 在线编程 排名查询