【剑指offer】找出数组中任意重复的数字(不修改数组),C++实现
原创博文,转载请注明出处!
# 题目
在一个长度为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++实现的更多相关文章
- 剑指Offer 找出字符串中第一个只出现一次的字符
题目描述 找出字符串中第一个只出现一次的字符 如果无此字符 请输出'.' 输入描述: 输入一串字符,由小写字母组成 输出描述: 输出一个字符 输入例子: asdfasdfo 输出例子: o 思路:数组 ...
- 剑指offer.找出数组中重复的数字
题目: 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数 ...
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...
- 剑指Offer的学习笔记(C#篇)-- 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. 一 . 题目分析 该题目并不是难题,但该题目考察目的是正确的选择合适的查找方法.题目中有一个关键词是:排序数组,也就是说,该数组已经排好了,我一开始直接 ...
- 剑指 offer set 21 圆圈中最后剩下的数字
思路 1. 经典解法是用环形链表模拟圆圈, 然后每次减少一个节点. 时间复杂度为 o(mn), 空间复杂度为 o(n) 2. 转化成数学问题, 递推公式决定下一个元素. 时间复杂度为 o(n), 空间 ...
- 【剑指Offer】字符流中第一个不重复的字符 解题报告(Python)
[剑指Offer]字符流中第一个不重复的字符 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...
- 剑指Offer——算法复杂度中的O(logN)底数是多少
剑指Offer--算法复杂度中的O(logN)底数是多少 前言 无论是计算机算法概论.还是数据结构书中,关于算法的时间复杂度很多都用包含O(logN)这样的描述,但是却没有明确说logN的底数究竟是多 ...
- 【剑指Offer】删除链表中重复的结点 解题报告(Python)
[剑指Offer]删除链表中重复的结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针
剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...
随机推荐
- Ubuntu16.04怎么安装virtualenv虚拟环境
最近安装virtualenv的python虚拟环境,在网上找了很多,尝试了很多,都有各种问题,最终搞定后,给大家分享下我的过程,希望大家少走弯路. 本次安装是基于Ubuntu16.04Linux版本安 ...
- android emulator 安装中文输入法
android emulator 模拟器内置没有中文输入法,有些情况下我们需要输入正文就比较麻烦. 在模拟器的浏览器中下载输入法然后安装,会提示系统不兼容的情况. 这是由于Android应用多基于AR ...
- 第八篇:Spark SQL Catalyst源码分析之UDF
/** Spark SQL源码分析系列文章*/ 在SQL的世界里,除了官方提供的常用的处理函数之外,一般都会提供可扩展的对外自定义函数接口,这已经成为一种事实的标准. 在前面Spark SQL源码分析 ...
- VS2012 创建 WebService
1.文件——新建——项目——Visual C#——Web——ASP.NET 空 Web 应用程序. 2.右键项目——添加——新建项——Web——Web 服务. 3.按 F5 启动调试,浏览器将显示接口 ...
- tyvj 1027 木瓜地 简单模拟
P1027 木瓜地 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 4TH 描述 Bessie不小心游荡出Farmer John的田地 ...
- hiho 1318 非法二进制数 dp
#1318 : 非法二进制数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的. 小Hi想知道在所有 n 位 ...
- vue element new vue const
new Vue{ el:"app", } ========= const app = new Vue({ router, data:{....} }).$mount('#app') ...
- 转 tensorflow模型保存 与 加载
使用tensorflow过程中,训练结束后我们需要用到模型文件.有时候,我们可能也需要用到别人训练好的模型,并在这个基础上再次训练.这时候我们需要掌握如何操作这些模型数据.看完本文,相信你一定会有收获 ...
- 堆 Heap
2018-03-01 20:38:34 堆(Heap)是可以用来实现优先的队列的数据结构,而不是堆栈. 若采用数组或者链表实现优先队列 若采用树的结构 如果采用二叉搜索树,那么每次删除,比如删除最大值 ...
- windows系统下,安装多个版本的jdk,java -version
问题描述: 开始安装了 jdk8 后来装了jdk9,可以为项目配置不同的jdk,相安无事: 今天发现软件需要jdk8的环境,结果我的java -version始终是jdk9.0.1: 解决办法:使ja ...