七种常见排序算法可以分为两大类:
非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
算法复杂度
相关概念
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
1、冒泡排序(Bubble Sort)冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的 ...
快速选择用于求解 Kth Element 问题,也就是第 K 个元素的问题。
可以使用快速排序的 partition() 进行实现。需要先打乱数组,否则最坏情况下时间复杂度为 O(N2)。
堆用于求解 TopK Elements 问题,也就是 K 个最小元素的问题。使用最小堆来实现 TopK 问题,最小堆使用大顶堆来实现,大顶堆的堆顶元素为当前堆的最大元素。实现过程:不断地往大顶堆中插入新元素,当堆中元素的数量大于 k 时,移除堆顶元素,也就是当前堆中最大的元素,剩下的元素都为当前添加过的元素中最小的 K 个元素。插入和移除堆顶元素的时间复杂度都为 log2N。
堆也可以用 ...
什么是堆?参考文档
满足下面两个条件的就是堆:
堆是一个完全二叉树(完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。)
堆上的任意节点值都必须大于等于(大顶堆)或小于等于(小顶堆)其左右子节点值
如果堆上的任意节点都大于等于子节点值,则称为 大顶堆
如果堆上的任意节点都小于等于子节点值,则称为 小顶堆
也就是说,在大顶堆中,根节点是堆中最大的元素;在小顶堆中,根节点是堆中最小的元素;
堆的存储我们知道,完全二叉树适用于数组存储法( 前端进阶算法7:小白都可以看懂的树与二 ...
二分查找的主要情况分成7种情况:
123456789101112131. 查找对应target位置(返回对应位置,没找到则返回-1)2. 查找第一个大于或等于target的位置(返回对应位置,没找到则返回-1)3. 查找第一个大于target的位置(返回对应位置,没找到则返回-1)4. 查找最后一个小于等于target的位置(返回对应位置,没找到则返回-1)5. 查找最后一个小于target的位置(返回对应位置,没找到则返回-1)6. 查找第一个等于target的位置(返回对应位置,没找到则返回-1)7. 查找最后一个等于target的位置(返回对应位置,没找到则返回-1)
11. 查找对应t ...
#ES6的Set和Map数据结构 :
Set和Map主要的应用场景在于数组去重和数据存储,
Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构
集合
集合是由一组无序且唯一(即不能重复)的项组成的,可以想象成集合是一个既没有重复元素,也没有顺序概念的数组
ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值
Set 本身是一个构造函数,用来生成 Set 数据结构
这里说的Set其实就是我们所要讲到的集合,先来看下基础用法
12345678const s = new Set();[2, 3, 5, 4, 5, 2, 2].forEach(x => ...
1.输入两个数,输出他两个的和
javascript (V8 6.0.0)
123456var line;while(line = readline()){ //读取出来的是字符串格式 line = line.split(' ') print(parseInt(line[0]) + parseInt(line[1]))}
1234while(line=readline()){ let [a,b]=line.split(' ') console.log(parseInt(a)+parseInt(b))}
Node
12
12345678910111213141516171819202122232425//两个数组模拟栈的行为var stack1=[],//存储栈 stack2=[];//辅助栈 //栈是后入先出(LIFO,last in first out),队列是先入先出(FIFO,first in first out) //队列插入元素函数function push(ele){ //模拟队列的push操作,直接往存储栈stack1中推入即可 //但是要考虑辅助栈stack2中还存在值的情况,需要先将辅助栈中的值推回存储栈中 while(stack2.length !== ...
题目给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad” 输出:”bab” 解释:”aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd” 输出:”bb”
示例 3:
输入:s = “a” 输出:”a”
示例 4:
输入:s = “ac” 输出:”a”
题解暴力破解法
1234567891011121314151617181920212223function isPalindrome(str) { var len = str.length var ...
动态规划包含三个部分:最优子结构、边界和状态转移方程,审题时应充分思考是否能找出这几部分,也就是看能否进行动态规划的求解。
动态规划的的四个解题步骤是:
定义子问题
写出子问题的递推关系
确定 DP 数组的计算顺序
空间优化(可选)
这个解题步骤适用于任何一道动态规划题目,能够让你很快理清解题的各个要点。
图源来自 https://blog.csdn.net/feng_lin_hh/article/details/104483394
打家劫舍基本版题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间 ...
题目题解思路:
这道题目主要用到的思想是: 滑动窗口
什么是滑动窗口?
其实滑动窗口我们可以看出一个队列,比如题目中 abcabcbb, 进入这个队列(窗口)为abc此时满足题目要求,当再进入一个a,也就是当窗口向右扩大的时候,队列变成了abca,这个时候不满足要求,所以,我们要移动这个队列。
具体应该如何移动呢?
我们只需要把队列的左边的元素移除出去就可以了,直到满足题目要求!
一直维持这样的队列,找出队列出现最长的长度时候,求出解。具体实现:
在js中我们使用一个数组来维护滑动窗口
遍历字符串,判断字符串是否在滑动窗口数组里面
不在则push进数组
在则删除滑动窗口数组里相同字符以及相同字 ...