C++(后台开发面试题)-判断数组中是否存在重复元素
2017-03-22 11:43
711 查看
今天进行了今日头条一轮的技术面试,面试官问了这样一道题,给定一个数组,长度为n,数组中的元素均为整数,范围是[0,n-1],问如何判断数组中是否出现重复数字。
这道题不算难,如果对时间复杂度和空间复杂度没有要求的话,那就直接使用二重循环进行遍历,代码如下:时间复杂度为O(n^2)
当然这是最暴力的方法,为了将时间复杂度降到O(n),想再定义一个大小为n的向量用于记录数组元素出现的次数进行判断,空间复杂度为O(n)
然后面试官就问能不能在时间复杂度不变的情况下使空间复杂度降低。
于是想到这个数组的元素是比较特殊的,假如不存在重复元素排序后的的数组会是连续的,也即第i个元素是数字i-1,但是如果使用常用的排序方法,时间复杂度至少为O(nlogn),所以这里需要利用到数组的特殊性进行排序,即将数字i-1交换到数组中第i个位置。
代码实现如下:时间复杂度O(n),空间复杂度O(1)
记录一下……
这道题不算难,如果对时间复杂度和空间复杂度没有要求的话,那就直接使用二重循环进行遍历,代码如下:时间复杂度为O(n^2)
bool repeat(vector<int> &v) { for (int i = 0; i < v.size(); i++) { for (int j = i + 1; j < v.size(); j++) { if (v[j] == v[i]) return true; } } return false; }
当然这是最暴力的方法,为了将时间复杂度降到O(n),想再定义一个大小为n的向量用于记录数组元素出现的次数进行判断,空间复杂度为O(n)
bool repeat(vector<int> &v) { vector<int> count(v.size(), 0); for (int i = 0; i < v.size(); i++) { if (count[v[i]] == 1) return true; count[v[i]] == 1; } return false; }
然后面试官就问能不能在时间复杂度不变的情况下使空间复杂度降低。
于是想到这个数组的元素是比较特殊的,假如不存在重复元素排序后的的数组会是连续的,也即第i个元素是数字i-1,但是如果使用常用的排序方法,时间复杂度至少为O(nlogn),所以这里需要利用到数组的特殊性进行排序,即将数字i-1交换到数组中第i个位置。
代码实现如下:时间复杂度O(n),空间复杂度O(1)
bool repeat(vector<int> &v) { for (int i = 0; i < v.size(); i++) { while (v[i] != i){ int temp = v[i]; if (v[i] == v[temp]) return true; else { int t = v[i]; v[i] = v[temp]; v[temp] = t; } } } return false; }
记录一下……
相关文章推荐
- c++面试题:判断数组是否存在重复元素
- 判断数组是否存在重复元素
- 判断一个int数组中的元素是否存在重复
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 哈希(6) - 判断数组中是否存在重复元素且距离在K之内
- 判断数组中是否存在重复元素
- 判断数组中是否存在重复的元素
- (笔试题)如何判断数组中是否存在重复元素
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 判断一个int数组中的元素是否存在重复
- 使用位图法判断整形数组是否存在重复 (待续)
- [转]返回不重复的元素数组以及判断字符串在数组中存在
- C#判断某元素是否存在数组中
- 判断数组是否存在某元素
- 给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
- js 判断数组是否有重复元素的几种方式
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- N个元素的有序数组A,判断是否有 A[i]=i 存在
- 判断一个数组中的元素是否重复?