题目一
(1)题目描述
给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。
(2)算法思路
假设给定的数组如下,数组大小为N,num=5.,X初始化为-1,表示的意思是下标<=X的数,都<=num。
规定,当前数若<=num,则将此值与X的下一个位置的数进行交换,然后将X的值改为当前值的下标(换个意思,也就是<=num的区域增加了),然后继续下一个数;若当前数>num,则不进行任何操作,继续下一个数。
按照上述规定,流程如下:
①第一步:X = -1,下标为0的值为4 <= 5,则先将此值与X的下一位置的值进行交换,X的下一个位置也就是数组下标为0,则4与4自身交换,然后将X的值修改为0;如下图:
②第二步:X = 0,下标为1的值为6,不进行任何操作,继续下一个数;
③第三步:X = 0,下标为2的值为7,不进行任何操作,继续下一个数;
④第四步:X = 0,下标为3的值为3 <= 5,则先将此值与X的下一位置的值(也就是6)进行交换,然后X的值修改为1,继续下一个数;如下图:
⑤第五步:X=1,下标为4的值 5 <= 5,则先将此值与X的下一位置的值(也就是7)进行交换,然后X的值修改为2,继续下一个数,如下图:
⑥第六步:继续以上流程,直到下标为N-1。
(3)算法实现
void splitArray(std::vector<int> &arr, int num)
{
int arraySize = arr.size();
if (arraySize < 2)
return;
int i;
int x = -1;
for (i = 0; i < arraySize, ++i)
{
if (arr[i] <= num)
{
arr[i] = arr[x + 1];
++x;
}
}
return;
}
题目二(荷兰国旗问题)
(1)算法描述
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。
(2)算法思路
假设给定的数组如下,数组大小为N=7,num=5.,X初始化为-1,表示的意思是下标<=X的数,都小于num;Y初始化为7,代表的意思是下标大于>=Y的数都大于num。
规定,当前数若<num,则将此值与X的下一个位置的数进行交换,然后将X的值改为当前值的下标(换个意思,也就是<num的区域增加了),然后继续下一个数;若当前数=num,则跳下一个数;若当前数>num,则将此值与Y的前一个位置进行交换,将Y的值减去1,然后再比较交换后的值与num的关系,继续上述操作。算法结束判断条件:当前数下标等于Y的下标。
按照上述规定,流程如下:
①第一步:X = -1,Y = 7,下标为0的值为3 < 5,则先将此值与X的下一位置的值进行交换,X的下一个位置也就是数组下标为0,则3与3自身交换,然后将X的值修改为0;如下图:
②第二步:X = 0,Y = 7,下标为1的值5 = 5,不进行任何操作,直接进行下一个数;
③第三步:X = 0,Y = 7,下标为2的值7 > 5,将此值先与Y的前一个数交换(也就是8),然后将Y的值减1,如下图:
然后比较交换后的数(也就是8 > 5),继续上述操作,与Y前一个数(也就是6交换),然后Y的值加1,如下图:
然后继续比较交换后的数(也就是6 > 5),继续上述操作,与Y的前一个数(也就是4交换),然后Y的值加1,如下图:
然后继续比较交换后的数(也就是4 < 5),这个时候则将此数与X的后一个数交换(也就是5),然后将X的值加1,继续下一个数,如下图:
④第四步:X = 1,Y = 4,下标为2的数为5=num,直接跳过,进行下一个数;下标为3的数为5=num,直接跳过,进行下一个数;此时下标为4 = Y,终止完成。
(3)代码实现
void splitArray1(std::vector<int> &arr, int num)
{
int arraySize = arr.size();
if (arraySize < 2)
return;
int x = -1, y = arraySize;
int i;
for (i = 0; i < arraySize && i != y; ++i)
{
if (arr[i] < num)
{
int temp = arr[i];
arr[i] = arr[x + 1];
arr[x + 1] = temp;
++x;
}
else if (arr[i] == num)
{
continue;
}
else
{
int temp = arr[i];
arr[i] = arr[y - 1];
arr[y - 1] = temp;
--y;
--i;
}
}
}
参考资料:
1:《牛客网算法基础班02》