日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1943. 描述绘画结果(差分思想)

發布時間:2024/7/5 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

輸入:segments = [[1,4,5],[4,7,7],[1,7,9]] 輸出:[[1,4,14],[4,7,16]] 解釋:繪畫借故偶可以表示為: - [1,4) 顏色為 {5,9} (和為 14),分別來自第一和第二個線段。 - [4,7) 顏色為 {7,9} (和為 16),分別來自第二和第三個線段。

示例 2:

輸入:segments = [[1,7,9],[6,8,15],[8,10,7]] 輸出:[[1,6,9],[6,7,24],[7,8,15],[8,10,7]] 解釋:繪畫結果可以以表示為: - [1,6) 顏色為 9 ,來自第一個線段。 - [6,7) 顏色為 {9,15} (和為 24),來自第一和第二個線段。 - [7,8) 顏色為 15 ,來自第二個線段。 - [8,10) 顏色為 7 ,來自第三個線段。

示例 3:

輸入:segments = [[1,4,5],[1,4,7],[4,7,1],[4,7,11]] 輸出:[[1,4,12],[4,7,12]] 解釋:繪畫結果可以表示為: - [1,4) 顏色為 {5,7} (和為 12),分別來自第一和第二個線段。 - [4,7) 顏色為 {1,11} (和為 12),分別來自第三和第四個線段。 注意,只返回一個單獨的線段 [1,7) 是不正確的,因為混合顏色的集合不相同。提示: 1 <= segments.length <= 2 * 10^4 segments[i].length == 3 1 <= starti < endi <= 10^5 1 <= colori <= 10^9 每種顏色 colori 互不相同。

來源:力扣(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. 描述绘画结果(差分思想)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。