剑指Offer-50.数组中重复的数字(C++/Java)
题目:
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
分析:
因为所有数字都在0到n-1的范围内,我们可以创建一个大小为n的数组v,每遍历一个数字,就将v[numbers[i]]标记为已访问过,每访问一个新的数字,就判断v中是否已经访问这个数字了,这样可以找到第一个重复的数字。
看了一下书中的答案,是通过遍历数组,将当前的数字和当前数字索引下的数字进行比较,如果不同就交换,直到访问的数字和该数字索引下的数字相等(不和当前的索引相同),便是第一个重复数字,如果将数组都遍历一遍了的话,就意味着没有重复数字。
以[1,3,2,0,2,5,3]举例
首先,遍历到数字1,数字1不等于当前索引0,且和numbers[1]也不相同,所以根numbers[1]的数字交换,当前数组为[3,1,2,0,2,5,3]。
由于3还是不等于0,再根numbers[3]交换,当前数组为[0,1,2,3,2,5,3].
由于0和当前索引0相同,扫描下一个数字,1和索引1相等,以此类推,直到扫描到numbers[4],也就是2,此时2不等于当前索引4,比较numbers[2]的数字恰好等于2,意味着这个元素是访问过的,这样便找到了第一个相同的元素。
还有一个比较巧妙的方法也是利用原数组,每访问一个元素,就将该元素作为索引指向的那个位置的元素进行标记,由于所有数字都在0到n-1的范围内,我们就将该数字作为索引指向的元素加上n,也就是如果访问到的元素是大于等于n的,意味着该索引数字,是我们当前访问过的,可以判断重复,要取当前数字的话只要减去n就可以了。
还是拿[1,3,2,0,2,5,3]举例
访问1,我们发现numbers[1]下的3小于n(7),意味着没有访问过,现在将1标记为访问,也就是将numbers[1]加上n,此时的数组为[1,10,2,0,2,5,3]
接下来访问下一个元素,但此时numbers[1]是10,大于7,意味着索引1代表的数字我们访问过了,要将numbers[1]的元素还原,减去7等于3,继续修改numbers[3]的元素为7,此时数组为[1,10,2,7,2,5,3]。
同理访问numbers[2]时,数组会变为[1,10,9,7,2,5,3]
访问numbers[3]时,数组会变为[8,10,9,7,2,5,3]
当我们访问numbers[4]时,也就是2这个数字时,此时numbers[2] > n(7),意味着2这个数字我们时访问过的!所以也就找到了第一个重复的数字。总结一下就是利用元素加上n来表示当前索引时我们访问过的,因为所有数字都在0到n-1的范围内,这个方法很巧妙。
程序:
C++
//use map
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
if(length == 0)
return false;
for(int i = 0; i < length; ++i){
if(m[numbers[i]] == 1){
*duplication = numbers[i];
return true;
}
else{
m[numbers[i]]++;
}
}
return false;
}
private:
map<int, int> m;
};
Java
//space O(1) time O(n)
public class Solution {
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
// Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
// 这里要特别注意~返回任意重复的一个,赋值duplication[0]
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers == null || length == 0)
return false;
for(int i = 0; i < length; ++i){
int index = numbers[i];
if(index >= length)
index -= length;
if(numbers[index] >= length){
duplication[0] = index;
return true;
}
numbers[index] += length;
}
return false;
}
}
剑指Offer-50.数组中重复的数字(C++/Java)的更多相关文章
- 剑指Offer 50. 数组中重复的数字 (数组)
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- [剑指Offer] 50.数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...
- 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...
- 5.1 剑指 Offer 03. 数组中重复的数字
类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...
- 【剑指Offer】数组中重复的数字 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 Set 快慢指针 日期 题目地址:https://leetcod ...
- [剑指Offer]3.数组中重复的数字
题目 找出数组中重复的数字. 在一个长度为n的数组中的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但是不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数组.例 ...
- Go语言实现:【剑指offer】数组中重复的数字
该题目来源于牛客网<剑指offer>专题. 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组 ...
- (python)剑指Offer:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- 剑指offer:数组中重复的数字
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度 ...
随机推荐
- 探索Kimi智能助手:如何用超长文本解锁高效信息处理新境界
目前,Kimi备受瞩目,不仅在社交平台上引起了广泛关注,而且在解决我们的实际问题方面也显示出了巨大潜力.其支持超长文本的特性使得我们能够更加灵活地配置信息,避免了频繁与向量数据库进行交互以及编写提示词 ...
- 力扣441(java&python)-排列硬币(简单)
题目: 你总共有 n 枚硬币,并计划将它们按阶梯状排列.对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币.阶梯的最后一行 可能 是不完整的. 给你一个数字 n ,计算并返回可形成 完整 ...
- 力扣54(java)-螺旋矩阵(中等)
题目: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. 示例 1: 提示: m == matrix.lengthn == matrix[i].leng ...
- 力扣423(java)-从英文中重建数字(中等)
题目: 给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9).按 升序 返回原始的数字. 示例 1: 输入:s = "owoztneoer"输出:&quo ...
- 【CDS技术揭秘系列 总篇】阿里云的云定义存储来了
简介: 全新发布的云定义存储 CDS 和传统的存储阵列.分布式存储.软件定义存储的区别在哪里?阿里云存储团队如何看待将来存储的发展趋势?本文邀请了 CDS 研发团队的核心技术负责人为大家揭开围绕着阿 ...
- dotnet core 3.1 将 UWP 控件嵌入到 WPF 应用 收到 UIA 消息主线程卡住
本文记录一个问题,此问题是在 .NET Core 3.1 的 WPF 应用里面,嵌入 UWP 控件之后,在收到 UIA 的消息时,可能让主线程卡住.暂时此问题还不知道具体的复现步骤,此问题预计和 WP ...
- 什么是IPD项目管理模式?聊聊IPD下的产品研发流程
IPD(集成产品开发)涵盖了产品从创意提出到研发.生产.运营等,包含了产品开发到营销运营的整个过程.围绕产品(或项目)生命周期的过程的管理模式,是一套生产流程,更是时下国际先进的管理体系.IPD(集成 ...
- van-tab吸顶后头部透明色渐变响应
方法一:监听滚动事件 $('.scrollContent').bind('touchmove', function(e){ var winHeight = $(window) ...
- JUC并发编程学习笔记(十九)原子引用
原子引用 带版本号的原子操作! 解决ABA问题,引入原子引用(乐观锁思想) AtomicStampedReference类解决ABA问题 package org.example.cas; import ...
- golang 常用操作
golang 获取切片 slice 第一个 最后一个 元素 复合数据类型切片通常用作Go中索引数据的口语结构. 该类型[]intSlice是具有类型为integer的元素的切片. len函数用于获取切 ...