class Solution {
public:
vector<int> applyOperations(vector<int>& nums) {
int size = nums.size();
for(int i = 0; i < size - 1; ++i){
if(nums[i] == nums[i + 1]){
nums[i] *= 2;
nums[i + 1] = 0;
}
}
int i = 0;
vector<int> ans(size, 0);
for(int d : nums){
if(d != 0) ans[i++] = d;
}
return ans;
}
};
B
class Solution {
public:
long long maximumSubarraySum(vector<int>& nums, int k) {
long long ans = 0;
long long sum = 0;
unordered_map<int, int> map;
for(int i = 0; i < nums.size(); i++){
sum += nums[i];
if(i < k - 1){
map[nums[i]]++;
}else{
map[nums[i]]++;
if(map.size() < k){
map[nums[i - k + 1]]--;
if(map[nums[i - k + 1]] <= 0) map.erase(nums[i - k + 1]);
}else{
ans = ans < sum ? sum : ans;
map.erase(nums[i - k + 1]);
}
sum -= nums[i - k + 1];
}
}
return ans;
}
};
C
class Solution {
public:
long long totalCost(vector<int>& costs, int k, int candidates) {
long long ans = 0;
int size = costs.size();
if(size < candidates * 2){
sort(costs.begin(), costs.end());
int i = 0;
while(i < k) ans += costs[i++];
}else{
priority_queue<int, vector<int>, greater<int>> p;
priority_queue<int, vector<int>, greater<int>> q;
int i = 0, j = size - 1;
while(i < candidates) p.push(costs[i++]);
while(j > size - candidates - 1) q.push(costs[j--]);
int num = 0;
while(num < k && i <= j){
int l = p.top();
int r = q.top();
if(l <= r){
ans += l;
p.pop();
p.push(costs[i++]);
cout << l <<" ";
}else{
ans += r;
q.pop();
q.push(costs[j--]);
cout << r <<" ";
}
num++;
}
while(num < k){
if(!p.empty() && !q.empty()){
if(p.top() <= q.top()){
cout << p.top() <<" ";
ans += p.top();
p.pop();
}else{
cout << q.top()<<" ";
ans += q.top();
q.pop();
}
}else{
if(!p.empty()){
ans+=p.top();
p.pop();
}
if(!q.empty()){
ans+=q.top();
q.pop();
}
}
num++;
}
}
return ans;
}
};