ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

常见算法

2022-04-27 16:35:27  阅读:105  来源: 互联网

标签:node function return res 常见 算法 test root


1、二分查找

  * 在有序数组中查找某个数值,返回数值在数组中的索引

    * 从有序数组的中间开始查找,如果正好是需要查找的数值,则搜索结束,返回索引     * 如果指定查找的元素大于或者小于中间的元素,那么在大于或者小于中间元素的那一部分进行寻找,然后重复第一部的操作     * 重复以上过程,直到找到指定元素,找到的话返回索引;查找数组为空时查找失败

  * 优点是比较次数少,查找速度快;缺点为待查表必须为有序数组,不适用于经常变动并且查找频繁的有序列表

  * 实现方法分为递归方法与非递归方法

    * 递归方法

function search(arr, key, start, end){
if(start > end){
return -1;
}
var end = end === undefined ? arr.length - 1 : end;
var start = start || 0;
var mid = parseInt((start+end)/2);
if(key == arr[mid]){
return mid;
}else if(key < arr[mid]){
return search(arr, key, start, mid - 1)
}else{
return search(arr, key, mid+1, end)
}
}
View Code

    * 非递归方法

function search(arr, key){
var start = 0,
end = arr.length - 1;
while(start <= end){
var mid = parseInt((start+end)/2);
if(key == arr[mid]){
return mid
}else if(key < arr[mid]){
end = mid - 1
}else{
start = mid + 1
}
};
return -1;
}
View Code

2、二叉树

  * 用来模拟具有树状结构性质的数据集合

  * 树的每一个节点都包含当前节点的值以及所有子节点的列表;二叉树是每个节点最多具有两个子树的树结构

  * 二叉树的遍历分为三种 - 根据根节点的遍历顺序来区分:

    * 前序遍历 - 根节点 -> 左子树 -> 右子树

      * 递归实现

function preorderTraversal(root){
let res = [];
test(root, res);
return res;
}
function test(node, res){
if(!node) return;
res.push(node.val);
test(node.left, res);
test(node.right, res);
}
View Code

      * 迭代实现

function preorderTraversal(root){
const list = [];
const stack = [];
if(root) stack.push(root)
while(stack.length > 0) {
const curNode = stack.pop()
// 第一步的时候,先访问的是根节点
list.push(curNode.val)
// 我们先打印左子树,然后右子树
// 所以先加入栈的是右子树,然后左子树
if(curNode.right !== null) {
stack.push(curNode.right)
}
if(curNode.left !== null) {
stack.push(curNode.left)
}
}
return list
}
View Code

    * 中序遍历 - 左子树 -> 根节点 -> 右子树

      * 递归实现

function inorderTraversal(root){
let res = [];
test(root, res);
return res;
}
function test(node, res){
if(!node) return;
test(node.left, res);
res.push(node.val);
test(node.right, res);
}
View Code

    * 后序遍历 - 左子树 -> 右子树 -> 根节点

      * 递归实现

function inorderTraversal(root){
let res = [];
test(root, res);
return res;
}
function test(node, res){
if(!node) return;
test(node.left, res);
test(node.right, res);
res.push(node.val);
}
View Code

    * 层序遍历

    * 广度优先

    * 深度优先

3、数组的中心索引

  * 数组某元素左侧的元素之和等于右侧元素之和

  * 解题思路 - 计算数组的元素总和,遍历数组,用总和减去遍历元素之和与当前元素,如果剩余数值与相加之和相等,则该元素为中心索引

    * 题解

function test(nums){
let all = nums.reduce((a,b) => a+b);
let res = -1;
let sd = 0;
for(let i = 0; i < nums.length;i++){
let jk = all - sd - nums[i]
if(sd == jk){
res = i;
break
}
sd+=nums[i]
}
return res;
}
View Code

 

标签:node,function,return,res,常见,算法,test,root
来源: https://www.cnblogs.com/wind-jade/p/16199463.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有