7.23 219. 存在重复元素 II
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
我的思路:
abs绝对值:i - j <= k
哈希进行存储:键值对->值以及对应的索引
[1,0,1,1] k = 1
0 1 2 3
2-0
这个测试案例告诉我们要注意多个相同的动态改变map里面的值
var containsNearbyDuplicate = function(nums, k) {
let numsMap = new Map();
// 遍历nums
for(let i = 0 ; i < nums.length ; i++){
if(!numsMap.has(nums[i])){
numsMap.set(nums[i] , i);
}else {
// 存在相同的
let sub = numsMap.get(nums[i]) - i < 0 ? -(numsMap.get(nums[i]) - i) : numsMap.get(nums[i]) - i;
if(sub <= k)
return true;{
}
numsMap.set(nums[i] , i);
}
}
return false;
};
该函数利用哈希表(Map)来存储数组元素及其最新索引,遍历数组时检查当前元素是否已存在,若存在则计算当前索引与存储索引的差值,若差值小于k则返回true,否则更新存储的索引,最终若无符合条件的重复元素则返回false。
7.23 128. 最长连续序列
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
我的思路:
让它排好序
采取的是降序
count = 0 ;
100 map has 100 + 1
->yes : count ++ ; 动态维护max,放入map
-> no : count = 0 ; 放入map
返回max+1 :因为在及逆行count++的时候总会忽略第一个数
我的代码:
var longestConsecutive = function(nums) {
let numsMap = new Map();
let count = 0 ;
let max = 0;
nums.sort((a , b) => b - a );
console.log(nums);
if(nums.length === 0){
return 0;
}
// 遍历nums
for(let i = 0 ; i < nums.length ; i++){
if(!numsMap.has(nums[i] + 1)){
count = 0 ;
numsMap.set(nums[i] , i);
}else {
if(!numsMap.has(nums[i])){
count++;
max = max > count ? max : count;
numsMap.set(nums[i] , i);
}
}
}
return max + 1 ;
};
总结:
该函数通过哈希表和排序来高效地计算数组中连续递减序列的最长长度。时间复杂度主要取决于排序操作(O(n log n)),空间复杂度为 O(n)。