<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刷題實戰(zhàn)163:缺失的區(qū)間

          共 1878字,需瀏覽 4分鐘

           ·

          2021-01-24 21:36

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

          今天和大家聊的問題叫做?缺失的區(qū)間??,我們先來看題面:
          https://leetcode-cn.com/problems/missing-ranges/

          Given a sorted integer array where the range of elements are [lower, upper] inclusive, return its missing ranges.


          For example, given [0, 1, 3, 50, 75], lower = 0 and upper = 99, return ["2", "4->49", "51->74", "76->99"].

          題意


          給定一個排序的整數(shù)數(shù)組 nums ,其中元素的范圍在 閉區(qū)間 [lower, upper] 當中,返回不包含在數(shù)組中的缺失區(qū)間。

          樣例

          示例:

          輸入: nums = [0, 1, 3, 50, 75], lower = 0 和 upper = 99,
          輸出: [“2”, “4->49”, “51->74”, “76->99”]


          解題

          http://www.voidcn.com/article/p-qjcfguyv-b.html

          我們用一個指針prev記錄上次range的結(jié)尾,一個指針curr記錄當前遍歷到的數(shù)字,如果curr和prev相差大于1,說明一個missing range,我們將其加入結(jié)果列表中就行了。這題主要是有幾個corner case要解決:
          1. 如何處理lower到第一個數(shù),和最后一個數(shù)到upper的missing range?

          2. 如何區(qū)分range中只有一個數(shù)和多個數(shù)?

          3. 如何有效的得到missing range的起始和結(jié)束值,同時保證不會包含數(shù)組中的數(shù)字?

          對于第一個問題,我們要做的就是在讓for循環(huán)多判斷兩次。想象一下假設(shè)數(shù)組前有一段連續(xù)的負無窮到lower-1,數(shù)組后有一段upper+1到正無窮,這樣是等價與上下界的。本來如果不考慮頭尾,那for循環(huán)本應是從1到length-1的,但是為了判斷頭,我們從0開始,將下標為0的數(shù)和lower-1比較得到第一個range。最后循環(huán)到length停止,當下標為length時,我們將當前指針指向upper+1,并判斷upper+1和數(shù)組末尾是否能構(gòu)成最后一個區(qū)間。
          對于第二個問題,我們只要判斷這個區(qū)間的起止是否一樣就行了
          對于第三個問題,我們用prev+1和curr-1來標記這個區(qū)間的起止,因為prev和curr都是數(shù)組中的數(shù),所以解決了每個區(qū)間的邊界問題

          public?class?Solution?{
          ????public?List findMissingRanges(int[] nums, int?lower, int?upper) {
          ????????List res = new?LinkedList();
          ????????// 初始化prev為lower-1,判斷是否存在“第一個”區(qū)間
          ????????int?prev = lower - 1, curr = 0;
          ????????for(int?i = 0?; i <= nums.length; i++){
          ????????????// 當遍歷到length時,設(shè)置curr為upper+1,判斷是否存在“最后一個”區(qū)間
          ????????????curr = i == nums.length ? upper + 1?: nums[i];
          ????????????// 如果上一個數(shù)和當前數(shù)相差大于1,說明之間有區(qū)間
          ????????????if(curr - prev > 1){
          ????????????????res.add(getRanges(prev+1, curr-1));
          ????????????}
          ????????????prev = curr;
          ????????}
          ????????return?res;
          ????}
          ????
          ????private?String getRanges(int?from, int?to){
          ????????return?from?== to ? String.valueOf(from) : from?+ "->"?+ to;
          ????}
          }


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

          上期推文:

          LeetCode1-160題匯總,希望對你有點幫助!
          LeetCode刷題實戰(zhàn)161:相隔為1的編輯距離
          LeetCode刷題實戰(zhàn)162:尋找峰值


          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  青草久久视频 | 国产成人久久777777黄蓉 | 日日爽,夜夜爽,天天爽 | a√在线看| a√天堂中文8 |