이 칼럼을 쓰는 목적은 주로 문제 해결을 위한 몇 가지 아이디어를 제공하는 것입니다. ! !
질문:
정수 배열 숫자가 주어졌습니다. 배열에서 값이 두 번 이상 발생하면 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 <= 숫자 길이 <= 10 5
- -10 9 <= 숫자[i] <= 10 9
솔루션 1: 중복 제거
아이디어: 배열을 중복 제거한 다음 원래 배열의 길이와 비교합니다.
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
const newNums = [...new Set(nums)]; // 去重
return nums.length !== newNums.length;
};
해결 방법 2: 정렬
아이디어: 숫자를 정렬한 후 인접한 요소만 비교하면 됩니다. 인접한 요소가 같으면 동일한 요소가 두 개 있다는 의미이며 true를 반환하고 그렇지 않으면 false를 반환합니다.
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
nums.sort((a,b) => a-b);
for(let i = 0; i < nums.length - 1; i++) {
if (nums[i] === nums[i+1]) {
return true;
}
}
return false;
};
솔루션 3: 해시 테이블
아이디어: 배열의 요소를 해시 테이블에 차례로 삽입 요소 삽입 시 요소가 존재하는 것으로 확인되면 해당 요소가 존재함을 나타냅니다.
/**
* @param {number[]} nums
* @return {boolean}
*/
var containsDuplicate = function(nums) {
const set = new Set();
for (const x of nums) {
if (set.has(x)) {
return true;
}
set.add(x);
}
return false;
};
이 방법은 실제로 문제 해결 방법 1과 유사하며 둘 다 통과되지만 Set
판단 방법은 다릅니다. 여전히 질문이 있는 경우 여기로Set
이동할 수 있습니다 .
다음은 몇 가지 일반적인 솔루션입니다. 더 나은 솔루션이 있으면 추가할 수 있습니다.