
动态规划
leagalhigh
never give up!
展开
-
二叉树中最大路径和
分治,动态规划。分析:最长的路径一定经过某一个点,并且以这一个点为根节点;所以可以动态遍历每一个节点,找到使路径和最大的根节点。C++代码:/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int原创 2017-02-07 21:28:45 · 2596 阅读 · 0 评论 -
leetcode-338. Counting Bits
考察点:dp,bit运算&; 思路:重点是理解i&(i-1)是将数字 i 的二进制格式下最右边的1转换成0;dp[i]的含义是数字i的1bit数目,因此dp[i] = dp[i&(i-1)] + 1;就好理解了。 C++代码:class Solution {public: vector<int> countBits(int num) { vector<int> ret(原创 2017-04-26 16:23:14 · 214 阅读 · 0 评论 -
leetcode-523. Continuous Subarray Sum
考察hash、dp。 思路:用一个map记录,key是从开始0到i的和对k的余数,value是对应的i,及余数为key的情况下的下标值,若两个下标的余数相等,并且它们的下标差大于1的话,说明( ]区间内的连续和是k的倍数。这里的代码的map1[0]=-1用的很巧妙,若有两个数[5,7],这样可以使1-(-1)>1,返回true。 C++代码:class Solution {public:原创 2017-04-26 15:40:19 · 804 阅读 · 0 评论 -
leetcode-315. Count of Smaller Numbers After Self
这道题好难,考察树状数组。 思路:首先,先判断nums是否为0数组,若是做出相应选择;然后将nums转化为从1开始的数组,即整体平移,使其最小值为1;然后构造树状数组tree,tree【i】的含义要搞清楚:从tree【i】加到i去尾到0的tree【0】为,当前数字num位置后面的, 比num小的数的个数之和。然后每移动一次要更新一次tree。C++ 代码:class Solution {publ原创 2017-05-06 20:41:59 · 295 阅读 · 0 评论 -
leetcode-472. Concatenated Words
考察点:dp,看是否一个string可以由其他string组成的变种; 思路:首先要会一个string可以由其他string组成这道题。然后就可以依次按照string的length长短来判断是否满足上一道字问题。注意一点的是再判断时在第二个for循环下j应该按照从0到i的遍历一次而不是按照string集合去遍历,因为那样会超时。C++ 代码:class Solution {public:原创 2017-04-30 12:17:45 · 1074 阅读 · 2 评论 -
leetcode-139. Word Break
考察点:dp; 思路:dp总是那么难想。关键是要搞清楚dp【i】表示的是什么, 这里的dp【i】表示的就是问题:即s的前i个字符可以由set1内的字符串表示出来吗?方法是两个循环,外层是从s的第一个位置1到最后位置len;内层循环是遍历set1中的所有string,看第i个位置是否符合要求。 C++代码:class Solution {public: bool wordBreak(str原创 2017-04-30 11:15:03 · 342 阅读 · 0 评论 -
leetcode-321. Create Maximum Number-hard
题目链接:https://leetcode.com/problems/create-maximum-number/#/description这道题好难,我是看了discuss之后自己写出来的,用到了map存储, dp的思想,存储已经算出来的结果,以后用的时候没必要再算;还用到了贪心,具体体现在计算map和merge的函数中。本题思路:首先先从两个nums数组中分别计算从长度为i到k的最长数字组合,原创 2017-04-03 11:40:49 · 302 阅读 · 0 评论 -
栅栏染色-动态规划
这道题应该背下来,是经典的DP问题。当n==1时,有k种方案;当n==2时,有k*k种方案;当n==3时,分两种情况:1:后两根颜色相同(有num[1] * (k-1)=k*(k-1)种方案)2:后两根颜色不同(有num[2]*(k-1) = k*k*(k-1)种方案 )以后num[i]表示前i根柱子的方案数,num[i-1],num[i-2]表示前i-1 和 i-2种方案原创 2016-11-29 22:52:02 · 791 阅读 · 0 评论 -
通配符匹配
这个问题我看的别人的,用的动态规划解决。dp[i][j]表示的是s的前i个字符和p的前j个字符是否匹配;首先要使从1到最后初始化为false;然后初始化dp[0][0],表示前0个字符肯定匹配;然后根据是否是*来初始化边缘的dp值,如果s是是全*,则dp[i][0]全是true;最后要匹配中间的字符,根据是否有* 和是否有?来判断,最后根据是否相等来判断;返回d[lenS][lenP];转载 2017-01-26 23:47:24 · 240 阅读 · 0 评论 -
leetcode-516. Longest Palindromic Subsequence
考察思想:回文串、dp、边界条件特判;思路:dp【j】【i】表示下标j到i的最长字串; i下标从左往右遍历, j下标从i-1往0遍历,通过判断s【j】和s【i】的字符是否相等做出对dp【j】【i】的不同赋值。最终返回的dp【0】【len-1】即为最终结果。 C++ 代码:class Solution {public: int longestPalindromeSubseq(stri原创 2017-04-27 09:58:33 · 336 阅读 · 0 评论