您的位置:首页 > 其它

重复值判断(堆排序的非递归使用) -- 算法小结

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

给定一个int数组A及它的大小n,请返回它是否有重复值。

测试样例:

[1,2,3,4,5,5,6],7

返回:true

编程思路:我们知道堆排序在空间复杂度要求为1的时候效率是最好的 但是如果使用递归的话 由于函数栈的使用 空间复杂度变成了O(logN) 因此需要设计一个非递归的堆排序

import java.util.*;

public class Checker {
public boolean checkDuplicate(int[] a, int n) {
// write code here
if(a==null||n<2){
return false;
}
//初始化大根堆
for(int i=n/2-1;i>=0;i--){
buildHeap(a,i,n-1);
}
//每次将大根堆根与最后一个元素交换  缩小大根堆 直至堆大小为1
for(int i=n-1;i>0;i--){
change(a,0,i);
buildHeap(a,0,i-1);
}
for(int i=1;i<n;i++){
if(a[i-1]==a[i])
return true;
}
return  false;
}
public void buildHeap(int[] a,int start,int end){
int child = start*2+1;
//利用循环判断  不用递归
while(child<end){
if(a[child+1]>a[child]&&(child+1)<=end)
child=child+1;
if(a[child]<a[start]){
break;
}else{
change(a,start,child);
}
start = child;
child = 2*start+1;
}
}
public void change(int[] tem,int a,int b){
if(a!=b){
int temm = tem[a];
tem[a] = tem[b];
tem[b] = temm;
}
}
}


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