![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm
Serrie.
心存敬畏
展开
-
快速排序的思想以及实现
图片来自:程序员小灰(微信公众号)快速排序是从冒泡排序中演变而来的算法,但比冒泡排序要高效很多,因为使用了分治的思想。同冒泡排序一样,快速排序也属于交换排序,通过元素间的比较和位置的交换来达到排序的目的。不同的是,冒泡排序在每一轮只把一个元素冒泡到散列的一端。而快速排序每一轮挑选一个基准元素,并让其他比他大的元素移动到数列一边,比他小的元素移动到数列另一边,从而把数列拆解成两个部分...原创 2019-04-11 11:50:02 · 456 阅读 · 0 评论 -
leetcode96 Unique Binary Search Trees + leetcode95 Unique Binary Search Trees 2
96:二叉搜索树:学过数据结构我们都知道可以用构成不同结构的所有二叉树的个数是卡特兰数。卡特兰数的递推公式为:但是,抛开卡特兰数,我们来用动态规划的思路看本题:python:95:本题是Unique Binary Search Trees的另一种形式,直接输出各种独立的二叉搜索树的结构,难点在如何递...原创 2019-06-06 20:19:50 · 208 阅读 · 0 评论 -
Leetcode74 Search a 2D Matrix + 剑指offer 二维数组查找 + Leetcode240 Search a 2D Matrix2
本题共2三种思路 第一种 分别对行和列使用两次二分查找:第二种 将二维数组看做一个大的一维数组使用二分,即right = row × col 需要注意的是如何处理将一位数组转换为二维数组中元素 具体见代码第三种 与右上角元素做比较 如果右上角元素大于target 则本列不参与比较。若右上角元素小于target则本行不参与比较...原创 2019-06-06 20:21:29 · 132 阅读 · 0 评论 -
剑指offer 树的子结构 + 剑指offer 树的镜像
首先看 树的子结构:题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)要查找树A中是否函数树B结构,我们可以分为两步:第一步 找到树A中和树B的根节点的值一样的节点R(其实就是树的遍历)第二步 判断树A中以R为根节点的子树是否和B具有相同结构本题注意几种情况 A B树任一为空。当B遍历结束后A未必结束。 B结...原创 2019-07-09 15:13:49 · 107 阅读 · 0 评论 -
堆排序记录
笔记来源:程序员小灰(微信公众号)二叉堆本质上是一种完全二叉树:分为最大堆和最小堆。但堆在内存中是顺序存储而非链式存储。那么,如何构建一个堆呢?需要用到堆的自我调整。关于二叉堆,有以下几个操作:插入节点 删除节点 构建二叉堆。1.插入节点二叉堆的上浮调整二叉堆下沉调整构建...原创 2019-07-05 10:47:57 · 240 阅读 · 0 评论 -
剑指offer 最小的K个数 + Leetcode215 Kth Largest Element
剑指offer 最小的K个数:基于partition函数、基于数组的第k个数来调整,使得小于第k个数字的所有数字都位于数组的左边。同理,大于第k个数字的所有数字都位于数组的右边。Partition函数具体思路就是基于坑(基准)的快拍思想:时间复杂度o(n)(思想见快排概念)题目具体做法:题目中要注意对k的处理Leet...原创 2019-07-05 10:51:38 · 316 阅读 · 0 评论 -
递归回溯模板(回溯概念)
通用算法:用回溯法解体的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根节点到当前扩展节点的路径。如果解空间树中从根结点到叶节点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))递归回溯模板:回溯法对解空间做深度优先搜索,因此在一般情况下可用递归函数来实现回溯法: vo...原创 2019-07-05 10:53:06 · 1012 阅读 · 0 评论 -
Leetcode46 47 permutations1 2 + 60 permutation sequence + 70Combinations
46:回溯法:为了避免结果集重复,采用回溯法。构造一个新数组tmp,将nums中元素改变位置后,首先放入一个tmp中,再将tmp插入结果集中。在完成当前顺序插入,退回上一步时,需要将上一步的结果回溯掉,将nums复原。如上1 2 3,首先应该将1, 2, 3插入结果集,然后交换2, 3的位置。每一层都是一个递归。那么就需要一个位置指针pos,这个指针表示,需要从当前元素开...原创 2019-07-05 10:56:20 · 188 阅读 · 0 评论 -
二叉树的三种遍历(递归+非递归)+层序遍历笔记+leetcode遍历题解
写在前头:本文内容部分转载自:https://www.jianshu.com/p/49c8cfd07410,本文为笔记整理首先注意树的层序遍历和非层序遍历区别: 1.二叉树的前中后序遍历是递归遍历,需要用栈。(深度优先) 2.二叉树的层序遍历使用队列。(广度优先)首先来看二叉树的三种遍历递归写法: 三种递归遍历对遍历的描述,思路非常简洁,最重要的...原创 2019-07-24 17:22:58 · 817 阅读 · 0 评论 -
大数相加以及大数相乘
首先看大数相加:leetcode415,代码:接下来再看大数相乘,其实可以使用大数相加的思路做大数相乘,时间复杂度为o(m * n)例题、代码如下:...原创 2019-08-15 11:46:48 · 351 阅读 · 0 评论 -
Leetcode62 Unique Paths + 63 Unique Paths 2
因为递归会超时,所以采用DP方法,DP的关键在于找出地推公式。此题的递推公式为:每一个格子的路径数等于它左边格子的路径数加上边上边的格子的路径数,据此可建立一个数组数组中元素为每一行中格子的路径数。python:本题为path1的延续,只是多了障碍,需特殊判断条件详见代码python:...原创 2019-06-06 20:17:53 · 147 阅读 · 0 评论 -
剑指offer:连续子数组的最大和(动态规划)
其实就是个动态规划问题,找出递推关系即可。如果我们用函数f(i)表示以第i个数字结尾的子数组的最大和,那么我们需要求出max(f(i))可以有以下公式:F(i) = array[i] if i == 0 or f(i - 1) < 0F(i) =F(i- 1) + array(i) if i > 0 and F(i-1) >0a...原创 2019-06-06 20:13:48 · 1050 阅读 · 2 评论 -
DP思想总结收集+实例:走台阶问题
图片来源:各大CSDN博主博客,视频,以及程序员小灰(微信公众号)动态规划(dynamic programming)思想朴素递归算法之所以效率很低,是因为它反复求解相同的子问题。因此,动态规划方法仔细安排求解顺序,对每个子问题只求解一次,并将结果保存下来。如果随后再次需要此子问题的解,只需查找保存的结果,而不必重新计算。因此,动态规划方法是付出额外的内存空间来节省计算时间,是典型的...原创 2019-04-11 13:07:54 · 1123 阅读 · 1 评论 -
扔鸡蛋问题(四种解法)
转载自:程序员小灰方法一:二分法先从50再从25或75……方法二:平方根法方法三:解方程法(最优解)假设这个问题存在最优解,这个最优解的最坏尝试次数是X次。那么我们第一次扔鸡蛋应该考虑哪一层?那么 如果鸡蛋没有摔碎,我们的尝试次数消耗了一次,而下一次仍鸡蛋的地方就变成了x+x-1层。 因为问题变成了...原创 2019-04-11 13:11:10 · 13771 阅读 · 12 评论 -
最长上升子序列(LIS)以及最长公共子序列(LCS)
那么 依据之前的方法,我们还是从设计状态开始通过此题更加可以看出:DP是一种思想,一种”大事化小,小事化了“的思想。其关键依然是------我是谁?我从哪里来?我到哪里去?最长公共子序列:一个给定序列的子序列是在该序列中删去若干元素后得到的序列。。而给定两个序列X和Y,当另一序列Z既是X的...原创 2019-04-11 13:12:54 · 444 阅读 · 0 评论 -
0-1背包问题
给定n种物品:物品i的重量是wi,其价值为vi。和一个背包:背包的容量为C。在选择装入背包的物品时,对于每种物品i只有两种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。首先:带备忘录的递归方法:我们利用F(n, C)表示将前n个物品放入容量为C的背包里,得到的最大价值。推导:使用自顶向下的思想,假如我们已经进...原创 2019-04-11 13:13:35 · 460 阅读 · 0 评论 -
回溯思想以及八皇后思想 + Leetcode51 题题解
图片来源:程序员小灰(微信公众号)通用算法:用回溯法解体的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根节点到当前扩展节点的路径。如果解空间树中从根结点到叶节点的最长路径的长度为h(n),则回溯法所需的计算空间通常为O(h(n))代码如下...原创 2019-04-11 13:15:23 · 325 阅读 · 0 评论 -
红黑树与二叉查找树
图片来自:程序员小灰(微信公众号)在了解红黑树之前,需要先理解二叉查找树。又叫二叉排序树排序二叉树二叉搜索树二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:1.左子树上所有结点的值均小于或等于它的...原创 2019-04-12 08:52:10 · 1922 阅读 · 0 评论 -
C++ 单链表以及二叉树简单结构体的书写
简单二叉树:#include<iostream>#include<vector>using namespace std;//Definition for a binary tree nodestruct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(...原创 2019-04-12 08:59:38 · 415 阅读 · 0 评论 -
二分查找以及其变种总结
图片、原文来自:https://www.cnblogs.com/luoxn28/p/5767571.html以下图片中源码手写板来自:https://github.com/qq249356520/AlgorithmNotes Search文件夹上图分别解释了二分查找成功和失败的两种情况。当left > right时二分查找失败(所给数组中没有待查找元素)。基...原创 2019-04-13 15:57:07 · 661 阅读 · 0 评论 -
贪心算法+实例:删掉K个数后最小的数字+leetcode402
图片来自:程序员小灰(微信公众号)在求解最优化问题时通常在每个步骤都要面临多种选择。对于某些情况,使用动态规划算法来求最优解十分浪费时间空间复杂度,可以使用更简单高效的贪心算法。贪心算法在每一步看起来都是当时最佳的选择。意思是,它总是做出局部最优的选择,希望该选择能导致全局最优。虽然贪心算法并不一定能求得最优解。贪心算法建议通过一系列的步骤来构造问题的解,每一步对目前构...原创 2019-04-14 10:27:42 · 1272 阅读 · 0 评论 -
字典序算法(换位数)
给定一个顺序的数 一般是 逆序最大 顺序最小。比如 给定一个12354 我们找到离它最近的换位数。为了更接近原数,我们需要保持高位不变,低位在最小范围内变换顺序。那么究竟需要变换多少位呢? 这取决于当前数的逆序区域。12354的逆序区域是最后两位,对于这两位来说,此时已经是最大的组合。所以我们要想最接近原数,又比原数大,就必须从倒数第三位开始改变。比如此时 我们...原创 2019-08-15 11:49:07 · 479 阅读 · 0 评论