函数式编程
函数是一等公民
函数是一等公民的表现:
- 函数可以储存为变量
1
let four = () => 4 - 函数可作为数组的一个元素
1
let four = [4, () => 4] - 函数可作为对象的成员
1
let four = {num: 4, func: () => 4} - 函数可以在使用时直接创造出来
1
let four = 2 + (() => 2)() - 函数可作为参数传递给另一个函数
1
2
3let four = (num, f) => num + f()
four(2, () => 2) - 函数可以被另一函数返回
1
let four = () => () => 4 
其实,满足第5点或第6点的函数被称为 高阶函数
Applicative编程
Applicative编程是函数式编程的一部分(特殊的函数式编程形式),其典型的代表就是 map 、reduce 以及 filter 函数。
Applicative编程的其它实例:
- reduceRight
 - find
 - reject
 - all
 - any
 - sortBy | groupBy | countBy
 
函数柯里化
函数柯里化可以保存某些需要多次调用的操作,还可以将多个参数分割,每次只传递一个参数,让函数看起来就像是在一步步的操作数据。
一阶柯里化:
1  |  | 
使用示例:
1  |  | 
二阶柯里化(这里选择从右到左):
1  |  | 
使用示例:
1  |  | 
三阶柯里化(从右到左调用参数):
1  |  | 
使用示例:
1  |  | 
curry => partial => compose
递归
相互递归
实现判断奇偶性就是一个相互递归的很好的例子:
1  |  | 
递归实现深克隆
简单版本:
1  |  | 
JS函数式库
可编译为js的函数式编程语言
775. 全局倒置与局部倒置
暴力法+维护最小值+数学法=循序渐进
暴力法
看到题目,没有任何技巧,直接暴力!🐶 :dog:
1  |  | 
维护最小值法
稍微分析一下,我们在 i 位置上,只要找到从 i+2 往后的值中有小于 i 位上的值即可;那么只需要从 i+2 往后的值中最小的值与 nums[i] 比较即可!
可以从后往前遍历,有利于保存后缀最小值。
1  |  | 
数学证明
接着分析:
- 在 
i=0的位置上,只要其大于等于2,那就一定能在i=2及往后的位置中找到小于i的值。 - 在 
i=1的位置上,只要其大于等于3,那就一定能在i=3及往后的位置中找到小于i的值。 - 以此类推,可以看到,只要保证 
nums[i] <= i+2即可! 
1  |  | 
547. 省份数量
题目来源:LeetCode 547. 省份数量
有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。
省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。
给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。
返回矩阵中 省份 的数量。
示例1:
输入:isConnected = [[1,1,0],[1,1,0],[0,0,1]]
输出:2
示例2:
输入:isConnected = [[1,0,0],[0,1,0],[0,0,1]]
输出:3
限制:
- 1 <= n <= 200
 - n == isConnected.length
 - n == isConnected[i].length
 - isConnected[i][j] 为 1 或 0
 - isConnected[i][i] == 1
 - isConnected[i][j] == isConnected[j][i]
 
并查集解法
使用quick find
1  |  | 
基于路径压缩的按秩合并优化的「并查集」
1  |  | 
DFS解法
1  |  |