问题描述

找出数组中重复的数字。
在一个长度为 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. 数组中重复的数字的更多相关文章

  1. 【Java】 剑指offer(1) 找出数组中重复的数字

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...

  2. 【剑指Offer】50、数组中重复的数字

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

  3. 剑指offer(50)数组中重复的数字

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

  4. 剑指offer五十之数组中重复的数字

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

  5. 【剑指Offer】面试题03. 数组中重复的数字

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

  6. 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)

    PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...

  7. 剑指offer第二版-3.数组中重复的数

    面试题3:数组中重复的数 题目要求: 在一个长度为n的数组中,所有数字的取值范围都在[0,n-1],但不知道有几个数字重复或重复几次,找出其中任意一个重复的数字. 解法比较: /** * Copyri ...

  8. 剑指offer 面试题 删除链表中重复的节点

    题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...

  9. 剑指offer 面试题56. 数组中只出现一次的两个数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...

随机推荐

  1. 资源分配(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 资源设置好以后,不能光摆着看,分配到各任务中去才是正道. 分配资源就需要回到与任务相关的视图了,比如[任务工作表]视图或者 ...

  2. webservice注意事项

    1.private static final QName PORT_NAME = new QName("http://server.helloworld.cxf.demo/",&q ...

  3. SpringBoot整合log4j日志框架

    Spring Boot 2.x默认使用Logback日志框架,要使用 Log4j2必须先排除 Logback. 加入修改依赖 <dependency> <groupId>org ...

  4. nim_duilib(3)之按钮

    introduction 更多控件用法,请参考 here 和 源码. 本文的代码基于这里 lets go xml文件添加代码 下面的xml文件内容,删除label控件的相关代码,增加了3个按钮. 其中 ...

  5. 【LeetCode】74. Search a 2D Matrix 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 左下或者右上开始查找 顺序查找 库函数 日期 题目地 ...

  6. codeforces626D . Jerry's Protest

    Andrew and Jerry are playing a game with Harry as the scorekeeper. The game consists of three rounds ...

  7. 圆桌问题(hdu4841)

    圆桌问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submi ...

  8. 1226 - One Unit Machine

    1226 - One Unit Machine   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  9. Docker 与 K8S学习笔记(六)—— 容器的资源限制

    我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...

  10. mybatis查询时使用基本数据类型接收报错-attempted to return null from a method with a primitive return type (int)

    一.问题由来 自己在查看日志时发现日志中打印了一行错误信息为: 组装已经放养的宠物数据异常--->Mapper method 'applets.user.mapper.xxxMapper.xxx ...