leetcode|剑指offter|面试题3:数组中重复的数字
面试题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:数组中重复的数字相关推荐
- 剑指Offer - 面试题3. 数组中重复的数字(哈希)
1. 题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组 ...
- 剑指offer 面试题03. 数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 剑指offer面试题03. 数组中重复的数字(Array)
题目描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...
- 剑指offer面试题[51]-数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 【LeetCode】面试题 03. 数组中重复的数字
[LeetCode]面试题 03. 数组中重复的数字 文章目录 [LeetCode]面试题 03. 数组中重复的数字 一.遍历数组 二.原地置换 总结 一.遍历数组 由于只需要找出数组中任意一个重复的 ...
- 剑指offer: 面试题03. 数组中重复的数字
题目:找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...
- leetcode|剑指offter|面试题4:二维数组中的查找
面试题04. 二维数组中的查找 问题描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判 ...
- LeetCode 面试题 03 数组中重复的数字
原题链接 标签: 数组 集合 解题思路,找到数组中重复的任何一个元素.所以直接创建一个Set就解决了 class Solution {public int findRepeatNumber(int[] ...
- 剑指offer面试题[29]-数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
最新文章
- 1过程流程图 3 apqp_如何绘制流程图?这里有3种绘制方法,既简单又高效!1分钟可学会...
- mongoDB研究笔记:分片集群的工作机制
- nchw_to_nhwc=True
- python2.7更新pip_CentOS升级Python2.6到Python2.7并安装pip
- FileZilla Server下载以及安装使用
- H.264文件解析与码流分析
- 通过自定义函数计算阶乘
- 【4500字归纳总结】一名软件测试工程师需要掌握的技能大全
- 强大的健身软件——Keep
- BAT实现文件下载功能
- 腾讯广点通接入总结及源码
- java语言基础知识(完整版)
- 微信小程序:更改字体(text)和图标(icon)的颜色以及RGB颜色值与十六进制颜色码之间的转换
- 5.3Web服务器简介及HTTP协议
- 子曰:“以德报怨,何以报德?以直报怨,以德报德!”
- DDD——让天下没有难调的程序
- oc cyclic dependency
- 实名认证接口 网络平台实名制API
- Hibernate出现java.lang.IllegalArgumentException: org.hibernate.QueryException
- 好工具推荐系列:跨平台安卓实时投屏软件QtScrcpy