数据结构和算法
小豆饼
这个作者很懒,什么都没留下…
展开
-
回溯算法模板及其例题组合总和讲解(java)
回溯算法也是常见的算法,使用回溯法要么是求所有的可行解要么是求最优解。无论哪一种,都需要找出所有的可行解,进行比较。因此回溯法本质上还是深度优先遍历。它是将问题转换成图的深度遍历。然后沿着一个方向遍历,遍历到某个和节点的时候,判断这个节点是否可行,如果可行,则以这个节点为根进行子节点深度搜索。如果不可行,则往后退一步到父节点,然后继续判断,也就是说回溯一般使用递推的方式实现。有上面可知,首先要将问题转化为图的形式,然后开始遍历,每一个节点的下一个节点不止一个,我们将所有的下一个节点放在一个列表里,就叫做原创 2020-09-12 11:33:31 · 1363 阅读 · 0 评论 -
动态规划的应用(算法题题解)
动态规划解决打家劫舍系列问题废话少说,直接看题#### [198. 打家劫舍](https://leetcode-cn.com/problems/house-robber/)你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1原创 2020-08-06 19:15:02 · 213 阅读 · 0 评论 -
在算法题中链表的移除元素问题
我们直接看例题203. 移除链表元素移除其实很简单,只要掉过要移除的对象即可,比如发现a节点是需要移除的对象,那么可以令a节点的上一个节点的next=它的next.next。这个题目存在的一个异界就是head有没有值和它的值是不是符合移除的条件。所以虚设一个哨兵节点,让它的next=head代码如下:class Solution { public ListNode removeElements(ListNode head, int val) { if(hea原创 2020-08-01 21:40:33 · 510 阅读 · 0 评论 -
关于递归在求解路经和中的应用
觉得递归其实就是数学归纳法的逆运算。做递归相关的题目时,有三点:第一:明确要递归的函数要实现的功能,一定要相信这个函数可以完成任务;第二:不要去考虑细枝末节和它时如何实现的,只考虑当前。第三:找好终止条件;下面我们来做路径总和的三道题:112. 路径总和这个题目是判断从根到叶子节点的路径和是否等于一个数。首先我们hasPathSum(root,sum)这个函数的作用是找出以root为根的树的路径和等于sum的个数,我们相信它可以实现。接下来找终止条件如果root是叶子节点的话,那原创 2020-08-01 21:22:01 · 213 阅读 · 0 评论 -
利用双指针解决链表问题
先说快慢指针再谈滑动窗口快慢指针快慢指针顾名思义就是在题目中定义两个指针,根据两个指针移动的速度和条件不同。大体上可以分为两类,一类快慢指针 ,主要用于解决链表问题,如判断链表是否有环。一类是左右指针,主要用于解决数组和字符串问题,比如在二分查找中的应用。141. 环形链表这个题目就可以定义零个指针,一个是慢指针slow指向head,一个是快指针fast指向head或者是head.next。区别就是slow一次走一步,fast一次走两步。如果存在环的话,那么快指针一定可以追得上慢指针,就像操原创 2020-07-19 10:12:38 · 281 阅读 · 0 评论 -
利用队列和栈的算法题
栈 先进后出队列队列是一种常用的数据结构,可以将队列看做是一种特殊的线性表,遵循先进先出原则。分分为队列queue和双向队列deque。队列queue在java中,使用LinkedList实现queue。操作的方法如下: 抛出异常 返回值 插入 add(e) offer(e) 移除 remove() poll() 检查 element() peek() boolean add(E e);将指定的元素插入此队列(如果立即.原创 2020-07-01 10:17:40 · 317 阅读 · 0 评论 -
关于动态规划的讲解和力扣习题
动态规划是近年来笔试和面试做常考的题型了。但是很难有一个模板去套所有的题型。我们结合力扣的题型来说说动态规划。首先动态规划的问题一般都是最值问题,最短距离,最小序列,最长序列之类的。我们人看待问题可以左到统筹全局然后找出最值。但是电脑不行,电脑解决最值问题的唯一方法就是穷举。找出所有的解决方案,然后从中比较得出最优解。也就是说绝大部分的问题都可以使用穷举得到答案。但是这里存在两个问题:一是很多问题不是那么容易穷举,需要我们找出一个合理的关系(转移方程),不然很难做到穷举出所有的值。而是存在重叠问题,原创 2020-07-01 09:56:31 · 270 阅读 · 0 评论 -
拓扑排序讲解和典型例题
拓扑排序应用:拓扑排序是应用在有向图中,对所有的节点进行排序。思路:1.首先统计所有节点的入度,把其加入一个入度表中;2.维护一个队列,讲入度为0的节点入队;并且维护一个邻接表用于存储每个节点相关联的节点入度数量;3.然后将对列中的节点出队,并且将与这个节点相关联的节点入度减一。如果此时有相关的节点入度为0,则入 队。4.如果最后都是入度为0的节点,则表示有拓扑排序;如果最后不存在入度为0的节点,则表示图有环,不存在拓扑排序。如下图所示:(这个图借用了这篇博客:原文链接:https:原创 2020-05-18 11:07:07 · 1216 阅读 · 0 评论 -
dfs和bfs的讲解、模板和典型例题
1,概述广度优先搜索(BFS),利用队列实现,特点是水泛涟漪;深度优先搜索(DFS),使用递归实现(其实是用到了栈的形式,先进后出),特点是一条路走到黑;2,代码模板实现//DFS代码实现void dfs(TreeNode root){ if(root==null){ return; } dfs(root.left); dfs(root.right);}//BFS代码实现void bfs(TreeNode root){ Qu原创 2020-05-18 10:58:53 · 2544 阅读 · 0 评论