1、数组中重复的数字
方法一:哈希法;利用unordered_map查询效率是O(1),如果没有重复就添加进去,重复了就返回
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
unordered_map<int,int> hash;
for(int i=0;i<nums.size();i++)
{
if(hash.find(nums[i])!=hash.end())
return nums[i];
hash[nums[i]]++;
}
return -1;
}
};
方法二:先排序,查找相邻元素是否有相等。
int findRepeatNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=1;i<nums.size();i++){
if(nums[i-1] == nums[i]) return nums[i];
}
return -1;
}
方法三:鸽巢原理,因为出现的元素值 < nums.size(); 所以我们可以将见到的元素 放到索引的位置,如果交换时,发现索引处已存在该元素,则重复 O(N) 空间O(1)。
int findRepeatNumber(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
while(nums[i]!=i){
if(nums[nums[i]] == nums[i]) return nums[i];
int tmp = nums[i];
nums[i] = nums[tmp];
nums[tmp] = tmp;
}
}
return -1;
}
2、在排序数组中查找数字I
二分法
class Solution {
public:
int search(vector<int>& nums, int target) {
int i=0,j=nums.size()-1,mid;
//先二分,再精调
while(i<=j)
{
mid=i+(j-i)/2;
if(nums[mid]<target) i=mid+1;
else if(nums[mid]>target) j=mid-1;
else
{
if(nums[i]!=target) {i++;}
else if(nums[j]!=target) {j--;}
else break;
}
}
return j-i+1;
}
};
3、0~n-1中缺失的数字
有序数组的搜索还是得用二分法
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i=0,j=nums.size()-1;
while(i<=j)
{
int m=i+(j-i)/2;
if(nums[m]!=m) j=m-1;
else
{
i=m+1;
}
}
return i;
}
};