303. Range Sum Query - Immutable

解题思路:

Note里说sumRange会被调用很多次。。所以简直强烈暗示要做cache啊。。。所以刚开始,虽然用每次都去遍历数组求和的方式可以

AC,但是真的耗时太长了。因此,考虑不存储数组nums,而是在array[i+1]处存前i项的和。这样的话,求i和j之间的和,只需要用

array[j+1]-array[i]即可以求得了。这样是直接访问数组,会快很多。

class NumArray {
public:
NumArray(vector<int> nums) {
// default is 0
array = new int[nums.length() + 1];
for (int i = 0; i < nums.length(); i++) {
array[i + 1] = array[i] + nums[i];
}
} int sumRange(int i, int j) {
return array[j + 1] - array[i];
}
private:
// Notice
int[] array;
};

70. Climbing Stairs

解题思路:

类似汉诺塔问题。。

int climbStairs(int n) {
if (n <= 2)
return n;
// from n-1 to n
int oneBefore = 2;
int twoBefore = 1;
int sum = 0;
for (int i = 2; i < n; i++) {
sum = oneBefore + twoBefore;
twoBefore = oneBefore;
oneBefore = sum;
}
return sum;
}

198. House Robber

解题思路:

由题目可知,不能抢劫相邻的两家,所以可以考虑单数线和双数线。

int Max(int a, int b) {
return a > b ? a : b;
}
int rob(vector<int>& nums) {
int even = 0;
int odd = 0;
for(int i = 0; i < nums.size(); i++) {
if (i % 2 == 0)
// if odd is bigger, nums[i-1] is chosen and nums[i] isn't chosen
// otherwise, nums[i] is chosen.
even = Max(even + nums[i], odd);
else
odd = Max(even, odd + nums[i]);
}
// return max of two lines
return Max(even, odd);
}

300. Longest Increasing Subsequence

解题思路:

arr[i]存的是以nums[i]结尾的最长递增子序列的长度,所以计算时:

arr[i] = max(arr[j]+1) 其中, nums[j] < nums[i], j = 0...i-1

写的时候,注意max在内层循环结束后要更新。。。最终只要得到arr[]中的最大值就是结果。

int lengthOfLIS(vector<int>& nums) {
if (nums.size() <= 1)
return nums.size();
int arr[nums.size()];
arr[0] = 1;
int i, j;
int max = 1;
for (i = 0; i < nums.size(); i++) {
for (j = 0; j < i; j++) {
if (nums[j] < nums[i]) {
if (arr[j] + 1 > max)
max = arr[j] + 1;
}
}
arr[i] = max;
max = 1;
}
int result = arr[0];
for (i = 1; i < nums.size(); i++)
if (arr[i] > result)
result =arr[i];
return result;
}

72. Edit Distance

解题思路:

听老师讲完编辑距离那块,做这个就很容易了。思路是用一个数组edit[i][j]存储word1[1..i]变到word2[1..j]的编辑距离。数组的递推公式为:

解释:前两行是空串到非空串的情况;第三行是i,j > 0时,前两种是增加一个字母,最后一种是替换或不替换(word1[i]与word[j]相同,所以

此处要保持编辑距离)

实际写的时候,注意字符串的下标从0开始,所以diff(i-1, j-1)

int Min(int a, int b, int c) {
if (a <= b && a <= c)
return a;
if (b <= a && b <= c)
return b;
if (c <= a && c <= b)
return c;
}
int minDistance(string word1, string word2) {
int len1 = word1.length();
int len2 = word2.length();
if (len1 == 0)
return len2;
if (len2 == 0)
return len1;
int edit[len1+1][len2+1];
for (int i = 0; i <= len1; i++)
edit[i][0] = i;
for (int i = 0; i <= len2; i++)
edit[0][i] = i;
int diff;
int i, j;
for (i = 1; i <= len1; i++) {
for (j = 1; j <= len2; j++) {
if (word1[i-1] == word2[j-1])
diff = 0;
else
diff = 1;
edit[i][j] = Min(edit[i-1][j]+1, edit[i][j-1]+1, diff+edit[i-1][j-1]);
}
}
return edit[len1][len2];
}

leetcode-20-Dynamic Programming的更多相关文章

  1. [LeetCode] 139. Word Break_ Medium tag: Dynamic Programming

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  2. [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  3. [LeetCode] 55. Jump Game_ Medium tag: Dynamic Programming

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  4. [LeetCode] 63. Unique Paths II_ Medium tag: Dynamic Programming

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  5. [LeetCode] 121. Best Time to Buy and Sell Stock_Easy tag: Dynamic Programming

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  6. [LeetCode] 53. Maximum Subarray_Easy tag: Dynamic Programming

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  7. [LeetCode] 312. Burst Balloons_hard tag: 区间Dynamic Programming

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by ...

  8. [LeetCode] 64. Minimum Path Sum_Medium tag: Dynamic Programming

    Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...

  9. [LeetCode] 72. Edit Distance_hard tag: Dynamic Programming

    Given two words word1 and word2, find the minimum number of operations required to convert word1to w ...

  10. [LeetCode] 152. Maximum Product Subarray_Medium tag: Dynamic Programming

    Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...

随机推荐

  1. linux yum 安装

    ################## http://rpm.pbone.net/ 下载下来的包放到本地yum源中,然后在这个目录下面重新生成依赖关系就可以使用yum包来完成安装了 tt 1. 生成依赖 ...

  2. 线程池ThreadPoolExecutor的学习

    我们知道,ExecutorService是一个抽象出线程池的一个接口,然后我们在使用线程池的时候,用的是Executors工具类中的一系列newCachedThreadPool() 等类似的方法,这些 ...

  3. SQL SERVER 同一个表并且是同一个时间字段进行相减

    表AID NUM TIEM1 10 2012-06-10 10:10:002 20 2012-06-10 20:10:003 20 2012-06-10 20:10:004 10 2012-06-10 ...

  4. javascript组件封装中一段通用代码解读

    有图有真相,先上图. 相信很多想去研究源码的小伙伴一定被这段代码给吓着了把,直接就打消了往下看下去的想法.我刚开始看的时候也是有点一头雾水,这是什么东东这么长,但是慢慢分析你就会发现其中的奥秘,且听我 ...

  5. 测试的发现遗漏BUG的做法

    首先要确认BUG的影响范围: 后续做法如下: 1.从测试角度来说,外部缺陷等同与系统崩溃,测试是必须提的2.可以询问主管或负责人是否在后一个版本中修改3.评估缺陷对于用户使用存在多大的不便4.判定缺陷 ...

  6. 宿主机Windows访问虚拟机Linux文件(一)

    如果用户使用windows操作系统,但是在虚拟机下配置Linux内核操作操作系统,往往需要实现通过宿主机Windows操作系统访问Linux内核操作系统中资源.本次实验实现的是宿主机windows 1 ...

  7. SQL Server 2012安装配置(Part4 )

    SQL Server 2012安装配置(Part1) SQL Server 2012安装配置(Part2) SQL Server 2012安装配置(Part3 ) SQL Server 2012安装配 ...

  8. linux系统及服务安全(持续更新中)

    linux安全 1.隐藏NGINX和PHP版本号 curl -I "http://www.xxx.com" //检测 nginx:  http段加入server_tokens of ...

  9. 《spss统计分析与行业应用案例详解》:实例十二 卡方检验

    卡方检验的功能与意义 SPSS的卡方检验是非参数检验方法的一种,其基本功能足通过样本的 频数分布来推断总体是否服从某种理论分布或某种假设分布,这种检验过程是通过分析实际的频数与理论的频数之间的差别或是 ...

  10. C#的位运算

    链接地址: http://www.cnblogs.com/NetBelieve/archive/2012/07/30/2615006.html