打乱排序
# 打乱排序 (opens new window)
# 组合 (opens new window)
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
var combine = function(n, k) {
const ans = [];
const dfs = (cur, n, k, temp) => {
// 剪枝:temp 长度加上区间 [cur, n] 的长度小于 k,不可能构造出长度为 k 的 temp
if (temp.length + (n - cur + 1) < k) {
return;
}
// 记录合法的答案
if (temp.length == k) {
ans.push(temp);
return;
}
// 考虑选择当前位置
dfs(cur + 1, n, k, [...temp, cur]);
// 考虑不选择当前位置
dfs(cur + 1, n, k, temp);
}
dfs(1, n, k, []);
return ans;
};
# 二叉树遍历 (opens new window)
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var levelOrder = function(root) {
//二叉树的层序遍历
let res=[],//结果数组,为数值
queue=[];//当前层节点,为节点
queue.push(root);
if(root===null){
return res;
}
while(queue.length!==0){
// 记录当前层级节点数(来自上一层提供orRoot)
let length=queue.length;
//存放每一层的节点
let curLevel=[];
for(let i=0;i<length;i++){
let node=queue.shift();
curLevel.push(node.val);
// 存放当前层下一层的节点
if(node.left)queue.push(node.left);
if(node.right)queue.push(node.right);
}
//把每一层的结果放到结果数组
res.push(curLevel);
}
return res;
};
# 从前序与中序遍历序列构造二叉树 (opens new window)
# 买卖股票的最佳时机 (opens new window)
每一处卖出点的最佳时机都可以做一次判定 是与前一处卖出点相同还是有了更高卖点或更低买点 判断此点是否比买点更低或比卖点更高,更新买卖点,得到的最大差值即位最大收益
var maxProfit = function(prices) {
let min = prices[0]
let max = 0
for (let price of prices) {
max = Math.max(max, price - min) // 当前最大差值
min = Math.min(price, min) // 当前可能的最低买入
}
return max
};
# 有效的括号 (opens new window)
# 连续数组 (opens new window)
var findMaxLength = function(nums) {
let maxLength = 0;
const map = new Map();
let counter = 0;
map.set(counter, -1);
const n = nums.length;
for (let i = 0; i < n; i++) {
const num = nums[i];
if (num == 1) {
counter++;
} else {
counter--;
}
if (map.has(counter)) {
const prevIndex = map.get(counter);
maxLength = Math.max(maxLength, i - prevIndex);
} else {
map.set(counter, i);
}
}
return maxLength;
};