算法-寻找数组中的重复值

  • 寻找数组中的重复值

寻找数组中的重复值

题目来源于:Leetcode-287。本题归类到简单我无法理解…要满足四个条件需要用很特定的解法,面试中要是用到的话很可能是在给自己挖坑,所以我这里只讲几种能满足一部分条件的解法。

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]
输出: 2
示例 2:输入: [3,1,3,4,2]
输出: 3
说明:1、不能更改原数组(假设数组是只读的)。
2、只能使用额外的 O(1) 的空间。
3、时间复杂度小于 O(n2) 。
4、数组中只有一个重复的数字,但它可能不止重复出现一次。

下面给出四种解法,
1、第一种基于排序,大家都懂的,满足条件2、3、4。时间nlogn,空间n
2、第二种属于元素归位,其实和缺失最小正数那题挺像的,不过我们判断的时候,应当以目标位置中的元素是不是与当前元素重复为依据,如果索引不一致,但是值重复了,那就说明这是一个重复元素,满足2、3、4并且比排序方式更快。时间n,空间1
3、第三种是利用哈希表,满足1、3、4 。时间n空间n
4、第四种同样是利用哈希表,不过该哈希表我们可以自建,满足1、3、4。时间n空间n

第2类方式是比较好的。

    //方式1,排序,时空复杂度为nlog(n)和O(1)public int findDuplicate(int[] nums) {Arrays.sort(nums);for(int i=1;i<nums.length;i++){if(num[i]==nums[i-1]){return nums[i];}}return 0;}//方式2,按照最小缺失正数的思路来解,即元素归位//在数组中所有元素都处于1-n,我们把元素nums[i]放到i-1的位置//时间复杂度O(N),空间复杂度O(1)public int findDuplicate(int[] nums) {for(int i=0;i<nums.length;i++){while(i!=nums[i]-1){if((i!=nums[i]-1)&&nums[nums[i]-1]==nums[i]){return nums[i];}swap(nums,nums[i]-1,i);}}return 0;}private void swap(int nums[],int i,int j){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}//方式3,使用HashSet来映射,时空复杂度均为O(N)public int findDuplicate(int[] nums) {Set<Integer> set=new HashSet<>();for(int i=0;i<nums.length;i++){if(set.contains(nums[i])){return nums[i];}set.add(nums[i]);}return 0;}//方式4,自建map来映射,时空复杂度均为O(N)public int findDuplicate(int[] nums) {int[] map=new int[nums.length];for(int i=0;i<nums.length;i++){if(map[nums[i]]==1){return nums[i];}map[nums[i]]++;}return 0;}

算法-寻找数组中的重复值,四种解法相关推荐

  1. php数组重复值销毁,如何从PHP中删除数组中的重复值

    如何从PHP中删除数组中的重复值 如何从PHP中删除数组中的重复值? 21个解决方案 204 votes 使用array_unique(). 例: $array = array(1, 2, 2, 3) ...

  2. 去除html重复的元素 js,js数组中去除重复值的几种方法

    在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...

  3. php 从数组里删除元素,PHP从数组中删除元素的四种方法实例

    PHP从数组中删除元素的四种方法实例 一.总结 一句话总结:unset(),array_splice(),array_diff(),array_diff_key() 二.PHP从数组中删除元素的四种方 ...

  4. 最高效寻找重复数据,如何高效率的查找到数组中的重复值

    /*** @author zc*/ public class FindRepeatNumber {/**题目:在指定的数组中寻找重复的数字,假定当前数组中只有两个数字是相同的,并且不能借助其他容器*/ ...

  5. 寻找数组中的重复数字(java,可执行程序)

    package Array;import java.util.ArrayList; import java.util.Arrays;public class ex3_2 {public static ...

  6. php除去重复数组算法,如何从PHP中的多维数组中删除重复值

    我有一个类似的问题,但我找到了100%的工作解决方案.<?php     function super_unique($array,$key) { $temp_array = []; forea ...

  7. php 数组中重复值,php找出数组中的重复值

    一个数组不可能存在两个相同的key的,所有改成二维数组,相信你从数据库查出来也是二维数组 $provinces = [ [ 'id' => 1, 'pinyin' => 'hunan', ...

  8. 冒泡排序--通过冒泡算法让数组中最大的值成为数组中最后一个值

    var nums = [];//定义一个空数组for(var i=0;i<5;i++){//要用户输入五个数字,循环5次nums[i] = parseInt(prompt('请输入数字'));/ ...

  9. php 如何清空数组_PHP从数组中删除元素的四种方法实例

    删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: $array = array(0 => "a", 1 => "b", 2 =& ...

最新文章

  1. win10家庭版远程桌面连接出现身份验证错误
  2. MySQL清理注册表
  3. 【专题】多角度深入解析开放原子开源基金会
  4. 今天的西红柿就跑了的P8U8源码
  5. chromebook刷_使用Chromebook编码
  6. freeldr 如何调用_BootMain的
  7. mysql ansi导入_mysql导入csv的4种报错的解决方法
  8. oracle 数据实时同步方案,ORACLE数据库热备方案
  9. c语言十六进制字符串求和,一串十六进制求和软件 两个十六进制怎么相加的
  10. 2021-3-4大学化学无机化学原理(1)理想气体的状态方程和分压定律
  11. Kubernetes(K8s)容器设计模式实践案例 单节点多容器模式
  12. 高仿美团iOS版,版本号5.7
  13. Qt经典蓝牙系列四(经典蓝牙客户端的设计 纯Qt代码) android/windows10
  14. 关于open_cursors和session_cached_cursors的参数值
  15. Fiddler抓包:详解Fiddler抓包工具软件使用教程
  16. 《算法图解》学习笔记(五):哈希表,小名散列表(附代码)
  17. C语言将十进制转换成十六进制
  18. javascript 的七种继承方式(三)组合继承
  19. lepus天兔数据库监控系搭建
  20. 《2021年全国沙雕新闻TOP30》(全程卧槽!)

热门文章

  1. java获取工作日 日历接口_节假日api接口之获取指定日期的节假日信息
  2. bert获得词向量_Bert输入输出是什么
  3. 移动互联网数据分析 移动客户端流量统计 移动客户端数据统计(一)
  4. grpc AS编译报No such property: javaCompilerTask for class错误
  5. 【0091】【创建postgres后端进程】PostgreSQL如何接收并处理客户端的socket请求(4)?
  6. 记录:php上传图片至服务器 并返回显示图片地址
  7. 【每日随笔】毕业论文答辩 ① ( 答辩流程梳理 | 答辩的一些注意点 )
  8. 【转】Swagger详解(SpringBoot+Swagger集成)
  9. 嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果
  10. 有限元方法入门:有限元方法简单的二维算例(三角形剖分)