專欄:50多種數(shù)據(jù)結(jié)構(gòu)徹底征服

專欄:50多種經(jīng)典圖論算法全部掌握

最近一份針對字節(jié)跳動(dòng)豆包大模型負(fù)責(zé)人喬木的舉報(bào)文件在網(wǎng)上流傳,內(nèi)容是喬木婚內(nèi)出軌同組HRBP程某,且存在經(jīng)濟(jì)問題(公款攜程某某赴美出差、拒付女兒撫養(yǎng)費(fèi)等)。

3月28日據(jù)多名內(nèi)部人士透露,喬木和程某的飛書賬號狀態(tài)顯示暫停使用,有內(nèi)部人士表示這意味著公司內(nèi)部或已啟動(dòng)調(diào)查。

喬木畢業(yè)于西安交大,2014年加入字節(jié)跳動(dòng),他的妻子羅某某也是西安交大的本科生,中山大學(xué)碩士,有兩個(gè)女兒一個(gè)3歲,一個(gè)8歲。網(wǎng)上的傳言比較多,下面是我用豆包的提問,已經(jīng)簡要概述了。

打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片
打開網(wǎng)易新聞 查看精彩圖片

--------------下面是今天的算法題--------------

來看下今天的算法題,這題是LeetCode的第1288題:刪除被覆蓋區(qū)間,難度是中等。

給你一個(gè)區(qū)間列表,請你刪除列表中被其他區(qū)間所覆蓋的區(qū)間。只有當(dāng) c <= a 且 b <= d 時(shí),我們才認(rèn)為區(qū)間 [a,b) 被區(qū)間 [c,d) 覆蓋。

在完成所有刪除操作后,請你返回列表中剩余區(qū)間的數(shù)目。

示例1:

輸入:intervals = [[1,4],[3,6],[2,8]] 輸出:2 解釋:區(qū)間 [3,6] 被區(qū)間 [2,8] 覆蓋,所以它被刪除了。

  • 1 <= intervals.length <= 1000

  • 0 <= intervals[i][0] < intervals[i][1] <= 10^5

  • 對于所有的 i != j:intervals[i] != intervals[j]

問題分析

這題說的是刪除重疊區(qū)間后,返回剩余區(qū)間的數(shù)量,所謂重疊區(qū)間,就是一個(gè)區(qū)間完全被另一個(gè)區(qū)間給覆蓋了。

我們先對所有區(qū)間按照起始點(diǎn)從小到大排序,如果起始點(diǎn)相同,則按照區(qū)間終點(diǎn)從大到小排序。排序之后,下一個(gè)區(qū)間的起始點(diǎn)一定不下于前一個(gè)區(qū)間的起始點(diǎn),我們只需要判斷下一個(gè)區(qū)間的終點(diǎn)是否小于前一個(gè)區(qū)間的終點(diǎn)end即可。

如果下一個(gè)區(qū)間的終點(diǎn)小于等于前一個(gè)區(qū)間的終點(diǎn)end,說明下一個(gè)區(qū)間被前一個(gè)區(qū)間給覆蓋了,要累加覆蓋區(qū)間的個(gè)數(shù)。如果下一個(gè)區(qū)間的終點(diǎn)大于前一個(gè)區(qū)間的終點(diǎn)end,說明下個(gè)區(qū)間沒有覆蓋,要更新end的值。

最后用總的區(qū)間數(shù)量減去覆蓋的區(qū)間數(shù)量,就是剩余區(qū)間的數(shù)量。

JAVA:

public int removeCoveredIntervals(int[][] intervals) {     // 根據(jù)起始位置,從小到大排序,如果起始位置大小一樣,就根據(jù)指針位置按照從大到小排序。     Arrays.sort(intervals, (o1, o2) -> {         if (o1[0] == o2[0])             return o2[1] - o1[1];         return o1[0] - o2[0];     });     int end = intervals[0][1];     int cnt = 0;// 刪除的區(qū)間數(shù)量     for (int i = 1; i < intervals.length; i++) {         if (intervals[i][1] <= end)             cnt++;         else {             end = intervals[i][1];         }     }     return intervals.length - cnt; }

C++:

public:     int removeCoveredIntervals(vector

 > &intervals) {         // 根據(jù)起始位置,從小到大排序,如果起始位置大小一樣,就根據(jù)指針位置按照從大到小排序。         sort(intervals.begin(), intervals.end(), [](constvector

 &a, constvector

 &b) {             return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0];         });         int end = intervals[0][1];         int cnt = 0;// 刪除的區(qū)間數(shù)量         for (int i = 1; i < intervals.size(); i++) {             if (intervals[i][1] <= end)                 cnt++;             else {                 end = intervals[i][1];             }         }         return intervals.size() - cnt;     }


筆者簡介

博哥,真名:王一博,畢業(yè)十多年, 作者,專注于 數(shù)據(jù)結(jié)構(gòu)和算法 的講解,在全球30多個(gè)算法網(wǎng)站中累計(jì)做題2000多道,在公眾號中寫算法題解800多題,對算法題有自己獨(dú)特的解題思路和解題技巧,喜歡的可以給個(gè)關(guān)注,也可以 下載我整理的1000多頁的PDF算法文檔 。