重复值判断
来源:互联网 发布:金十数据原油直播室 编辑:程序博客网 时间:2024/05/17 05:07
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为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) { heapSort(a); for (int i = 1; i < n; ++i) if (a[i] == a[i - 1]) return true; return false; } void heapSort(vector<int> &A){ //堆排序 int n = A.size(); for (int i = n/2-1;i >= 0;i--){ //建立大根堆,堆顶元素为数组最大值 AdujustHeap(A,i,n-1); } for (int i = n-1; i > 0; i--){ //堆排序 //将堆尾和堆顶交换,换出根结点中元素,放到最终位置 swap(A[0], A[i]); AdujustHeap(A,0,i-1);//在减少了一个元素的无序序列中,调整大根堆的过程 } } //保持堆的性质 void AdujustHeap (vector<int> &A, int begin, int end){ int parent=begin;//parent为子树的根 int child=2*parent+1;//child是parent的左孩子 int value=A[parent];//记录子树根的值 while(child<=end){ //沿较小值孩子结点向下筛选 if(child<end && A[child]<A[child+1]){ //记录孩子值较大者,若右孩子较大,则child指向右孩子 child++;//记录值较大的孩子的序号,child变为2*parent+2 } if(value<A[child]){ A[parent]=A[child];//将A[child]调整到双亲结点的位置上 parent=child;//修改parent和child的值,以便继续向下调整 child=2*parent+1; } else break;//调整结束 } A[parent]=value;//将调整结点的值放入最终位置 }};
阅读全文
0 0
- 重复值判断练习
- 重复值判断练习题
- 原地重复值判断
- 重复值判断
- 重复值判断
- 判断dataGridView是否重复值
- 判断数组重复的值 和重复个数
- HashMap怎样判断值是否重复
- sql server判断是否重复值
- 【刷题之路】重复值判断
- 如何判断JavaScript 数组含有重复值
- js判断数组是否有重复值
- String[] 数组判断值不能重复
- 如何判断主键重复
- funambol-重复项判断
- sql判断重复
- 判断是否重复登录
- 判断是否重复录入
- Dijkstra算法
- 层次聚类算法的原理
- Terrible Sets——poj-2082——单调栈
- [六省联考2017]组合数问题
- 通过例子解析perl脚本
- 重复值判断
- 代码笔记--kNN算法
- 模拟实现strlen、strcpy、strcat、strcmp函数
- java技术面试之面试题大全
- 大数据环境搭建
- 事件分发机制
- 海量数据处理
- 客户端返回400错误
- scala中的泛型