《剑指offer》面试题03. 数组中重复的数字
问题描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
这道题和leetcode 287. 寻找重复数相似:
代码1
时间复杂度\(O(N)\),空间复杂度\(O(N)\).
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n = nums.size(),i;
vector<int> map(n,0);
for(i = 0; i< n; ++i)
{
++map[nums[i]];
if(map[nums[i]]>1)
break;
}
return nums[i];
}
};
结果:
执行用时 :116 ms, 在所有 C++ 提交中击败了17.01%的用户
内存消耗 :24 MB, 在所有 C++ 提交中击败了100.00%的用户
代码2
如果允许移动数据,时间复杂度为\(O(N\log(N))\),空间复杂度为\(O(1)\):
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n = nums.size(),i;
sort(nums.begin(),nums.end());
for(i = 0; i < n-1; ++i)
{
if(nums[i] == nums[i+1])
break;
}
return nums[i];
}
};
结果:
执行用时 :132 ms, 在所有 C++ 提交中击败了12.97%的用户
内存消耗 :23.3 MB, 在所有 C++ 提交中击败了100.00%的用户
代码3
如果允许修改数据,时间复杂度为\(O(N)\),空间复杂度为\(O(1)\):
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i,n = nums.size(),j;
for(i = 0; i < n; ++i)
{
j = abs(nums[i]);
if(nums[j] < 0)return j;
else nums[j] = -nums[j];
}
//因为一定有重复的数字,前面如果没有退出程序的话说明重复的是0
return 0;
}
};
结果:
执行用时 :92 ms, 在所有 C++ 提交中击败了28.16%的用户
内存消耗 :22.8 MB, 在所有 C++ 提交中击败了100.00%的用户
代码4
如果允许移动数据,时间复杂度为\(O(N)\),空间复杂度为\(O(1)\):
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i,n = nums.size(),j;
for(i = 0; i < n; ++i)
{
//我不在该在的地方,我该在的地方不是我
while(nums[i] != i && nums[i] != nums[nums[i]])
swap(nums[i],nums[nums[i]]);
//我不在该在的地方,我该在的地方还有我
if(nums[i] != i && nums[i] == nums[nums[i]])
break;
}
return nums[i];
}
};
结果:
执行用时 :92 ms, 在所有 C++ 提交中击败了28.16%的用户
内存消耗 :23.1 MB, 在所有 C++ 提交中击败了100.00%的用户
代码5
如果不允许移动数据,不允许修改数据,时间复杂度为\(O(N\log(N))\),空间复杂度为\(O(1)\),注意不能简单的写为
int findRepeatNumber(vector<int>& nums) {
int i,n = nums.size(),left = 1,right = n,middle,num;
while(left < right)
{
middle=left+(right-left)/2;
cout<<"("<<left<<","<<middle<<","<<right<<")"<<endl;
num = 0;
for(i = 0; i < n; ++i)
if(nums[i]+1 <= middle)
++num;
cout<<" "<<num<<endl;
if(num <= middle)
left = middle+1;
else
right = middle;
}
return left-1;
}
};
反例[0, 1, 2, 3, 4, 11, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],上面的写法适宜于写\(n+1\)个在1到n之间的元素,即不缺元素,这个例子缺个5.正确写法待思考。
《剑指offer》面试题03. 数组中重复的数字的更多相关文章
- 【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...
- 【剑指Offer】50、数组中重复的数字
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果 ...
- 剑指offer(50)数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指offer五十之数组中重复的数字
一.题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 【剑指Offer】面试题03. 数组中重复的数字
题目 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意 ...
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...
- 剑指offer第二版-3.数组中重复的数
面试题3:数组中重复的数 题目要求: 在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字. 解法比较: /** * Copyri ...
- 剑指offer 面试题 删除链表中重复的节点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- 剑指offer 面试题56. 数组中只出现一次的两个数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...
随机推荐
- 报表(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 好吧,今天这一篇,偷懒放水,不就是[报表]嘛,想看的话一个一个功能按钮点出来看就知道是咋肥四了,我就不一一截图了哈. 嗯, ...
- 工作簿拆分(Excel代码集团)
一个工作簿中包括N个工作表,将各个工作表拆分成工作簿. 工作表数量不定,表内内容不限,拆分后保存于当前文件夹内. Sub Sample() Dim MySheetsCount As Long For ...
- 当动态桌面遇上 HTML5
DreamScene2 + HTML5 = 无限可能.时隔一周,DreamScene2 动态桌面经过几个小版本的迭代,修复了一些问题并且功能也得到了增强.欢迎 Star 和 Fork https:// ...
- Django中提示消息messages的设置
1. 引入messages模块 1 from django.contrib import messages 2. 把messages写入view中 1 @csrf_exempt 2 def searc ...
- THUSC 2021 游记
想了想不往博客园放不行,还是放上来了. 原文 \[\texttt{Brief Introduction} \] 众所周知,THUSC2021 5 月 15-16 日在杭州市 XJ 中学举办,然而由于 ...
- std::function介绍 -转载
类模版std::function是一种通用.多态的函数封装.std::function的实例可以对任何可以调用的目标实体进行存储.复制.和调用操作,这些目标实体包括普通函数.Lambda表达式.函数指 ...
- Spring学习(三)几种集合属性的注入方式
1.前言 众所周知.java中不只有八大简单类型.还有一些集合类型.本文围绕集合类型的注入做一个总结. 2.项目骨架 3.过程 1.创建实体类AllCollectionType package com ...
- ORACLE数据库登录显示ORA-28001: the password has expired
Oracle数据库登录显示 "这个密码已过期,请输入新密码" 点击win键 找到Oracle的SQL Plus 点击打开之后输入登录的用户名密码,然后会显示该密码已过期,输入新口令 ...
- 【LeetCode】1170. Compare Strings by Frequency of the Smallest Character 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 日期 题目地址:https://leetc ...
- MySQL与Oracle 差异比较之二函数
函数 编号 类别 ORACLE MYSQL 注释 1 数字函数 round(1.23456,4) round(1.23456,4) 一样:ORACLE:select round(1.23456,4) ...