给定一个数组arr, 和一个数num, 请把小于等于num的数放在数组的左边, 大于num的数放在数组的右边。
问题二(荷兰国旗问题)
给定一个数组arr, 和一个数num, 请把小于num的数放在数组的左边, 等于num的数放在数组的中间, 大于num的数放在数组的右边。
要求额外空间复杂度O(1), 时间复杂度O(N)。
Python代码
def split_array(arr, num):
"""维持一个小于等于区域的index,
如果一个数小于等于num,则和index位置交换
如果一个数大于num,则直接跳下一个
"""
i = 0
for j in range(len(arr)):
if arr[j] > num:
pass
else:
arr[j], arr[i] = arr[i], arr[j]
i += 1
return arr
问题二(荷兰国旗问题)
给定一个数组arr, 和一个数num, 请把小于num的数放在数组的左边, 等于num的数放在数组的中间, 大于num的数放在数组的右边。
要求额外空间复杂度O(1), 时间复杂度O(N)
def split_array(arr, num):
"""总体的策略是,遇到小的数字,那么把它往前面移动,遇到大的数字,把它让后面移动,遇到相等的数字,不动
维持两个三个变量来进行交换 less , more , current
其中more的值应该为len(arr),这样在判断的时候多判断一次,并且j-=1写在后面
more要等于len(arr),并且运算的时候先要减一,否则会出现这种情况:
[7,6,4,1,2,5,4] 变为[2, 4, 4, 1, 5, 6, 7],因为这种情况下面并没有对中间的1进行排序,少了一次排序的次数
"""
current = 0
less = 0
more = len(arr)
while(current < more):
if arr[current] < num: # 如果小于,那么less和current要进行交换,并且都推进一位
arr[less], arr[current] = arr[current], arr[less]
less += 1
current += 1
elif arr[current] == num: # 如果等于,那么直接向下进行
current += 1
else:
more -= 1
arr[current], arr[more] = arr[more], arr[current]
return arr