您的位置:首页 > 其它

文章标题

2017-09-04 16:30 417 查看
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。

分析:

如果没有空间复杂度的限制可用哈希表实现,加了限制之后,应该先把整个数组进行排序(非递堆排序满足条件,因为递归必须用函数栈),然后再判断

public class 重复值判断 {

public  boolean checkDuplicate(int[] a, int n) {
if (a == null || n == 0) {
return false;
}
heapSort(a);
for (int i = 1; i < n; i++) {
if (a[i] == a[i - 1]) {
return true;
}
}
return false;
}

public  void heapSort(int[] arr) {
for (int i = 0; i != arr.length; i++) {
heapInsert(arr, i);
}
for (int i = arr.length - 1; i != 0; i--) {
swap(arr, 0, i);
heapify(arr, 0, i);
}
}

public  void heapInsert(int[] arr, int index) {
while (index != 0) {
int parent = (index - 1) / 2;
if (arr[parent] < arr[index]) {
swap(arr, parent, index);
index = parent;
} else {
break;
}
}
}

public  void heapify(int[] arr, int index, int heapSize) {
int left = index * 2 + 1;
int right = index * 2 + 2;
int largest = index;
while (left < heapSize) {
if (arr[left] > arr[index]) {
largest = left;
}
if (right < heapSize && arr[right] > arr[largest]) {
largest = right;
}
if (largest != index) {
swap(arr, largest, index);
} else {
break;
}
index = largest;
left = index * 2 + 1;
right = index * 2 + 2;
}
}

public  void swap(int[] arr, int index1, int index2) {
int tmp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = tmp;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序