问题
思路
- 使用动态规划,先创建以nums数组(最大值+1)为长度的数组temp,来统计各个值出现的次数
- 创建dp数组,给dp[1] 赋初始值 temp[1]
- 使用公式 m a x ( d p [ i − 2 ] + t e m p [ i ] ∗ i , d p [ i − 1 ] ) max(dp[i-2]+temp[i]*i,dp[i-1]) max(dp[i−2]+temp[i]∗i,dp[i−1]) ,这个公式来判别两个相邻近的数字使用哪个作为删除的数字
时间
代码
class Solution {
public int deleteAndEarn(int[] nums) {
if(nums.length==0)return 0;
int m=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
m=Math.max(m,nums[i]);
}
int[] temp=new int[m+1];
for(int i=0;i<nums.length;i++){
temp[nums[i]]++;
}
int[] dp=new int[m+1];
dp[1]=temp[1];
for(int i=2;i<dp.length;i++){
dp[i]=Math.max(dp[i-2]+temp[i]*i,dp[i-1]);
}
return dp[m];
}
}