LeetCode数组中重复的数字
LeetCode 数组中重复的数字
题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:[2,3,1,0,2,5,3]
输出:2或3
一得之见(Java/Python)
使用双循环,index 不等且 value 相等时,即重复。
时间复杂度 O(n²),空间复杂度 O(1)
/**
* 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
*
* @param nums 数组
* @return 任意一个重复的数字
*/
public static int findRepeatNumber(int[] nums) {
int result = -1;
int numsLen = nums.length;
for (int i = 0; i < numsLen; i++) {
for (int j = 0; j < numsLen; j++) {
if (i != j && nums[i] == nums[j]) {
result = nums[i];
break;
}
}
}
return result;
}
def find_repeat_number(nums: List[int]) -> int:
"""
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
:param nums: 数组
:return: 任意一个重复的数字
"""
nums_len = len(nums)
for i in range(nums_len):
for j in range(nums_len):
if i != j and nums[i] == nums[j]:
return nums[i]
return -1
他山之石(Java/Python)
使用集合 Set
把数组中的元素循环加入到集合 Set,如果加入时有重复,则返回。
时间复杂度:O(n),空间复杂度:O(n)
/**
* 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
*
* @param nums 数组
* @return 任意一个重复的数字
*/
public static int findRepeatNumberTwo(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
int repeat = -1;
for (int num : nums) {
if (!set.add(num)) {
repeat = num;
break;
}
}
return repeat;
}
def find_repeat_number_two(nums: List[int]) -> int:
"""
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
:param nums: 数组
:return: 任意一个重复的数字
"""
temp = set()
for num in nums:
if num not in temp:
temp.add(num)
else:
return num
return -1
先排序再查找
先排序再查找,排序之后有重复的肯定是挨着的,然后前后两两比较,如果有重复的直接返回。
时间复杂度:O(n),空间复杂度:O(1)
/**
* 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
*
* @param nums 数组
* @return 任意一个重复的数字
*/
public static int findRepeatNumberFour(int[] nums) {
Arrays.sort(nums);
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - 1]) {
return nums[i];
}
}
return -1;
}
def find_repeat_number_three(nums: List[int]) -> int:
"""
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
:param nums: 数组
:return: 任意一个重复的数字
"""
nums.sort()
nums_len = len(nums)
for i in range(1, nums_len):
if nums[i] == nums[i - 1]:
return nums[i]
return -1
使用临时数组
这道题有个很明显的特点,就是数字的大小在 0~n-1 之间,所以使用上面两种方法肯定不是最好的选择。这里我们可以申请一个临时数组 temp,因为 nums 元素中的每个元素的大小都在 0~n-1 之间,所以我们可以把 nums 中的元素的值和临时数组 temp 建立映射关系,就是 nums 中的元素的值是几,我们就把 temp 中对应的位置的值加 1,当 temp 某个位置的值大于 1 的时候,我们直接返回即可。
时间复杂度:O(n),空间复杂度:O(n)
/**
* 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
*
* @param nums 数组
* @return 任意一个重复的数字
*/
public static int findRepeatNumberFive(int[] nums) {
int length = nums.length;
int[] temp = new int[length];
for (int i = 0; i < length; i++) {
temp[nums[i]]++;
if (temp[nums[i]] > 1) {
return nums[i];
}
}
return -1;
}
def find_repeat_number_four(nums: List[int]) -> int:
"""
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
:param nums: 数组
:return: 任意一个重复的数字
"""
nums_len = len(nums)
temp = [0 for i in range(nums_len)]
for num in nums:
temp[num] += 1
if temp[num] > 1:
return num
return -1
原地置换
如果没有重复数字,那么正常排序后,数字 i 应该在下标为 i 的位置,所以思路是重头扫描数组,遇到下标为 i 的数字如果不是 i 的话,(假设为 m),那么我们就拿与下标 m 的数字交换。在家换过程中,如果有重复数字,那么终止返回。
时间复杂度:O(n),空间复杂度:O(1)
/**
* 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
*
* @param nums 数组
* @return 任意一个重复的数字
*/
public static int findRepeatNumberThree(int[] nums) {
int temp;
for (int i = 0; i < nums.length; i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]]) {
return nums[i];
}
temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
def find_repeat_number_five(nums: List[int]) -> int:
"""
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字
:param nums: 数组
:return: 任意一个重复的数字
"""
nums_len = len(nums)
for i in range(nums_len):
if nums[i] != i:
if nums[i] == nums[nums[i]]:
return nums[i]
else:
temp = nums[i]
nums[i] = nums[temp]
nums[temp] = temp
return -1
效率对比(Java)
输入:nums = {2, 3, 1, 0, 2, 5, 3};
方法一:1990900ns (个人笨比解法)
方法二:238000ns (使用集合Set)
方法三:12600ns (先排序再查找)
方法四:589800ns (使用临时数组)
方法五:17600ns (原地置换)
效率对比(Python)
输入:nums = {2, 3, 1, 0, 2, 5, 3};
方法一:6600ns (个人笨比解法 )
方法二:4500ns (使用集合 Set)
方法三:8100ns (先排序再查找 )
方法四:28300ns (使用临时数组)
方法五:6600ns (原地置换)
LeetCode数组中重复的数字的更多相关文章
- leetcode题库练习_数组中重复的数字
题目:数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次 ...
- 剑指offer-查找数组中重复的数字
找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重 ...
- 一起来刷《剑指Offer》-- 题目一:找出数组中重复的数字(Python多种方法实现)
数组中重复的数字 最近在复习算法和数据结构(基于Python实现),然后看了Python的各种"序列"--比如列表List.元组Tuple和字符串String,后期会写一篇博客介绍 ...
- 【剑指Offer】数组中重复的数字 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 Set 快慢指针 日期 题目地址:https://leetcod ...
- 《剑指offer》面试题03. 数组中重复的数字
问题描述 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中 ...
- No.3 数组中重复的数字 (P39)
题目1:找出数组中重复的数字 [题目描述] 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个 ...
- 【Java】 剑指offer(1) 找出数组中重复的数字
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字 ...
- 《剑指offer》第三_一题(找出数组中重复的数字,可改变数组)
// 面试题3(一):找出数组中重复的数字 // 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, // 也不知道每个数字重复了几次.请 ...
- 剑指offer35题:第一个只出现一次的字符+剑指offer55题:字符流中第一个不重复的字符+剑指offer51题:数组中重复的数字
在看剑指offer的时候,感觉这三个题目很像,都是用哈希表可以解决,所以把这三个题整理出来,以供复习. 剑指offer35题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...
随机推荐
- windows下安装dirmap详细教程
今天安装一下dirmap,纯小白非常详细的安装过程 1.先去下载dirmap 下载地址:https://github.com/H4ckForJob/dirmap 点这个绿色的code,然后再点下面这个 ...
- .NET Core TLS 协议指定被我钻了空子~~~
前言 此前,测试小伙伴通过工具扫描,平台TLS SSL协议支持TLS v1.1,这不安全,TLS SSL协议至少是v1.2以上才行,想到我们早已将其协议仅支持v1.3,那应该非我们平台问题.我依然自信 ...
- WLAN-无线路由综合应用
一.实验目的 掌握综合应用的配置 二.实验仪器设备及软件 实验仪器设备:路由器.三层交换机.3台二层交换机.AC.3台AP 软件:ensp 三.实验原理 四.实验内容与步骤 AC配置: [AC ...
- You (oracle) are not allowed to access to (crontab) because of pam configura
用oracle用户添加备份计划任务,crontab -e,提示:You (oracle) are not allowed to access to (crontab) because of pam c ...
- vue 插槽slot总结 slot看这篇就够了
一直模糊所以梳理一下,看了好多篇园友的文章和官网文档在这整理一下 默认插槽 //slot组件<template> <div class="slots"> s ...
- DDTP 分布式数据传输协议白皮书
声明 本文非本人原创,主要参考文献[1]编写的阅读笔记.本博客仅发表在博客园,作者LightningStar,其他平台均为转载. 摘要 本白皮书对全球现有主要个人信息可携带权的实践模式进行梳理,分析其 ...
- 倒谱Cepstrum本质的理解
1.理解: 信号叠加时,不是都是线性关系(时域相互+ 频率相加):有的时候是两种信号成分相乘得到的,(时域卷积,频域相乘):比如很多齿轮啮合时振动信号调制现象,电机的轴向与径向的振动耦合时采集到的振动 ...
- Ubuntu 安装 mysql 报错 "update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在"
解决方法: sudo cp /etc/mysql/my.cnf /etc/mysql/mysql.cnf 偷梁换柱-! 如果想更新mysql的源方法如下: wget http://dev.mysql. ...
- ansible主机组配置及秘钥分发
ansible主机组配置及秘钥分发 ansible主机组文件位于/etc/ansible/hosts文件中 1 hosts主机经常使用到的变量为: 2 ansible_ssh_host #用于指定被管 ...
- [python]Appium+python +pytest 实现APP自动化,基于安卓
1.安卓环境搭建 &关于app自动化,个人觉得安装过程比较复杂,脚本难度实现和web自动化差不多封装关键字即可,因此,下面会写安装.启动APP以及过程中遇到的一些坑(这一篇偏向解释给个人) & ...