【题目】
给定一个有序数组arr,调整arr使得这个数组的左半部分没有重复元素且升序,而不用保证右部分是否有序
例如,arr=[1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9],调整之后arr=[1, 2, 3, 4, 5, 6, 7, 8 ,9, ...]
【要求】
时间复杂度为O(N),额外空间复杂度为O(1)
1 public void leftUniqueSort(int[] arr) 2 { 3 if(arr == null || arr.length < 2) 4 { 5 return; 6 } 7 8 int left = 0; 9 int cur = 1; 10 11 while(cur != arr.length) 12 { 13 if(arr[cur] != arr[left]) 14 { 15 swap(arr, ++left, cur); 16 } 17 cur++; 18 } 19 }
【题目】
给定一个数组arr,其中只可能含有0、1、2三个值,请实现arr的排序
【要求】
时间复杂度为O(N),额外空间复杂度为O(1)
1 public void sort(int[] arr) 2 { 3 if(arr == null || arr.length < 2) 4 { 5 return; 6 } 7 8 int left = -1; 9 int index = 0; 10 int right = arr.length; 11 12 while(index < right) 13 { 14 if(arr[index] == 0) 15 { 16 swap(arr, ++left, index++); 17 } 18 else if(arr[index] == 2) 19 { 20 swap(arr, index, --right); 21 } 22 else 23 { 24 index++; 25 } 26 } 27 }
【题目】
有一个数组arr,给定一个值k,实现比k小的数都放在数组的左边,等于k的数都放在数组的中间,大于k的数都放在数组的右边
【要求】
时间复杂度为O(N),额外空间复杂度为O(1)
1 public void sort(int[] arr, int k) 2 { 3 if(arr == null || arr.length < 2) 4 { 5 return; 6 } 7 8 int left = -1; 9 int index = 0; 10 int right = arr.length; 11 12 while(index < right) 13 { 14 if(arr[index] < k) 15 { 16 swap(arr, ++left, index++); 17 } 18 else if(arr[index] > k) 19 { 20 swap(arr, index, --right); 21 } 22 else 23 { 24 index++; 25 } 26 } 27 }
1 public void swap(int[] arr, int i, int j) 2 { 3 int temp = arr[i]; 4 arr[i] = arr[j]; 5 arr[j] = temp; 6 }
来源:左程云老师《程序员代码面试指南》