算法和数据结构-js实现

根据自己对算法和数据结构的理解写出的思路和代码,如有错误欢迎指出。

一 排序

快排

快排的思想是从一堆数中随便选一个数作为pivot,遍历把所有比pivot小的移到左边,把比pivot大的移到右边。然后对生成的左右两个区间重复上述过程,直到区间大小缩小为1。

思路:

  1. 选取数组末尾的数作为pivot
  2. 将数组的值和pivot进行比较:
    a. 当前值比pivot大,但索引是位于pivot的的左边,进行交换
    b. 当前值比pivot小,但索引是位于pivot的的右边,进行交换
  3. 递归调用对左边子区间进行处理
  4. 递归调用对右边子区间进行处理
  5. 递归出口是区间内只有一个元素
function sort(arr, startIndex, endIndex) {
    // 递归出口,区间内只有一个元素的情况
    if (startIndex >= endIndex) {
        return
    }
    // 把最左侧作为pivot
   let pivot = endIndex
   for(let i = startIndex; i < endIndex; i++) {
       // 当前值比pivot大,但索引是位于pivot的的左边,进行交换
      if (arr[i] > arr[pivot] && i < pivot) {
        swap(arr, i, pivot)
      }
      // 当前值比pivot小,但索引是位于pivot的的右边,进行交换
      if (arr[i] < arr[pivot] && i > pivot) {
        swap(arr, i, pivot)
      }
   }
   console.log(JSON.stringify(arr), pivot)
   // 递归调用对左边子区间进行处理
   sort(arr, startIndex, pivot-1)
   // 递归调用对右边子区间进行处理
   sort(arr, pivot+1, endIndex)
}
// 数据交换和索引交换,有副作用
function swap(arr, i, pivot) {
    let temp = arr[pivot]
    arr[pivot] = arr[i]
    arr[i] = temp
    pivot = i
}
// 测试数据
const arr = [1, 5, 7, 4, 3, 6, 10, 11, 12, 20, 19, 18, 17, 9, 40, 21, 32, 8]
// 进行搜索
sort(arr, 0, arr.length-1)
console.log(arr)

归并排序

二 动态规划问题

动态规划的定义:

dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems.

爬楼梯

有一个有n个台阶的楼顶,小明一次只能爬一个或者两个台阶,爬到楼顶有多少种可能?

思路:
由于一次只能爬1个或两个台阶,爬到第n个台阶有两个可能,从n-1阶爬1个台阶,或者是从n-2阶爬2个台阶,假设爬到第n个台阶的可能记为f(n),那么爬到n-1个台阶的可记为f(n-1),爬到n-2个台阶为f(n-2),其实不用考虑f(n-1)和f(n-2)是否有重复的路径,即使重复了也没关系,最后到第n阶台阶是两种不同的选择,就会让所有的选择都不相同。(这里有点绕,理解了这一点,解决类似的问题就很容易了),这样就能得出下面的等式
f(n)=f(n-1)+f(n-2)

这里只给出动态规划的代码
求 f(n)=f(n-1)+f(n-2),可以分解成 f(n-1)=f(n-2)+f(n-3)、f(n-2)=f(n-3)+f(n-4)...、f(3)=f(2)+f(1)
可以自底往上求解,f(1)、f(2)可以很容易得到,从而可以求出f(3),根据f(2)和f(3)可以求出f(4),可以对这一过程进行循环最终得到f(n)

function f(n){
    let arr = new Array(n)
    for (let i = 0; i < n; i++) {
        if (i === 0) {
            arr[0] = 1
        } else if (i === 1) {
            arr[1] = 2
        } else {
            arr[i] = arr[i-1] + arr[i-2]
        }
     }
     console.log(arr)
    return arr[n-1]
}
console.log(f(10))

数组最大子序和

棋盘路径

三 链表

链表的反转

四 二叉树

二叉树的前、中、后序遍历

这里的前、中、后是指遍历中间节点的顺序,若是中、左、右的顺序遍历则是前序,若是在左、中、右的顺序遍历则是中序,若是左右中的顺序遍历则是后序

前序

二叉搜索树查找

五 字符串相关

哈希查重

找出字符串中第一个只出现一次的字符 输入描述:输入一个非空字符串
输出描述:输出第一个只出现一次的字符,如果不存在输出-1
示例1
输入:asdfasdfo
输出:o

有两种解题思路:

  1. 可以采用双重循环,遍历每一个字符累加它出现的次数,遇到次数为1的情况则返回该字符。
function find(str) {
    for(let i = 0; i < str.length; i++) {
        let times = 0
        for(let j = 0; j < str.length; j++) {
           if (str[i] === str[j]) {
               times++
           }
        }
        if(times === 1){
            return str[i]
        }
    }    
    return -1
}
console.log(find('asdfasdfo'))

由于采用了双重循环算法的时间复杂度是O(n²)

  1. 采用哈希,时间复杂度可以达到O(n),跟字符串查重相关的题目可以优先考虑哈希
function find(str) {
    let hashObject = {}
    for(let i = 0; i < str.length; i++) {
        if (hashObject[str[i]]) {
            hashObject[str[i]] +=1
        } else {
            hashObject[str[i]] = 1
        }
    }    

    for(let i = 0; i < str.length; i++) {
        if (hashObject[str[i]] === 1) {
            return str[i]
        }
    }
    return -1
}
console.log(find('asdfasdfo'))

参考:
https://www.zhihu.com/question/23995189
https://blog.csdn.net/a911711054/article/details/72869324
https://101.zoo.team/dong-tai-gui-hua/dong-tai-gui-hua-part-1-zui-da-zi-xu-he-pa-lou-ti-he-mai-mai-gu-piao-de-zui-jia-shi-ji

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容