携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
217. 存在重复元素 [easy]
题目描述
给你一个整数数组 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 <= 105 -
-109 <= nums[i] <= 109
解题思路
对于一个无序数组来说,如果我们要判断任一一个值出现的次数,那么我们肯定是要对值进行统计的。
首先可以使用排序,将无序数组变成有序的,然后对数组第 i 个元素与第 i+1 个元素两两对比,如果相同就说明出现至少两次了,否则当数组遍历结束都没有返回 true 的话,则说明数组中都是不重复的数字,返回 false。
这里我使用的是 Set 集合来统计,然后遍历集合,如果集合中不存在该元素,则将该元素添加进集合中,否则说明集合中已经存在,返回 true。当然这里用对象也是可以的。
题解
var containsDuplicate = function(nums) {
const set = new Set();
for (const x of nums) {
if (set.has(x)) { // 存在的话说明除了当前遍历到的元素外,该值又出现了
return true;
}
set.add(x);
}
return false;
};
219. 存在重复元素Ⅱ [easy]
题目描述
给你一个整数数组 nums 和一个整数 k,判断数组中是否存在两个 不同的索引 i 和 j,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true;否则,返回 false。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1
输出:true
示例 3:
输入:nums = [1,2,3,1,2,3], k = 2
输出:false
提示:
-
1 <= nums.length <= 105 -
-109 <= nums[i] <= 109
解题思路
这题的条件在上一题的基础上增加了 abs(i - j) <= k ,我们不仅要判断是重复出现,还要满足两个重复出现元素的下标是小等于 k 的,那么我们需要一个数据结构,来保存我们的值以及该值对应的下标,当第二次遇到该值时,满足条件1,然后取出该值的下标,同上一次存下的值的下标进行对比,如果满足条件2,则返回 true;当循环结束时,说明没有找到,返回 false。
所以这里我采用的数据结构是 Map 集合,用值作为 Map 的 key,用值对应的下标作为 value,遍历时,判断值是否存在于 map 的键中,存在则取出对应的 value,比对下标。
题解
/**
* @param {number[]} nums
* @param {number} k
* @return {boolean}
*/
var containsNearbyDuplicate = function(nums, k) {
const map = new Map();
const lens = nums.length;
for(let i=0; i<lens; ++i) {
if(map.has(nums[i]) && i - map.get(nums[i]) <= k) {
return true;
} else {
map.set(nums[i], i);
}
}
return false;
};
220. 存在重复元素Ⅲ [middle]
题目描述
示例 1:
输入:nums = [1,2,3,1], k = 3, t = 0
输出:true
示例 2:
输入:nums = [1,0,1,1], k = 1, t = 2
输出:true
示例 3:
输入:nums = [1,5,9,1,5,9], k = 2, t = 3
输出:false
提示:
-
1 <= nums.length <= 105 -
-109 <= nums[i] <= 109
解题思路
这题和上一题差不多,不过不是找两个相同值了,而是两个值的关系满足 abs(nums[i] - nums[j]) <= t ,也就是差值的绝对值小等于 t,
最直接的,我们两层循环暴力求解,从第 i 个元素开始,分别同 i+1、i+2 ... i+t 比较,如果 nums[i] 和 nums[n] 的关系存在 Math.abs(nums[i] - nums[j]) <= t ,则返回 true,当循环结束时,说明没有找到,返回 false。
题解
/**
* @param {number[]} nums
* @param {number} k
* @param {number} t
* @return {boolean}
*/
var containsNearbyAlmostDuplicate = function(nums, k, t) {
const lens = nums.length;
for(let i=0; i<lens; ++i) {
for(let j=i+1; j<=i+k; ++j) {
if(Math.abs(nums[i] - nums[j]) <= t) {
return true;
}
}
}
return false;
};
注:这里 j 的范围要设到 (i, i+k],左开右闭。
34 和 61,还凑合,但是作为新时代的前台端菜员,啊不,前端工程师,我们难道就要止步于此了?