1.Algorithm
class Solution {
List<List<Integer>> resp = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
backtrack2(nums, new LinkedList<Integer>());
return resp;
}
public void backtrack2(int[] nums, LinkedList<Integer> track) {
if (track.size() == nums.length) {
resp.add(new LinkedList<Integer>(track));
return;
}
for(int num:nums) {
if(track.contains(num)) {
continue;
}
track.add(num);
backtrack2(nums , track);
track.removeLast();
}
}
}
2.Review
Data Structures - Dynamic Programming
动态规划方法类似于分治法,将问题分解为越来越小的可能子问题。但与“分而治之”不同的是,这些子问题不是独立解决的。相反,这些较小子问题的结果被记住,并用于类似或重叠的子问题。在有问题的地方使用动态规划,这些问题可以被划分为相似的子问题,以便它们的结果可以被重复使用。这些算法主要用于优化。在解决这些子问题之前,动态算法会尝试检查之前解决的子问题的结果。将子问题的解进行组合,以获得最佳解。
所以我们可以说:
- 该问题应能分解成更小的重叠子问题。
- 利用较小子问题的最优解可以得到问题的最优解。
- 动态算法使用记忆。
比较
与贪心算法不同,贪心算法是针对局部优化的,而动态算法是针对问题的整体优化。
与分治算法不同,在分治”算法中,解决方案被组合起来以获得一个整体的解决方案,动态算法利用较小子问题的输出,然后尝试优化较大的子问题。动态算法使用记忆来记住已经解决的子问题的输出。
示例
下面的计算问题可以用动态规划方法来解决:
- Fibonacci number series
- Knapsack problem
- Tower of Hanoi
- All pair shortest path by Floyd-Warshall
- Shortest path by Dijkstra
- Project scheduling
动态规划可以采用自顶向下和自底向上两种方式。当然,在大多数情况下,引用上一个问题答案比重新计算这个问题更节约cpu。
3.Tips
沟通技能之沟通的内容
好的沟通内容,在围绕沟通目的的前提下,还需要做到“表述清晰准确”和“逻辑清晰”。
先了解下列重要的概念:
事物-》观念-》语言-》逻辑
事物-事件:
- 事物是客观存在的实体,如:动物、树木。要确认事物的存在,你只需实地去考察。
- 事件是由事物组成,或由事物的表现形式组成。
观念:
- 我们大脑中的每个观念最终都源于对事物的描摹(好比电脑存储东西是用二进制,人脑存东西可能也是类似于二进制的东西),而真实存在的事物却独立于观念之外。观念是对客观事物的主观反映。
- 正确观念忠实地反映其对象的客观秩序,与之相反,错误观念则是对客观世界的歪曲表达。
语言:
- 首先客观存在的事物,然后事物在大脑中的反映为观念,最后我们为其创造的语言,借之我们才能与他人交流。
- “语言”和“观念”的匹配度越高,沟通就越清晰、有效。
逻辑:
- 逻辑本身就是发现真相并将其从谬误中分离出来的学问。
- 结论需要逻辑的支撑。
- 有逻辑可以清晰高效的思考。
如何表述清晰准确有效
以“事物-》观念-》语言-》逻辑” 等概念来讲,确保双方对“事物-》观念-》语言” 有一致理解的前提下,并且有逻辑的呈现,即可做到表达内容清晰准确有效。
如何做到理解一致,要点如下:
- 背景信息,不要想当然地认为听众和我们一样了解问题的背景信息
- 表达内容的平衡,如何恰到好处(不多、不少、易理解)
- 避免闪避式语言,尽量直抒心意
- 避免使用模糊多义的词语,有必要针对它进行限定说明
- 沟通的关键是理解,不要故作高深
- 信息表达过多或者因为一些其他原因说了很多无关的信息,掩盖了表达意图
- 不要将主观看法当作客观事实来表达
- 内容要有逻辑
要点详解
下篇讲解...
4.Share
本周分享费曼的四步学习法
费曼的四步学习法:
第一步,选择一个你想要理解的概念,然后拿出一张白纸,把这个概念写在白纸的最上边。第二步,设想一种场景,你正要向别人传授这个概念,然后在白纸上写下你对这个概念的解释,就像你在教一位新接触这个概念的学生一样。这样做的时候,你会清楚的意识到关于这个概念你理解了多少,是否还存在理解不清的地方。
第三步,无论何时你感觉卡壳了,都要回到原始的学习资料并重新学习让你感到卡壳的那部分,直到你领会得足够顺畅,顺畅到可以在纸上解释这个部分为止。
第四步,用你自己的语言,而不是学习资料中的语言来解释概念。如果你的解释很冗长或者令人迷惑,那就说明你对概念的理解可能并没有你自己想象得那么顺畅。你要努力简化语言表达,或者与已有的知识建立一种类比关系,以便更好地理解它。
感想:
我理解“费曼的四步学习法”,它明确定义了学会的终极目标的考量(用自己的语言能顺畅的解释)和达到终极目标的一种方法(找到理解不清的地方,不断尝试理解,直到清晰)。“找到理解不清的地方,不断尝试理解它” 可理解为不断复盘和系统化的一个过程。类比,一个事物的背后会有无数个小的事物组成,这些小的事物之间相互作用形成一套系统,要理解这个事物,需要理清楚这些小事物之间关系,通常可用树状结构(脑图)来体现各自的关系和规律。寻找规律和构建这颗“树”的过程,要有“找到失败的节点有策略有计划地不断进行复盘重试”精神。
费曼的这个思想,在很多地方的体现:
-
吴恩达
吴恩达教你如何读论文
在他的方法中也明确定义了终极目标的考量(高效了解新领域)和保障目标达到的一套方法。下面是达成目标的方法,包含问题检验和过程记录表,更多详情可点击上面链接。
吴恩达提供了一系列的问题,在阅读的时候询问自己。这里就摘取一部分。
1、Describe what the authors of the paper aim to accomplish, or perhaps did achieve.
这篇论文作者的目标是什么,或者也许已经实现了什么。
2、If a new approach/technique/method was introduced in a paper, what are the key elements of the newly proposed approach?
如果文中引入了一种新方法/技术,那么这一新提出的方法/技术的关键要素是什么?
3、What content within the paper is useful to you?
论文中,有哪些内容对你有用。
4、What other references do you want to follow?
你还想关注哪些参考资料/文献?
-
埃隆·马斯克
网友在reddit的AMA中,问埃隆·马斯克(ElonMusk) 你在这么多领域做的这么好,这是为什么?下面是他的回答:
它的回答强调了知识是一颗语法树(类似于英语的语法吧,你掌握了语法,读英语基本不会有问题了),梳理每个节点(知识点)之间是存在联系,并理解它的原理。我认为这是他掌握一个事物的终极目标考量和方法吧(把事物树状化,并理解各节点之间的原理和联系)。
-
小结
上面主要在讨论学习,其实这个思想也可以泛化到做事上面。如:做管理、做产品、创业 等。
例如:程序员写代码,是以写完为标准,是以自测通过为标准,是以稳定高效运行为标准,还是以能为用户带来实际用途为标准 等。每个标准最终得到的实际效果肯定会不一样,其中的有些标准可能会导致项目廷期和不可交付,有些标准可以无法满足用户需求而没有了后续,而有些标准能让产品(项目)持续不断向成功精进。在向成功精进的过程中肯定会遇到的困难和一些异常,用费曼的思想“找到失败的节点有策略有计划地不断进行复盘重试”,构建好这颗“树”,肯定能成。