<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Smartbbbb的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Smartbbbb</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Smartbbbb]]></copyright><item><title><![CDATA[一个数的所有连续自然数之和]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123822491</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123822491</guid><author>Smartbbbb</author><pubDate>Tue, 29 Mar 2022 15:21:37 +0800</pubDate><description><![CDATA[* 题目描述:
*      一个整数可以由连续的自然数之和来表示,现给定一个整数,计算该整数有几
*      种连续自然数之和的表达式并打印出每一种表达式
* 输入描述:
*         一个目标整数t  1&lt;= t &lt;=1000
*         1.该整数的所有表达式和表达式的个数
*         如果有多种表达式，自然数个数最少的表达式优先输出
*         2.每个表达式中按自然数递增输出
*         在每个测试数据结束时，输出一行"Result:X"...]]></description><category></category></item><item><title><![CDATA[乱序数组 删除所有重复元素 使得每个元素只出现一次 并且按照出现次数由高到低排序 相同出现次数 按照第一次出现的顺序进行先后排序（要求稳定）]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123820910</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123820910</guid><author>Smartbbbb</author><pubDate>Tue, 29 Mar 2022 14:45:59 +0800</pubDate><description><![CDATA[思路:

首要统计数组中每个元素出现的频次以及出现顺序(以第一次出现的为准)
	创建一个结构体,包含: val count order
	构造一个比较器确定比较规则(按照出现次数多少从大到小排序,出现次数相同则按照出现顺序order排序)

    public static int[] fx(int[] arr) {
        //收集节点信息
        HashMap&lt;Integer, Node&gt; map = new HashMap&lt;&gt;();
        int.]]></description><category></category></item><item><title><![CDATA[一个Set解决二叉树任何节点间的距离问题]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123816342</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123816342</guid><author>Smartbbbb</author><pubDate>Tue, 29 Mar 2022 11:16:08 +0800</pubDate><description><![CDATA[前提: 二叉树的每个节点都有一个指向夫节点的parent指针,遍历找到二叉树中想求距离的节点,将两个节点到根节点之间经过的所有节点存入set,那么set的大小就是距离.

分析:无论是否经过头节点,无论怎样都是要汇集到头节点的

    情况一: 不在同一子树,那么两边的路径只有根节点重合                                  情况二:在同一子树,必然有公用的节点,两条路径中选择任意一条将沿途节点存入...]]></description><category></category></item><item><title><![CDATA[给定一个数组存储的二叉树,求根节点到最小叶子节点的路径]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123813127</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123813127</guid><author>Smartbbbb</author><pubDate>Tue, 29 Mar 2022 10:01:56 +0800</pubDate><description><![CDATA[描述:

以数组来存储二叉树,现给定一个数组
树的根节点的值储存在下标1, 对于储存在下标n的节点，
他的左子节点和右子节点分别储存在下标2*n和2*n+1
并且我们用-1代表一个节点为空
试求从根节点到最小叶子节点的路径,路径由节点的值组成

思路:

    1.将给定的数组先转换为二叉树,转换时添加一个向上的parent指针指向父节点                2.层序遍历所...]]></description><category></category></item><item><title><![CDATA[迪杰斯特拉(Dijsktra)算法求到任意节点的最短路径]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123810975</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123810975</guid><author>Smartbbbb</author><pubDate>Tue, 29 Mar 2022 08:25:11 +0800</pubDate><description><![CDATA[迪杰斯特拉算法要求

    1.必须给一个起点,可求出起点到任何节点的最短路径,如果不可达那么距离设定为正无穷         2.输出一张表记录一个节点到任何节点的最短路径                                      3.dijkstra本质是一种贪心算法

要求: 不能出现权值为负的边(如果沿途路径不能构成一个环那么也可以,但最好不要有)

操作: 维护一...]]></description><category></category></item><item><title><![CDATA[Prim算法之最小生成树]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123810685</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123810685</guid><author>Smartbbbb</author><pubDate>Tue, 29 Mar 2022 04:16:11 +0800</pubDate><description><![CDATA[P算法思路: 给定任意一个节点,保证权值最小的情况下生成最小生成树,在确定一个节点后,在该节点的所有边中找到权值最小的,结果集加入这条边,然后使用这条边的to节点在解锁一些边,找出最小权值的边 ...

对于解锁出的边存入小根堆中每次弹出最小权值的即为有效边


    /**
     * 最小生成树(保持树的连通性,保证权值最小)
     *
     * P算法:
     *      首先需要指定一个节点,由一个点解锁一批边,挑出最小的,也是用优先队列
     */
    public s.]]></description><category></category></item><item><title><![CDATA[基于并查集的Kruskal算法求最小生成树]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123754057</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123754057</guid><author>Smartbbbb</author><pubDate>Mon, 28 Mar 2022 14:02:23 +0800</pubDate><description><![CDATA[不了解并查集的可以看我之前写的: 👇https://blog.youkuaiyun.com/Smartbbbb/article/details/123623055?spm=1001.2014.3001.5501



/**
 * 最小生成树(保持树的连通性,保证权值最小)
 *
 * K算法:
 *      思路: 将所有边按照权值排序,从最低权值的边开始,判断边两边的节点
 *      是否在同一集合,不在union,在,放弃这条边 ... 直到遍历结束,使用
 *      并查集解决,最终连成一片,因为并.]]></description><category></category></item><item><title><![CDATA[图的拓扑排序]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123791328</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123791328</guid><author>Smartbbbb</author><pubDate>Mon, 28 Mar 2022 11:38:20 +0800</pubDate><description><![CDATA[拓扑排序常用于编译前依赖的编译,只有上一步做完下一步才可以进行 ...

思路: 依次消除所有入度为0的节点,并消除其边的影响


public static List&lt;Node&gt; topology(Graph graph){
        //key 某一个节点 value 剩余的入度
        HashMap&lt;Node,Integer&gt; inMap = new HashMap&lt;&gt;();
        //只有入度为0的节点才可进入
        Queu.]]></description><category></category></item><item><title><![CDATA[两种方式实现: 二叉树深度优先(BFS),统计二叉树最大宽度]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123753198</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123753198</guid><author>Smartbbbb</author><pubDate>Sat, 26 Mar 2022 11:51:09 +0800</pubDate><description><![CDATA[* &lt;pre&gt;
* 二叉树的层序遍历
*
*                       '1'
*              |                   |
*             '2'                 '3'
*       |          |           |      |
*       4         '5'          6      7'
*              |      |                  ...]]></description><category></category></item><item><title><![CDATA[二叉树层序遍历]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123753153</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123753153</guid><author>Smartbbbb</author><pubDate>Sat, 26 Mar 2022 11:41:54 +0800</pubDate><description><![CDATA[基本思路: 头节点先入队,poll()则打印,如果有左有孩子,入队 ....


    //层序遍历
    public static void levelVisit(Node node){
        Queue&lt;Node&gt; qe = new LinkedList&lt;&gt;();
        qe.add(node);
        while (!qe.isEmpty()){
            Node cur = qe.poll();
            ..]]></description><category></category></item><item><title><![CDATA[二叉树的前序,中序,后序的遍历(非递归/递归实现)]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123749771</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123749771</guid><author>Smartbbbb</author><pubDate>Sat, 26 Mar 2022 06:44:53 +0800</pubDate><description><![CDATA[1.非递归遍历二叉树


    //先序遍历 先push right再push left,目的是先处理left节点 弹栈就打印
    public static void prefix(Node node) {
        System.out.print("pre-order: ");
        Stack&lt;Node&gt; stack = new Stack&lt;&gt;();
        stack.push(node);
        while (!stack.em..]]></description><category></category></item><item><title><![CDATA[单调栈: 找出数组中任意位置左右两边比它大的数字]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123749570</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123749570</guid><author>Smartbbbb</author><pubDate>Sat, 26 Mar 2022 03:34:21 +0800</pubDate><description><![CDATA[* 单调栈: 找出任意一个位置,左边比它大的及右边比它大的
* {5 4 6 7 2 3 0 1}
* 如5左边无右边是6
描述: 找出数组中任意位置上,左右两边比它大的数字,左右没有输出 " 无 ", 否则就打印.操作时利用栈结构实现,索引从0开始,如果栈为空直接push,不为空比对栈顶数据和要push的值,如果栈顶的小于要压入的数据,那么就弹出,一直弹出到遇到比它大的栈顶元素停止,接着push就行.需要注意的是,在push过程中由于要将遇到的小的栈内元素弹出,弹出时是需要打印信息的,因为弹出行为...]]></description><category></category></item><item><title><![CDATA[滑动窗口 (双端队列实现)]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123748903</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123748903</guid><author>Smartbbbb</author><pubDate>Sat, 26 Mar 2022 00:46:41 +0800</pubDate><description><![CDATA[滑动窗口: 使用双端队列实现,双端队列的作用是保证每次L边界右移时从队列头弹出的都是当前窗口的最大值.

操作:

    1.给定一个限制为k的窗口大小,L,R分别代表窗口左右边界,L和R只能向右移动,当R触碰到数组长度极限时结束.                                                                   ...]]></description><category></category></item><item><title><![CDATA[给定一个栈,仅利用栈自身的结构逆序栈,不能借助其它数据结构]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123645312</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123645312</guid><author>Smartbbbb</author><pubDate>Mon, 21 Mar 2022 20:48:26 +0800</pubDate><description><![CDATA[不借助其它数据结构,仅使用给的一个栈实现栈的逆序,听起来不可思议!其实是可以借助递归时系统压栈的方式(即栈帧存储数据)来实现逆序.

操作:

1.使用 f() 函数每次抽取出栈底的元素且弹出,那么就可以将栈中所有的元素按逆序的方式拿到 2.reverse() 函数也利用系统压栈,当达到调用链尽头,这时栈帧中p变量存储的就是原来栈顶的元素,并且此时栈已经空了(因为栈为空是 base case 即:终止条件),那么压栈返回,压栈返回... 就会将栈逆序.

小结: 虽然在代码层面并没有利用给定栈的其它数据结.]]></description><category></category></item><item><title><![CDATA[图的结构 .图的广度优先遍历(BFS),深度优先遍历(DFS)]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123634886</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123634886</guid><author>Smartbbbb</author><pubDate>Mon, 21 Mar 2022 14:42:29 +0800</pubDate><description><![CDATA[1.图的构成

    1.边集

    2.点集


]]></description><category></category></item><item><title><![CDATA[并查集实现]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123623055</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123623055</guid><author>Smartbbbb</author><pubDate>Sun, 20 Mar 2022 22:18:41 +0800</pubDate><description><![CDATA[并查集用于解决关联性问题,可以合并不同的集合,判断是否属于同一集合. 根据业务场景应用很广,比如是否属于同一省份,或根据不同信息判定是否属于同一个人...

并查集结构: 如下UnionSet 结构


**
 * 并查集的结构的重要性,解决一切联通性的问题,是不是同一个用户,是否属于同一个集合
 */
public class UnionSetFind {

    public static void main(String[] args) {
        Integer[] arr = {1,3,]]></description><category></category></item><item><title><![CDATA[能安装多少灯可以照亮所有区域?]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123617849</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123617849</guid><author>Smartbbbb</author><pubDate>Sun, 20 Mar 2022 18:17:28 +0800</pubDate><description><![CDATA[**
 * 给一个字符串,只由x和.构成
 * x 代表墙不能装灯
 * .代表居民点,可以装灯
 * 如果灯放在i位置可以让 i-1 i i+1位置被点亮,返回需要点亮所有区域至少需要多少灯
 *


public class LightsNumber {
    public static void main(String[] args) {
        String str = "...x..xxx.x..x.";
        //String str = "x.x.xx...xxx....]]></description><category></category></item><item><title><![CDATA[O(N)时间复杂度copy一个含有随机指针的链表]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123569366</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123569366</guid><author>Smartbbbb</author><pubDate>Fri, 18 Mar 2022 10:57:55 +0800</pubDate><description><![CDATA[*
 * 复制含有随机指针的链表
 * 
 * 思路1: 每遍历一次旧节点存入到map一个新的节点(不需要设置),然后依据来节点的指向设置
 * 思路2: 复制节点,由原节点指向,然后拆分
 *
 *   箭头矢代表random指向
 *       -------&gt;
 *       7  23  3  4  56
 *       &lt;---
 *



    //思路1: 每遍历一次旧节点存入到map一个新的节点(不需要设置),然后依据来节点的指向设置
    public Node ..]]></description><category></category></item><item><title><![CDATA[时间复杂度O(n)的回文链表判断算法, 额外空间复杂度O(1)]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123555193</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123555193</guid><author>Smartbbbb</author><pubDate>Thu, 17 Mar 2022 17:08:46 +0800</pubDate><description><![CDATA[/**
 * 判断链表是否为回文:
 *      利用链表逆序的思路,将中点之后的指针反序指向中点,从两头走
 *      直到走到null依旧没有返回false,那就是会回文
 *
 *      2 -&gt; 6 -&gt; 9 &lt;- 6 &lt;- 2
 *                |
 *               null
 *     slow = head
 *     fast = head
 */




//反转后一半链表前后比对,然后调整好指针
    priv..]]></description><category></category></item><item><title><![CDATA[链表的回文问题: 全压栈 与 半压栈]]></title><link>https://blog.youkuaiyun.com/Smartbbbb/article/details/123549369</link><guid>https://blog.youkuaiyun.com/Smartbbbb/article/details/123549369</guid><author>Smartbbbb</author><pubDate>Thu, 17 Mar 2022 14:22:37 +0800</pubDate><description><![CDATA[/**
 * 基于栈判断是否为回文
 *      1.使用栈: 所有节点依次入栈,弹出一个与原链表或字符比对有一个不对,不是回文
 *      2.使用栈: 利用快慢指针找到链表中点,以slow下一个开始压入栈中,弹出比对,栈为空停止
 */


//遍历链表全部放入栈中,弹出比对
    public static boolean isPalindrome1(Node head){
        if(head == null){
            return false;
    ...]]></description><category></category></item></channel></rss>