반응형

https://leetcode.com/problems/minimum-increment-to-make-array-unique

 

nums를 정렬하고, 동일한 수가 연속해서 나타나면 queue에 임시로 넣어줍니다.

nums[i]와 nums[i - 1] 사이에 2 이상의 간격이 나타나면, 해당 간격에 queue에 임시로 넣었던 값들을 채워줍니다.

O(nlogn)에 풀 수 있었습니다.

class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());

        queue<int> q;
        int prev = nums[0];
        int res = 0;
        for(int i=1; i<nums.size(); i++) {
            if(nums[i] == prev) {
                q.push(nums[i]);
            } else {
                for(int val = prev + 1; !q.empty() && val < nums[i]; val++) {
                    res += val - q.front();
                    q.pop();
                }
            }
            prev = nums[i];
        }

        while(!q.empty()) {
            res += ++prev - q.front();
            q.pop();
        }
        return res;
    }
};

 

 

다음과 같이 개선할 수 있었습니다.

값이 증가해야하는 최소 기준점을 찾고, 그 수부터 1씩 올라가야합니다.

class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int start = nums[0] + 1, res = 0;
        for(int i=1; i<nums.size(); i++) {
            if (start < nums[i]) start = nums[i] + 1;
            else res += start++ - nums[i];
        }
        return res;
    }
};
반응형

'기록' 카테고리의 다른 글

LeetCode 2192. All Ancestors of a Node in a Directed Acyclic Graph  (0) 2024.06.29
LeetCode 1051. Height Checker  (0) 2024.06.23
LeetCode 1122. Relative Sort Array  (0) 2024.06.12
LeetCode 846. Hand of Straights  (1) 2024.06.12
한라산  (0) 2021.12.24

+ Recent posts