CodingTour
ARTS #53

Algorithm

本周选择的算法题是:Best Time to Buy and Sell Stock II

规则如下:

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

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).

Note: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again).

Example 1:

Input: [7,1,5,3,6,4]
Output: 7
Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
             Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.

Example 2:

Input: [1,2,3,4,5]
Output: 4
Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
             Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are
             engaging multiple transactions at the same time. You must sell before buying again.

Example 3:

Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

Constraints:

  • 1 <= prices.length <= 3 * 10 ^ 4
  • 0 <= prices[i] <= 10 ^ 4

Solution

Runtime:60 ms,快过 78.99%。

Memory:15 MB,低于 78%。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        profit = 0
        for i in range(1, len(prices)):
            diff = prices[i] - prices[i-1]
            if diff > 0: profit += diff
        return profit

Review

Let’s Build dispatch_queue

大神 Mike Ash 在文章里展示了如何构建一个轻量的 dispatch_queue,涉及到很多细节+思考点,值得一看。

Tip

CommonJS 详细介绍

CommonJS 模块特点:

  • 所有代码都运行在模块作用域,不会污染全局作用域
  • 独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互
  • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果,要想让模块再次运行,必须先清除缓存
  • 模块加载的顺序,按照其在代码中出现的顺序

Share

积木法搭建 iOS 应用—— VIPER

关于 VIPER 的一次完整实践,内容很细。