2163. 删除元素后和的最小差值

2163. 删除元素后和的最小差值


题目链接:2163. 删除元素后和的最小差值

代码如下:

//参考链接:https://leetcode.cn/problems/minimum-difference-in-sums-after-removal-of-elements/solutions/1247074/qian-zhui-zui-xiao-he-hou-zhui-zui-da-he-yz3d
class Solution {
public:
	long long minimumDifference(vector<int>& nums) {
		int m = nums.size(), n = m / 3;
		priority_queue<int, vector<int>, greater<>> min_pq(nums.end() - n, nums.end()); // 最小堆,存储后 n 个元素
		long long sum = reduce(nums.end() - n, nums.end(), 0LL);// 计算后 n 个元素的和

		vector<long long> suf_max(m - n + 1);//后缀最大和
		suf_max[m - n] = sum; // 初始化后缀最大和
		for (int i = m - n - 1;i >= n;i--) {
			int v = nums[i];
			if (v > min_pq.top()) {
				sum += v - min_pq.top();
				min_pq.pop(); // 弹出最小堆的最小元素
				min_pq.push(v); // 将当前元素加入最小堆
			}
			suf_max[i] = sum;
		}

		priority_queue<int> max_pq(nums.begin(), nums.begin() + n); // 最大堆,存储前 n 个元素
		long long pre_min = reduce(nums.begin(), nums.begin() + n, 0LL);//前缀最小和
		
		long long res = pre_min - suf_max[n];//i=n-1时的答案
		for (int i = n;i < m - n;i++) {
			int v = nums[i];
			if (v < max_pq.top()) {
				pre_min += v - max_pq.top();
				max_pq.pop(); // 弹出最大堆的最大元素
				max_pq.push(v); // 将当前元素加入最大堆
			}
			res = min(res, pre_min - suf_max[i + 1]); // 更新结果
		}
		return res;
	}
};

你可能感兴趣的:(leetcode,c++)