【LeetCode】找出数组中重复的数字day01
时间:2022-07-23
本文章向大家介绍【LeetCode】找出数组中重复的数字day01,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
- 找出数组中重复的数字。
- 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,
- 但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
- 示例 1:
- 输入:
- [2, 3, 1, 0, 2, 5, 3]
- 输出:2 或 3
- 限制:
- 2 <= n <= 100000
解题思路
- 暴力搞,双层for循环,第一层的第一个元素和全数组比较。遇到就return
- 空间换时间,那就是利用set的属性不可以进行重复add元素。则会fasle,那就将这个重复元素return
- 这里需要注意的是set在进行add得时候其中检查元素重复的复杂度是多少呢?
- 其中hashSet的add是通过HashMap的key来实现的那么我们了解一下hashMap的putVal()的源码
- 在put的时候我们会进行插入这个最坏复杂度也在O(n)所以也就是O(n)
- 将数组进行排序,然后前后比较,其中java中Arrays.sort使用了两种排序方法,快速排序和优化的合并排序。那就是sort的时间复杂度为O(NlogN) for循环比较是O(n) 算下来也是O(NlogN
上面的计算复杂度的思路不准确,仅供参考
package linkedandlist;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* @authoryuanxindong
* @date: 2020/6/14 8:40 下午
*
*/
public class FinadListRePeatNum {
public static void main(String[] args) {
int[] nums = new int[]{
2, 3, 1, 0, 2, 53
};
int repeatNumberV1 = findRepeatNumberV1(nums);
System.out.println("重复数字1:" + repeatNumberV1);
int repeatNumberV2 = findRepeatNumberV2(nums);
System.out.println("重复数字2:" + repeatNumberV2);
int repeatNumberV3 = findRepeatNumberV3(nums);
System.out.println("重复数字3:" + repeatNumberV3);
}
/**
* 暴力遍历对比
* 时间复杂度为 O(n^2)
*/
private static int findRepeatNumberV1(int[] nums) {
if (nums == null) {
return -1;
}
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] == nums[j]) {
return nums[i];
}
}
}
return -1;
}
/**
* 空间换时间使用set的特性来判断是否有重复
*
* @param nums
* @return 时间复杂度为O(n)
*/
private static int findRepeatNumberV2(int[] nums) {
if (nums == null) {
return -1;
}
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < nums.length; i++) {
if (!set.add(nums[i])) {
return nums[i];
}
}
return -1;
}
/**
* 先通过将数组排序,再进行便利比较前后元素。等于就说明重复
* 排一次顺序是logn,for循环便利一次是N
* 时间复杂度:O(NlogN)
*/
private static int findRepeatNumberV3(int[] nums) {
if (nums == null) {
return -1;
}
Arrays.sort(nums);
for (int i = 0 ; i< nums.length; i++) {
if (nums[i] == nums[i + 1]) {
return nums[i];
}
}
return -1;
}
}
- 自己写个 Prisma
- Numpy|需要信手拈来的功能
- 数据库连接池极简教程
- 碎片化 | 第四阶段-35-Struts2-Spring结合jdbc实现查询列表-视频
- 碎片化 | 第四阶段-28-Struts2框架概述以及原理图解-视频
- nginx 负载均衡
- 机器学习算法应用中常用技巧-1
- 碎片化 | 第四阶段-29-Struts2入门示例1-视频
- nginx虚拟主机配置
- nginx rewrite
- 碎片化 | 第四阶段-30-Struts2入门示例流程梳理-视频
- 碎片化 | 第一阶段-01-基本常识-视频
- 你真的了解For循环吗?一道For循环Java面试题引发的思考
- 碎片化 | 第一阶段-02-Java的跨平台性-视频
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 第1次Spring源码学习之@Bean、@Configuration、xml、分析
- Spring 中的依赖注入(DI),你都知道多少?
- Docker配置1台Nginx+3台Tomcat做负载均衡
- Centos7.x+Docker部署RabbitMQ
- LeetCode(1)-找出数组中重复的数字
- LeetCode(面试题:二维数组中的查找)
- 面试题05-替换空格(LeeCode)
- 解决Mybatis当实体类中的属性名和表中的字段名不一致的问题
- 图书管理系统(一)项目框架结构搭建
- Mybatis中模糊查询like语句的使用方法
- win10暴力查看wifi密码
- 再也不怕面试官问java中的goto关键字了?
- 死磕Java之分析short类型
- 死磕Java之Java数据类型的来龙去脉
- 请不要再使用判断进行参数校验了