当前位置: 首页 > news >正文

多种解法全解析——力扣217. 存在重复元素

力扣217. 存在重复元素

在这里插入图片描述


【LeetCode题解】217. 存在重复元素(多种解法全解析)

一、题目描述

给定一个整数数组 nums,判断数组中是否存在重复元素:

  • 如果任一值在数组中至少出现两次,返回 true
  • 如果数组中每个元素都不同,返回 false

示例

示例 1:

输入: nums = [1,2,3,1]
输出: true

示例 2:

输入: nums = [1,2,3,4]
输出: false

示例 3:

输入: nums = [1,1,1,3,3,4,3,2,4,2]
输出: true

提示

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

二、解法思路

这道题的核心就是:检查数组中是否有重复元素
下面我会从暴力法到高效解法,依次介绍多种方法。


三、解法一:暴力枚举(双重循环)

这是最直观的解法,对每个元素都去和后续所有元素比较,如果有相等的就返回 true

  • 时间复杂度:O(n^2),最坏情况下要比较所有元素对。
  • 空间复杂度:O(1),没有额外开销。

代码实现

class Solution {public boolean containsDuplicate(int[] nums) {for (int i = 0; i < nums.length; i++) {for (int j = i + 1; j < nums.length; j++) {if (nums[i] == nums[j]) {return true;}}}return false;}
}

在这里插入图片描述


四、解法二:排序后扫描

先对数组排序,重复元素一定会出现在相邻位置。只要检查相邻是否相等即可。

  • 时间复杂度:O(n log n),排序的时间消耗。
  • 空间复杂度:取决于排序算法,通常是 O(1)O(log n)

代码实现

import java.util.Arrays;class Solution {public boolean containsDuplicate(int[] nums) {Arrays.sort(nums);for (int i = 1; i < nums.length; i++) {if (nums[i] == nums[i - 1]) {return true;}}return false;}
}

在这里插入图片描述


五、解法三:哈希集合(HashSet)

利用哈希集合的特性:

  • 插入时如果发现元素已经存在,则说明有重复。

这是最常用的方法,效率也最高。

  • 时间复杂度:O(n),遍历一次数组。
  • 空间复杂度:O(n),哈希集合的存储开销。

代码实现

import java.util.HashSet;class Solution {public boolean containsDuplicate(int[] nums) {HashSet<Integer> seen = new HashSet<>();for (int num : nums) {if (seen.contains(num)) {return true;}seen.add(num);}return false;}
}

在这里插入图片描述


六、解法四:哈希表(HashMap)

与 HashSet 类似,用哈希表统计每个元素的出现次数,如果某个元素超过 1,则返回 true

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

代码实现

import java.util.HashMap;class Solution {public boolean containsDuplicate(int[] nums) {HashMap<Integer, Integer> map = new HashMap<>();for (int num : nums) {if (map.containsKey(num)) {return true;}map.put(num, 1);}return false;}
}

在这里插入图片描述


七、解法五:流式写法(Java 8+)

如果使用 Java 8 及以上版本,可以利用流的去重特性。
通过比较去重前后的长度是否相等,判断是否有重复元素。

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

代码实现

import java.util.Arrays;class Solution {public boolean containsDuplicate(int[] nums) {return Arrays.stream(nums).distinct().count() < nums.length;}
}

在这里插入图片描述


八、总结

方法时间复杂度空间复杂度适用场景
暴力枚举O(n^2)O(1)数据规模很小
排序后扫描O(n log n)O(1)~O(log n)中等规模,允许排序
哈希集合O(n)O(n)高效通用,推荐
哈希表计数O(n)O(n)适合需要统计频率
流式写法O(n)O(n)简洁优雅,但开销稍大

其中 哈希集合解法 是最常用、最推荐的方案。


http://www.dtcms.com/a/403076.html

相关文章:

  • 用python做的网站多吗二手书交易网站策划书
  • phpcms网站源码ui培训班多少钱
  • Android Studio 导入 opencv
  • 在线网站做成appdede网站地图样式修改
  • 全新尚界H5凭借HUAWEI XMC数字底盘引擎技术,让湿滑路面也“稳”操胜券
  • iOS 26 性能测试实战,如何评估启动速度、CPUGPU 负载、帧率与系统资源适配(uni-app 与 iOS 原生应用性能方案)
  • 腾讯会议→微课操作
  • html原生表格,实现左侧列固定
  • Idea提高开发效率的快捷键最佳学习方式
  • 做网站一定需要icp么中国建设协会官网
  • Selenium使用教程
  • 多线程——单例模式
  • 镜头调焦的 调整的是焦距还是像距?
  • (四)React+.Net+Typescript全栈(错误处理)
  • @ant-design/icons-vue 打包成多格式库
  • 什么是营销型网站?杭州建设教育网站
  • C++开发环境(VSCode + CMake + gdb)
  • JAVA CodeX精选实用代码示例
  • 肥东网站建设南京医院网站建设
  • Qt 多线程解析
  • ZooKeeper与Kafka分布式:从基础原理到集群部署
  • 免费网站服务器安全软件下载wordpress权限设置方法
  • three.js射线拾取点击位置与屏幕坐标映射
  • AutoMQ × Ververica:打造云原生实时数据流最佳实践!
  • Laravel5.8 使用 snappyPDF 生成PDF文件
  • 自己做网站的图片手机芒果tv2016旧版
  • L4 vs L7 负载均衡:彻底理解、对比与实战指南
  • wordpress站群软件自己的网站怎么赚钱
  • 零知IDE——基于STM32F407VET6和MCP2515实现CAN通信与数据采集
  • 若依框架-Spring Boot