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

力扣面试150题-- 存在重复元素 II和最长连续序列

Day 26

题目描述

在这里插入图片描述

思路

  1. 定义一个map用来存放每个元素以及它对应的序号
  2. 从前向后遍历数组
  3. 如果该元素存在于map(说明满足了重复元素的条件),用当前元素的序号值减去map中存放的序号值(因为是从前遍历的所以当前元素序号一定大于存放的序号)。
  4. 满足条件就返回true。
  5. 不满足条件,就将当前的元素序号替换近map(因为如果后面出现这个元素的重复值,与当前元素的序号值相减比更前面的元素相减更小)。
  6. 不存在,就将该元素的值放入map中。
  7. 循环结束,说明没有满足条件的,返回false。
class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Map<Integer,Integer>map=new HashMap<>();int j=0;for(int i=0;i<nums.length;i++){if(map.containsKey(nums[i])){j=map.get(nums[i]);if(i-j<=k){return true;}else{map.put(nums[i],i);}}else{map.put(nums[i],i);}}return false;}
}

题目描述

在这里插入图片描述

思路

初次思路:考虑到样例中,重复元素只计数一次,于是采取set来存储,思路如下:

  1. 定义一个TreeSet(原因在于TreeSet可以对于存放元素按值的大小排序)
  2. 遍历数组,将元素插入到TreeSet
  3. 遍历TreeSet,取出元素i
  4. 如果i-1不存在于集合,i+1存在于集合,说明该元素就是起始元素,设置长度sum=1
  5. 如果i-1存在于集合,i+1也存在于集合,说明这个元素在一段连续区间中,sum++
  6. 如果i-1存在集合,i+1不存在于集合,说明这是一段连续区间的结尾,sum++进入判断(注:由于TreeSet是按数值大小存放的,所以当找到一个开头和一个结尾,中间所有的元素都是连续的
  7. 如果sum>max,就让max等于sum
  8. 循环结束,返回max
class Solution {public int longestConsecutive(int[] nums) {if(nums.length==0){return 0;}int max=1,sum=0;Set<Integer> map=new TreeSet<>();for(int i=0;i<nums.length;i++){map.add(nums[i]);}for(Integer i:map){if(map.contains(i+1)&&!map.contains(i-1)){//起始点sum=1;}else if(map.contains(i+1)&&map.contains(i-1)){//区间sum++;}else if(map.contains(i-1)&&!map.contains(i+1)){//结束点sum++;if(sum>max){max=sum;}}}return max;}
}

进阶思路:以上做法,虽然通过,但是我的时间复杂度很高,我感觉原因在于TreeSet的插入和遍历效率太低了,看过官方题解后,有以下做法。

  1. 使用Hashset存放数组元素(去重)
  2. 遍历HashSet,判断该节点i是否为头节点(及i-1是否存在于hashset)
  3. 不存在,说明为头节点,循环向后遍历x,直到找到不存在x+1的元素,sum同时增加
  4. 比较sum和max,将较大的值存放到max
  5. 如果该节点不是头节点,就不处理
  6. 最后返回max
class Solution {public int longestConsecutive(int[] nums) {Set<Integer> set = new HashSet<Integer>();for (int num : nums) {set.add(num);}int maxs = 0;for (int num : set) {if (!set.contains(num - 1)) {int tou = num;int len = 1;while (set.contains(tou + 1)) {tou ++;len ++;}maxs = Math.max(maxs, len);}}return maxs;}
}
http://www.xdnf.cn/news/534.html

相关文章:

  • 一个 CTO 的深度思考
  • 西北工业大学 | 《DeepSeek核心技术白话解读》
  • Transformer 进阶:拥抱预训练模型,迈向实际应用
  • vite 按照出错解决方案
  • Cursor新版0.49.x发布
  • fastlio用mid360录制的bag包离线建图,提示消息类型错误
  • 黑马点评秒杀优化
  • python函数之间嵌套使用yield
  • langchain langgraph 快速集成mcp: langchain-mcp-adapters
  • 历史文化探险,梧州旅游景点推荐
  • 任意文字+即梦3.0的海报设计Prompt
  • 基于尚硅谷FreeRTOS视频笔记——15—系统配制文件说明与数据规范
  • 基于MCP的RAG系统实战:用Cursor+GroundX构建复杂文档问答引擎
  • Java Spring Bean生命周期详解
  • AI 驱动抗生素发现:从靶点到化合物测试
  • 功能安全实战系列07-英飞凌TC3xx电源监控开发详解
  • 26考研——存储系统_主存储器与 CPU 的连接(3)
  • CUDA编程中影响性能的小细节总结
  • 《关于加快推进虚拟电厂发展的指导意见》解读
  • 图像预处理-图像边缘检测(流程)
  • OSI七层网络模型详解
  • Datawhale AI春训营】AI + 新能源(发电功率预测)Task1
  • 【KWDB创作者计划】_从0到1部署KWDB:踩坑指南与最佳实践
  • 深入理解 MCP 协议:开启 AI 交互新时代
  • Django 实现服务器主动给客户端发送消息的几种常见方式及其区别
  • 机器学习误差图绘
  • [HOT 100] 1964. 找出到每个位置为止最长的有效障碍赛跑路线
  • PHP中stdClass详解
  • 【java实现+4种变体完整例子】排序算法中【计数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • 接口自动化 ——fixture allure