12.53.最大子序和
/**
* @author mys
* @version 2019.9.16
* 最大子序和
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
*
* 示例:
* 输入: [-2,1,-3,4,-1,2,1,-5,4],
* 输出: 6
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
*/
package com.mys.db;
import org.junit.Test;
public class MaxSubArray53 {
public int maxSubArray(int[] nums) {
int res = nums[0];
int sum = 0;
for (int num : nums) {
if (sum > 0) {
sum += num;
} else {
sum = num;
}
res = Math.max(sum, res);
}
return res;
}
@Test
public void fun() {
int [] nums = {-2,1,-3,4,-1,2,1,-5,4};
System.out.println("最大子序和:" + maxSubArray(nums));
}
}
13.70.爬楼梯
/**
* @author mys
* @version 2019.9.16
* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
* 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
*
* 爬上 n-1 阶楼梯 => 再爬1阶到n阶
* 爬上 n-2 阶楼梯 => 再爬2阶到n阶
* dp[n] = dp[n-1] + dp[n-2]
*/
package com.mys.db;
import org.junit.Test;
public class ClimbStairs70 {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
// dp[1] = 1//走一阶有1种走法
// dp[2] = 2;//走两阶有2种走法
// for (int i = 3; i <= n; i ++) {
// //dp[n] = dp[n-1] + dp[n-2]
// dp[i] = dp[i - 1] + dp[i - 2];
// }
dp[0] = 1;//比前面从1开始更快,内存使用更少,并无实际意义
dp[1] = 1;
for (int i = 2; i <= n; i ++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
@Test
public void fun() {
System.out.println(climbStairs(4));
}
}
14.121.股票最大收益
/**
* @author mys
* @version 2019.9.16
*
* 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
* 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
* 注意你不能在买入股票前卖出股票
*
* 前i天最大收益 = max{前 i-1 天最大收益, 第i天价格 - 前 i-1 天最小价格}
*/
package com.mys.db;
import org.junit.Test;
public class MaxProfit121 {
public int maxProfit(int[] prices) {
if (prices.length <= 1) {
return 0;
}
int max = 0;
int min = prices[0];
for (int price : prices) {
max = Math.max(max, price - min);
min = Math.min(min, price);
}
return max;
}
@Test
public void fun() {
int[] prices = {7,1,5,3,6,4};
System.out.println(maxProfit(prices));
}
}