# Delete and Earn in C++

C++Server Side ProgrammingProgramming

#### C in Depth: The Complete C Programming Guide for Beginners

45 Lectures 4.5 hours

#### Practical C++: Learn C++ Basics Step by Step

Most Popular

50 Lectures 4.5 hours

#### Master C and Embedded C Programming- Learn as you go

66 Lectures 5.5 hours

Suppose we have an array nums of integers, we can perform some operations on the array. Here in each operation, we pick any nums[i] and delete it to earn nums[i] amount of points. We must delete every element equal to nums[i] - 1 or nums[i] + 1. Initially the point is 0. We have to find the maximum number of points we can earn by applying such operations. So if the input is like [3,4,2], then the output will be 6. So this is because, if we delete 4, we will get 4 points, consequently 3 will also be deleted. Then delete 2 to get 2 points. 6 total points are earned.

To solve this, we will follow these steps −

• n := size of nums array, define map m, ret := 0, store the frequency of elements in nums into m

• cnt := 0

• for each pair it of m

• x := key of it

• temp := x * value of it

• it1 := point to previous of it, and it2 := point to the previous of it1

• if cnt >= 1 and x – key of it1 > 1, then temp := m[key of it1]

• otherwise when cnt >= 2, then temp := temp + m[key of it2]

• a = m[key of it1] if cnt >= 1, otherwise 0

• m[key of it] := max of temp and a

• ret := max of ret and temp

• increase cnt by 1

• return ret

## Example(C++)

Let us see the following implementation to get a better understanding −

Live Demo

#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));
}

## Input

[3,4,2]

## Output

6