雙指針應用
#同向:不改變元素的相對位置
#反向:改變元素的相對位置
例一:翻轉數組,不額外開辟空間O(1)
[1,2,3,4,5,6,7,8] → [8,7,6,5,4,3,2,1]
#反向
1 def reverseArray(s): 2 i, j = 0, len(s) - 1 3 while i < j: 4 s[i], s[j] = s[j], s[i] 5 i += 1 6 j -= 1 7 return s
例二:將數組所有的元素0移動到數組一端
[0,1,2,0,3,0,0,5,0] → [1, 2, 3, 5, 0, 0, 0, 0, 0]
#同向
1 def moveEnd(s): 2 i, j = 0 ,1 3 while i < j and j <= len(s)-1: 4 if s[i] == 0 and s[j] != 0: 5 s[i], s[j] = s[j], s[i] 6 while s[i] != 0: 7 i += 1 8 j += 1 9 while j <= len(s)-1 and (s[i] == 0 and s[j] == 0): 10 j += 1 11 return s
#反向
1 def moveEnd(s): 2 i, j = 0 ,len(s) - 1 3 while i < j: 4 if s[i] == 0 and s[j] != 0: 5 s[i], s[j] = s[j], s[i] 6 while (i < j) and (s[i] != 0): 7 i += 1 8 while (i < j) and (s[j] == 0): 9 j -= 1 10 return s
例三:將數組的奇數與偶數分開
[2,7,6,1,3,4,5,2,8] → [5, 7, 3, 1, 6, 4, 2, 2, 8]
#同向
1 def exchange(nums): 2 3 i, j = 0, 1 4 while i < j and j <= len(nums) - 1: 5 if nums[i] & 1 == 0 and nums[j] & 1 == 1: 6 nums[i], nums[j] = nums[j], nums[i] 7 while nums[i] & 1 == 1: 8 i += 1 9 j += 1 10 while (j <= len(nums) - 1) and nums[j] & 1 == 0: 11 j += 1 12 13 return nums
#反向
1 def exchange(nums): 2 3 i, j = 0, len(nums) - 1 4 while i < j: 5 if nums[i] & 1 == 0 and nums[j] & 1 == 1: 6 nums[i], nums[j] = nums[j], nums[i] 7 while nums[i] & 1 == 1: 8 i += 1 9 j -= 1 10 while (j <= len(nums) - 1) and nums[j] & 1 == 0: 11 j -= 1 12 13 return nums
浙公網安備 33010602011771號