C++ 中的删除和赢取
c++server side programmingprogramming更新于 2024/11/8 22:40:00
假设我们有一个整数数组 nums,我们可以对数组执行一些操作。在每个操作中,我们选择任意 nums[i] 并删除它以获得 nums[i] 数量的积分。我们必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。最初积分为 0。我们必须通过应用此类操作找到我们可以获得的最大积分数。因此,如果输入为 [3,4,2],则输出将为 6。这是因为,如果我们删除 4,我们将获得 4 分,因此 3 也将被删除。然后删除 2 以获得 2 分。总共获得 6 分。
为了解决这个问题,我们将遵循以下步骤 −
n := nums 数组的大小,定义映射 m,ret := 0,将 nums 中元素的频率存储到 m 中
cnt := 0
对于 m 的每一对 it
x := it 的键
temp := x * it 的值
it1 := 指向 it 的前一个,it2 := 指向 it1 的前一个
如果 cnt >= 1 且 x – it1 的键 > 1,则 temp := m[key of it1]
否则当 cnt >= 2 时,则 temp := temp + m[key of it2]
如果 cnt >= 1,则 a = m[key of it1],否则为 0
m[key of it] := temp 和 a 的最大值
ret := ret 和 temp 的最大值
将 cnt 增加 1
返回 ret
示例(C++)
让我们看下面的实现,以便更好地理解 −
#include <bits/stdc++.h> using namespace std; class Solution { public: int deleteAndEarn(vector<int>& nums) { int n = nums.size(); map <int, int> m; int ret = 0; for(int i = 0; i < nums.size(); i++){ m[nums[i]]++; } int cnt = 0; map <int, int> :: iterator it = m.begin(); while(it != m.end()){ int x = it->first; int temp = x * it->second; map <int, int> :: iterator it1 = prev(it); map <int, int> :: iterator it2 = prev(it1); if(cnt >= 1 && x - it1->first > 1){ temp += m[it1->first]; } else if(cnt >= 2){ temp += m[it2->first]; } m[it->first] = max(temp, cnt >= 1 ? m[it1->first] : 0); ret = max(ret, temp); it++; cnt++; } return ret; } }; main(){ vector<int> v = {3,4,2}; Solution ob; cout << (ob.deleteAndEarn(v)); }
输入
[3,4,2]
输出
6