重复值判断练习
来源:互联网 发布:淘宝交易金额冻结 编辑:程序博客网 时间:2024/05/21 20:23
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。
给定一个int数组A及它的大小n,请返回它是否有重复值。
测试样例:
[1,2,3,4,5,5,6],7
返回:true
这道题目要求高效,并且要求空间复杂度为O(1).这样就不能用哈希表是实现,只能先排序再遍历实现
经典排序算法空间复杂度如下:
O(1)
冒泡排序,选择排序,插入排序,希尔排序,堆排序
O(logN)~O(N)
快速排序
O(N)
归并排序
O(M)
计数排序和基数排序
所以选择堆排序,并且不能使用递归时间,因为递归函数要如栈,需要额外的空间开销。利用大根堆,循环实现排序代码如下
class Checker {public: bool checkDuplicate(vector<int> a, int n) { if(n<2) return false; do { buildheap(a,n); swapnum(a[0],a[n-1]); }while(n--); for(int i=0;i!=a.size()-1;++i) { if(a[i]==a[i+1]) return true; } return false; // write code here } void buildheap(vector<int> &a,int lena) { if(lena<2) return; if(a[(lena-2)/2]<a[lena-1]) swapnum(a[(lena-2)/2],a[lena-1]); if(lena%2==1) { if(a[(lena-2)/2]<a[lena-2]) swapnum(a[(lena-2)/2],a[lena-2]); } for(int i=(lena-4)/2;i>=0;--i) { if(a[i]<a[2*i+1]) swapnum(a[i],a[2*i+1]); if(a[i]<a[2*i+2]) swapnum(a[i],a[2*i+2]); } } void swapnum(int &a,int &b) { int temp=a; a=b; b=temp; }};
0 0
- 重复值判断练习
- HashSet小练习--判断人是否重复
- 重复值判断练习题
- 原地重复值判断
- 重复值判断
- 重复值判断
- 代码练习:通过键盘键入数字判断重复个数
- 判断dataGridView是否重复值
- 判断数组重复的值 和重复个数
- HashMap怎样判断值是否重复
- sql server判断是否重复值
- 【刷题之路】重复值判断
- 如何判断JavaScript 数组含有重复值
- js判断数组是否有重复值
- String[] 数组判断值不能重复
- 如何判断主键重复
- funambol-重复项判断
- sql判断重复
- Mybatis - 一级缓存和二级缓存 -1
- Linux进程
- [ios] respondsToSelector等常用判断方法
- SURE无偏估计推导
- opencv获取摄像头帧率分辨率
- 重复值判断练习
- C/C++ console程序隐藏console黑窗口
- 数据加签加密
- 小白笔记----------- 执行 hadoop checknative 报错 openssl: false Cannot load libcrypto.so
- Angular 2 – 提升水平的最佳实践
- docker UFT-8乱码问题
- LeetCode: Teemo Attacking
- python遍历本地文件系统
- iOS中self的定义