[程序员代码面试指南]数组和矩阵-数组的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;
	}
}

posted on   coding_gaga  阅读(169)  评论(0编辑  收藏  举报

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示