小奥的学习笔记

  • Home
  • Learning & Working
    • Speech Enhancement Notes
    • Programming language
    • Computer & DL
    • MOOC
  • Life
    • Life Time
    • Thinking & Comprehension
    • Volunteer
    • Plan
    • Travel
  • Footprints
  • GuestBook
  • About
    • About Me
    • 个人履历
    • 隐私策略
  1. 首页
  2. Study-notes
  3. Programming language
  4. Algorithm
  5. Leetcode
  6. 正文

Leetcode题目解析(191018)

2019年10月21日 704点热度 0人点赞 0条评论

Leetcode 494:目标和

题目描述

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。

返回可以使最终数组和为目标数 S 的所有添加符号的方法数。

示例

输入: nums: [1, 1, 1, 1, 1], S: 3
输出: 5
解释:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3

一共有5种方法让最终目标和为3。

解题思路

这个题本质上是一个背包问题。但是如果不进行一些推导,我们很难看出这是一个背包问题。所以这真的是很考察人的逻辑思维能力。

由题目可知,数组里面的数字要么为加上的数字要么为减去的数字,所以我们可以将这两组数字分为两组,一组为要加上的数字,我们命名为P,它的和为sum(P);一组为要减去的数字,我们命名为N,它的和为sum(N)。另外我们将数组中所有和命名为sum(nums)。那么可以得到sum(P)-sum(N)=target。

进一步推导,

sum(nums)+sum(P)-sum(N)=target+sum(nums)
==>sum(P)+sum(N)+sum(P)-sum(N)=target+sum(nums)
==>2*sum(P)=target+sum(nums)
==>sum(P)=(target+sum(nums))/2

那么这个问题就转化为了:在nums数组中选择哪些数字,使它们的和为(target+sum(nums))/2。这个问题,我们就可以使用0-1背包来解决。

其实从这个新的问题我们就可以看出,若sum(P)为奇数,那么就不存在相应的组合。

0-1背包问题,我们可以使用动态规划的思想来解决。我们新建一个dp数组,大小为(target+sum(nums))/2+1。对于数组中每一个元素来说,其下标代表着和为当前数的方案数(例如dp[4]=9代表和为4有9种情况)。
代码中for循环的意思,其实是针对前i个数的情况下,和的值为相应下标有多少种情况(例如在对于第3个1的情况下dp[4]就是代表着加入这个数组只有前3个数字,那么就在这三个数字情况下和为4有多少种情况)。其实这是一个动态更新的过程。

我们知道对于0-1背包问题来说,当前物品有两种情况,一为选择二为不选择。所以对于0-1背包问题来说,目标值=当前物品不选择且前一步骤达到目标值的情况+前一步骤没有达到目标值且加上当前物品恰好达到目标值的情况。
那么对于dp[i]=dp[i]+dp[i-num]来说,等号后面的dp[i]的值是上一步计算出来的和为i的情况数,也就是说我们在上一步选择完成之后已经达到了我们的target,那么当前数字肯定不选择,所以dp[i]就是代表了这种情况。

对于后面的dp[i-num]来说,就是前一步骤没有达到目标值且加上当前物品恰好达到目标值的情况。其实dp[i-num]就是到目前为止和为i-num有多少种选择,所以这也就等价于前一步骤没有达到目标值且加上当前物品恰好达到目标值的情况。

故这就是整个题目的思路。

代码实现

 int findTargetSumWays(vector<int>& nums, int S) {
    int sum = 0;
    int times = 0;
    for (int n : nums)
    {
        sum += n;
    }
    if (sum < S||(sum+S)%2==1)
        return 0;
    S = (S + sum) / 2;
    vector<int>dp(S + 1, 0);
    dp[0] = 1;
    for (int num : nums)
    {
        for (int i = S;i >= num;i--)
            dp[i] += dp[i - num];
    }
    return dp[S];
}

Leetcode 538:把二叉搜索树转换成累加树

题目描述

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。

示例

输入: 二叉搜索树:
5
/ \
2 13

输出: 转换为累加树:
18
/ \
20 13

解题思路

这个题其实就是一个变相的中序遍历,所以按照中序遍历进行处理即可。具体看代码。

代码实现

    int num=0;
    TreeNode* convertBST(TreeNode* root) {
        if(root!=nullptr)
        {
            convertBST(root->right);
            root->val=root->val+num;
            num=root->val;
            convertBST(root->left);
            return root;
        }
        return nullptr;
    }
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: leetcode
最后更新:2019年10月21日

davidcheung

这个人很懒,什么都没留下

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

搜索
欢迎关注我的个人公众号
最新 热点 随机
最新 热点 随机
DEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架 奥地利匈牙利九日游旅程 论文阅读之Study of the General Kalman Filter for Echo Cancellation 小奥看房之鸿荣源珈誉府 杭州往返旅途及西溪喜来登和万怡的体验报告 2022年的第一篇碎碎念
奥地利匈牙利九日游旅程论文阅读之Study of the General Kalman Filter for Echo CancellationDEEPFILTERNET:一种基于深度滤波的全频带音频低复杂度语音增强框架
欢迎大家学习由昆士兰大学提供的热带海岸线生态系统课程! 每日一感0922:严重抗议日本的这种暴行! 忏悔录——高一第一阶段水平测试总结 小奥の专属领地V4正式上线! 2019年牛客网校招全国同一模拟笔试(5月场)部分题目解析 未知原因,导致数据库部分数据丢失
标签聚合
高中 鸟哥的linux私房菜 学习 leetcode 算法 linux python学习 Python Java 生活
最近评论
davidcheung 发布于 5 个月前(02月09日) The problem has been fixed. May I ask if you can s...
tk88 发布于 5 个月前(02月07日) Hmm is anyone else having problems with the pictur...
cuicui 发布于 9 个月前(10月20日) :wink:
niming 发布于 10 个月前(09月19日) 同级校友,能刷到太巧了
davidcheung 发布于 2 年前(08月16日) 我得找一下我之前整理的word文档看一下,如果找到了我就更新一下这篇文章。
Nolan 发布于 2 年前(07月25日) 您的笔记非常有帮助。贴图不显示了,可以更新一下吗?
davidcheung 发布于 3 年前(06月19日) 到没有看webrtc的代码。现在主要在看我们公司的代码了。。。只是偶尔看一看webrtc的东西。。。
aobai 发布于 3 年前(03月13日) gain_change_hangover_ 应该是每三个block 只能够调整一次,这样保证每帧...
匿名 发布于 5 年前(12月30日) 烫
小奥 发布于 5 年前(12月12日) webRTC里面的NS本身我记得就是在C++里面呀

COPYRIGHT © 2025 小奥的学习笔记. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

陕ICP备19003234号-1

鲁公网安备37120202000100号