算法设计
ths99
985计算机毕业、全栈偏前端工程师,曾就业于腾讯、Shopee、微软
展开
-
快速排序
核心思想:分治 + 递归1:找一个基准元素,将比它小的都移到它左边,将比它大的都移到它右边,这样就分成了左右两个子区间——分治思想2:分别对左右两子区间再进行上述步骤,最终子区间越来却小,所有元素均有序—递归思想时间复杂度:快速排序的时间复杂度在最坏情况下是O(n^2),平均的时间复杂度是O(n*log n)。另外,快速排序是一种不稳定的排序算法,即两个相等元素排序前后的相对位置可能会改变...原创 2019-03-25 23:25:37 · 138 阅读 · 0 评论 -
缺失的第一个正数
给定一个未排序的整数数组,找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1说明:你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。var firstMissingPositive = function(nums) { //过滤掉...原创 2019-09-18 09:11:13 · 101 阅读 · 0 评论 -
js排序大坑
javascript 排序坑介绍string类型数组排序// baiDu排在了最后:['Google', 'baiDu', 'Facebook'].sort(); // ['Facebook', 'Google", 'baiDu']// 无法理解的结果:[10, 20, 1, 2].sort(); // [1, 10, 2, 20]解决方法加上回调函数[10, 2, 3, 10...原创 2019-09-17 20:14:16 · 256 阅读 · 0 评论 -
重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。示例 2:输入: “aba”输出: False示例 3:输入: “abcabcabcabc”输出: True解释: 可由子字符串 “abc” 重复四次构成。 (或者...原创 2019-09-17 15:52:48 · 123 阅读 · 0 评论 -
格雷编码
格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。示例 1:输入: 2输出: [0,1,3,2]解释:00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 01...原创 2019-09-17 15:46:31 · 212 阅读 · 0 评论 -
种花问题
假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。示例 1:输入: flowerbed = [1,0,0,0,1], n = 1输出: Tr...原创 2019-09-17 10:46:15 · 174 阅读 · 0 评论 -
电话号码的数字组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。var letterCombinatio...原创 2019-09-16 13:36:27 · 779 阅读 · 0 评论 -
动态规划
动态规划原创 2019-05-31 23:52:00 · 154 阅读 · 0 评论 -
贪心算法
贪心算法求解问题时,总是做出在当前看来是最好的选择,得到的结果是某种意义下的局部最优解贪心选择所求问题的整体最优解可以通过一系列局部最优解,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。采用自顶向下,以迭代的方法相继做出选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步...原创 2019-05-24 09:12:42 · 317 阅读 · 0 评论 -
LeetCode题解 javascript
删除链表的倒数第n个节点思路1:建立两个指针p1,p2 其中p1 先走n步,p2再开始走,等p1到末尾了,p2.next就是要删除的节点,注意特殊位置的考虑,删除的是头结点思路2:用个数组,对链表每个节点值重新声明为节点对象,再存入数组,删除对应元素后,一个一个串起来var removeNthFromEnd = function(head, n) { var p1 = head; /...原创 2019-04-27 23:18:56 · 523 阅读 · 0 评论 -
KMP算法
字符串匹配首先什么叫字符串匹配或者字符串模式匹配?假设主串为:“abcdeabcef” 子串为"abce" ,找出子串在主串中第一次出现的位置,即红色部分第一个字符的索引,上述问题就是我们通常说的字符串匹配问题,或者一些要用到上面知识的问题。朴素算法这个方法理解起来比较简单,就是主串,子串各自建立一个索引,从下标为0开始比较,如果S[i]=P[i] 则继续比较下一位,当出现不等的情况时,...原创 2019-04-23 22:53:46 · 195 阅读 · 0 评论 -
插入排序
算法思想 在介绍具体的插入排序算法思想之前,我建议大家先仔细回忆一下自己玩扑克牌的经历,想清楚了这一点,插入排序思想基本就理解的很透彻了。假设我们现在手上有几张牌,已经排序好的,我们每摸一张新牌,是怎么插入到手中的呢?当然我们眼睛一扫当然就很快知道插在什么位置了,但是计算机处理这样的过程是有条理的…&...原创 2019-03-26 19:03:49 · 132 阅读 · 0 评论 -
选择排序
算法思想 选择排序是一种理解起来比较简单的排序思想,时间复杂度为O(n^2),通过每次与当前值之后元素中选择最小(或最大)的与当前元素交换,每次选出一个最值,循环结束,整个数组就排好序了 算法实现步骤step1:两层循环,外层循环 i从0开始,ste...原创 2019-03-26 10:10:38 · 151 阅读 · 0 评论 -
经典排序-冒泡排序
冒泡排序思想介绍:核心思想:相邻两个数之间比较,把大的数往右换,最终每经过一次内层循环,就把当前未排序的数组的最大值换到最右边去了;如果是从大到小排序,就把小的数往右换,换到最后那个数就是最小的,下面贴上代码:void Bubble_Sort(int* a,int n) { int temp=0; for(int i=0;i<n;i++) { ...原创 2019-03-13 15:10:08 · 124 阅读 · 0 评论