题目:
在长度为n-1的整形数组中找1到n中缺失的数字,数字的范围1到n,找其中一个缺失的数字
这个题和剑指53,力扣268 ,448 相似
案例:
输入:a[]={1,2,3,5};
输出:4
题解思路:
方法一:数学求和作差法
1.求出1+2+3+…+n的和sum
2.用总数和sum减去数组中所有元素的值,剩下的sum就是缺失的数字。
函数代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum=n*(n+1)/2;
for(int i=0;i<nums.size();i++)
{
sum=sum-nums[i];
}
return sum;
}
};
方法二:二分查找
1.如果中间元素的值和下标相等,则下一次查找只需要查找右半边;
2.如果中间元素的值和下标不相等,且它前面一个元素和它的下标相等,则
中间的数字正好是第一个值和下标不相等的元素,它的下标就是数组中缺失的数字。nums[]={0,1,3,4,5}
3.如果中间元素的值和下标不相等,且它前面一个元素和它的下标不相等,则下一次查找只需要在左边查找即可。nums=[]={0,2,3,4,5}
函数代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]==mid/2)
{
right=mid-1;
}
else if(nums[mid]==mid+1)
{
left=mid+1;
}
}
return left+1;
}
};
方法三:位运算,排异法
注意:任何数异或自己都为0,任何数异或0都为自己,
例:n0=n,nn=0;
假设给定的数组:nums[]={1,3,4,5};
1.第一次异或:res=1 ^3 ^4 ^5,
2.第二次异或:res=1 ^3 ^4 ^5 ^1 ^2 ^3 ^4 ^5=2;
函数代码:
class Solution {
public:
int missingNumber(vector<int>& nums,int n) {
//假定数组有序,无序sort(nums.begin(),nums.end());
//n数组元素为最大值
int t=0;
for(int i=1;i<=n;i++)
{
t=t^i;
}
for(int i=0;i<n;i++)
{
t=t^nums[i];
}
return t;
}
};
int main()
{
int nums[]={1,3,4,5};
cout<<missingNumnber(nums,5)<<endl;
}
方法四:排序法
方法五:hash法
函数代码:
class Solution {
public:
int missingNumber(vector<int>& nums) {
vector<int>hash(nums.size()+1,0);
int res;
for(int i=0;i<nums.size();i++){
hash[nums[i]]++;
}
for(int i=0; i<=nums.size(); i++)
{
if(hash[i]==0)
{
res=i;
}
}
return res;
}
};
函数代码:版本2
class Solution {
public:
int missingNumber(vector<int>& nums) {
vector<int>hash(nums.size()+1,0);
for(int i=0;i<nums.size();i++){
hash[nums[i]]++;
}
//加上不缺失的数字共有数组长度n+1,从完整的数组去查找
for(int i=0; i<=nums.size(); i++)
{
if(hash[i]==0)
{
return i;
}
}
return nums.size();
}
};
函数代码:版本3 用map
class Solution {
public:
int missingNumber(vector<int>& nums) {
unordered_map<int,int>mp;
int res;
for(int i=0;i<nums.size();i++)
{
mp[nums[i]]++;
}
for(int i=0;i<=nums.size();i++)
{
if(mp[i]==0)
{
res=i;
//其实加不加break都可以
//break;
}
}
return res;
}
};
方法六:双指针,快慢指针,结合链表环的相遇点那道题思考