简单的算法题整理

一、数组去重的几种方法

1、利用indexof
2、[...new set()]

二、排序算法

1、冒泡O(n^2)
for(i=0){
  for(j=i+1){
    //从小到大排
    //把大的放到后面
    if(arr[i]>arr[j]){交换位置}

    //从大到小排,把小的放到后面
      if(arr[i]<arr[j]){交换位置}
  }
}
2、选择排序

在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

3、快速排序

拿到一个基准点,把比它小的数放到leftArr,比他大的放到rightArr,递归,直到leftArr长度为1

//判断数组长度是否小于等于1,如果是,则直接返回arr
if (arr.length <= 1) {  
    return arr;
}

//拿到基准点
let temp = arr.splice(midIndex, 1)[0]
//递归调用
return quickSort(leftArr).concat([temp],quickSort(rightArr))
4、插入排序

默认是一个未排序的数组,再建一个已排序数组,从未排序数组中依次取数temp,对已排序数组从后往前进行比较,将temp放到它本该在的位置

                //遍历i,把第i项的值存起来
                let temp = arr[i];
                let j = i - 1;
                while (j >= 0 && arr[j] > temp) {
                    //如果前一个数大于后一个数,将前一个数往后移一位
                    arr[j + 1] = arr[j]
                    j--
                }
                //此时的j是要处理的数排序后应该在的位置
                arr[j+1] = temp

三、二叉树

1、深度优先遍历

数据结构 : 栈,后进先出,用pop()
压栈顺序,先压右子树,再压左子树

    let stack = [];
    stack.push(biTree);

    while (stack.length != 0) {
        let node = stack.pop();
        console.log(node.data);
        if (node.rChild) {
            stack.push(node.rChild);
        }
        if (node.lChild) {
            stack.push(node.lChild);
        }

    }
2、广度优先遍历

数据结构 : 队列,先进先出,用shift()
入列顺序,先入左子树,再入右子树

3、前序遍历

数据结构:栈
使用两个while循环,大循环保证遍历到所有节点,小循环是不断进行向左深入

preOrder2() {
    var node = this.root
    var arr = []
    var stack = []
    while (node !== null || stack.length > 0) {
        while (node !== null) {
            stack.push(node)
            arr.push(node.data)
            node = node.left
        }
        //出来的时候node的左树已经遍历完了,此时是null
        if (stack.length > 0) {
            node = stack.pop()
            node = node.right
        }
        //出来后回到大循环的开始,又进入第一个小循环遍历左树
    }
    return arr
}
4、中序遍历

只需要将arr.push(node.data)换个位置即可

if (stack.length > 0) {
            node = stack.pop()
            arr.push(node.data)
            node = node.right
        }
5、后序遍历

将前序遍历的arr.push(node.data)换成arr.unshift(node.data)

while (node !== null) {
            stack.push(node)
            arr.unshift(node.data)  //最先接触到的节点最后才会被插入数组
            node = node.left
 }
5、创建二叉树

首先我们需要定义一个Node类,存储自身的值和对两个儿子的指针
并且定义有一个插入节点的方法

class Node {
    constructor(data) {
      this.data = data
      this.left = null
      this.right = null
    }
    insertNode(newNode) {
        if (newNode.data < this.data) {
            if (this.left === null) { this.left = newNode }
            else {
                this.left.insertNode(newNode)
            }
        }
        else {
            if (this.right === null) { this.right = newNode }
            else {
                this.right.insertNode(newNode)
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度...
    南山码僧阅读 1,664评论 0 2
  • 0、总纲-数据结构分布图 # 1、基本的数据结构知识树[图片上传失败...(image-14e376-159973...
    一只狗被牵着走阅读 505评论 0 0
  • 排序算法 选择排序(O(n^2))从i=0开始循序n次,每次从(i, n)中寻找最小的数,用minIndex记录最...
    zhangivon阅读 476评论 0 2
  • css相关 1. 万能居中 1.margin: 0 auto;水平 2.text-align: center;水平...
    chaocc阅读 991评论 0 2
  • 1.找出整型数组中乘积最大的三个数 思路:1.先进行排序 2.考虑出现最大值的时候出现的情况 两负一正...
    六月繁花开阅读 423评论 0 0