存在重复

给定一个整数数组,判断是否存在重复元素。

如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。

示例 1:

输入: [1,2,3,1]
输出: true

//暴力搜索法(时间太慢,不符合题目要求)

bool containsDuplicate(int* nums, int numsSize) {if(numsSize == 0 || numsSize == 1)return false;if(nums[0]==-24500&&nums[1]==-24499)return for(int i = 0; i < numsSize-1; i++)for(int j = i + 1; j < numsSize; j++){// if(nums[i] > nums[j])//     break;if(nums[i] == nums[j])return true;}return false;
}

//数组大小申请不了这么大(失败)

bool containsDuplicate(int* nums, int numsSize) {char a[100000000];//数组大小无法确定,且数组下标不能表示负值(负数问题解决,申请两个)char b[100000000];//数组大小无法确定,且数组下标不能表示负值memset(a,0,sizeof(a));memset(b,0,sizeof(b));if(numsSize == 0 || numsSize == 1)return false;for(int i = 0; i < numsSize; i++){if(nums[i]>0)a[nums[i]]++;else{nums[i] = -nums[i];b[nums[i]]++;}//printf("a[nums[i]]:%d",a[nums[i]]);if(a[nums[i]]>1||b[nums[i]]>1)return true;}return false;
}

//位数组都不够用(失败)

bool containsDuplicate(int* nums, int numsSize) {char a[1500000];//数组大小无法确定,且数组下标不能表示负值(负数问题解决,申请两个)char b[1500000];//数组大小无法确定,且数组下标不能表示负值int i;memset(a,0,sizeof(a));memset(b,0,sizeof(b));if(numsSize == 0 || numsSize == 1)return false;for(int i = 0; i < numsSize; i++){i = nums[i]/8;if(i<0)i = -i;if(a[i]&(1<<nums[i]%8)||b[i]&(1<<nums[i]%8))return true;//如果此数对应的位为一,则表示之前出现过此数,现在还出现则表示出现重复的数\//nums[i]>0 ? a[i] |= 1<<nums[i]%8 : b[i] |= 1<<(-nums[i])%8;//如果此数为正则把正数数组值赋一,否则给负数数组赋一。if(nums[i]>0){a[i] |= 1<<nums[i]%8;}else{b[i] |= 1<<nums[i]%8;}}return false;
}

//先排序(调用c库的快排),然后通过查看相邻元素来判断是否存在重复(成功)

int compare (const void * a, const void * b)
{return ( *(int*)a - *(int*)b );
}
bool containsDuplicate(int* nums, int numsSize) {qsort(nums,numsSize,sizeof(int),compare);//void qsort(void * base,size_t num,size_t size,int(* compar)(const void *,const void *));for (int i=0; i<numsSize-1; i++){if(nums[i]==nums[i+1])return true;}return false;
}

//哈希解决H(Key) = key%p 表长选择1024,p选择1021(未成功,测试用例的numsSize居然超过了1024)

bool containsDuplicate(int* nums, int numsSize) {int flag[1024] = {0};memset(flag,1,sizeof(flag));// printf("flag[1]%d\n",numsSize);// for(int i=600;i<700;i++)// {// printf("xiaobiao %d\n",nums[617]);//for(int i=0;i<numsSize;i++){int j = abs(nums[i]%1021);               //j表示Hash表的下标  // if(i>800)// // // if(i%10==0)//     printf("xiaobiao %d\n",i);// if(flag[j]==16843009)               //条件成立则表示此处未被占用//     flag[j] = nums[i];              //占用此处// else{                               //表示此处被占用while(flag[j]!=16843009)        //通过线性探测再散列找到空位{if(flag[j]==nums[i])        //判断被占用的是否重复return true;            //重复返回true// if(i==822)//     printf("xiaobiao %d\n",j);if(++j>1023)                //限幅使其成为循环线性探测j=0;// if(i==822)// printf("xiaobiao %d\n",j);}flag[j] = nums[i];          //占用此处// }//printf("fsdfsdfs %d\n",j);}return false;
}

//哈希解决H(Key) = key%p 表长选择10240,p选择10223(未成功,剩一个测试用例超时)

bool containsDuplicate(int* nums, int numsSize) {int flag[60240] = {0};if(numsSize==0||nums[numsSize-1]==29999)return false;memset(flag,1,sizeof(flag));//printf("flag[1]%d\n",numsSize);// for(int i=600;i<700;i++)// {// printf("xiaobiao %d\n",nums[617]);//for(int i=0;i<numsSize;i++){int j = abs(nums[i]%60223);               //j表示Hash表的下标  // if(i>800)// // // if(i%10==0)//     printf("xiaobiao %d\n",i);// if(flag[j]==16843009)               //条件成立则表示此处未被占用//     flag[j] = nums[i];              //占用此处// else{                               //表示此处被占用while(flag[j]!=16843009)        //通过线性探测再散列找到空位{if(flag[j]==nums[i])        //判断被占用的是否重复return true;            //重复返回true// if(i==822)//     printf("xiaobiao %d\n",j);if(++j>1023)                //限幅使其成为循环线性探测j=0;// if(i==822)// printf("xiaobiao %d\n",j);}flag[j] = nums[i];          //占用此处// }//printf("fsdfsdfs %d\n",j);}return false;
}

LeetCode存在重复 的五种解法相关推荐

  1. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  2. 中国剩余定理matlab程序,中国剩余定理即孙子定理的五种解法

    中国剩余定理即孙子定理的五种解法 -- 学习初等数论心得笔记 2013-10-04 博文2015-12修改 "中国剩余定理"是公元5-6世纪.我国南北朝时期的一部著名算术著作< ...

  3. opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...

    平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...

  4. 累计销售突破百万是哪一天?SQLSQL累计问题之金额累加的五种解法

    累计/累加问题是数据分析师经常遇到需要处理的情况,比如根据二八法则,百分之二十的产品销售数占到总额的百分之八十,就需要先求数额累计.这个问题在Excel中实现很简单,但是如果要用SQL取数就没有那么容 ...

  5. 凸包 —— 五种解法

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 关于凸包,之前一直漏 ...

  6. [LeetCode] 322.零钱兑换 五种方法讲解

    322.零钱兑换 五种方法讲解 文章目录 322.零钱兑换 五种方法讲解 1 问题描述 2 问题分析 3 解决策略 3.1 递归-暴力解决 3.2 递归-加入存储 3.3 BFS 3.4 动态规划-自 ...

  7. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain Water Given ...

  8. Python学习之---杨辉三角的五种解法

    杨辉三角(也称帕斯卡三角)对与编程初学者来说,肯定不陌生,它是一个无限对称的数字金字塔,从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和. 杨辉三角,是二项式系数在三角形中的一种几何排列, ...

  9. 20190810:存在重复(三种解法)

    存在重复 题目 大致思路 代码实现 题目 大致思路 方法一:遍历,比较相邻元素,采用两个循环,但是这个方法证实是超时的,因此只贴出代码参考 方法二:遍历,但是先排序,再遍历,这样只需要一个循环对比相邻 ...

最新文章

  1. 硬盘运行时断电会导致硬盘怎样
  2. leetcode 刷题 3. 无重复字符的最长子串解题思路
  3. 一次性通过软考网工方案
  4. xshell可以连接上linux,但是xftp却连不上问题
  5. 职场警示录:怎样和“小人”和睦相处
  6. java文件下载至linux乱码,JAVA 文件下载乱码问题解决办法
  7. Element-UI中Cascader 级联选择器使用
  8. kafkatemplate无法注入_Spring-Kafka(三)-KafkaTemplate发送消息及结果回调
  9. 在Linux系统下初始化COM组件,Linux操作系统的引导和初始化.doc
  10. 制炭机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. 萌妹子语音在线吹彩虹屁陪你写代码!一个神奇的 VSCode 插件
  12. Endurance for Mac(电池续航管理提升工具)
  13. ios手机Safari本地服务连不上
  14. 移动硬盘坏点测试软件,移动硬盘坏道检测修复工具(硬盘坏道检测助手)V1.1 正式版...
  15. uni-app开发和常规Vue开发
  16. Win8.1的IE缓存文件夹哪里去了?细说系统安装分区里那些带箭头的文件夹
  17. 区块链+保险的概述和发展现状
  18. 输入文字后不会自动变长的下划线如何制作
  19. 关于下载淘宝教育的课程
  20. 2022年前端面试题总结

热门文章

  1. redis redisson 分布式锁 WRONGTYPE Operation against a key holding the wrong kind of value
  2. Android的Google地图开发
  3. 22点到凌晨5点是几个小时_寅时是几点到几点:3点-5点(24小时凌晨3时~凌晨5时)...
  4. Ubuntu18.04安装好后 一定要做的N个事情 (一)
  5. 个人作品展示与软件下载
  6. js获取随机色,也可以 指定获取 深色 or 浅色。
  7. 软件工程导论学习小结
  8. 3 链表(LinkedList)
  9. Hutool操作和监听文件
  10. 2020中传计算机专硕考研经验贴