Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述
- 给你一个整数数组
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 <= Math.pow(10,5)
- -Math.pow(10,9) <= nums[
i] <= Math.pow(10,9)
二、思路分析:
- 这题就是很直白的看数组去重,所以是简单难度的,第一种,排序,遍历一次
- 首先将给定的整数数组排序,升序倒序无所谓
- 然后遍历数组,排序后的数组,如果有相同的项,肯定是前后相邻的,比较
nums[i]和nums[i+1]是否相等就可以,有相等的返回true,没有返回false
- 然后第二种,不对数组排序,遍历两次
- 第一层遍历,取出数组的项,第二层遍历依次取出,看是否有与第一次遍历取出的项相等,有则返回
true,没有返回false
- 第一层遍历,取出数组的项,第二层遍历依次取出,看是否有与第一次遍历取出的项相等,有则返回
三、AC 代码:
- 第一种
function containsDuplicate(nums: number[]): boolean {
if(nums.length === 1) return false
nums.sort((a, b) => {return a-b});
for(let i = 0; i < nums.length - 1; i++){
if(nums[i] === nums[i+1]){
return true
}
}
return false
};
- 第二种
function containsDuplicate(nums: number[]): boolean {
if(nums.length === 1) return false
for(let i = 0; i < nums.length - 1; i++){
for(let j = i + 1; j < nums.length; j++){
if(nums[i] === nums[j]){
return true
}
}
}
return false
};
四、总结:
- 需要注意一下数组长度为
1的特殊情况,这样是必不可能出现重复项的 - 以上两种复杂度一般,可以去题解区看看其他大佬的解法。。。