ARTS 第35周

ARTS (第36周)

归纳和总结。

Algorithm 算法

买卖股票的最佳时机

https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/

leetcode 121

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1 暴力搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 执行用时:545 ms,在所有java提交中击败了5.01%的用户
// 内存消耗:38.1 MB,在所有java提交中击败了54.64%的用户
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0)
return 0;
// return maxProfit_help(prices,0,0);
int result = 0;
for (int i = 0; i < prices.length; i++) {
for (int j = i + 1; j < prices.length; j++) {
result = Math.max(prices[j] - prices[i], result);
}
}
return result;
}

解法2 动态规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 执行用时:3 ms,在所有java提交中击败了46.26%的用户
// 内存消耗:38 MB,在所有java提交中击败了56.33%的用户
public int maxProfit_dp(int[] prices) {
// dp
if (prices == null || prices.length == 0)
return 0;
// 到今天最小的
int[] dp = new int[prices.length];
dp[0] = prices[0];
int max = 0;
for (int i = 1; i < prices.length; i++) {
max = Math.max(max, prices[i] - dp[i - 1]);
dp[i] = Math.min(dp[i - 1], prices[i]);
}
return max;
}

Review 英文文章

https://spring.io/guides/gs/accessing-data-mongodb/

使用mongodb

Tip 技巧

现代计算机的组成

冯诺依曼理论的要点是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。
人们把冯诺依曼的这个理论称为冯诺依曼体系结构。从EDVAC到当前最先进的计算机都采用的是冯诺依曼体系结构。所以冯诺依曼是当之无愧的数字计算机之父。
根据冯诺依曼体系结构构成的计算机,必须具有如下功能:
把需要的程序和数据送至计算机中。
必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。
能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力。
能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作。
能够按照要求将处理结果输出给用户。
为了完成上述的功能,计算机必须具备五大基本组成部件,包括:
1:输入数据和程序的输入设备;
2:记忆程序和数据的存储器;
3:完成数据加工处理的运算器;
4:控制程序执行的控制器;
5:输出处理结果的输出设备。

https://baike.baidu.com/item/%E5%86%AF%C2%B7%E8%AF%BA%E4%BE%9D%E6%9B%BC%E7%BB%93%E6%9E%84%E8%AE%A1%E7%AE%97%E6%9C%BA/10430105?fr=aladdin

Share 分享

https://www.jianshu.com/p/c32ce5678c50 教,才是最好的学!

状态机的思路

关键就在于列举出所有可能的「状态」,然后想想怎么穷举更新这些「状态」。一般用一个多维 dp 数组储存这些状态,从 base case 开始向后推进,推进到最后的状态,就是我们想要的答案。想想这个过程,你是不是有点理解「动态规划」这个名词的意义了呢?

具体到股票买卖问题,我们发现了三个状态,使用了一个三维数组,无非还是穷举 + 更新,不过我们可以说的高大上一点,这叫「三维 DP」,怕不怕?这个大实话一说,立刻显得你高人一等,名利双收有没有。

所以,大家不要被各种高大上的名词吓到,再多的困难问题,奇技淫巧,也不过是基本套路的不断升级组合产生的。只要把住算法的底层原理,即可举一反三,逐个击破。

作者:labuladong
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/yi-ge-fang-fa-tuan-mie-6-dao-gu-piao-wen-ti-by-l-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。