剑指 Offer —— 数组中重复的数字
数组中的重复数字
题目描述
长度为 n 的数组里,所有数字都在 0 到 n-1 的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3}
,那么对应的输出是重复的数字 2 或者 3。(牛课网这里弄成「那么对应的输出是第一个重复的数字 2」了)
A 简单实现思路
借助外部数组 b,原数组中的数字记为外部数组的下标,外部数组的值来存储这个数字出现的次数。原数组中的数字都在 0 到 n-1 的范围内,因此外部数组 b 的长度为 n 即可。
public boolean duplicate(int[] numbers, int length, int[] duplication) {
if (numbers == null) {
return false;
}
int[] array = new int[length];
for (int i = 0; i < length; i++) {
if (array[numbers[i]] > 0) {
duplication[0] = numbers[i];
return true;
}
array[numbers[i]]++;
}
return false;
}
时间复杂度 O(n),空间复杂度 O(n)
B 剑指 Offer 思路
如果数组中没有重复的数字,排序后第 i 个位置会存放值为 i 的数字。因为数组中某些数字是重复的,在排序后,某个位置处会存放多个相同数字(逻辑上的,就相当于叠起来),有些位置就没有数字。前者就是我们要找的数字。但是我们并不去排序,只是利用这种思想,把值为 i 的元素放到下标为 i 的位置。
具体来说,我们从前往后依次遍历该数组。当遍历到下标 i 时,记该位置上的数字为 x,如果 x 等于 i,就跳过。如果 x 不等于 i,就判断 x 应放位置处(即下标 x 处)的数字(计作 m)是否已经是 x 了,如果是就找到了一个重复的数字(循环结束);如果 m 不等于 x,那么就交换下标 i、x 的两个数(保证把位置 i 处的 x 放置到正确的位置上),直到下标 i 位置的值是 i。
/**
* 将值为 i 的元素调整到下标为 i 的位置,如果该位置上的数已经等于 i 了,就说明 i 已经重复了
* @param numbers
* @param length
* @param duplication
* @return
*/
public static boolean jz(int[] numbers, int length, int[] duplication) {
for (int i = 0; i < length; i++) {
//下标 i 处的数 numbers[i],若不与下标 i 相等,就把 numbers[i] 放到下标 numbers[i] 处
while (numbers[i] != i) {
//在交换位置之前还要检查下标 numbers[i] 处的数字是否已经是 numbers[i],如果是就已经找到了重复的数字
if (numbers[numbers[i]] == numbers[i]) {
duplication[0] = numbers[i];
//注意这里不是 break
return true;
}
//交换下标为 i、numbers[i] 两个位置上的数字(保证值为 numbers[i] 的元素放到下标 numbers[i] 处)
swap(numbers, i, numbers[i]);
}
}
return false;
}
/**
* 交换下标为 i、j 的两个数
* @param numbers
* @param i
* @param j
*/
public static void swap(int[] numbers, int i, int j) {
int swap = numbers[i];
numbers[i] = numbers[j];
numbers[j] = swap;
}
剑指 Offer —— 数组中重复的数字的更多相关文章
- 剑指offer数组中重复的数字
package 数组; /*在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的. 也不知道每个数字重复几次.请找出数组中任意一个重复的数字. ...
- 剑指Offer——数组中重复的数字
题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度 ...
- 剑指offer 数组中重复的数
在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{ ...
- 剑指offer--16.数组中重复的数字
时间限制:1秒 空间限制:32768K 热度指数:198342 本题知识点: 数组 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复 ...
- 剑指offer 数组中的重复数字
问题描述: 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1 ...
- 剑指Offer-数组中重复的数字
package Array; /** * 数组中重复的数字 *在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次 ...
- 剑指Offer 数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只 ...
- python剑指offer数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指Offer——数组中出现次数超过一半的数字——一题多解
看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
随机推荐
- 【php】php开发的前期准备
原文来自:http://www.cnblogs.com/sows/p/6867675.html (博客园的)风马一族 侵犯版本,后果自负 php介绍 什么php? 一种服务器端的 HTML 脚本/编程 ...
- $.ajax中contentType: “application/json” 的用法
不使用contentType: “application/json”则data可以是对象 $.ajax({ url: actionurl, type: "POST", datTyp ...
- Valgrind 初次接触
Valgrind 英文的意思是:堆内存 它有很多小工具,作用各不相同 学习于: http://blog.csdn.net/sduliulun/article/details/7732906 http: ...
- ansible Ansible Galaxy ansible-playbook 安装 使用 命令 笔记 生成密钥 管控机 被管控机 wget epel源
笔记 ansible 安装 与salt对比 相同 都是为了同时在多台机器上执行相同的命令 都是python开发 不同 agent(saltstack需要安装.ansible不需要) 配置(salt配置 ...
- text()和html()区别
这两天看了一下html和jquery的选择器,并对w3chool上面的在线编辑产生了兴趣,但是在用textarea展示后台纯html的时候发生错误,查阅各种资料发现不行--心态炸了.废话不多说了,上干 ...
- PLAY2.6-SCALA(二) Actions, Controllers ,Results,routes
一.Action(play.api.mvc.Action) 大多数的应用的请求都是由action进行处理,并生成一个结果给客户端,Action有多种创建方式: 1. Action {Ok(" ...
- 项目上使用的每月1日自动导出Zabbix性能数据的python脚本
基于zabbix-manager python2.7 #!/usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "life&q ...
- 从 FastAdmin 看国内开源现状
从 FastAdmin 看国内开源现状 在做 FastAdmin 之前看过太多的国内开源软件,很多没有建立起正反馈,最终而烂尾. 国内开源者有时候收到的是负反馈. 比如遇到问题埋怨开源作者,对开源作者 ...
- OpenJudge_1477:Box of Bricks
描述 Little Bob likes playing with his box of bricks. He puts the bricks one upon another and builds s ...
- poj 2342 hdu 1520【树形dp】
poj 2342 给出每个顶点的happy值,还有若干组两个顶点L,K关系,表示K是L的上司.求当K.L不同时出现时获得的happy值的最大和. 设dp[u][0]表示不选u结点时获得的最大值,dp[ ...