
数据结构与算法
文章平均质量分 84
bitkevin
关注必回
展开
-
STL标准库设计原理与使用
本文详细介绍了C++ STL(标准模板库)各个常用容器的底层数据结构与实现和典型使用方法,对理解和正确使用STL有一定帮助。原创 2021-12-25 11:51:52 · 1020 阅读 · 0 评论 -
使用回溯算法解决排列组合问题
回溯算法是一种非常实用的算法解题思路,LeetCode中题库中有106道回溯的试题,而且难度都在中等以上,掌握回溯算法对高效快速解决很多问题都很有帮助。今天我们主要看看回溯算法的解题套路和实用回溯解决排列组合问题的题解。1.回溯算法特点 回溯算法过程:在搜索中寻找问题的解,发现不满足条件时,就回溯返回上一步,尝试别的路径。 从上面的定义可以看出,回溯算法依赖于递归实现,与递归算法的差异就在于一个“回”字,即修改了状态并做了尝试之后,需要回过来把状态改回去再做其他尝试,通过多轮回溯逐步求出所有的原创 2021-10-13 00:18:58 · 2245 阅读 · 1 评论 -
归并排序及其优化(数组归并/链表归并,自顶向下/自底向上等)
归并排序时一种使用分治思想实现的高效的排序算法,它的最好/最坏/平均时间复杂度都是O(nlogn),而且是一种稳定的排序算法。然而归并排序并没有得到广泛的应用,今天我们来看看归并排序的特点、优化和应用。1. 算法简介归并排序的原理 归并排序(Merge Sort)的核心思想就是一个典型的分治算法。如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。算法示意图如下: 代码实现如下:class Solution原创 2021-10-02 00:43:03 · 2027 阅读 · 2 评论 -
链表反转的技巧及相关题解
单链表作为一种比较常见的数据结构,经常会出现在面试题中。单链表只有一个后继指针,要实现O(1)空间复杂度的反转,就需要掌握单链表反转的一些技巧。注:我们这里讨论的都是如何不借助额外空间(即O(1)空间复杂度),实现链表反转。首先让我们先看看最简单的链表反转:1. 链表反转(简单)206. 反转链表剑指 Offer 24. 反转链表剑指 Offer II 024. 反转链表题目描述:把一个单链表反转,并返回反转后的链表头。解题过程:这道题可以很容易地用双指针解决:定义两个指针一个指向前原创 2021-09-30 00:41:57 · 576 阅读 · 0 评论 -
树/二叉树的层序遍历 掌握这个方法轻松解决16道LeetCode题
我们知道树/图的深度优先搜索使用递归可以很简单的实现,但树的广度优先搜索是依赖于队列先见先出的特性来实现的,不方便使用递归实现。今天我们来看看树的层序遍历方法,掌握了这个方法,广度优先搜索的大部分题都可以轻松解决了。1. 二叉树的层序遍历剑指 Offer 32 - I. 从上到下打印二叉树先看这个最简单的层序遍历,只需要按广度优先的顺序一个一个地输出节点值就可以了要点:头结点入队队列不为空时不断出队,出队节点值加入结果将出队节点的左右子节点入队重复以上直到队列为空vector<原创 2021-09-15 00:10:43 · 208 阅读 · 1 评论 -
二叉树的遍历(深度优先/广度优先 递归/非递归 层序遍历)详解
目录1.简介2.二叉树的深度优先遍历2.1 二叉树的前序遍历2.2 二叉树的中序遍历2.3 二叉树的后序遍历3. 二叉树的广度优先搜索3.1 二叉树广度优先搜索3.2 二叉树的层序遍历3.3 二叉树自底向上层序遍历3.4 二叉树的锯齿形层序遍历 二叉树是一种很常用的基本数据结构,它可以看做一种特殊的图(一个节点只有一个入度和最多两个出度),因此二叉树的的遍历要比图简单很多,学好二叉树也能较容易掌握图的遍历。1.简介 我们...原创 2021-09-12 23:53:03 · 1621 阅读 · 2 评论 -
动态规划原理与LeetCode题解
目录动态规划的三个特征:动态规划解题思路:1.状态转移表法2. 状态转移方程法3. LeetCode题解3.1 LeetCode509. 斐波那契数3.2 LeetCode70. 爬楼梯3.3 LeetCode198. 打家劫舍3.4 LeetCode53. 最大子序和3.5 LeetCode152. 乘积最大子数组3.6 LeetCode1014. 最佳观光组合3.7 LeetCode55. 跳跃游戏动态规划适合解决多阶段决策最优解模型问题...原创 2021-09-10 00:26:23 · 250 阅读 · 0 评论 -
常见路径规划算法介绍
本文介绍了算法书上常见的路径规划算法和工业界目前比较流行的高效分层路径规划算法。目录1. 经典路径规划算法1.1Dijkstra1.2 Bellman-Ford1.3 SPFA1.4A*1.5Bidirectional Search(双向搜索)2.分层规划算法2.1CH算法(Contraction Hierarchies)2.1.1CH预处理2.1.2CH查询2.2CCH算法(Customizable Contra...原创 2021-08-29 22:05:38 · 17894 阅读 · 0 评论 -
二分查找详解及其变种实现&LeetCode题解
二分查找(Binary Search)又叫折半查找,对于已排序的数组,是一种非常高效的排序算法,时间复杂度为O(logn)。二分查找很简单也很高效,但要写好用好二分查找却不容易,多数程序员都不能完整地实现一个无bug的二分查找。1.最基本的二分查找 我们先来看一个最基本的二分查找,在一组无重复的数组中查找指定的数并返回数组索引。int binarySearch(int[] a, int n, int value) { int low = 0; int hi...原创 2021-08-19 22:41:37 · 423 阅读 · 0 评论 -
回溯算法与优化
回溯算法定义:在搜索中寻找问题的解,发现不满足条件时,就回溯返回上一步,尝试别的路径回溯算法应用:深度优先搜索,八皇后,0-1背包,全排列等以0-1背包问题为例:有一个背包,背包总的承载重量是Wkg。现在我们有n个物品,每个物品的重量不等,并且不可分割。我们现在期望选择几件物品,装载到背包中。在不超过背包所能装载重量的前提下,如何让背包中物品的总重量最大?private int maxW = Integer.MIN_VALUE; // 结果放到maxW中private int[] weigh原创 2021-08-03 00:13:32 · 1031 阅读 · 0 评论