假设我们有一个整数数组,可以对数组执行一些操作。在这里,在每个操作中,我们选择任何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
每对米
x:=它的关键
temp:= x *它的值
it1:=指向它的前一个,而it2:=指向它的前一个
如果cnt> = 1并且x – it1的键> 1,则temp:= m [it1的键]
否则,当cnt> = 2时,则temp:= temp + m [it2的键]
a = m [it1的键]如果cnt> = 1,否则为0
m [它的键]:= temp和a的最大值
ret:= ret和temp的最大值
增加cnt 1
返回ret
让我们看下面的实现以更好地理解-
#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