当前位置: 首页 > article >正文

leetcode day7 442

442 数组重复出现的数据

给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 最多两次 。请你找出所有出现 两次 的整数,并以数组形式返回。

你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间(不包括存储输出所需的空间)的算法解决此问题。

示例 1:

输入:nums = [4,3,2,7,8,2,3,1]
输出:[2,3]
示例 2:

输入:nums = [1,1,2]
输出:[1]
示例 3:

输入:nums = [1]
输出:[]
 

解题思路:将元素交换到对应的位置。

将数 i 放在数组中下标为 i−1 的位置:

(1)如果 i 恰好出现了一次,那么将 i 放在数组中下标为 i−1 的位置即可;
(2)如果 i 出现了两次,将另一个 i 放置在任意不冲突的位置 j,数 j+1 没有在数组中出现过。
如果 nums[i]−1!=i,说明 nums[i] 出现了两次(另一次出现在位置 num[i]−1)

放置的方法:对数组进行一次遍历。当遍历到位置 i 时,nums[i] 应该被放在位置 nums[i]−1。不满足交换 num[i] 和 nums[nums[i]−1] 即可,直到待交换的两个元素相等为止。

int* findDuplicates(int* nums, int numsSize, int* returnSize) {
    int *a=(int*)malloc(sizeof(int)*numsSize);
    *returnSize=0;
    for(int i=0;i<numsSize;i++){
        while(nums[i]!=nums[nums[i]-1]){
            int t=nums[i];
            nums[i]=nums[t-1];
            nums[t-1]=t;
        }
    }
    for(int i;i<numsSize;i++){
        if(nums[i]-1!=i){
            a[(*returnSize)++]=nums[i];
        }
    }
    return a;
}

本题如果不要求使用常量额外空间,我们可以简单的遍历数组,并使用哈希表存储每个正整数然后再找出出现两次的数。

int* findDuplicates(int* nums, int numsSize, int* returnSize) {
    int *a=(int*)malloc(sizeof(int)*numsSize);
    int b[100005]={},k=0;
    *returnSize=0;
    for(int i=0;i<numsSize;i++){
         b[nums[i]]++;
         if( b[nums[i]]==2){
            a[k]=nums[i];
            k++;
         }
    }
    *returnSize=k;
    return a;
}

http://www.kler.cn/a/373935.html

相关文章:

  • java执行python时脚本引用动态配置文件遇到的问题
  • 【网络安全 | 漏洞挖掘】逻辑漏洞+无限制爆破实现业务瘫痪
  • vim命令及shell命令
  • mac-ubuntu虚拟机(扩容-共享-vmtools)
  • idea运行maven项目提示jar不存在,但jar实际上是存在的
  • AMD XILINX 20nm器件价格上调25%
  • 6. 线程池实现
  • 如何安装和使用PowerDesigner
  • TDengine 数据订阅 vs. InfluxDB 数据订阅:谁更胜一筹?
  • ETLCloud遇上MongoDB:灵活数据流,轻松管理
  • 四、k8s快速入门之Kubernetes资源清单
  • 忘记无线网络密码的几种解决办法
  • 【GO学习笔记 go基础】编译器下载安装+Go设置代理加速+项目调试+基础语法+go.mod项目配置+接口(interface)
  • vue中el-table显示文本过长提示
  • 函数的调用
  • vue2和vue3的数据双向绑定差异整理
  • PPT制作新选择:本地部署PPTist结合内网穿透实现实时协作和远程使用
  • 【java batik_使用BATIK解析SVG生成PNG图片】
  • 数字普惠金融-工具变量(2024.2更新)
  • ubuntu 给终端设置代理
  • web文件包含include
  • 变压器漏感对整流电路的影响【电力电子技术3章】
  • 【jvm】空间分配担保策略
  • Rust 力扣 - 643. 子数组最大平均数 I
  • kafka中MirrorMaker1和MirrorMaker2的区别
  • 易保全创新“诉前调解+赋强公证”,提供便捷高效的纠纷解决途径