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. jsp中c标签的使用

    jsp中c标签的使用 核心标签库 它是JSTL中的核心库,为日常任务提供通用支持,如显示和设置变量.重复使用一组项目.测试条件和其他操作(如导入和重定向Web内容).Core标签按功能可分为4种类型: ...

  2. HDU 1087 E - Super Jumping! Jumping! Jumping! DP

    http://acm.hdu.edu.cn/showproblem.php?pid=1087 设dp[i]表示去到这个位置时的最大和值.(就是以第i个为结尾的时候的最大值) 那么只要扫描一遍dp数组, ...

  3. SSIS控件使用

    1.转换控件: 2.执行SQL任务,返回一个值后,判断全量,还是增量?

  4. 基于JAVA的设计模式之单例模式

    概念 于大二上学期面向对象C++期中考试中有这么道题:一个Computer有多个USB插口,那么意味着这台电脑可以插多个鼠标,但是无论你如何拔插多少个鼠标,桌面上的鼠标一直只显示一个,且多个硬件鼠标都 ...

  5. centOS 下开启端口号

    firewall-cmd --zone=public --add-port=80/tcp --permanent permanent参数表示永久生效 更新防火墙规则  firewall-cmd --r ...

  6. css:focus伪类的使用

    css中:focus伪类的使用,即给已获取焦点的元素设置样式 示例一 <!DOCTYPE html> <html lang="en"> <head&g ...

  7. js之深度克隆、简易克隆

    一.js中的对象 谈到对象的克隆,必定要说一下对象的概念. js中的数据类型分为两大类:原始类型和对象类型. (1)原始类型包括:数值.字符串.布尔值.null.undefined(后两个是特殊的原始 ...

  8. 本号讯 | 人工智能手表为帕金森患者带来书写希望;微软翻译发布可实时翻译幻灯片的Presentation Translator

    7 月 12 日,微软成立微软研究院人工智能中心(Microsoft Research AI).这是一个隶属于微软研究体系内的科研和孵化中心,将聚焦于解决最复杂的人工智能挑战. 这支由科学家和工程师组 ...

  9. CAS 配置NLB 负载均衡网络无法连接

    在虚拟机与虚拟机.虚拟机与实机之间利用Windows操作系统自带的网络负载均衡功能如选择单播集群模式,网络就无法通讯,NLB不成功. Scenario #1 在虚拟机与虚拟机之间选择多播模式NLB可正 ...

  10. smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp10,DsCowAA3nir1u6xZq42WDw--.22935S2 1504492533,please

    # from email.mime.text import MIMEText # # msg = MIMEText('hello, send by Python...', 'plain', 'utf- ...