原创博文,转载请注明出处!

# 题目

在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。

# 思路

借鉴二分查找的思想,将数字1~n拆分成1~m和m+1~n两部分,如果数字范围1~m中数字个数大于m,则重复数字在1~m中间,否则重复数字一定在数字范围m+1~n中。基于二分查找法不能找到全部的重复数字,例如{2,2,3,3,4,5,6,7}中数字区间为1~2的范围内2出现两次,但1没有出现,不能确定是每个数字出现一个还是某个数字出现两次。

# 代码

  1 #include <iostream>
2 #include <vector>
3 using namespace std;
4 class Solution{
5 public:
6 int duplication(vector<int> vec)
7 {
8 // 空数组
9 int length = vec.size();
10 if(vec.size() == 0)
11 return -1;
12
13 // 数字超界
14 for(int i =0;i<length;++i)
15 {
16 if(vec[i]<1 || vec[i]>length-1)
17 return -1;
18 }
19 // 定义数字范围
20 int begin = 1;
21 int end = length-1;
22
23 // 指定数字范围内的数字个数
24 while(begin<=end)
25 {
26 // 计算数字范围的中点
27 int mid = (begin + end)>>1;
28
29 // 统计指定数字范围内的数字个数
30 int count = countrange(vec,begin,mid,length);
31
32 if(end > begin)
33 {
34 // 更新数字范围
35 if(count>(mid - begin + 1))
36 end = mid;
37 else
38 begin = mid + 1;
39 }
40 else
41 {
42 if(count > 1)
43 return begin;
44 else
45 break;
46 }
47 }
48
49 return -1;
50 }
51
52 int countrange(vector<int> vec,int begin,int end,int length)
53 {
54 int count=0;
55 for(int i=0;i<length;++i)
56 {
57 if(vec[i]>=begin && vec[i]<=end)
58 ++count;
59 }
60
61 return count;
62 }
63 };
64
65 int main()
66 {
67 vector<int> vec ;
68 vector<int> vec1 = {1,2,3,4,5,6,7};
69 vector<int> vec2 = {1,1,2,3,4,5,6};
70 vector<int> vec3 = {2,2,3,3,4,5,6};
71
72
73 Solution solution;
74 cout<<solution.duplication(vec)<<endl;
75 cout<<solution.duplication(vec1)<<endl;
76 cout<<solution.duplication(vec2)<<endl;
77 cout<<solution.duplication(vec3)<<endl;
78
79 return 0;
80 }

# 复杂度

       时间复杂度为O(nlogn),空间复杂度为O(1)

# 测试用例

  • 空数组
  • 数字超界
  • 数组中包含一个重复数字
  • 数组中包含多个重复数字

【剑指offer】找出数组中任意重复的数字(不修改数组),C++实现的更多相关文章

  1. 剑指Offer 找出字符串中第一个只出现一次的字符

    题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...

  2. 剑指offer.找出数组中重复的数字

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

  3. 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ

    题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...

  4. 剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...

  5. 剑指 offer set 21 圆圈中最后剩下的数字

    思路 1. 经典解法是用环形链表模拟圆圈, 然后每次减少一个节点. 时间复杂度为 o(mn), 空间复杂度为 o(n) 2. 转化成数学问题, 递推公式决定下一个元素. 时间复杂度为 o(n), 空间 ...

  6. 【剑指Offer】字符流中第一个不重复的字符 解题报告(Python)

    [剑指Offer]字符流中第一个不重复的字符 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...

  7. 剑指Offer——算法复杂度中的O(logN)底数是多少

    剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...

  8. 【剑指Offer】删除链表中重复的结点 解题报告(Python)

    [剑指Offer]删除链表中重复的结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...

  9. 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针

    剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

随机推荐

  1. Caffe学习笔记(一):Caffe架构及其模型解析

    Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...

  2. iOS日常学习 - 如何配置.gitignore文件

    文章为转载学习,原文地址 为什么要配置.gitigore 在我们使用git的过程当中,不是任何文件都需要commit到本地或者远程仓库的,比如一些三方库文件. 那么作为一个git新手,很多人不知道如何 ...

  3. 程序员清理xcode垃圾命令

    xcrun simctl list devices xcrun simctl delete unavailable

  4. JAVA小工具打包

    D: cd D:\xxx\IPOSpider javac -d bin/ src/com/xxx/IPOSpider.java src/com/xxx/ConfigProperties.java -c ...

  5. consul 小結

    Consul Config 使用Git做版本控制的实现 https://segmentfault.com/a/1190000013807641 服务发现 - consul 的介绍.部署和使用 http ...

  6. 删除Rancher节点的正确姿势

    在Rancher上疏散该节点 删除节点 登录该节点宿主机,删除rancher相关容器 docker rm -f -v $(docker ps -aq) 删除该节点的所有volume docker vo ...

  7. raid1磁盘更换---测试

    安装centos6.71. CentOS安装过程配raid.参考:http://www.360doc.com/content/13/1209/21/14661619_335823338.shtml. ...

  8. Spring Boot的自动配置的原理

    Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器. 1.1.1.   ...

  9. 【Python】@staticmethod和@classmethod的作用与区别

    前言 Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法,一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法.而使用@static ...

  10. 五、Google Code Prettify:实现代码高亮的JS库

    介绍 code prettify 解释为 “代码修饰”. 他由JS代码和CSS代码构成,用来高亮显示HTML页面中的代码. 支持:C, Java, Python, Bash, HTML, XML, J ...