zoukankan      html  css  js  c++  java
  • 740. 删除并获得点数(动态规划)

    1. 题目

    给你一个整数数组 nums ,你可以对它进行一些操作。

    每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。

    开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/delete-and-earn
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2. 示例

    输入:nums = [3,4,2]
    输出:6
    解释:
    删除 4 获得 4 个点数,因此 3 也被删除。
    之后,删除 2 获得 2 个点数。总共获得 6 个点数。

    3. 提示

    1 <= nums.length <= 2 * 104
    1 <= nums[i] <= 104

    4. 题解

    此题仅比打家劫舍一样的原理多了一步操作,就是对同一数字可能又多个,这种只需要重新定义一个数组来存储即可,数组的下标为元数组的数据,值为总值,数组的size为元数组的最大值。

    动态规划的守则:找到恒等式。

    第i个数字是否取与第i-2和第i个数字有关,又由于相邻不能取,所以dp[i] = Math.max(dp[i - 1] , dp[i - 2] + nums[i]);

    又因为所有操作仅与上两个数字有关,所以仅存储上两个数字即可。

    5. Code

    public class DeleteAndEarnA {
        public int deleteAndEarn(int[] nums) {
            int len = nums.length, maxVal = 0;
            for(int val : nums) {
                maxVal = Math.max(maxVal, val);
            }
            int[] sum = new int[maxVal + 1];
            for(int val : nums) {
                sum[val] += val;
            }
            return rob(sum);
    
        }
    
        public int rob(int[] nums) {
            /**
             * @Method: rob
             * @Author: haifwu
             * @Version:  1.0
             * @Date: 25/05/2021 21:11
             * @param nums
             * @Return: int
             * @Description:
             * 动态规划
             * 是对第一种方式的优化
             * 第一种方式需要另外定义一个数组来存储数据,
             * 由于在操作过程中只用到了前两个数,所以我们只需要
             * 保存前两个数即可。
             */
            if (nums == null || nums.length == 0) {
                return 0;
            }
            int len = nums.length;
            if(len == 1) {
                return nums[0];
            }
            if(len == 2) {
                return Math.max(nums[0], nums[1]);
            }
            int first = nums[0], second = Math.max(nums[1], nums[0]);
            for(int i = 2; i < nums.length; i++) {
                int temp = Math.max(first + nums[i], second);
                first = second;
                second = temp;
            }
            return second;
        }
    
        public static void main(String[] args) {
            int[] nums = {3, 4, 2};
            System.out.println(new DeleteAndEarnA().deleteAndEarn(nums));
        }
    }
  • 相关阅读:
    JPG bufffer转Mat
    cv:Mat MFC上显示 BitMatToWnd
    opencv 版本修改
    2个多边形的关系判断和相交面积计算
    截取图像 opencv
    SQL Server 存储过程的分页方案比拼
    XP系统下数据库文件夹的权限设置
    关于23种设计模式的有趣见解
    一些编程的好习惯
    sql server 2000的数据库还原
  • 原文地址:https://www.cnblogs.com/haifwu/p/14810771.html
Copyright © 2011-2022 走看看