【算法】荷兰国旗问题
【算法】荷兰国旗问题 题目 思路 说明 代码 题目 给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。 思路 num表示给定的数 L 用于正在遍历的元素的下标,初始值为0。 less 用于记录小于 num的区域的右下标,初始为-1,代表不存在。 more 用于记录大于 num区域的左下标,初始为arr.length()-1+1,代表不存在。 1⃣️L指向的元素x < num时,x需要放于num的左边,此时less右移(即空间开辟一位),x与less右移之后的位置上的数(实则为空)交换,L++继续遍历。 2⃣️L指向的元素x > num时,x需要放于num的右边,此时more左移(即空间开辟一位),x与more左移之后的位置上的数(实则为空)交换。 3⃣️L指向的元素x = num时,L++继续遍历。 整个循环的终止条件是:当L指针与more指针撞上了。 说明 为什么当L指向的元素x > num时,L不需要++? 因为此时换到L位置上的数是待定区的,需要继续进行验证,而不能直接忽略。 代码 public class HollandFlag { public void patition ( int [ ] arr , int l , int r , int