剑指offer#3

剑指offer

#3数组中重复出现的数字
找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

int findRepeatNumber(int* nums, int numsSize)
{
    // 1、找出数组中最大的一个元素
    int max = nums[0];
    for(int i=0;i<numsSize;i++)
    {
        if(max<nums[i])
            max=nums[i];
    }

    // 2、创建一个临时数组
    int *countArray=(int*)malloc((max+1)*sizeof(int));
    for(int i=0;i<=max;i++)
        countArray[i]=0;

    // 3、将nums中的出现次数添加到countArray中
    for(int i=0;i<numsSize;i++)
    {
        countArray[nums[i]]++;
    }

    // 4、将出现次数>=2次的数字打印出来;
    int ret=0;
    for(int i=0;i<=max;i++)
    {
        if(countArray[i]>=2)
        {
            ret=i;
            break;
        }

    }
    return ret;
}

/*
    这道题的关键在于通过这两个测试用例,因为用数组计数的方式,下标0 的意义就显得格外重要了
    [2, 3, 1, 0, 2, 5, 3]  //如果使用-1 这里的边界值0 就会出现-1 
    [1, 1, 1]              //只出现一个计数空间

    int *countArray=(int*)malloc((max+1)*sizeof(int));
    为了便于人类的习惯理解,这里采用牺牲一个空间的做法max+1
    这样计数就可以在它的位置计数了,不需要为了节省一个空间 -1(还因为0-1的话0会出现-1)
    比如:
    0   1   2   3   4   5
    1   1   2   2   0   1
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值