Contents

ARST打卡第259周

lc39_组合总和 【TED演讲】解决任何问题的五个步骤 Golang-优雅处理可选参数 http.Transport连接池

Algorithm

lc39_组合总和

思路: 无限背包获取目标值

达到背包容积有多少种放置方式。

dp[n][m] 表示容量为 n 时,用 m 种物品的总组合数。

状态转移: 容积为i.以及j种物品. dp[i][j] = dp[i-candidate[1..j]][j - 1] + 1

感觉状态转移还是不够清晰,学习一下题解吧。

发现没有认真看题目,不是方案数,是具体方案…

所以是枚举遍历…

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
    void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {
        if (idx == candidates.size()) {
            return;
        }
        if (target == 0) {
            ans.emplace_back(combine);
            return;
        }
        // 直接跳过
        dfs(candidates, target, ans, combine, idx + 1);
        // 选择当前数
        if (target - candidates[idx] >= 0) {
            combine.emplace_back(candidates[idx]);
            dfs(candidates, target - candidates[idx], ans, combine, idx);
            // 因为combine是引用,加上是其他dfs子遍历,所以一定要帮当层的值去掉
            combine.pop_back();
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> ans;
        vector<int> combine;
        dfs(candidates, target, ans, combine, 0);
        return ans;
    }
};

Review

【TED演讲】解决任何问题的五个步骤

快速行动修复局面好过快速行动打破局面 步骤:

  1. 搞清楚真正的问题,保持好奇心;
  2. 进行实验,尝试解决问题,不一定成功,但值得尝试;
  3. 结交新朋友,获得新想法,优化解决问题的方案:
  4. 讲自身故事,有助于理解过去经历、现在、将来的关系,也能激发他人;
  5. 尽力突破自我去行动,提升效率

然后就是有问题,立马行动。

Tips

Golang-优雅处理可选参数

Share-http.Transport

上周推荐了 fatih/pool 的 tcp 连接池。但是这周看到了同事推荐的好文章:

http.Client的连接行为控制详解

通读全文之后,知道了就是把原来的pool tcp连接池直接改成 http.Transport 连接池

然后需要注意这5个参数:

  • 每个连接池最大容量:MaxIdleConnsPerHost
  • 每个连接池空闲时要保持的空闲连接数:MaxIdleConnsPerHost
  • 每个空闲连接的最长保持时间:IdleConnTimeout
  • 是否启动 KeepAlive: DisableKeepAlives
  • http.Client连接超时设置: Timeout
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
	tr := &http.Transport{
		MaxConnsPerHost: maxConnections,
		// 默认保留最大连接数一半的连接不销毁,但是超过10s销毁
		MaxIdleConnsPerHost: maxConnections / 2,
		IdleConnTimeout:     10 * time.Second,
		DisableKeepAlives:   !keepAlive,
	}
	channel.httpClient = http.Client{
		Transport: tr,
		Timeout:   time.Duration(timeout) * time.Millisecond,
	}

最大的好处就是 http.Client 自动控制连接池的创建和关闭,完全不用上层接口关心,还能控制 Idle 池超时关闭,非常舒服。