双指针应用

#同向:不改变元素的相对位置

#反向:改变元素的相对位置

例一:翻转数组,不额外开辟空间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


 
原文地址:https://www.cnblogs.com/xiaodangdang/p/13551961.html