All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0701_0800.s0740_delete_and_earn.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0701_0800.s0740_delete_and_earn;

// #Medium #Array #Hash_Table #Dynamic_Programming #Dynamic_Programming_I_Day_3
// #2022_03_25_Time_4_ms_(77.68%)_Space_47.6_MB_(13.69%)

/**
 * 740 - Delete and Earn\.
 *
 * Medium
 *
 * You are given an integer array `nums`. You want to maximize the number of points you get by performing the following operation any number of times:
 *
 * *   Pick any `nums[i]` and delete it to earn `nums[i]` points. Afterwards, you must delete **every** element equal to `nums[i] - 1` and **every** element equal to `nums[i] + 1`.
 *
 * Return _the **maximum number of points** you can earn by applying the above operation some number of times_.
 *
 * **Example 1:**
 *
 * **Input:** nums = [3,4,2]
 *
 * **Output:** 6
 *
 * **Explanation:** You can perform the following operations: 
 *
 * - Delete 4 to earn 4 points. Consequently, 3 is also deleted. nums = [2]. 
 *
 * - Delete 2 to earn 2 points. nums = []. 
 *   
 * You earn a total of 6 points.
 *
 * **Example 2:**
 *
 * **Input:** nums = [2,2,3,3,3,4]
 *
 * **Output:** 9
 *
 * **Explanation:** You can perform the following operations: 
 *
 * - Delete a 3 to earn 3 points. All 2's and 4's are also deleted. nums = [3,3]. 
 *
 * - Delete a 3 again to earn 3 points. nums = [3]. 
 *
 * - Delete a 3 once more to earn 3 points. nums = []. 
 *   
 * You earn a total of 9 points.
 *
 * **Constraints:**
 *
 * *   1 <= nums.length <= 2 * 104
 * *   1 <= nums[i] <= 104
**/
public class Solution {
    public int deleteAndEarn(int[] nums) {
        int[] sum = new int[10001];
        int min = 10001;
        int max = 0;
        for (int num : nums) {
            sum[num] += num;
            min = Math.min(num, min);
            max = Math.max(num, max);
        }

        int[] dp = new int[max + 1];
        dp[min] = sum[min];
        for (int i = min + 1; i <= max; i++) {
            dp[i] = Math.max(dp[i - 1], dp[i - 2] + sum[i]);
        }
        return dp[max];
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy