
算法
文章平均质量分 61
name_s_Jimmy
每天坚持学习10小时,坚持锻炼1小时。吃好睡好。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法学习(10):LeetCode刷题之Dijkstra最短路径算法
前言:迪杰斯特拉(Dijkstra)最短路径算法是求有向加权图中某个节点到其他节点的最短路径。“图”这种数据结构的具体实现就是“邻接矩阵”或者“邻接表”。比如上面这个图,用邻接表或者邻接矩阵的存储方式如下,图中的节点一般抽象成一个数字(即下标或索引):首先,我们来确定一下Dijkstra算法的签名:// 输入一个起点和一个图(邻接矩阵表示),返回start到其他节点的最短路径,节点的值作为返回数组的下标int[] dijkstra(int start, int[][] graph)最短路径原创 2022-01-06 22:50:39 · 10447 阅读 · 1 评论 -
算法学习(9):LeetCode刷题之回溯算法
前言算法的实现依赖于深度优先搜索DFS,DFS算法尽可能深的搜索某一条路径,直到到达边界,而回溯算法在DFS算法的基础上强调了回退操作,即回溯法采用尝试的思想,分步解决问题,当发现现有的分步结果不能得到正确的结果,它将取消上一步的选择,再通过其他可能的分步继续尝试。回溯算法,其实还是一棵树的遍历过程。整个回溯过程涉及到3个方面:1、路径:即已经做出的选择。2、选择列表:即当前可以做的选择。3、结束条件:已经符合条件,无法继续选择。回溯算法通常用于求解一个问题的所有解,如排列、组合、子集等问题。算原创 2021-12-01 23:03:54 · 926 阅读 · 0 评论 -
算法学习(8):LeetCode刷题之dfs网格递归
前言深度优先搜索DFS算法通常出现在树结构或者图结构上,上一篇文章我们已经讲了二叉树的深度优先遍历,本文我们将二叉树的深度遍历继续引申,拓展到网格型深度优先遍历。首先我们先来统一一下网格的概念,网格是由m * n个小方格组成的网状结构,每个小方格与其上下左右4个方格都是相邻的,题目要求在这样的网格中进行某种搜索。本文借leetcode上的几个岛屿问题来讲解DFS,一般地,岛屿问题题目中每个格子中的数字是0或1。数字0代表海水,1代表陆地,相邻的陆地就连成了一个岛屿。在这个前提下,就会衍生出各种岛屿原创 2021-11-22 23:00:20 · 1145 阅读 · 0 评论 -
算法学习(7):LeetCode刷题之二叉树递归
前言二叉树天然具有递归的特性,所以刷二叉树基本都用递归的方式。建议先刷二叉树题目,因为很多经典的算法,比如分治、回溯、动态规划等,其实都是在处理树的问题。而树的问题,基本上离不开树的递归遍历框架,这篇文章通过二叉树的问题来理解递归。/* 二叉树遍历框架 */void traverse(TreeNode root) { // 前序遍历 traverse(root.left) // 中序遍历 traverse(root.right) // 后序遍历}那么,我们原创 2021-11-16 23:08:29 · 1213 阅读 · 0 评论 -
算法学习(6):LeetCode刷题之并查集
前言并查集是一种巧妙的算法思想,主要解决连通性问题的场景,比如:一组对象被划分成了若干个区域,求解被划分区域的数量,或者求解如何将这几个区域连接起来。题目中往往以图形的形式来表示区域,图中节点的连通关系用一个二维数组来表示,就比如LeetCode No. 1319题,题目给出了图中节点的数量,还给出了一个二维数组,如下输入表示有4个节点,其中0和1、0和2、1和2之间有连接。输入:n = 4, connections = [[0,1],[0,2],[1,2]]我们怎么判断2个节点之间是否连通呢?我原创 2021-11-02 14:08:13 · 1519 阅读 · 0 评论 -
算法学习(5):LeetCode刷题之滑动窗口
前言:滑动窗口算法专门优化一种场景,就是找出一个字符串(或数组)中满足一定条件的子串(或子数组)。原创 2021-10-18 23:21:39 · 851 阅读 · 0 评论 -
算法学习(4):LeetCode刷题之单调栈
前言栈是一种很常用的数据结构,最大的特点就是只能在一端进行操作。Java中的集合提供了一个接口Deque来表示栈结构,如下语句:Deque<Integer> stack = new ArrayDeque<>();至于为啥不用Stack类,请看下面这篇文章:Java 程序员,别用 Stack?!那么,单调栈又是什么呢?很简单,就是普通的栈加一个限定条件:栈内元素单调递增或单调递减。单调栈并不是一个Java集合中现成的容器,而是需要在编码中手动控制栈内元素的单调性。举个例子:原创 2021-09-30 17:26:04 · 482 阅读 · 0 评论 -
算法学习(3):LeetCode刷题之优先队列(堆)
前言堆是一种很常用的数据结构,常常用于排序中,算法的时间复杂度非常的低。本文不再详细介绍堆的概念,只简单回顾一下几个比较重要的知识点,然后做几道LeetCode题目。堆就是一个完全二叉树,每个节点都大于或者小于它的子节点,相应的叫做大顶堆和小顶堆。而完全二叉树可以用数组来表示,可以使用数学公式很轻松的计算出一个节点的父节点和2个子节点,这样就有助于节点值得交换,也就为在堆中增加和删除节点时,进行相应的上浮和下沉操作。知识点一:往堆中添加元素,元素首先加到数组尾部,也就是完全二叉树的最后一个节点。然后发生原创 2020-09-24 00:38:16 · 642 阅读 · 0 评论 -
算法学习(2):排序算法-插入排序及python实现
前言插入排序应该是最容易想到的排序算法,其核心思想是:将待排序的序列看成两部分,以某一个元素为界,左边的是排好序的序列,右边是待排序的序列,每次读取边界上的一个元素,然后将它跟排序好的序列中的元素一个一个对比,然后排好序的元素依次挪出个空位,然后将这个元素插入到合适的位置,一直循环到序列结束。插入排序很常见,比如:玩扑克牌时,抓牌的过程就是一个插入排序,每抓到一张牌,就将这张牌插入到手里排好序的牌中原创 2017-03-25 20:58:50 · 1551 阅读 · 0 评论 -
算法学习(1):算法时间复杂度O(n)的通俗理解
前言如果你发明了一个算法,想知道这个算法的快慢程度,怎么办呢?上机运行一下?显然不合适。。。计算机科学家提出了“时间复杂度”这个概念。那么,该怎么理解这个“时间复杂度”概念呢?尤其是O(n)这样的符号。正文思考一下生活中的一些场景,并估计时间:1、打个哈欠 — 几秒钟2、烧一壶水 — 几分钟3、睡上一觉 — 几小时4、完成项目 — 几个月5、飞出银河系 — 几光年那么,我们常见的时间复杂度的表示O(logn)、O(n)、O(n2)也可以类比上面的时间估算,其中大O就是“几”,括号里面原创 2021-08-12 20:39:29 · 2478 阅读 · 0 评论