首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode Remove Element:雙指針原地移除指定值

     編輯:關於C++

題目回顧

移除數組中所有等於 val 的元素,返回新長度。順序可變,超出新長度部分忽略。
例:[1,2,3,4,3,2,1], val=1 → 長度 5

雙指針法:左右向中間收縮

  • left 找等於 val 的位置
  • right 找不等於 val 的位置
  • 交換(實際為覆蓋),left++, right--
  • 直到 left > right

Python 代碼

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            while left <= right and nums[left] != val:
                left += 1
            while left <= right and nums[right] == val:
                right -= 1
            if left < right:
                nums[left] = nums[right]
                left += 1
                right -= 1
        return right + 1

單指針法(更簡潔)

def removeElement(self, nums, val):
    slow = 0
    for fast in range(len(nums)):
        if nums[fast] != val:
            nums[slow] = nums[fast]
            slow += 1
    return slow

複雜度

  • 時間:O(n)
  • 空間:O(1)

總結

單指針法(快慢指針)更直觀:slow 指向下一個放置非 val 元素的位置,fast 掃描全數組。雙指針法交換次數少,適合「移除元素代價大」的場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved