题目:
数组中有一个元素出现3次,其余出现两次
找到出现三次的元素,
要求空间复杂度 O(1) // 不要想用Map
时间复杂度不大于O(nlgn)
思路:
快排,count 记录在比较过程中与基准元素相等的个数,如果==3 , 则直接返回
//找到出现三次的数,数组中的元素要么出现两次就是三次
public static int quickSort(int[] arr , int low , int high) {
if(low >= high) return -1;
int[] count = {1};
int pivot = parition(arr , low , high , count);
if(count[0] == 3) {
return pivot;
}
int left = quickSort(arr , low ,pivot - 1);
if(left > 0) return left;
return quickSort(arr , pivot + 1 , high);
}
private static int parition(int[] arr, int low, int high, int[] count) {
int i = low , j = low + 1;
for( ; j <= high ; j++) {
if(arr[j] == arr[low]) {
count[0]++;
swap(arr , i + 1 , j);
i++;
}
if(arr[j] < arr[low]) swap(arr , ++i, j);
}
swap(arr , i , low);
return i;
}
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}