본문 바로가기
Computer Science/알고리즘

leetcode 1675) Minimize Deviation in Array

by eeeun:) 2022. 2. 19.
반응형

LV. Hard 🥵

https://leetcode.com/problems/minimize-deviation-in-array/

 

Minimize Deviation in Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

문제

You are given an array nums of n positive integers.

You can perform two types of operations on any element of the array any number of times:

  • If the element is evendivide it by 2.
    • For example, if the array is [1,2,3,4], then you can do this operation on the last element, and the array will be [1,2,3,2].
  • If the element is oddmultiply it by 2.
    • For example, if the array is [1,2,3,4], then you can do this operation on the first element, and the array will be [2,2,3,4].

The deviation of the array is the maximum difference between any two elements in the array.

Return the minimum deviation the array can have after performing some number of operations.

 

Example 1:

Input: nums = [1,2,3,4]
Output: 1
Explanation: You can transform the array to [1,2,3,2], then to [2,2,3,2], then the deviation will be 3 - 2 = 1.

Example 2:

Input: nums = [4,1,5,20,3]
Output: 3
Explanation: You can transform the array after two operations to [4,2,5,5,3], then the deviation will be 5 - 2 = 3.

Example 3:

Input: nums = [2,10,8]
Output: 3

 

Constraints:

  • n == nums.length
  • 2 <= n <= 10^5
  • 1 <= nums[i] <= 10^9

 

문제 해결법

수의 편차를 줄여나가는 방법으로 문제를 해결했다.

홀수 * 2와 짝수 % 2는 계속해서 수행할 수 있다.

홀수에 한 번 2를 곱하고 나면 더 이상 *2를 할 수 없기 때문에, nums에서 만들 수 있는 최댓값을 구할 수 있다.

처음에 구한 최댓값과 최솟값으로 편차를 구해준다.

 

그 후 priority_queue에 넣어 가장 큰 값(top)을 2로 나눠준다.

top의 값과 mn값을 빼 현재 deviation보다 값이 적으면 deviation를 업데이트해준다.

priority_queue의 top이 2로 나눠질 수 없을 때까지 위의 방법을 계속 진행하면 끝!

priority_queue는 내림차순으로 정렬이 되어 맨 위의 값을 2로 나눌 수 없다는 것은 nums에서 만들 수 있는 가장 작은 수 중 최대라는 뜻이다.

deviation 값을 리턴해 주면 끝!

 

해결 코드
class Solution {
public:
	int minimumDeviation(vector<int>& nums) {
		priority_queue<int> pq;
		int n = nums.size();
		int mx = INT_MIN;
		int mn = INT_MAX;
	
		for (int i = 0; i < n; ++i) {
			if (nums[i] % 2 != 0)
				nums[i] *= 2;
			mx = max(mx, nums[i]);
			mn = min(mn, nums[i]);
			pq.push(nums[i]);
		}

		int deviation = mx - mn;
		while (pq.top() % 2 == 0) {
			int top = pq.top();
			pq.pop();
			pq.push(top / 2);
			deviation = min(deviation, top - mn);
			mn = min(mn, top / 2);
		}
		deviation = min(deviation, pq.top() - mn);
		return deviation;
	}
};

 

 

 

 

728x90

'Computer Science > 알고리즘' 카테고리의 다른 글

leetcode 169) Majority Element  (0) 2022.02.21
leetcode 1288) Remove Covered Intervals  (0) 2022.02.20
leetcode 402) Remove K Digits  (0) 2022.02.18
leetcode 39) Combination Sum  (0) 2022.02.17
leetcode 24) Swap Nodes in Pairs  (0) 2022.02.16

댓글