溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LeetCode如何移動零

發布時間:2021-12-15 14:35:40 來源:億速云 閱讀:191 作者:小新 欄目:大數據
# LeetCode如何移動零:算法詳解與多語言實現

## 問題描述

LeetCode第283題"移動零"要求我們:
- 給定一個數組`nums`
- 將所有`0`移動到數組末尾
- 保持非零元素的相對順序
- 必須原地修改數組(不能創建新數組)

示例:

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


## 算法思路分析

### 方法一:雙指針法(最優解)

**核心思想**:
1. 使用快慢雙指針:
   - 慢指針`left`:標記下一個非零元素應該放置的位置
   - 快指針`right`:遍歷數組尋找非零元素
2. 將非零元素前移后,末尾補零

**步驟分解**:
1. 初始化`left = 0`
2. `right`從0開始遍歷:
   - 當`nums[right] != 0`時:
     - 交換`nums[left]`和`nums[right]`
     - `left`右移
3. 遍歷結束后,`left`左側全是非零元素

**時間復雜度**:O(n)  
**空間復雜度**:O(1)

### 方法二:計數補零法

1. 遍歷數組,統計非零元素個數
2. 將非零元素按順序前移
3. 在數組末尾補零

雖然直觀,但效率略低于雙指針法。

## 代碼實現

### Python實現
```python
def moveZeroes(nums):
    left = 0
    for right in range(len(nums)):
        if nums[right] != 0:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1

Java實現

public void moveZeroes(int[] nums) {
    int left = 0;
    for (int right = 0; right < nums.length; right++) {
        if (nums[right] != 0) {
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
        }
    }
}

C++實現

void moveZeroes(vector<int>& nums) {
    int left = 0;
    for (int right = 0; right < nums.size(); right++) {
        if (nums[right] != 0) {
            swap(nums[left++], nums[right]);
        }
    }
}

邊界情況處理

  1. 全零數組:算法仍能正確處理
  2. 無零數組:不會進行不必要的交換
  3. 空數組:直接返回
  4. 前導零:如[0,0,1][1,0,0]

算法優化點

  1. 減少交換操作:可以改為直接賦值后補零
    
    def moveZeroes(nums):
       left = 0
       for right in range(len(nums)):
           if nums[right] != 0:
               nums[left] = nums[right]
               left += 1
       nums[left:] = [0] * (len(nums) - left)
    
  2. 提前終止:當left == right時可跳過交換

復雜度對比

方法 時間復雜度 空間復雜度 交換次數
雙指針交換法 O(n) O(1) 非零元素數量級
計數補零法 O(n) O(1) 固定n次

實際應用場景

  1. 數據庫查詢結果去空值
  2. 圖像處理中去除無效像素
  3. 數據清洗時處理缺失值

擴展思考

  1. 如果要求保持零的相對順序怎么辦?
    • 需要穩定排序算法
  2. 如何用函數式編程實現?
    • 使用filter和concat
  3. 大數據場景下的分布式處理方案

總結

移動零問題看似簡單,但考察了: - 對數組操作的掌握 - 雙指針技巧的應用 - 邊界條件處理能力 - 代碼優化意識

建議在理解基礎上,嘗試用不同語言實現,并比較性能差異。這是面試中的高頻考題,建議熟練掌握至少兩種實現方式。 “`

注:本文實際約850字,可通過以下方式擴展至950字: 1. 增加更多語言實現(如Go/Rust) 2. 添加復雜度數學推導 3. 補充更多邊界測試用例 4. 增加算法可視化圖示 5. 添加LeetCode實際提交數據

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女