알고리즘/알고리즘 공부(JAVA)

LeetCode(Contains Duplicate)

소소한필통 2025. 3. 9. 16:44

금일 풀어본 문제는 Contains Duplicate라는 알고리즘이다.

 

Url : https://leetcode.com/explore/interview/card/top-interview-questions-easy/92/array/578/

 

문제에서 물어본 내용은 배열에 같은 값이 최소 2개가 있으면 True, 아니면 False로 반환하라고 했다.

 


 

첫번째 문제 풀이 방법

1. nums[i]의 최소값과 최대값만큼 (약 10억)개의 boolean 리스트 생성

2. nums.length를 전체돌면서 한번 방문한 곳은 true로 변경

3. 다시 방문했을때 해당 index가 true로 되어있으면 두번째 방문이므로 리스트에 해당 숫자가 2개임을 파악가능

 

실패 : out of memory

사유 : 10억개의 인자를 가진 배열을 생성할때 아웃 오브 메모리 발생함

 

시간 복잡도: O(n), n nums.length

공간 복잡도: O(10^9), lstNum 배열의 크기

public boolean containsDuplicate(int[] nums) {
        boolean answer = false;
        boolean[] lstNum = new boolean[1000000001];

        for (int i=0; i < nums.length; i++){
            if ( lstNum[nums[i]]) {
                answer = true;
                break;
            }
            lstNum[nums[i]] = true;
        }

        return  answer;
    }

 

 

두번째 문제 풀이 방법

1. 주어진 배열을 정렬함.

2. 배열을 돌면서 전값과 다음값이 같으면 2개 이상 배열에 포함됨을 알 수 있음

 

시간 복잡도 : O(nlogn)

공간 복잡도 : O(1)

public boolean containsDuplicate2(int[] nums) {
        boolean answer = false;

        Arrays.sort(nums);

        for (int i=0; i < nums.length - 1; i++){
            if ( nums[i] == nums[i+1]) {
                answer = true;
                break;
            }
        }

        return  answer;
    }

 

 

세번째 문제 풀이 방법

 

1. hashset을 만듬

2. 주어진 배열을 for문을 돌면서 hashset에 중복된 값이 있는지 확인후에 없으면 hashset 객체에 dd

 

시간 복잡도 : O(n)

공간 복잡도 : O(n)

public boolean containsDuplicate(int[] nums) {
        boolean answer = false;

        HashSet<Integer> checkNum = new HashSet<>();

        for (int num : nums){
            if (checkNum.contains(num)){
                return true;
            }
            checkNum.add(num);

        }

        return  answer;
    }

 

 

2번 방법은 공간복잡도를 가장 줄일수 있으며, 3번 방법은 시간 복잡도를 줄일 수 잇음

'알고리즘 > 알고리즘 공부(JAVA)' 카테고리의 다른 글

Delete Node in a Linked List  (0) 2025.04.06
LeetCode(Single Number)  (0) 2025.03.15
Leetcode(Rotate Array)  (0) 2025.03.08
backjoon_1546_평균 Using(Java)  (0) 2022.08.31
backjoon_1339_두수비교하기 Using(Java)  (0) 2022.08.31