力扣740-删除并获得点数

        当选了第i个数的时候就不能再选第i-1和第i+1的数,则在解题的时候可以考虑将原始数组转为可以利用动态规划算法的数组处理,这样就比较简单了。只是这样空间复杂度会增加一点。

package likou;
/*
 * 删除并获得点数
 * 题干:
 * 	给你一个整数数组nums,你可以对它进行一些操作;
 * 	每次操作中,选择任意一个nums[i]删除它并获得 nums[i]的点数;
 * 	 	然后你必须删除所有等于nums[i]-1和nums[i]+1的元素
 * 	开始你拥有 0 个点数,返回你能通过这些操作获得的最大点数;
 */
public class Demo740 {
	
	/*
	 * 假设输入数组为nums,其中1 <= nums[i] <= 10000
	 * 删除第i个元素,int temp = nums[i];
	 * 则要求删除num数组中所有值等于temp-1和temp+1的值,然后再重新选
	 * 要求返回的数字最大,则肯定是要能选点数最多的数据尽可能多
	 * 	所选的数据尽可能多
	 * 设计思路:
	 * 		步骤1.先定义一个数组,下标为nums[i]的值,则i需要取nums数组中的最大值
	 *      步骤2.对nums数组遍历,下标为nums[i]的值,相当于把数组转为满足打家劫舍条件的数组
	 *      步骤3,按打家劫舍算法对数据进行处理(如取了[i]的值,则[i-1]和[i+1]两个相邻的数据都不能选)
	 */
	public int deleteAndEarn(int[] nums) {
		int maxValue = nums[0];
		for (int i = 0; i < nums.length; i++) {
			int temp = nums[i];
			maxValue = Math.max(maxValue, temp);
		}
		int[] tempNums = new int[maxValue+1];

		for (int j = 0; j < nums.length; j++) {
			int tempNum = nums[j];
			tempNums[tempNum] = tempNums[tempNum] + nums[j];
		}
		int p1 = tempNums[0];
		int p2 = Math.max(p1, tempNums[1]);
		int p3 = 0;
		for (int k = 2; k <tempNums.length; k++) {
			p3 = Math.max(p1 + tempNums[k], tempNums[k - 1]);
			p1 = tempNums[k - 1];
			p2 = p3;
		}

		return p3;
	}
	
	public static void main(String args[]) {
		Demo740 demo = new Demo740();
		int[] nums = {2,2,3,3,3,4};
		System.out.println(demo.deleteAndEarn(nums));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunny_daily

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值