↓快轉到主要內容
  1. LeetCode/

LeetCode 922: Sort Array By Parity II

·1 分鐘· ·
LeetCode Easy Array Two-Pointers Sorting
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-25

  • 提交紀錄:Runtime Error ×10 → Output Limit Exceeded → Accepted ×3 → Runtime Error → Accepted ×2

解題思路
#

i 只看偶數位置、j 只看奇數位置,都一次跳兩格(Two Pointers 模板二)。nums[i] 是奇數時放錯了,往後找一個 nums[j] 是偶數(也放錯了)的奇數位置,兩個交換。奇偶數各一半,所以一定找得到。

我的嘗試
#

這題提交了 17 次,前十次都是 RE:兩個指標的邊界條件沒寫好,超出範圍,例如 [9, 8] 時 j 走過頭(IndexError);有一版留著 debug 的 print,Output Limit Exceeded。

正確解法
#

class Solution:
    def sortArrayByParityII(self, nums: List[int]) -> List[int]:
        j = 1
        for i in range(0, len(nums), 2):
            if nums[i] % 2:                              # 偶數位置放了奇數
                while nums[j] % 2:
                    j += 2
                nums[i], nums[j] = nums[j], nums[i]
        return nums

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 兩個指標都一次走兩格。
  • j 不用重設,前面的奇數位置已經都是對的。

面試口說整理
#

我用 i 走偶數位置、j 走奇數位置,i 遇到奇數時讓 j 往後找放錯的偶數,兩個交換。每個指標只往前走,時間 O(n)。

相關文章

LeetCode 905: Sort Array By Parity
·1 分鐘
LeetCode Easy Array Two-Pointers Sorting
LeetCode 905 解題筆記:寫入指標把偶數交換到前面,跟 move zeroes 一樣
LeetCode 455: Assign Cookies
·1 分鐘
LeetCode Easy Array Two-Pointers Greedy Sorting
LeetCode 455 解題筆記:小孩和餅乾都排序,用最小的、夠大的餅乾滿足最小的小孩;兩個指標各走一次
LeetCode 888: Fair Candy Swap
·1 分鐘
LeetCode Easy Array Hash-Table Binary-Search Sorting
LeetCode 888 解題筆記:交換 x 和 y 後總和相等,代表 y = x + (sumB - sumA) / 2;把 B 放進集合,逐一檢查 A 的 x
LeetCode 821: Shortest Distance to a Character
·1 分鐘
LeetCode Easy Array Two-Pointers String
LeetCode 821 解題筆記:左往右掃一次記錄到左邊最近的 c 的距離,右往左再掃一次取較小值
LeetCode 832: Flipping an Image
·1 分鐘
LeetCode Easy Array Two-Pointers Bit-Manipulation Matrix
LeetCode 832 解題筆記:每一列先左右反轉再把 0、1 互換;可以用左右指針同時做
LeetCode 747: Largest Number At Least Twice of Others
·1 分鐘
LeetCode Easy Array Sorting
LeetCode 747 解題筆記:掃一次找最大和第二大,最大 >= 2 × 第二大就回傳最大值的 index;用乘法避免除以 0