【LeetCode】03.数组中重复的数字

题目描述
在这里插入图片描述
思路 使用哈希表

class SolutionHash
{
public:
    int findRepeatNumber(vector<int> &nums)
    {
        unordered_map<int, int> count;//哈希表变量
        for (int n : nums)
        {
            if (++count[n] > 1)//在哈希表中插入元素 size为插入的元素个数 每插入一个新元素  key为n value默认值为0
                return n;
        }
        return -1;
    }
};

使用数组 构建一个大小为n-1的数组,把数字i存储在n-1的位置,如果遇到n-1的元素是i,说明是重复的数字。

class Solution {
public:
    int findRepeatNumber(vector<int>& nums) {
        //int i=0;
        int len=nums.size();
        int* map=new int[len];
        //cout<<map[0]<<endl;
        for(int i=0;i<len;i++)
        {
            int key=nums[i];
            if(map[key]!=key)
            {
            map[key]=key;
            }
            else
            {
                return key;
            }
        }
        return 0;
    }
};

数组排序的方法 如果i和num[i]不相等的情况下,交换位置,

class Solution {
public:
    int findRepeatNumber(vector<int>& nums)
{
    int len=nums.size();
    for (int i=0;i<len;i++)
    {
        int key=nums[i];
        while(key!=i)//当位置不同时进入
       {
           if(nums[key]==key)
           {
               return key;
           }
            swap(nums[key],nums[i]);
        
       }

    }
            return 0;
}
};

二分法查找(题目需要变成 长度为n+1的数组 数字在0-n内)
1,变量为区间,不断缩小的区间是最终找到重复数字的关键点
2,循环整个数组,找到某一区间的计数值

int count(int begin, int endl, vector<int>& nums, int len)
{
	int count=0;

	for (int i = 0;i < len;i++)
	{
		if (nums[i] >= begin && nums[i] <= endl)
		{
			count++;
		}
	}
	return count;
}
int findRepeatNumber(vector<int>& nums)
{
	int len = nums.size();
	int start = 1;
	int endl = len - 1;
	int midle;
	while (start <= endl)
	{
		midle = start + (endl - start) / 2;
		cout << "midle" << midle << std::endl;
		int count1 = count(start, midle, nums, len);
		cout << "count1" << count1 << std::endl;
		if (endl == start)//找完了
		{
			if (count1 > 1)
			{
				return start;
			}
			else { break; }
		}
		if (count1 > (midle - start + 1))
		{
			endl = midle;
			cout << "s" << midle << std::endl;
		}
		else
		{
			start = midle + 1;

		}

	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值