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题:第一个只出现一次的字符 题目描述:在字符串中找出第一个只出现一次的字符.如 ...
随机推荐
- 决策树 机器学习,西瓜书p80 表4.2 使用信息增益生成决策树及后剪枝
使用信息增益构造决策树,完成后剪枝 目录 使用信息增益构造决策树,完成后剪枝 1 构造决策树 1 根结点的选择 色泽 信息增益 根蒂 信息增益 敲声 信息增益 纹理 信息增益 脐部 信息增益 触感 信 ...
- hdu 3887 Counting Offspring(DFS序【非递归】+树状数组)
题意: N个点形成一棵树.给出根结点P还有树结构的信息. 输出每个点的F[i].F[i]:以i为根的所有子结点中编号比i小的数的个数. 0<n<=10^5 思路: 方法一:直接DFS,进入 ...
- dart系列之:dart语言中的内置类型
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
- 理解ASP.NET Core - 日志(Logging)
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 快速上手 添加日志提供程序 在文章主机(Host)中,讲到Host.CreateDefault ...
- 在Vs code中使用sftp插件以及连接windows远程sftp协议部署指导(解决vscode的sftp插件中文目录乱码问题)
一.启动SFtp 二.上手vs code SFTP插件 2.1 初始配置 2.2解决乱码问题 三.SFTP配置 3.1常用配置 3.2示例配置 四.SFTP使用 五.扩展阅读 一.启动SFtp 话说小 ...
- Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)
Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...
- Windows11 如何让开始菜单出现休眠选项(Windows11如何开启休眠功能?)Windows家庭版
1. Windows11新版的菜单找不到调休眠的选项了,所以我们可以用win+r键调出运行,输入control,回车调出「控制面板」 配图: 2. 我的电脑系统是家庭版的Windows11,其它版本这 ...
- c语言1左移32位(1<<32)是多少,左移-1位呢
C语言中 << 是逻辑移位,不是循环移位.1 左移 32 位后为 0,左移 -1 位实际是左移 255 位(互补),当然也是0.这种问题可以写一段小程序,单步执行,看一下每一步的结果.先说 ...
- Exploring Matrix
import java.util.Scanner; public class J714 { /** * @taking input from user */ public static void ma ...
- C#疑问
在Microsoft.NET里面int=Int32Int64=long但是在其他.NET环境下面可能不是这样的.C#是一门计算机编程语言,是经过标准化,也就是说其他的人也可以根据它的语法去实现它的编译 ...