目录
问题一
给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N);
思路:
在数组左边创建一个小于等于区域,遍历数组,arr[i]<=num时小于区域向右扩充,将小于区域新加入的值与arr[i]交换位置
代码
/**
* 1.在数组左边创建一个小于等于区域边界值j初始为-1
* 2.遍历数组
* 3.若array[j+1]<=num,将array[i]与array[j+1]交换位置,j++
**/
private static int[] questionOne(int[] array, int num) {
int j = -1;
for (int i = 0; i < array.length; i++) {
if (array[i] <= num){
//交换位置
CommonUtil.swap2(array, i, ++j);
}
}
return array;
}
问题二
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。
思路
在问题一解法的基础上增加右边界设定,同理,arr[i]>num时右边界扩充,将新加入的值与arr[i]交换下标。
代码
/**
* 1.在数组左边创建一个小于区域边界值j初始为-1,在数组右边创建一个大于区域边界值k为array.size()
* 2.遍历数组至i==k
* 3.若array[i]<num,交换array[i]与array[j+1],j++
* 4.若array[i]>num,交换array[i]与array[k-1],k--,i--;
**/
private static int[] questionTwo(int[] array, int num) {
array[0] = 50;
int j = -1;
int k = array.length;
for (int i = 0; i < k; i++) {
if (array[i] < num){
CommonUtil.swap2(array, i, ++j);
}else if (array[i] > num){
CommonUtil.swap2(array, i, --k);
i--;
}
}
return array;
}
总结
在问题一的基础上问题二其实有更多解法,比如获取到问题一结果后对小于等于区域进行递归操作,条件中的<=修改为<即可。