继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Leetcode 442 划水记录05

holdtom
关注TA
已关注
手记 1885
粉丝 240
获赞 992


题目:

**给定一个整数数组 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的原创作品,如需转载,请注明出处,否则将追究法律责任


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP