这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
leetcode740:删除并获得点数
前文
本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。
题目信息分析
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
解题思路分析
解法1
这个问题表面上比较复杂,当选择到对应元素后,还需要对相邻大小的元素进行处理。其实可以换个思路,先对整个数组进行从小到大排序。经过排序后可以发现,该问题可以转化为前n-1个点获得的最大值,加上当前节点获得的值,与前n个节点获得的最大值相比较哪一个更大。因此很容易想到动态规划的解题思路。将每个节点的实际数值,作为动态规划dp数组的值。而状态转移方程则根据f(n-1) + current 与 f(n)进行比较得出。以这个思路对整个数组进行循环操作即可。而要得到每个节点具体的数值,采用map要由于本方案采用的双循环的操作,时间复杂度能够显著降低。本方案暂时采用了数组双循环进行计算,暂时未做时间复杂度的优化。而开始阶段需要对初始节点进行手动计算。至此,解题完毕。
public int deleteAndEarn(int[] nums) {
// 首先进行排序
Arrays.sort(nums);
if(nums.length == 0){
return 0;
}
int pre = 0;
int pre1 = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 1){
pre++;
}
}
for (int i = 2; i <= nums[nums.length-1]; i++) {
int max = 0;
int index = 0;
for (int j = 0; j < nums.length; j++) {
if(i == nums[j]){
max += nums[j];
}
}
max = Math.max(pre,pre1+max);
pre1 = pre;
pre = max;
}
return pre;
}
复杂度分析
- 时间复杂度 o(n)
- 空间复杂度 o(1)
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。