常见算法

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

 

posted @ 2022-04-27 16:20  清风环珮  阅读(19)  评论(0编辑  收藏  举报