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

# 题目

在一个长度为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. 自学Java测试代码一数据类型、数组使用

    2017-08-22 21:23:37. writer:pprp package test; public class helloWorld { int maxn = 123; //常量,需要定义一个 ...

  2. maven 本地仓库的配置

    <?xml version="1.0" encoding="UTF-8"?> <!--Licensed to the Apache Softw ...

  3. MySQL索引最左原则

    通过实例理解单列索引.多列索引以及最左前缀原则 实例:现在我们想查出满足以下条件的用户id: 因为我们不想扫描整表,故考虑用索引. 单列索引: ALTER TABLE people ADD INDEX ...

  4. mvn deploy返回400错误的几种可能

    user credentials are wrong url to server is wrong user does not have access to the deployment reposi ...

  5. Java 练习题摘录

    2018-01-21 23:23:08 1.finally与return同时出现的情况 finally中有return语句则会使try...catch中的return语句失效 public stati ...

  6. 最优化问题 Optimization Problems & 动态规划 Dynamic Programming

    2018-01-12 22:50:06 一.优化问题 优化问题用数学的角度来分析就是去求一个函数或者说方程的极大值或者极小值,通常这种优化问题是有约束条件的,所以也被称为约束优化问题. 约束优化问题( ...

  7. 如何高效的使用 Git

    -- 代码昨天还是运行好好的今天就不行了. 代码被删了. 突然出现了一个奇怪的 bug,但是没人知道怎么回事. 如果你出现过上面的任何一种情况,那本篇文章就是为你准备的. 除了知道 git add, ...

  8. Oracle 冷备份详解【实战案例】

    Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...

  9. 【BZOJ3144】切糕(网络流,最小割)

    [BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...

  10. IDEA运行时Information:java: Errors occurred while compiling module!

    在网上找了资源 说看一下项目JDK,字符编码UTF-8,但是都不很实用,突然发现: IDEA的右下角改变字符编码的按钮,先改成GBK然后再改成UTF-8,然后就OK了. 原因:导入开源的项目的时候,你 ...