面试题03. 数组中重复的数字

本题要求找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例1:

输入: [2,3,1,0,2,5,3]

输出: 2或3

限制:2 <= n <= 100000

解法一:

一个简单的方法是把输入的数组进行排序,遍历排序后的数组找到重复的数字。排序一个长度为n的数字的时间复杂度为O(nlogn),所以这种方法的时间复杂度为O(nlogn)。

解法二:

使用哈希表来解决这个问题。从头到尾顺序扫描数组中的每一个数,没扫描一个数字可以用O(1)的时间判断在哈希表中是否包含此数字,如果哈希表中没有此数字就将此数字加入到哈希表中,如果哈希表中已存在此数字就能找到一个重复的数字。算法的时间复杂度为O(n),但是空间复杂度也为O(n),以空间换区时间。

解法三:

数组中的数字为0到n-1的范围内。如果这个数组中没有重复的数字,则对应的i位置的数据也为i。可以重排此数组,扫描数组中的每一个数字,当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i。如果是,接着扫描下一个数字。如果不是,再拿它和第m个数字比较,如果相等则找到重复的数据。否则就把第i个数字与第m个数字交换。重复这个比较、交换的过程,直到找到一个重复的数字。

leetcode解答:

class Solution {public:int findRepeatNumber(vector<int>& nums) {if(nums.size()<=0)return false;for(int i=0;i<nums.size();i++){if(nums[i]<0||nums[i]>nums.size()-1)return false;}for(int i=0;i<nums.size();i++){while(nums[i]!=i){if(nums[i]==nums[nums[i]])return nums[i];int a=nums[i];nums[i]==nums[nums[i]];nums[nums[i]]=a;}}return false ;}
};

牛客网解答:

class Solution {public:// Parameters://        numbers:     an array of integers//        length:      the length of array numbers//        duplication: (Output) the duplicated number in the array number// Return value:       true if the input is valid, and there are some duplications in the array number//                     otherwise falsebool duplicate(int numbers[], int length, int* duplication) {if(numbers==nullptr||length<=0)return false;for(int i=0;i<length;i++){if(numbers[i]<0||numbers[i]>length-1)return false;}for(int i=0;i<length;i++){while(numbers[i]!=i){if(numbers[i]==numbers[numbers[i]]){*duplication=numbers[i];return true;             }int a=numbers[i];//交换numbers[i]=numbers[a];numbers[a]=a;}}return false;}
};

leetcode|剑指offter|面试题3:数组中重复的数字相关推荐

  1. 剑指Offer - 面试题3. 数组中重复的数字(哈希)

    1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...

  2. 剑指offer 面试题03. 数组中重复的数字

    找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...

  3. 剑指offer面试题03. 数组中重复的数字(Array)

    题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...

  4. 剑指offer面试题[51]-数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...

  5. 【LeetCode】面试题 03. 数组中重复的数字

    [LeetCode]面试题 03. 数组中重复的数字 文章目录 [LeetCode]面试题 03. 数组中重复的数字 一.遍历数组 二.原地置换 总结 一.遍历数组 由于只需要找出数组中任意一个重复的 ...

  6. 剑指offer: 面试题03. 数组中重复的数字

    题目:找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...

  7. leetcode|剑指offter|面试题4:二维数组中的查找

    面试题04. 二维数组中的查找 问题描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判 ...

  8. LeetCode 面试题 03 数组中重复的数字

    原题链接 标签: 数组 集合 解题思路,找到数组中重复的任何一个元素.所以直接创建一个Set就解决了 class Solution {public int findRepeatNumber(int[] ...

  9. 剑指offer面试题[29]-数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

最新文章

  1. 1过程流程图 3 apqp_如何绘制流程图?这里有3种绘制方法,既简单又高效!1分钟可学会...
  2. mongoDB研究笔记:分片集群的工作机制
  3. nchw_to_nhwc=True
  4. python2.7更新pip_CentOS升级Python2.6到Python2.7并安装pip
  5. FileZilla Server下载以及安装使用
  6. H.264文件解析与码流分析
  7. 通过自定义函数计算阶乘
  8. 【4500字归纳总结】一名软件测试工程师需要掌握的技能大全
  9. 强大的健身软件——Keep
  10. BAT实现文件下载功能
  11. 腾讯广点通接入总结及源码
  12. java语言基础知识(完整版)
  13. 微信小程序:更改字体(text)和图标(icon)的颜色以及RGB颜色值与十六进制颜色码之间的转换
  14. 5.3Web服务器简介及HTTP协议
  15. 子曰:“以德报怨,何以报德?以直报怨,以德报德!”
  16. DDD——让天下没有难调的程序
  17. oc cyclic dependency
  18. 实名认证接口 网络平台实名制API
  19. Hibernate出现java.lang.IllegalArgumentException: org.hibernate.QueryException
  20. 好工具推荐系列:跨平台安卓实时投屏软件QtScrcpy

热门文章

  1. 电信物联网开放平台NB-IoT商业项目已投产
  2. ubuntu18.04安装vim
  3. 微软解释“云下载”如何重新安装Windows 10
  4. 判断设置了css省略号样式的元素是否出现了省略号
  5. 华大开发板SW失效,无法下载程序
  6. Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试
  7. 1553B数据总线用终端电连接器-DK-6211
  8. mongodb数据库优缺点分析(扫盲)
  9. 前端瓦片地图加载之塞尔达传说旷野之息
  10. 量化对冲策略在国内的实践历程