[程序员代码面试指南]数组和矩阵-数组的partition调整
Posted coding-gaga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[程序员代码面试指南]数组和矩阵-数组的partition调整相关的知识,希望对你有一定的参考价值。
题目
补充问题:数组只含0,1,2,对数组排序,要求时间复杂度O(n),额外空间复杂度O(1)
题解
- 维护三个变量,l,idx,r。左区间[0,l],中间区间[l+1,idx],右区间[idx+1,r]。
- 初始化l=-1,r=len,idx=0。idx用来遍历数组。
- 当arr[idx]=1,idx++;
- 当arr[idx]=0,swap(arr[l+1,idx]),i++,idx++
- 当arr[idx]=2,swap(arr[idx,r-1]),r--,idx++
- 当idx=r说明中区间和右区间连上了。排序结束。
todo
原问题待做。
代码
package ArrayAndMatrix;
public class Main {
public static void main(String args[]) {
int[] arr= {0,1,2,0,1,2};
sort(arr);
for(int elm:arr) {
System.out.println(elm);
}
}
public static void sort(int[] arr) {
if(arr.length>1) {
int l=-1;
int r=arr.length;
int idx=0;
while(idx!=r) {
if(arr[idx]==1) {
++idx;
}
else if(arr[idx]==0) {
swap(arr,idx++,++l);
}
else {
swap(arr,idx,--r);
}
}
}
}
public static void swap(int[] arr,int idx1,int idx2) {
int temp=arr[idx1];
arr[idx1]=arr[idx2];
arr[idx2]=temp;
}
}
以上是关于[程序员代码面试指南]数组和矩阵-数组的partition调整的主要内容,如果未能解决你的问题,请参考以下文章
[程序员代码面试指南]数组和矩阵问题-数组中子数组的最大累乘积
《程序员代码面试指南》第八章 数组和矩阵问题 自然数数组的排序
[程序员代码面试指南]数组和矩阵-数组的partition调整