思路1:
时间复杂度 O ( n ) O(n) O(n)
使用unordered_set
c++代码1:
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
unordered_set<int> hash; //set数组,不可以存贮重复元素
int n = nums.size();
if(n==0) return -1;
for(int i = 0; i < n; i++)
{
if(nums[i] < 0||nums[i] > n-1)
return -1;
}
for(int i = 0; i < n; i++)
{
if(hash.count(nums[i])!=0) //如果
return nums[i];
else
hash.insert(nums[i]);
}
return -1; //没有重复的数字,返回-1
}
};
思路2:
(数组遍历) O ( n ) O(n) O(n)
首先遍历一遍数组,如果存在某个数不在0到n-1的范围内,则返回-1。
下面的算法的主要思想是把每个数放到对应的位置上,即让nums[i] = i
。
从前往后遍历数组中的所有数,假设当前遍历到的数是 nums[i]=x
,那么:
如果x != i && nums[x] == x
,则说明 x
出现了多次,直接返回x
即可;如果nums[x] != x
那我们就把 x
交换到正确的位置上,即 swap(nums[x], nums[i])
,交换完之后如果nums[i] != i
,则重复进行该操作。由于每次交换都会将一个数放在正确的位置上,所以swap
操作最多会进行 n
次,不会发生死循环。
循环结束后,如果没有找到任何重复的数,则返回-1
。
时间复杂度分析
每次swap
操作都会将一个数放在正确的位置上,最后一次swap
会将两个数同时放到正确位置上,一共只有 n
个数和 n
个位置,所以swap
最多会进行 n−1
次。所以总时间复杂度是 O ( n ) O(n) O(n)。
c++代码2:
总结
谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析),有需要的朋友可以戳这里即可免费领取
66个Java面试知识点
架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)
算法刷题(PDF)
Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)**
[外链图片转存中…(img-6f3ebsB9-1628594488768)]
算法刷题(PDF)