首页 > 其他分享 >LeetCode|3180. 执行操作可获得的最大总奖励 I(day23)

LeetCode|3180. 执行操作可获得的最大总奖励 I(day23)

时间:2024-10-25 22:49:33浏览次数:7  
标签:可行 day23 奖励 rewardValues 3180 数组 let LeetCode dp

作者:MJ昊

博客:掘金CSDN

公众号:程序猿的编程之路

今天是 昊 的算法之路第23天,今天分享的是LeetCode第3180题执行操作可获得的最大总奖励 I的解题思路。这是一道中等难度的题目,要求我们在给定的奖励值数组中,通过某些操作尽可能获取最大总奖励。

题目描述简要回顾

题目要求从一个数组rewardValues中选择部分值,使得这些值相加可以尽可能获得最大的总和。同时我们要考虑到一些操作限制,确保总和符合特定规则或范围。

解题思路

  1. 排序处理:先对 rewardValues 数组进行升序排列,以便我们从小到大依次尝试累积奖励值。
  2. 动态规划数组:使用一个dp数组来标记哪些奖励和是可行的。dp[i]为 1 表示可以通过某些操作获得和为i的总奖励。
  3. 倒序遍历:从最大可能的范围向下更新dp,确保每次累加时避免重复计算。
  4. 结果计算:最后遍历dp数组,找出最大的可行奖励和。

代码实现:

var maxTotalReward = function (rewardValues) {
    rewardValues.sort((a, b) => a - b);// 对奖励值数组进行排序
    const m = rewardValues[rewardValues.length - 1]; // 找到最大奖励值
    const dp = Array(m * 2).fill(0);// 初始化动态规划数组
    dp[0] = 1;// 初始状态:和为 0 是可行的
    // 遍历奖励值,并倒序更新 dp 数组
    for (let x of rewardValues) {
        for (let k = 2 * x - 1; k >= x; k--) {
            if (dp[k - x] === 1) {
                dp[k] = 1;// 如果减去 x 后可行,则当前和也可行
            }
        }
    }
    // 找到最大的可行奖励和
    let res = 0;
    for (let i = 0; i < dp.length; i++) {
        if (dp[i] === 1) {
            res = i;
        }
    }
    return res;
};

总结

本题采用排序结合动态规划的方法,通过倒序遍历避免重复累加,从而有效计算出最大可行的奖励和。通过合理地更新 dp 数组,我们可以保证解法的高效性。在面临类似的求解最大和问题时,这种思路具有很强的通用性。

标签:可行,day23,奖励,rewardValues,3180,数组,let,LeetCode,dp
From: https://blog.csdn.net/Hao_i/article/details/143243825

相关文章

  • LeetCode|384. 打乱数组(day22)
    作者:MJ昊博客:掘金、CSDN等公众号:程序猿的编程之路今天是昊的算法之路第22天,今天分享的是LeetCode第384题打乱数组的解题思路。这是一道中等难度的题目,要求我们实现一个算法,使得数组支持随机打乱和重置为初始顺序的功能,并且每种排列出现的概率应当相等。题目描述简要......
  • LeetCode|910. 最小差值 II(day19)
    作者:MJ昊博客:掘金、CSDN等公众号:程序猿的编程之路今天是昊的算法之路第19天,今天分享的是LeetCode第910题最小差值II的解题思路。这是一道中等难度的题目,考察如何通过调整数组中的数值来最小化最大值与最小值之间的差距。题目描述简要回顾给定一个整数数组nums和......
  • 2024-10-23-leetcode每日一题-构成整天的下标对数目 II
    题目描述给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i<j 且 hours[i]+hours[j] 构成 整天 的下标对 i, j 的数目。整天 定义为时间持续时间是24小时的 整数倍 。例如,1天是24小时,2天是48小时,3天是72小时,以此类推。......
  • LeetCode_70. 爬楼梯_java
    1、题目70.爬楼梯https://leetcode.cn/problems/climbing-stairs/假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输......
  • LeetCode_509. 斐波那契数_java
    1、题目509.斐波那契数https://leetcode.cn/problems/fibonacci-number/斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给定n,请......
  • LeetCode_2119. 反转两次的数字_java
    1、题目2119.反转两次的数字https://leetcode.cn/problems/a-number-after-a-double-reversal/反转一个整数意味着倒置它的所有位。   例如,反转2021得到1202。反转12300得到321,不保留前导零。给你一个整数num,反转num得到reversed1,接着反转reversed1......
  • leetcode-1280-学生参加各科测试的次数
    链接:1280.学生们参加各科测试的次数-力扣(LeetCode)前提条件:学生表: Students+---------------+---------+|ColumnName|Type|+---------------+---------+|student_id|int||student_name|varchar|+---------------+---------+在SQL中,主......
  • 【每日一题】LeetCode - 最长回文子串
    在字符串相关的算法题中,寻找最长回文子串是一个经典且富有挑战性的题目。本篇将详细分析并推导两种有效的解决方案:动态规划法和中心扩展法。题目描述给定一个字符串s,我们需要找到s中最长的回文子串。回文是指正着读和反着读都相同的字符串。例如,输入"babad"时,输出可......
  • 【leetcode-面试经典 150 题】-4.删除有序数组中的重复项 II
    题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用O(1)额外空间的条件下完成。示例1:输入:nums=[1,1,1,2,2,3]输出:5,nums=......
  • 【leetcode-面试经典 150 题】-1.合并两个有序数组
    题目:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 ......