<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)41:缺失的第一個(gè)正數(shù)

          共 887字,需瀏覽 2分鐘

           ·

          2020-09-19 03:22

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

          今天和大家聊的問題叫做?缺失的第一個(gè)正數(shù),我們先來看題面:

          https://leetcode-cn.com/problems/first-missing-positive/

          Given an unsorted integer array, find the smallest missing?positive integer.

          題意

          給你一個(gè)未排序的整數(shù)數(shù)組,請你找出其中沒有出現(xiàn)的最小的正整數(shù) 。你的算法的時(shí)間復(fù)雜度應(yīng)為O(n),并且只能使用常數(shù)級別的額外空間。

          樣例

          示例?1:

          輸入: [1,2,0]
          輸出: 3

          示例?2:

          輸入: [3,4,-1,1]
          輸出: 2

          示例?3:

          輸入: [7,8,9,11,12]
          輸出: 1

          題解

          由于線性時(shí)間和常數(shù)空間的要求,我們開不了數(shù)組,用不了哈希表,不能排序。能用的就只有數(shù)組本身以及額外常數(shù)個(gè)變量。。。

          我們考慮如果整數(shù)都出現(xiàn),那么最后數(shù)組排列應(yīng)該是[1,2,3,4,5,…,n],每個(gè)都是遞增1。于是乎,如果我們最后也排列成這種形式,那么只要不滿足nums[i]-nums[i-1]不等于1,那么就找到了最小的未出現(xiàn)的整數(shù),但是我們沒法排序。

          所以我們可以強(qiáng)行另數(shù)組下標(biāo)和存的值產(chǎn)生聯(lián)系-> 令數(shù)字i出現(xiàn)在下標(biāo)為i-1的位置,如果會越界則不做處理。
          比如[3,4,-1,1]->[-1,4,3,1]->[-1,1,3,4]->[1,-1,3,4];

          class?Solution?{

          ????????public?int?firstMissingPositive(int[] nums)?{
          ????????????for(int?i=0;i????????????????if(nums[i]>0&&nums[i]<=nums.length&&nums[i]!=nums[nums[i]-1]){
          ????????????????????//確定nums[i]的值對應(yīng)的下標(biāo)不越界,同時(shí)排除num[i]本身位置正確或者nums[i]應(yīng)該放入的位置nums[i]-1原本就是nums[i](如[1,1])

          ????????????????????int?index = nums[i];//
          ????????????????????nums[i] = nums[index -1];
          ????????????????????nums[index -1]=index;
          ????????????????????//換位置之后需要繼續(xù)判斷換過來的值是否在對的位置上,因此不能i++;
          ????????????????}else{
          ????????????????????i++;
          ????????????????}
          ????????????}
          ????????????for(int?i=0;i????????????????if(nums[i]!=i+1){
          ????????????????????return?i+1;
          ????????????????}
          ????????????}
          ????????????return?nums.length+1;
          ????????}
          ????}


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


          上期推文:


          LeetCode1-20題匯總,速度收藏!
          LeetCode21-40題匯總,速度收藏!
          LeetCode刷題實(shí)戰(zhàn)40:組合總和 II


          瀏覽 40
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  人人干人人叉人人操 | 少妇做受 高潮10在线 | 亚洲精品综合在线 | 成人在线三级 | 哪里可以看日本黄色电影 |