![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
文章平均质量分 53
数据结构与算法总结
北城望戈
在更大的世界,做更好的自己
展开
-
一道题理解二进制子集枚举与状态压缩
相关理论1、二进制子集枚举对于一个二进制数,其子集指的是对于原二进制数中1的选择,如对于一个二进制数01101,有三个1,则有8个子集,分别为01101,01100,01001,00101,01000,00100,00001,00000。方法一:暴力枚举// m => 总状态数for (int i = 1; i < m; i++) { // 从 [1, i] 就可以了,后面的一定不会是 i 的子集 for (int j = 1; j <= i; j++)转载 2021-08-30 11:18:58 · 402 阅读 · 0 评论 -
一文弄懂拓扑排序
原理:在一个有向图中,对所有节点进行排序,要求没有一个节点指向它前面的节点。通过邻接矩阵或邻接表建图后,统计所有节点的入度,分离出入度为0的节点,然后把这个节点指向的节点的入度减1,直到所有节点都被分离。例如下面(a)图的一种拓扑排序过程:应用:思路:对队伍排名进行拓扑排序。import java.util.*;public class Main{ public static void main(String[] args){ Scanner ci..原创 2021-08-10 10:38:08 · 112 阅读 · 0 评论 -
Dijkstra(迪杰斯特拉)算法求单源最短路径
算法思想:将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。用节点 A「更新」节点 B 的意思是,用起点到节点 A 的最短路长度加上从节点 A 到节点 B 的边的长度,去比较起点到节点 B 的最短路长度,如果前者小于后者,就用前者更新后者。原创 2021-08-02 11:48:55 · 270 阅读 · 0 评论 -
一文搞懂回溯(Backtracking)
Backtracking(回溯)属于DFS。普通DFS主要用在可达性问题,这种问题只需要执行的特定位置然后返回即可。回溯主要用于求解排列组合问题,这种问题在执行到特定位置返回之后还会继续执行求解过程。实现:在访问一个新元素进入新的递归调用时,需要将新元素标记为已经访问,在递归返回时,需要将元素标记为未访问。应用:思路: 对于这类寻找所有可行解的问题,我们都可以尝试用 搜索回溯 来解决。class Solution { //存储结果 List<List<原创 2021-07-23 10:36:18 · 233 阅读 · 0 评论 -
一文搞懂深度优先搜索(DFS)
一、原理深度优先搜索再得到一个新节点时立即对新节点进行遍历,从节点 0 出发开始遍历,得到到新节点 6 时,立马对新节点 6 进行遍历,得到新节点 4;如此反复以这种方式遍历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行遍历,得到新节点 2,然后继续以上步骤。从一个节点出发,使用DFS对一个图进行遍历时,能够遍历到的节点都是从初始节点可达的,DFS常用来解决这种 可达性 问题。实现:递归栈(保存当前节点信息,当遍历新节点返回时能继续遍历当前节点)、标记原创 2021-07-22 12:25:53 · 416 阅读 · 0 评论 -
递归和迭代两种方式求二叉树遍历
二叉树的前序遍历:根 左 右递归class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer>res=new ArrayList<>(); preorder(root,res); return res; } public void preorder(TreeNode root,Lis原创 2021-07-21 19:30:19 · 80 阅读 · 0 评论 -
一文搞懂广度优先搜索(BFS)
1、原理:广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历地结果作为起点,遍历一个距离能访问地所有节点。遍历过的节点不能再次被遍历。每一层遍历的节点都与根节点的距离相同。设di表示第i个节点与根节点的距离,推导出一个结论,对于先遍历的节点i与后遍历的节点j,有di<=dj。利用这个结论,可以求解最短路径等最优解问题:第一次遍历到目的节点,其所经过的路径为最短路径。实现BFS:队列(用来存储每一轮遍历得到的节点);标记(对于遍历过的节点,应该将它标记,防止重复遍历)。2、原创 2021-07-21 11:39:39 · 1613 阅读 · 0 评论 -
线段树的原理和应用
一、原理简介:假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n))。线段树的原理就是,将[1,n]分解成若干特定的子区间(数量不超过4*n,),然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。结构:对于A[1:6] = {1,8,6,4,3,5}来说,线段树如下所示,红色代表每个原创 2021-07-20 11:17:52 · 405 阅读 · 2 评论 -
树状数组的原理与应用
一、原理简介:「树状数组」是一种可以动态维护序列前缀和的数据结构,它的功能是:单点更新 update(i, v): 把序列 i 位置的数加上一个值 v区间查询 query(i): 查询序列 [1⋯i] 区间的区间和,即 i 位置的前缀和修改和查询的时间代价都是 O(logn),其中 nn 为需要维护前缀和的序列的长度。结构:上图中黑色数组是原来的数组,用A代替,红色数组是我们的树状数组,用C代替,由图可知C[1] = A[1]...原创 2021-07-16 14:26:33 · 81 阅读 · 0 评论 -
算法思想:双指针
双指针:主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。class Solution { public int[] twoSum(int[] numbers, int target) { int i=0,j=numbers.length-1; while(i<j){ int temp=numbers[i]+numbers[j]; if(temp<target){原创 2021-05-25 22:15:11 · 105 阅读 · 0 评论 -
搜索问题汇总
1、BFS广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有结点。遍历过的结点不能再次被遍历。设 di表示第 i 个节点与根节点的距离,推导出一个结论:对于先遍历的节点 i 与后遍历的节点 j,有 di<= dj。应用场景:无权图的最短路径。程序实现:1、队列,用来存储每一轮遍历得到的节点;2、标记,对于遍历过的节点,应该将它标记,防止重复遍历。leetcode例题:class Solution { public..原创 2021-04-19 14:55:05 · 844 阅读 · 0 评论 -
数据结构:208、实现Trie(前缀树)
思路:定义前缀树节点,属性有结束标志位isEnd,下一个前缀树节点。定义根节点root,添加、查找时都从根节点开始搜索。class Trie { class TrieNode{ private boolean isEnd; private TrieNode[] next; public TrieNode(){ isEnd=false; next=new TrieNode[26]; ..原创 2021-04-14 10:19:14 · 68 阅读 · 0 评论 -
常用排序算法
排序算法总览算法 时间复杂度 空间复杂度 稳定性 冒泡排序 O(n^2) O(1) 稳定 快速排序 O(nlogn) O(logn) 不稳定 直接选择排序 O(n^2) O(1) 不稳定 直接插入排序 O(n^2) O(1) 稳定 希尔排序 O(nlogn~n^2) O(1) 不稳定 归并排序 O(nlogn) O(1) 稳定 堆排序 O(nlo原创 2021-04-13 14:49:39 · 90 阅读 · 0 评论 -
常用查找算法
数组内元素无序一、线性查找public class SequenceSearch { public static int sequenceSearch(int[] arr,int target){ for(int i=0;i<arr.length;i++){ if(arr[i]==target){ return i; } } return -1; }原创 2021-04-13 12:12:10 · 222 阅读 · 0 评论 -
Java数据结构与算法
视频地址:尚硅谷Java数据结构与java算法一、数组顺序存储结构,存储空间连续,逻辑结构为线性结构。下标从0开始。稀疏数组把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模二、队列队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出原则。1、数组模拟队列:maxSize :队列容量(数组的长度)arr :模拟队列的数组front :指向队列头部元素的前一个元素,初始值为 -1rear :指向队列尾部元素,初始值为 -1基本操作队列.原创 2021-03-09 10:21:49 · 96 阅读 · 0 评论 -
大话数据结构读书笔记
一、绪论1、数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,别输入给计算机处理的符号集合。数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。数据项:一个数据元素可以由若干个数据项组成。数据项是数据不可分割的最小单位。数据对象:是性质相同的数据元素的集合,是数据的子集。总结:数据 > 数据对象 > 数据元素 > 数据项2、数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构:数据对象中数原创 2021-03-09 09:03:57 · 393 阅读 · 0 评论 -
图论问题汇总
一、最短路径问题1、单源最短路径深度或广度优先算法,从起点开始访问所有深度遍历路径或广度优先路径,则到达终点节点的路径有多条,取其中路径权值最短的一条则为最短路径。void dfs(int cur, int dst){ if(minPath < dst) return;//当前走过路径大于之前最短路径,没必要再走下去 if(cur == n){//临界条件 if(minPath > dst) minPath = dst;原创 2021-01-20 11:22:35 · 2254 阅读 · 1 评论 -
刷题:输入输出总结
1、输入形式为:1,2,3,-4,5 将每个整数存入数组中C++版#include<iostream>#include<vector>#include<sstream>using namespace std;int main(){ string str; cin >> str; vector<int>arr; string tmp; stringstream str_1(str);..原创 2020-11-20 20:43:47 · 158 阅读 · 0 评论 -
动态规划
解决的问题:当遇到最大,最小,最长,最短的子问题时,用动态规划解决。三部曲:定义dp数组的含义,找出状态方程,初始化。优化:空间优化,考虑能否用常量代替一维数组,用一维数组代替二维数组。...原创 2020-11-08 10:28:16 · 58 阅读 · 0 评论 -
数据结构之树问题汇总
一、二叉树的前序、中序、后序遍历1.前序遍历递归解法:根左右class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int>res; preorder(root,res); return res; } void preorder(TreeNode *root,vector<int>&a原创 2020-11-03 14:34:58 · 365 阅读 · 0 评论 -
二分搜索
一、寻找一个数int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; while(left <= right) { int mid = left + (right - left) / 2; if(nums[mid] == target) return mid; else if (转载 2020-07-23 10:44:11 · 57 阅读 · 0 评论 -
滑动窗口框架背诵
转载作者:labuladong链接:https://leetcode-cn.com/problems/minimum-window-substring/solution/hua-dong-chuang-kou-suan-fa-tong-yong-si-xiang-转载 2020-07-07 10:54:57 · 163 阅读 · 0 评论 -
常用的二叉树基本概念
二叉树二叉树是每个节点最多拥有两个子节点,左子树和右子树是有顺序的不能任意颠倒。满二叉树高度为h,由2^h-1个节点构成的二叉树称为满二叉树。完全二叉树完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。二叉排序树(二叉查找数、二叉搜索树)根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适.原创 2020-07-06 20:08:33 · 266 阅读 · 0 评论