重复值判断(堆排序的非递归使用) -- 算法小结
2017-09-13 13:16
309 查看
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。
给定一个int数组A及它的大小n,请返回它是否有重复值。
测试样例:
[1,2,3,4,5,5,6],7
返回:true
编程思路:我们知道堆排序在空间复杂度要求为1的时候效率是最好的 但是如果使用递归的话 由于函数栈的使用 空间复杂度变成了O(logN) 因此需要设计一个非递归的堆排序
给定一个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; } } }
相关文章推荐
- 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
- 【算法系列】使用LINQ来检测和删除重复的文件
- 某级数的前两项A1=1,A2=1,以后各项具有如下关系:An=An-2+2An-1。使用非递归的算法求解满足要求的n值的程序。
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 1.1 设计算法判断一个字符串中字符都是否唯一的。如果不能使用额外的数据结构呢?
- 字符串操作(人民币转成大写/全角字符转半角字符/去掉字符串中重复的子字符串/过滤常见特殊字符/反过滤特殊字符/判断是不是合法手机/字符串匹配的算法)
- 使用“初中知识”实现查找重复最优算法 + 最终极限算法
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 去除字符串中的重复字符,算法不使用额外缓冲。如abbc->abc
- 笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍
- 【算法面试】写程序输出8皇后问题的所有排列,要求使用非递归的深度优先遍历。
- 算法学习(java实现之字符串篇)·····判断字符串是否没有重复字符
- 点击添加按钮,使用ajax动态添加一行和移除一行,并且序号重新排序和数据不重复操作判断
- 1.3 设计一个算法移除字符串中的重复字符,算法不使用额外缓冲。并对你的算法设计测试用例。
- 每天学习一算法系列(12) (求1+2+…+n,不能使用乘除法,for、while、if 、else、switch、case 等关键字以及条件判断语句)
- 请问一下,我要向一个表插入数据,根据ID,重复的更新,没有的插入,不使用COUNT后判断,能做到吗?
- 更加高效的去除数组中重复元素的算法(不使用HashSet)
- 判断一个整数数组中是否有重复数字出现的O(n)时间复杂度算法
- 算法艺术(二):判断(if)的使用策略
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。