202111-7更文-leetcode740:删除并获得点数

232 阅读2分钟

这是我参与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)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。