Delete and Earn in C++

C++Server Side ProgrammingProgramming

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
raja
Published on 02-May-2020 09:01:51
Advertisements