<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)56:合并區(qū)間

          共 1417字,需瀏覽 3分鐘

           ·

          2020-10-06 01:43

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做?合并區(qū)間,我們先來看題面:

          https://leetcode-cn.com/problems/merge-intervals/

          Given a collection of intervals, merge all overlapping intervals.

          題意

          給出一個(gè)區(qū)間的集合,請(qǐng)合并所有重疊的區(qū)間。

          樣例

          示例 1:

          輸入: intervals = [[1,3],[2,6],[8,10],[15,18]]
          輸出: [[1,6],[8,10],[15,18]]
          解釋: 區(qū)間 [1,3] 和 [2,6] 重疊, 將它們合并為 [1,6].

          示例?2:

          輸入: intervals = [[1,4],[4,5]]
          輸出: [[1,5]]
          解釋: 區(qū)間 [1,4] 和 [4,5] 可被視為重疊區(qū)間。


          解題


          此題的難點(diǎn)就是判斷哪些區(qū)間重疊了,以及如何進(jìn)行合并。重疊只有兩種情況,一個(gè)區(qū)間是另外一個(gè)區(qū)間的子集,或者兩個(gè)區(qū)間相鄰(有部分重疊)。由于有區(qū)間在容器中有次序關(guān)系,那么需要分a是b的子集還是b是a的子集,則重疊的情況就分為了四種。那能不能找到一種操作,在合并之前就將所有的情況合并為一種情況呢?答案顯然是有的——排序。此處的排序需要以左區(qū)間為主次序遞增,右區(qū)間為輔次序遞增。即首先保證左區(qū)間遞增,如果某兩個(gè)元素的左區(qū)間相同,那么則比較他們的右區(qū)間。排序后再進(jìn)行合并即可。

          示例圖解


          class?Solution?{
          public:
          ??static?bool?myCompare(Interval one, Interval two){
          ????//以start為主次序遞增
          ????if?(one.start == two.start){//當(dāng)start相等的時(shí)候,才進(jìn)行比較end
          ??????return?one.end < two.start;
          ????}
          ????else?{//否則直接比較start的大小關(guān)系
          ??????return?one.start < two.start;
          ????}
          ??}

          ??vector merge(vector& intervals) {
          ????sort(intervals.begin(), intervals.end(), myCompare);//按照自定義順序進(jìn)行排序
          ????for?(int?i = 0; i < intervals.size(); ++i){//動(dòng)態(tài)掃描
          ??????int?begin = intervals[i].start;//基準(zhǔn)begin
          ??????int?end = intervals[i].end;//基準(zhǔn)end
          ??????//因?yàn)榕判虻臅r(shí)候就保證了start為主次序遞增,只要下一個(gè)的start小于上一個(gè)的end,就證明可以進(jìn)行合并
          ??????while?(i + 1?< intervals.size() && intervals[i + 1].start <= end){//如果能進(jìn)行合并
          ????????end = max(intervals[i + 1].end, end);//更新
          ????????intervals.erase(intervals.begin() + i + 1);
          ??????}
          ??????intervals[i].end = end;//更新i的end
          ????}
          ????return?intervals;
          ??}
          };


          好了,今天的文章就到這里,如果覺得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力。


          上期推文:


          LeetCode1-50題匯總,速度收藏!
          LeetCode刷題實(shí)戰(zhàn)51:N 皇后
          LeetCode刷題實(shí)戰(zhàn)52:N皇后 II
          LeetCode刷題實(shí)戰(zhàn)53:最大子序和
          LeetCode刷題實(shí)戰(zhàn)54:螺旋矩陣
          LeetCode刷題實(shí)戰(zhàn)55:跳躍游戲


          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色小视频网 | 18禁黄无码免费网站 | 亚洲免费视频网 | 大香蕉免费亚洲美国 | 含羞草一区二区三区无码观看 |