<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)80:刪除排序數(shù)組中的重復(fù)項(xiàng) II

          共 2995字,需瀏覽 6分鐘

           ·

          2020-10-31 01:11

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

          今天和大家聊的問(wèn)題叫做?刪除排序數(shù)組中的重復(fù)項(xiàng) II,我們先來(lái)看題面:

          https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/

          Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twice and return the new length.


          Do not allocate extra space for another array; you must do this by modifying the input array in-place with O(1) extra memory.

          題意


          給定一個(gè)增序排列數(shù)組 nums ,你需要在 原地 刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素最多出現(xiàn)兩次,返回移除后數(shù)組的新長(zhǎng)度。

          不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。


          樣例

          示例 1:

          輸入:nums = [1,1,1,2,2,3]
          輸出:5, nums = [1,1,2,2,3]
          解釋:函數(shù)應(yīng)返回新長(zhǎng)度 length = 5, 并且原數(shù)組的前五個(gè)元素被修改為 1, 1, 2, 2, 3 。你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。

          示例 2:

          輸入:nums = [0,0,1,1,1,1,2,3,3]
          輸出:7, nums = [0,0,1,1,2,3,3]
          解釋:函數(shù)應(yīng)返回新長(zhǎng)度 length = 7, 并且原數(shù)組的前五個(gè)元素被修改為?0, 0, 1, 1, 2, 3, 3 。你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。


          解題

          https://www.cnblogs.com/techflow/p/13186342.html

          題解

          刪除重復(fù)的元素本身并不復(fù)雜,唯一麻煩的是我們?cè)趺?strong style="color: rgb(71, 193, 168);">在不引入額外存儲(chǔ)的情況下完成這一點(diǎn)。如果你能抓住數(shù)組是有序的這一點(diǎn),應(yīng)該很容易想通:既然數(shù)組是有序的,那么相同的元素必然排在一起。
          既然相同的元素排在一起,那么我們可以利用一個(gè)變量存儲(chǔ)當(dāng)前元素出現(xiàn)的次數(shù)。如果遇到不同的元素,則將次數(shù)置為1。這樣我們就可以判斷出究竟哪些元素需要?jiǎng)h除,哪些元素需要保留了。
          但是這就又引入了另外一個(gè)問(wèn)題,我們?cè)趺磥?lái)刪除這些重復(fù)的元素呢?因?yàn)槲覀儾荒芤腩~外的數(shù)組,需要在當(dāng)前數(shù)組上完成。我們可以先假設(shè)沒(méi)有這個(gè)限制,我們會(huì)怎么做?

          new_nums = []
          cur = None
          for?i in range(n):
          ????if?cur == nums[i]:
          ????????count?+= 1
          ?else:
          ????????count?= 1
          ????????cur = nums[i]
          ????if?count?> 2:
          ????????continue
          ????new_nums.append(nums[i])


          由于有這個(gè)限制,所以我們要做的就是把new_nums這個(gè)數(shù)組去掉,其實(shí)去掉是很簡(jiǎn)單的,因?yàn)槲覀兛梢宰宯ums這個(gè)數(shù)組自己覆蓋自己。因?yàn)楫a(chǎn)出的數(shù)據(jù)的數(shù)量一定是小于等于數(shù)組長(zhǎng)度的,所以不會(huì)出現(xiàn)數(shù)組越界的問(wèn)題。我們只需要維護(hù)一個(gè)下標(biāo)記錄nums數(shù)組當(dāng)中允許覆蓋的位置即可。
          這個(gè)也是非常常見(jiàn)的做法,我們?cè)谥暗念}目當(dāng)中也曾經(jīng)見(jiàn)到過(guò)。

          class?Solution:
          ????def?removeDuplicates(self, nums: List[int])?-> int:
          ????????# start是起始覆蓋指針,指向第一個(gè)可以覆蓋的位置
          ????????start, cur, cnt = 0, None, 0
          ????????n = len(nums)
          ????????if?n == 0:
          ????????????return?0
          ????????for?i in?range(n):
          ????????????if?cur == nums[i]:
          ????????????????cnt += 1
          ????????????else:
          ????????????????cnt = 1
          ????????????????cur = nums[i]
          ????????????# 如果數(shù)量超過(guò)2,說(shuō)明當(dāng)前元素應(yīng)該舍棄,則continue
          ????????????if?cnt > 2:
          ????????????????continue
          ????????????# 否則用當(dāng)前元素覆蓋start位置,并且start移動(dòng)一位
          ????????????else:
          ????????????????nums[start] = nums[i]
          ????????????????start += 1
          ????????return?start


          關(guān)于這段代碼,還有一個(gè)簡(jiǎn)化版本,我們可以把cnt變量也省略掉。因?yàn)樵厥怯行虻?,我們可以直接用nums[i]和nums[i-2]進(jìn)行判斷,如果相等,那么說(shuō)明重復(fù)的元素一定超過(guò)了兩個(gè),當(dāng)前元素需要跳過(guò)。
          簡(jiǎn)化之后的代碼如下:

          class?Solution(object):
          ????def?removeDuplicates(self, nums):
          ????????"""
          ????????:type nums: List[int]
          ????????:rtype: int
          ????????"""

          ????????i = 0
          ????????for?n in?nums:
          ????????????if?i < 2?or?n != nums[i - 2]:
          ????????????????nums[i] = n
          ????????????????i += 1
          ????????return?i


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


          上期推文:

          LeetCode40-60題匯總,速度收藏!
          LeetCode刷題實(shí)戰(zhàn)61:旋轉(zhuǎn)鏈表
          LeetCode刷題實(shí)戰(zhàn)62:不同路徑
          LeetCode刷題實(shí)戰(zhàn)63:不同路徑 II
          LeetCode刷題實(shí)戰(zhàn)64:最小路徑和
          LeetCode刷題實(shí)戰(zhàn)66:加一
          LeetCode刷題實(shí)戰(zhàn)67:二進(jìn)制求和
          LeetCode刷題實(shí)戰(zhàn)68:文本左右對(duì)齊
          LeetCode刷題實(shí)戰(zhàn)69:x 的平方根
          LeetCode刷題實(shí)戰(zhàn)70:爬樓梯
          LeetCode刷題實(shí)戰(zhàn)71:簡(jiǎn)化路徑
          LeetCode刷題實(shí)戰(zhàn)72:編輯距離
          LeetCode刷題實(shí)戰(zhàn)73:矩陣置零
          LeetCode刷題實(shí)戰(zhàn)74:搜索二維矩陣
          LeetCode刷題實(shí)戰(zhàn)75:顏色分類
          LeetCode刷題實(shí)戰(zhàn)76:最小覆蓋子串
          LeetCode刷題實(shí)戰(zhàn)77:組合
          LeetCode刷題實(shí)戰(zhàn)78:子集
          LeetCode刷題實(shí)戰(zhàn)79:?jiǎn)卧~搜索

          瀏覽 60
          點(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>
                  亚洲欧美AA | 婷婷久久综合激情综合 | 嫩俩国产欧美啪啪九一 | 激情开心五月天 | 影音先锋最新av资源 |