问题
给你一个整数数组 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:
-
提示
1 <= nums.length <= 105
-109 <= nums[i] <= 109 -
来源
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/contains-duplicate
解法一:lastIndexOf
// 可以使用indexOf和lastIndexOf,例如[1,2,1],indexOf(1)它会返回0,lastIndexOf(1)返回1,返回值不同说明该元素至少重复2次。
// const repeatValidate1 = (arr) => {
// for(var i=0; i<arr.length; i++){
// // 此时arr.indexOf(arr[i])等于遍历的数组的索引i
// if(i !== arr.lastIndexOf(arr[i])){
// return true
// }
// }
// return false
// }
// console.log(repeatValidate1([1,2,1,4]));
解法二:排序后比较相邻元素
// 先给数组排序,如果数组存在重复的元素则数组中一定有相同的相邻元素
// const repeatValidate2 = (arr) => {
// arr = arr.sort()
// for(var i=0; i<arr.length; i++){
// // 防止数组越界,当判断倒数第二个元素时,其实倒数第一个元素已经进行了判断,所以当i+1 >= arr.length时已经判断完成
// if((i+1) >= arr.length) return false
// if(arr[i] === arr[i+1]) return true
// }
// }
// console.log(repeatValidate2([1,2,5,4]));
解法三:Map
// 使用Map,遍历数组,向map存值,在存值之前先查看map有没有该元素,如果有则数组中有重复的,没有就存值。
// const repeatValidate3 = (arr) => {
// const map = new Map()
// const len = arr.length
// var i = 0
// var flag = false // 默认不存在重复,返回false
// while(!flag && i<len){
// if(map.has(arr[i])){
// flag = true
// break
// }else {
// // map以键值对的方式存在,查找速率很快,这里我们是用他的键进行判断
// map.set(arr[i], true)
// i++
// }
// }
// return flag
// }
// console.log(repeatValidate3([1,2,1,4]));