【一天一道Leetcode】刪除有序數(shù)組的重復(fù)項(xiàng)Ⅱ

本篇推文共計(jì)2000個字,閱讀時間約3分鐘。
01
題目描述

題目描述:
給一個有序數(shù)組nums,請?jiān)?/span>刪除重復(fù)出現(xiàn)的元素,使每個元素最多出現(xiàn)兩次,返回刪除后數(shù)組的長度。
不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用O(1)額外空間的條件下完成。
示例:
輸入:nums = [1,1,1,2,2,3]
輸出:5, nums = [1,1,2,2,3]
解釋:函數(shù)應(yīng)返回新長度 length = 5,
并且原數(shù)組的前五個元素被修改為 1, 1, 2, 2, 3 。
不需要考慮數(shù)組中超出新長度后面的元素。提示:
1.0 <= nums.length <= 3*10^4
2.-10^4 <= nums[i] <= 10^4
3.nums 已按升序排列
02
思路和方法
由題意最后只用輸出新數(shù)組的長度。
我們可以利用遍歷,設(shè)定兩個開始節(jié)點(diǎn)。
從數(shù)組第一個元素進(jìn)行遍歷,依次對比元素是否相同,將符合題目要求的元素往前移動。
最后輸出數(shù)組元素不同的那部分長度即可。
例如我們用一個例子來直觀地說明。
初始數(shù)組num=[1,2,2,2]
設(shè)定兩個起點(diǎn)進(jìn)行遍歷數(shù)組,因?yàn)轭}目要求使每個元素最多出現(xiàn)兩次,
所以此時我們設(shè)置節(jié)點(diǎn)的起始值
node=1,j=2,
num[node]=1,num[j]=2,
如果num[i]!=num[node-1]
通過node++,使得node++的值等于此時i的值。
使得num[node]=num[i]
利用這樣的方式,將同一個數(shù)組的符合要求的元素都往前移動。
最后輸出節(jié)點(diǎn)node+1的長度即可。
我們用代碼表示為:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
node = 1
for i in range(2, len(nums)):
if nums[i] != nums[node-1]:
node += 1
nums[node] = nums[i]
return node + 1
我們由這道題浮想一下,如果題目繼續(xù)改為:
給一個有序數(shù)組nums,請刪除重復(fù)出現(xiàn)的元素,使每個元素最多出現(xiàn)n次,返回刪除后數(shù)組的新長度。
設(shè)定n是一個值,我們的函數(shù)表達(dá)式可以表示為:
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
node = n-1
for i in range(n, len(nums)):
if nums[i] != nums[node-(n-1)]:
node += 1
nums[node] = nums[i]
return node + 1
【年終總結(jié)】你好2021,再見2020。

【秋招紀(jì)實(shí)錄】一篇特別正經(jīng)的【騰訊】求職經(jīng)驗(yàn)分享

【一天一道Leetcode】旋轉(zhuǎn)鏈表
你與世界
只差一個
公眾號
評論
圖片
表情

