交换排序冒泡排序算法思想,每一轮排序(从小到大),从后往前遍历比较,把最小值一步步交换到相应的位置。 时间复杂度: n(n-1)/2 冒泡排序算法的优化改进 - Coding 的文章 - 知乎https://zhuanlan.zhihu.com/p/51479010 从前往后遍历12345678910111213function bubbleSort(nums) { // 最
插入排序算法思想:假设第一个元素排好序,然后往后遍历元素,当前元素与已经排好的序中的元素比较。如果不符合,就交换位置。 123456789101112131415161718192021222324252627function insertSort(nums) { // 假定第一个已经排好序 for (let i = 1; i < nums.length; i++) {
回溯 回溯算法是对树形或者图形结构执行一次深度优先遍历,实际上类似枚举的搜索尝试过程,在遍历的过程中寻找问题的解。深度优先遍历有个特点:当发现已不满足求解条件时,就返回,尝试别的路径。此时对象类型变量就需要重置成为和之前一样,称为「状态重置」。 许多复杂的,规模较大的问题都可以使用回溯法,有「通用解题方法」的美称。实际上,回溯算法就是暴力搜索算法,它是早期的人工智能里使用的算法,借助计算机强大
前缀和是一种重要的预处理,能大大降低查询的时间复杂度。可以简单理解为“数列的前 项的和”。 经典例题 https://leetcode-cn.com/problems/range-sum-query-immutable/ 学习资料 https://oi-wiki.org/basic/prefix-sum/ https://leetcode-cn.com/problems/binary-subar
子序列匹配给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,”ace”是”abcde”的一个子序列,而”aec”不是)。 进阶: 如果有大量输入的 S,称作 S1, S2, … , Sk 其中 k >= 10 亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,
滚动数组滚动数组的思想主要是用于优化 o(n)的空间复杂 使其变为 o(1),经常在动态规划中使用。动态规划中,经常会使用到 dp[i]这个状态,这个状态经常通常用来记录某个一项的状态,如果我们在求解的过程中,发现dp[i] 只依赖dp[i-1]或者 依赖 dp[i-2],那么我们就可以用可数的变量来记录它,如 pre,cur.下面,我们具体看下示例. 斐波那契数12345678910111213
方法一:Brian Kernighan 算法 12345678function countOne(int n ){ let ones=0; while(n>0){ n=n&(n-1) ones++ } return ones;}