03. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
if(nums.empty())
{
return -1;
}
sort(nums.begin(), nums.end());
int size = nums.size();
for(int i = 0; i < size; i++)
{
if(nums[i] < 0 || nums[i] > size-1)
return -1;
if(nums[i] == nums[i+1])
return nums[i];
}
return -1;
}
};
53(1).在排序数组中查找数字
统计一个数字在排序数组中出现的次数。
class Solution {
public:
int search(vector<int>& nums, int target) {
int i = 0;
int j = nums.size()-1;
while(i <= j)
{
int m = (i+j)/2;
if(nums[m] <= target)
i = m+1;
else
j = m-1;
}
int right = i;
if(j >= 0 && nums[j] != target)
return 0;
i = 0;
j = nums.size()-1;
while(i <= j)
{
int m = (i+j)/2;
if(nums[m] < target)
i = m+1;
else
j = m-1;
}
int left = j;
return right-left-1;
}
};
53(2). 0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i = 0;
int j = nums.size()-1;
while(i <= j)
{
int m = (i+j)/2;
if(nums[m] != m)
{
if(m == 0 || nums[m-1] == m-1){
return m;
}
j = m - 1;
}else{
i = m + 1;
}
}
if(i == nums.size()){
return i;
}
return -1;
}
};