- Trending Categories
Data Structure
Networking
RDBMS
Operating System
Java
MS Excel
iOS
HTML
CSS
Android
Python
C Programming
C++
C#
MongoDB
MySQL
Javascript
PHP
Physics
Chemistry
Biology
Mathematics
English
Economics
Psychology
Social Studies
Fashion Studies
Legal Studies
- Selected Reading
- UPSC IAS Exams Notes
- Developer's Best Practices
- Questions and Answers
- Effective Resume Writing
- HR Interview Questions
- Computer Glossary
- Who is Who
Delete and Earn in C++
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 −
#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