使用區間來簡化代碼思考

  Leetcode中移動零(https://leetcode-cn.com/problems/move-zeroes/)和快速排序的最初版本,本質上都可以使用區間來簡化代碼。

  首先以移動零爲例,假設兩個循環變量分別爲jjii(假設j<=ij<=i),則[0,...,j][0,...,j]中均爲非零元素(區間1),而[j+1,...,i1][j+1,...,i-1]均爲零(區間2)。其中i是從最開始滑到最後一個元素的。
在這裏插入圖片描述
  由於區間1和區間2最開始都沒有元素,則兩個區間應該爲空,所以得到j=1j=-1以及i=0i=0。假設nums[i]爲0,則什麼都不要做,假設nums[i]不爲0,則需要進行交換。具體如代碼:

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # [0, j] not zero, [j+1, i-1] all zero
        j = -1
        for i in range(0, len(nums)):
            if nums[i] != 0:
                nums[i], nums[j+1] = nums[j+1], nums[i]
                j += 1

  接着以最簡單的快速排序中partition函數爲例。
在這裏插入圖片描述

def partition(nums, l, r):
    # [l+1,...,j] < v, [j+1,...,i-1] > v
    v = nums[l]
    j = l

    for i in range(l+1, r+1):
        if nums[i] < v:
            nums[i], nums[j+1] =  nums[j+1], nums[i]
            j += 1

    nums[l], nums[j] = nums[j], nums[l]

    return j

  如果是兩個區間,則jj從-1開始,如果是單個區間,則jj從0或者其他正整數開始。

  1. 刪除排序數組中的重複項
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        # [0,...j] non duplicates i
        j = 0

        for i in range(0, len(nums)):
            if nums[j] != nums[i]:
                nums[j+1] = nums[i]
                j += 1

        return j + 1
  1. 移除元素
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        #[0,...j] != val, [j+1,...i-1] == val

        j = -1
        for i in range(0, len(nums)):
            if nums[i] != val:
                nums[i], nums[j+1] = nums[j+1], nums[i]
                j += 1

        return j + 1
  1. 刪除排序數組中的重複項
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        # [0,...j] non duplicates i
		if len(nums) == 0:
			return 0
			
        j = 0

        for i in range(0, len(nums)):
            if nums[j] != nums[i]:
                nums[j+1] = nums[i]
                j += 1

        return j + 1
  1. 刪除排序數組中的重複項 II
class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        # [0,...j] non duplicates
		if len(nums) <=1:
			return len(nums)

        j = 1

        for i in range(2, len(nums)):
            if not (nums[i] == nums[j] and nums[i] == nums[j-1]):
                nums[j+1] = nums[i]
                j += 1

        return j + 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章