上一页 1 ··· 25 26 27 28 29 30 31 32 33 ··· 43 下一页
摘要: 有了前几题的经验,这道题也很快过了。有序添加,每一次DFS都是找解中的第i个元素。public class Solution { ArrayList> ans = new ArrayList>(); ArrayList tmp = new ArrayList(); public ArrayList> combinationSum2(int[] candidates, int target) { ans.clear(); tmp.clear(); Arrays.sort(candidates); boolean used[... 阅读全文
posted @ 2013-09-21 23:18 阿牧遥 阅读(178) 评论(0) 推荐(0)
摘要: 有了之前的经验,此题相对顺利。public class Solution { ArrayList> ans = new ArrayList>(); ArrayList tmp = new ArrayList(); public ArrayList> combinationSum(int[] candidates, int target) { ans.clear(); tmp.clear(); sub(candidates, 0, 0, target); return ans; } private vo... 阅读全文
posted @ 2013-09-21 23:08 阿牧遥 阅读(185) 评论(0) 推荐(0)
摘要: 要完成这道题,首先让我们再回顾一下SubSet IIhttp://discuss.leetcode.com/questions/265/subsets-ii1.每次进入sub的时候,都会记录当前path为一个结果(一个子集);2.进入sub时,是用i个元素的子集来推导i+1个元素的子集的过程;3.有了i个元素,第i+1个元素只从原始集合S的位置i之后的元素选;4.该算法的关键是,有序添加。保证,产生的集合中的元素是有序的。比如[1,2,3,4,5](暂不考虑重复)如果进入sub的时候是[1,3],那么下一步是[1,3,4]和[1,3,5]为什么没有[1,3,2]呢,因为[1,2]比如在[1,3 阅读全文
posted @ 2013-09-21 11:57 阿牧遥 阅读(716) 评论(0) 推荐(0)
摘要: DFS的遍历。里面的关键是两个:1.使用了合理的数据结构,用ArrayList来存每一段;2.后来发现一个条件是,除了‘0’以外不能有以‘0’开头的段;我看有的人判断比255小是先转化为数字再判断,比我这个字符串的简单。public class Solution { ArrayList result = new ArrayList(); ArrayList section = new ArrayList(); public ArrayList restoreIpAddresses(String s) { result.clear(); sectio... 阅读全文
posted @ 2013-09-20 21:20 阿牧遥 阅读(238) 评论(0) 推荐(0)
摘要: 高精度大数相乘。首先是用数组存大数,然后关键的是ans[i+j] += num1[i]*num2[j]。数组中的数这时可能会大于10,就扫一遍做进位处理。编写中犯过的两个错:1.ans[i+j] += num1[i]*num2[j]没有写+;2.略过末尾的0时,忘记判断index>=0;3.如果结果... 阅读全文
posted @ 2013-09-20 20:52 阿牧遥 阅读(295) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1017/划分型动态规划1.转移方程是:f[i][j]=max(f[k][j-1]*t[k+1][i]),f[i][j]表示前面i个字符加上j个乘号所得的最大值,t[i][j]表示i到j的数值;2.可预处理,先计算出每段的数字值;3.看代码分析错误实在不行时,还是debug一下吧。#include #include #define ulong long longusing namespace std;ulong t[45][45]; // number from i to j; start from 0;ulong f[45][10]; // 阅读全文
posted @ 2013-09-20 12:18 阿牧遥 阅读(162) 评论(0) 推荐(0)
摘要: 棋盘型动态规划。(PPT:http://wenku.baidu.com/view/56badad850e2524de5187ea3.html)该类动态规划有一个共性,那就是在一个矩阵中(一般是二维矩阵,当然可能有更加复杂的图形)给出一些规则,然后按规则去做某些决策,我们思考这类问题的基本方法是:以坐标为状态,坐标之间的转换关系,一般利用问题给出的规则进行决策转移。状态转移方程一般可描述如下: F(i,j)=Max{f(i-1,k)}+决策;这里k为规则数此题简单。唯一的处理是用(不会重复的)整数来记录二维的点。还有差点忘记了C++中的数组定义是int mx[25][25]这样的了。多语言使用的 阅读全文
posted @ 2013-09-19 19:03 阿牧遥 阅读(323) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1048/区间型动态规划。参考PPT:http://wenku.baidu.com/view/73c1ded5b9f3f90f76c61bc4.html首先对于这样的动态规划,我现在的经验是可以有两种思路一是从k到k+1,二是分左右两段,此题就是分左右两段。在PPT中的题目,是一个环(或者圈),最后又有一个优化,就是把n个的环变成2*n个的Array,这样就把复杂度保持在O(n^3)。当然本题是非环,更简单一点。在PPT的总结里也写到:该类问题的基本特征是能将问题分解成为两两合并的形式。解决方法是对整个问题设最优值,枚举合并点,将问题分解成为 阅读全文
posted @ 2013-09-19 16:51 阿牧遥 阅读(266) 评论(0) 推荐(0)
摘要: http://wikioi.com/problem/1576/经典的动态规划。我写了个o(n^2)的DP方法。PPT:http://wenku.baidu.com/view/bd290294dd88d0d233d46ac7.html线型动态规划问题,最典型的特征就是状态都在一条线上,并且位置固定,问题一般都规定只能从前往后取状态,解决的办法是根据前面的状态特征,选取最优状态作为决策进行转移。设前i个点的最优值,研究前i-1个点与前i个点的最优值,利用第i个点决策转移,如下图。状态转移方程一般可写成: fi(k) = min{ fi-1 or j( k’) + u(i,j) or u(i,i.. 阅读全文
posted @ 2013-09-18 15:04 阿牧遥 阅读(618) 评论(0) 推荐(0)
摘要: 简单题。public class Solution { public ArrayList getRow(int rowIndex) { ArrayList ans = new ArrayList(); ans.add(1); ArrayList tmp = new ArrayList(); for (int i = 1; i <=rowIndex; i++) { for (int j = 0; j <= i; j++) { if (j == 0 ... 阅读全文
posted @ 2013-09-18 13:52 阿牧遥 阅读(155) 评论(0) 推荐(0)
上一页 1 ··· 25 26 27 28 29 30 31 32 33 ··· 43 下一页