为了账号安全,请及时绑定邮箱和手机立即绑定

Leetcode 442 划水记录05

标签:
C++


题目:

**给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。

找到所有出现两次的元素。

你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?

示例:

输入:

[4,3,2,7,8,2,3,1]

输出:

[2,3]**

看题目条件给的数据大小我就想用计数排序,但是怎么不申请额外空间呢?

其实完全可以利用每个元素的高位数据保存信息. 但是要确定要保存的信息的范围大小

比如你保存的是1-100 那你得给高8位留下来保存数据 底24位用来保存这个位置真实的数据值

leetcode上跑了还不错

int* findDuplicates(int* nums, int numsSize, int* returnSize) 

{

    //把每个元素的高16位和低16位分别保存2个信息点就可以了

    for (int m=0;m<numsSize;m++)

    {

        //每个元素的第16位才是其真正的值 因为高16位可能有其他值

        int realvalue = nums[m] &65535;//

        int high16 = nums[realvalue-1] >> 16;   //当前的数字  //取下高16位

        int g16 = high16; //如果不是空

        g16++;

        nums[realvalue -1] = (nums[realvalue - 1]&65535) | (g16<<16);

    }

    //申请额外空间保存返回结果这个应该不算额外空间吧

    int *result = malloc(sizeof(int)*numsSize);

    int cc = 0;

    for (int m = 0; m < numsSize; m++)

    {

        int high16 = (nums[m]>>16);

        if (2 == high16)

        {

            result[cc++] = m + 1;

        }

    //  printf("%d 出现%d次\n", m + 1, high16);

    }

    *returnSize = cc;

    return result;

}

时间

Leetcode 442 划水记录05

©著作权归作者所有:来自51CTO博客作者hzChan的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消