一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
问题1
注意这里只要求划分左右两部分,并不要求左右是有序的!
比较常见的解法是设立一个空数组,然后对arr进行一次遍历,≤放在左侧,大于放在右侧即可。但是这种不满足空间复杂度要求
这里需要借助双指针,一个指针进行arr遍历,另一个指针进行≤区域右边界的移动,处理过程中进行如何操作:
arr的3和5都满足1条件,所以需要交换,3和3自己交换,5和arr[0+1]=5交换,然后右边界指向5,接着遍历到6和7都是>5的,只移动i,到了4之后继续和arr[1+1]=6进行交换,然后右边界右移指向4,...
上述算法实质就是根据当前位置i和右侧未知区域,结合左侧已知≤区域来推进,≤区域根据i的value判断要不要扩张自己,扩张就进行交换和推进,不>丢到右边
问题2
接着看一下解决升级版本的问题,主要是需要分家了(荷兰国旗问题-三色旗):
这里需要新增一个描述>边界的变量,然后i遍历,判断i和位置value关系看看是扩左侧还是扩右侧
这里需要解释一下为何>num时交换完了以后i不动,这是因为交换完之后的数字是右边新过来的,i这边还没有对比处理过,而<num的是因为i从左遍历的,之前看过了,可以++
最后截止条件是i和右侧边界撞上时候停止
双向奔赴和比较交换