leetcode-删除并获得点数

本文详细解析了LeetCode的一道难题,涉及动态规划和数组操作。题目要求通过删除数组元素并获得点数,找到能获得的最大点数。博主首先构建了一个临时数组,以原数组数字为下标,记录其出现次数,然后利用动态规划求解,状态转移方程为dp[i]=max(dp[i-1],dp[i-2]+(arr[i]*i))。通过这种方法,找到了解决复杂问题的思路。
摘要由CSDN通过智能技术生成

leetcode-删除并获得点数
题目链接:题目链接

题目大意:给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
先来一组数据,方便后面,[2,2,3,3,3,4]
这里需要在原先数组的基础上得到一个临时数组arr,这个数组以nums里面的数字为下标,以其中的数字出现次数为值,那么上面的数组就应该是这样的,[0, 0, 2, 3, 1]
那么这个时候对于这个数组进行动态规划,不妨定义数组dp[i]为当前位置所能得到的最大点数,对于dp[i]来说,面临着两个选择,那就是是否删除这个点数,如果选择删除这个点数,那么配套的就是要删除arr中相邻的元素,所以得到的最大点数应该是dp[i-2]+arr[i]*i,如果不删除这个点数,则得到的最大价值应该等于dp[i-1],我们要取的就是这两个的最大值,所以可以得到状态转移方程,dp[i] = max(dp[i-1], dp[i-2]+(arr[i]*i)),在设置一下初始状态就能得到最终的代码了

public int deleteAndEarn(int[] nums) {
        int max = -1;
    	//获取原数组的最大值,方便后面的数组初始化
    	for(int i = 0; i < nums.length; i++) {
    		if(nums[i] > max) {
    			max = nums[i];
    		}
    	}
    	int[] sum = new int[max+1];
    	//初始化新的数组
    	for(int i = 0; i < nums.length; i++) {
    		sum[nums[i]]++;
    	}
    	//开始打家劫舍
    	sum[0] = 0;
    	//此时的状态转移方程是dp[i] = max(dp[i]*i+dp[i-2], dp[i-1])
    	for(int i = 2; i < sum.length; i++) {
    		sum[i] = Math.max(((sum[i]*i)+sum[i-2]), sum[i-1]);
    	}
    	return sum[max];
    }

暂时看到的最难的题目了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值