Skip to content

Commit 5d0d80a

Browse files
authored
算法模板 添加 JavaScript 版本代码
1 parent f88678d commit 5d0d80a

File tree

1 file changed

+258
-1
lines changed

1 file changed

+258
-1
lines changed

problems/算法模板.md

Lines changed: 258 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ void backtracking(参数) {
248248
## 并查集
249249
250250
```CPP
251-
int n = 1005; // 更具题意而定
251+
int n = 1005; // 根据题意而定
252252
int father[1005];
253253
254254
// 并查集初始化
@@ -280,6 +280,263 @@ void backtracking(参数) {
280280
(持续补充ing)
281281
## 其他语言版本
282282

283+
JavaScript:
284+
285+
## 二分查找法
286+
287+
使用左闭右闭区间
288+
289+
```javascript
290+
var search = function (nums, target) {
291+
let left = 0, right = nums.length - 1;
292+
// 使用左闭右闭区间
293+
while (left <= right) {
294+
let mid = left + Math.floor((right - left)/2);
295+
if (nums[mid] > target) {
296+
right = mid - 1; // 去左面闭区间寻找
297+
} else if (nums[mid] < target) {
298+
left = mid + 1; // 去右面闭区间寻找
299+
} else {
300+
return mid;
301+
}
302+
}
303+
return -1;
304+
};
305+
```
306+
307+
使用左闭右开区间
308+
309+
```javascript
310+
var search = function (nums, target) {
311+
let left = 0, right = nums.length;
312+
// 使用左闭右开区间 [left, right)
313+
while (left < right) {
314+
let mid = left + Math.floor((right - left)/2);
315+
if (nums[mid] > target) {
316+
right = mid; // 去左面闭区间寻找
317+
} else if (nums[mid] < target) {
318+
left = mid + 1; // 去右面闭区间寻找
319+
} else {
320+
return mid;
321+
}
322+
}
323+
return -1;
324+
};
325+
```
326+
327+
## KMP
328+
329+
```javascript
330+
var kmp = function (next, s) {
331+
next[0] = -1;
332+
let j = -1;
333+
for(let i = 1; i < s.length; i++){
334+
while (j >= 0 && s[i] !== s[j + 1]) {
335+
j = next[j];
336+
}
337+
if (s[i] === s[j + 1]) {
338+
j++;
339+
}
340+
next[i] = j;
341+
}
342+
}
343+
```
344+
345+
## 二叉树
346+
347+
### 深度优先遍历(递归)
348+
349+
二叉树节点定义:
350+
351+
```javascript
352+
function TreeNode (val, left, right) {
353+
this.val = (val === undefined ? 0 : val);
354+
this.left = (left === undefined ? null : left);
355+
this.right = (right === undefined ? null : right);
356+
}
357+
```
358+
359+
前序遍历(中左右):
360+
361+
```javascript
362+
var preorder = function (root, list) {
363+
if (root === null) return;
364+
list.push(root.val); //
365+
preorder(root.left, list); //
366+
preorder(root.right, list); //
367+
}
368+
```
369+
370+
中序遍历(左中右):
371+
372+
```javascript
373+
var inorder = function (root, list) {
374+
if (root === null) return;
375+
inorder(root.left, list); //
376+
list.push(root.val); //
377+
inorder(root.right, list); //
378+
}
379+
```
380+
381+
后序遍历(左右中):
382+
383+
```javascript
384+
var postorder = function (root, list) {
385+
if (root === null) return;
386+
postorder(root.left, list); //
387+
postorder(root.right, list); //
388+
list.push(root.val); //
389+
}
390+
```
391+
392+
### 深度优先遍历(迭代)
393+
394+
前序遍历(中左右):
395+
396+
```javascript
397+
var preorderTraversal = function (root) {
398+
let res = [];
399+
if (root === null) return rs;
400+
let stack = [root],
401+
cur = null;
402+
while (stack.length) {
403+
cur = stack.pop();
404+
res.push(cur.val);
405+
cur.right && stack.push(cur.right);
406+
cur.left && stack.push(cur.left);
407+
}
408+
return res;
409+
};
410+
```
411+
412+
中序遍历(左中右):
413+
414+
```javascript
415+
var inorderTraversal = function (root) {
416+
let res = [];
417+
if (root === null) return res;
418+
let stack = [];
419+
let cur = root;
420+
while (stack.length== 0 || cur !== null) {
421+
if (cur !== null) {
422+
stack.push(cur);
423+
cur = cur.left;
424+
} else {
425+
cur = stack.pop();
426+
res.push(cur.val);
427+
cur = cur.right;
428+
}
429+
}
430+
return res;
431+
};
432+
```
433+
434+
后序遍历(左右中):
435+
436+
```javascript
437+
var postorderTraversal = function (root) {
438+
let res = [];
439+
if (root === null) return res;
440+
let stack = [root];
441+
let cur = null;
442+
while (stack.length) {
443+
cur = stack.pop();
444+
res.push(cur.val);
445+
cur.left && stack.push(cur.left);
446+
cur.right && stack.push(cur.right);
447+
}
448+
return res.reverse()
449+
};
450+
```
451+
452+
### 广度优先遍历(队列)
453+
454+
```javascript
455+
var levelOrder = function (root) {
456+
let res = [];
457+
if (root === null) return res;
458+
let queue = [root];
459+
while (queue.length) {
460+
let n = queue.length;
461+
let temp = [];
462+
for (let i = 0; i < n; i++) {
463+
let node = queue.shift();
464+
temp.push(node.val);
465+
node.left &&queue.push(node.left);
466+
node.right && queue.push(node.right);
467+
}
468+
res.push(temp);
469+
}
470+
return res;
471+
};
472+
```
473+
474+
### 二叉树深度
475+
476+
```javascript
477+
var getDepth = function (node) {
478+
if (node === null) return 0;
479+
return 1 + Math.max(getDepth(node.left), getDepth(node.right));
480+
}
481+
```
482+
483+
### 二叉树节点数量
484+
485+
```javascript
486+
var countNodes = function (root) {
487+
if (root === null) return 0;
488+
return 1 + countNodes(root.left) + countNodes(root.right);
489+
}
490+
```
491+
492+
## 回溯算法
493+
494+
```javascript
495+
function backtracking(参数) {
496+
if (终止条件) {
497+
存放结果;
498+
return;
499+
}
500+
501+
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
502+
处理节点;
503+
backtracking(路径,选择列表); // 递归
504+
回溯,撤销处理结果
505+
}
506+
}
507+
508+
```
509+
510+
## 并查集
511+
512+
```javascript
513+
let n = 1005; // 根据题意而定
514+
let father = new Array(n).fill(0);
515+
516+
// 并查集初始化
517+
function init () {
518+
for (int i = 0; i < n; ++i) {
519+
father[i] = i;
520+
}
521+
}
522+
// 并查集里寻根的过程
523+
function find (u) {
524+
return u === father[u] ? u : father[u] = find(father[u]);
525+
}
526+
// 将v->u 这条边加入并查集
527+
function join(u, v) {
528+
u = find(u);
529+
v = find(v);
530+
if (u === v) return ;
531+
father[v] = u;
532+
}
533+
// 判断 u 和 v是否找到同一个根
534+
function same(u, v) {
535+
u = find(u);
536+
v = find(v);
537+
return u === v;
538+
}
539+
```
283540

284541
Java:
285542

0 commit comments

Comments
 (0)