Leetcode中移動零(https://leetcode-cn.com/problems/move-zeroes/)和快速排序的最初版本,本質上都可以使用區間來簡化代碼。
首先以移動零爲例,假設兩個循環變量分別爲和(假設),則中均爲非零元素(區間1),而均爲零(區間2)。其中i是從最開始滑到最後一個元素的。
由於區間1和區間2最開始都沒有元素,則兩個區間應該爲空,所以得到以及。假設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
如果是兩個區間,則從-1開始,如果是單個區間,則從0或者其他正整數開始。
- 刪除排序數組中的重複項
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
- 移除元素
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
- 刪除排序數組中的重複項
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
- 刪除排序數組中的重複項 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