LeeCode陣列問題 原地刪除

2022-10-11 12:39:08 字數 3298 閱讀 6115

leecode 27:移除元素

題目描述:

給你乙個陣列nums和乙個值val,你需要原地移除所有數值等於val的元素,並返回移除後陣列的新長度length

不要使用額外的陣列空間,你必須僅使用 o(1) 額外空間並原地修改輸入陣列。

元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。

標籤:陣列、首尾指標

建立模型:

定義首、尾指標

首指標向右移動,且當首指標指向的值等於val時,(交換首尾指標的值,尾指標向左移動)

重複第2步,直到首指標移動到尾指標的右邊

時間複雜度:o(n)

**實現:

# python實現

def remove_element(nums: list[int], val: int) -> int:

left, right = 0, len(nums) - 1

while left <= right:

if nums[left] == val:

nums[left], nums[right] = nums[right], nums[left]

right -= 1

else:

left += 1

# 由於while迴圈的條件設定為 i<=j, 所以最後 i 的值始終等於 len(新陣列)

return left

/* j**a實現 */

public int remove_element(int nums, int val)

else

} return left;

}

leecode 26:刪除有序陣列中的重複項

題目描述:

給你乙個 公升序排列的陣列nums,請你原地刪除重複出現的元素,使每個元素只出現一次,返回刪除後陣列的新長度length。元素的相對順序應該保持 一致 。

由於在某些語言中不能改變陣列的長度,所以必須將結果放在陣列nums的第一部分。更規範地說,如果在刪除重複項之後有 k 個元素,那麼 nums 的前 k 個元素應該儲存最終結果。

將最終結果插入 nums 的前 k 個位置後返回 k 。

不要使用額外的空間,你必須在 原地 修改輸入陣列 並在使用 o(1) 額外空間的條件下完成

標籤:陣列、快慢指標

建立模型:

定義快、慢指標。(快指標指向當前元素,慢指標指向當前插入位置)

當快指標出現nums[fast] != nums[fast - 1],將快指標指向的當前元素插入慢指標指向的位置,快、慢指標同時向右移動

當快指標出現nums[fast] == nums[fast - 1],只向右移動快指標

重複步驟2,3,直至fast == nums.length

時間複雜度:o(n)

**實現:

# python實現

def remove_duplicates(nums:list[int]) -> int:

if not nums:

return 0

slow, fast = 1, 1

while fast < len(nums):

if nums[fast] != nums[fast - 1]:

nums[slow] = nums[fast]

slow += 1

fast += 1

return slow

/* j**a實現 */

int remove_duplicates(int nums)

int slow = 1, fast = 1;

while (fast < nums.length)

fast += 1;

} return slow;

}

leecode 283:移動零

題目描述:

給定乙個陣列nums,編寫乙個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。請注意,必須在不複製陣列的情況下原地對陣列進行操作。

標籤:陣列、快慢指標

時間複雜度:o(n)

建立模型:

定義快、慢指標。(快指標指向當前元素,慢指標指向當前插入位置)

當快指標出現nums[right] != 0,則交換快慢指標的值,快慢指標同時右移

當快指標出現nums[right] == 0,則只向右移動快指標

重複步驟2,3,直到right == nums.length

**實現:

# python實現

def move_zeroes(self, nums: list[int]) -> none:

left, right = 0, 0

while right < len(nums):

if nums[right] != 0:

nums[left], nums[right] = nums[right], nums[left]

left += 1

right += 1

return none

/* j**a實現 */

public void move_zeroes(int nums)

right += 1

} return;

}

LeeCode 陣列題目

leecode 485 最大連續 1 的個數 給定乙個二進位制陣列,計算其中最大連續 1 的個數。示例 輸入 1,1,0,1,1,1 輸出 3 解釋 開頭的兩位和最後的三位都是連續 1 所以最大連續 1 的個數是 3.輸入的陣列只包含 0 和 1 輸入陣列的長度是正整數,且不超過 10,000。遍歷...

leecode 刪除排序陣列中的重複項

給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前兩個元素被修改為1,...

共享陣列原地逆置

偶然在一本書上看到這樣一道題覺得聽一意思的就拿來做了一下,題目是這樣設定的 在已知一維陣列a m n 中一次存放兩個線性表 a1,a2,a3,a4 am b1,b2,b3 bn 試寫出乙個函式將兩個順序表位置互換,即由 a,1,a2,a3,a4.am,b1,b2,b3.bn 轉換成 b1,b2,b3...