您的位置:首页 > 健康 > 美食 > 大连网络设计有限公司_公司营业执照怎么查询_seo引擎优化外包_网络公关公司

大连网络设计有限公司_公司营业执照怎么查询_seo引擎优化外包_网络公关公司

2025/4/21 6:45:22 来源:https://blog.csdn.net/qq_46634167/article/details/147350702  浏览:    关键词:大连网络设计有限公司_公司营业执照怎么查询_seo引擎优化外包_网络公关公司
大连网络设计有限公司_公司营业执照怎么查询_seo引擎优化外包_网络公关公司

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;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com