<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[HUIEX的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/HUIEX</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; HUIEX]]></copyright><item><title><![CDATA[题目 1568: 蓝桥杯算法提高VIP-身份证排序]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/123455270</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/123455270</guid><author>HUIEX</author><pubDate>Sun, 13 Mar 2022 10:25:50 +0800</pubDate><description><![CDATA[排序  重写Comparator就行了  没什么特殊的
public class C1568 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();

        ArrayList&lt;String&gt; list = new ArrayList();
        for (int i = 0; ]]></description><category></category></item><item><title><![CDATA[题目 1975: 蓝桥杯算法提高VIP-扑克排序]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/123450328</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/123450328</guid><author>HUIEX</author><pubDate>Sat, 12 Mar 2022 21:06:01 +0800</pubDate><description><![CDATA[package LanQiao.C_Web.C_1975;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

/**
 * @author Huiex on 2022/3/12
 */
public class C1975 {
    public static void main(String[] args) {
        Scanner input = new Scanner(S]]></description><category></category></item><item><title><![CDATA[题目 1917: 蓝桥杯算法提高VIP-快乐司机]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/123450273</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/123450273</guid><author>HUIEX</author><pubDate>Sat, 12 Mar 2022 21:04:17 +0800</pubDate><description><![CDATA[排序 实现compare方法即可
package LanQiao.C_Web.C_1917;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;

/**
 * @author Huiex on 2022/3/12
 */
public class C1917 {
    public static void main(String[] args) {
        /** 输入*/
   ]]></description><category></category></item><item><title><![CDATA[剑指 Offer 35. 复杂链表的复制]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121797759</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121797759</guid><author>HUIEX</author><pubDate>Wed, 08 Dec 2021 18:24:12 +0800</pubDate><description><![CDATA[主要思路是：以为题目的要求返回的链表和给的链表位置不一样，所以要新建结点
将新建结点和原结点放入Map中，key为原结点，value为新建结点
然后通过在map中取出原结点，得到新节点，让新节点next指向 map中原结点的next对应新节点
连接random也同理
public class Offer35 {
    /** 题目的要求返回的链表和给的链表位置不一样，所以要新建结点*/
    public Node copyRandomList(Node head) {
        if (hea.]]></description><category></category></item><item><title><![CDATA[剑指 Offer 59 - II. 队列的最大值]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121797630</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121797630</guid><author>HUIEX</author><pubDate>Wed, 08 Dec 2021 18:18:37 +0800</pubDate><description><![CDATA[参考：
https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/ru-he-jie-jue-o1-fu-za-du-de-api-she-ji-ti-by-z1m/
主要思路就是 创建两个队列，一个是先进先出队列，一个是双向队列
普通队里用来执行pop 和push
双向队列用来执行最大值的存放 如果加入的数值大于双向队列的最后元素，就将该元素从双向队列的从末尾弹出，直到双向队列的末尾元素大于该数值，就将数值从后面放入双向队列
]]></description><category></category></item><item><title><![CDATA[剑指 Offer 66. 构建乘积数组]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121797404</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121797404</guid><author>HUIEX</author><pubDate>Wed, 08 Dec 2021 18:11:07 +0800</pubDate><description><![CDATA[题目要求不能用除法，所以只能用乘法，如果每一个B[i]直接乘的话会有很多重复计算，费时
所以可根据题意 可构建一个矩阵，分为上下两个三角区域
下三角区域中，b[n] = b[n-1] * a[n-1]
上三角区域中，b[n] = b[n-+] * a[n+1]
这样递推可以有效地避免重复计算
最后上三角的b[n] 乘上下三角的b[n]，就得到结果

public int[] constructArr(int[] a) {
        if (a.length == 0) return new int[0]]></description><category></category></item><item><title><![CDATA[剑指 Offer 12. 矩阵中的路径]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121794313</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121794313</guid><author>HUIEX</author><pubDate>Wed, 08 Dec 2021 17:57:40 +0800</pubDate><description><![CDATA[回溯 剪枝
回溯题，套模板
这道题中，走过的路用一个特殊的字符进行标记，用来作为路径选择的判断条件

具体思路看注解

public class Offer12 {
    public boolean exist(char[][] board, String word) {
        /** 从网格的任意一个地方开始遍历寻找，也就是当前的ij位置上的字符是否为word的第一个字符，如果是说明该路径起点有戏，否则连起点都不对还是换一个起点吧*/
        for (int i = 0; i &l]]></description><category></category></item><item><title><![CDATA[剑指 Offer 38. 字符串的排列]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121793865</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121793865</guid><author>HUIEX</author><pubDate>Wed, 08 Dec 2021 16:17:09 +0800</pubDate><description><![CDATA[回溯
很标致的一道回溯题
照着模板写就行

没有用剪枝
具体的流程注解里面有
public class Offer38 {
    public String[] permutation(String s) {
        HashSet&lt;String&gt; result = new HashSet&lt;&gt;();
//        ArrayList&lt;String&gt; result = new ArrayList&lt;&gt;();//结果集
        String ]]></description><category></category></item><item><title><![CDATA[剑指 Offer 48. 最长不含重复字符的子字符串]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121793506</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121793506</guid><author>HUIEX</author><pubDate>Wed, 08 Dec 2021 16:04:57 +0800</pubDate><description><![CDATA[用滑动窗口
主要注意滑动窗口的滑动的条件
用两个指针，从最左边开始，右指针向右移动，并且右指针移动后，将对应字符存入set中，当右指针指向的字符已经存在set中时，就移动左指针，然后set删去左指针对应的字符，直到set中没有右指针对应的字符时，左指针停止移动
public class Offer48 {
    /** 滑动窗口，*/
    public int lengthOfLongestSubstring(String s) {
        /** 先将字符串转化为字符数组*/
       ]]></description><category></category></item><item><title><![CDATA[剑指 Offer 26. 树的子结构]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121742080</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121742080</guid><author>HUIEX</author><pubDate>Mon, 06 Dec 2021 10:58:09 +0800</pubDate><description><![CDATA[递归套递归
一开始思路是 在 创建一个函数，进行在A中查找和B的根节点相同的结点，然后再创建一个函数，用来比较刚才在A中找到的子树和B树是否一样
提交时发现，给的二叉树可能存在结点值相同，
所以就只能  一旦找到A中和B的根节点相同的结点 后，就开始比较 A中子树和B是否一样
public class Offer26 {

    public boolean isSubStructure(TreeNode A, TreeNode B) {
        /** 终止条件 ： 穿过叶子结点 或者 如果当前]]></description><category></category></item><item><title><![CDATA[剑指 Offer 36. 二叉搜索树与双向链表]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121734832</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121734832</guid><author>HUIEX</author><pubDate>Sun, 05 Dec 2021 20:37:23 +0800</pubDate><description><![CDATA[二叉搜索树的中序遍历是有序的，所以可以在中序遍历的基础上进行添加
将中序遍历中的输出结点替换为本题所需要的结点中间的连接（具体看注解）
public class Offer36 {
    /** 二叉搜索树的中序遍历是有序的，所以可以在中序遍历的基础上进行添加*/
    /** 设立两个辅助指针，一个用来指向当前结点，一个指向上一个结点*/
    private Node pre;

    private Node head;

    public Node treeToDoublyList(No]]></description><category></category></item><item><title><![CDATA[剑指 Offer 34. 二叉树中和为某一值的路径]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121733406</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121733406</guid><author>HUIEX</author><pubDate>Sun, 05 Dec 2021 19:14:41 +0800</pubDate><description><![CDATA[深度优先  回溯法
public class Offer34 {

    /** 先创建一个List用来存放路径*/
    private List&lt;List&lt;Integer&gt;&gt; result = new ArrayList&lt;&gt;();//结果集
    private List&lt;Integer&gt; path = new ArrayList&lt;&gt;();//设置一个变量，来判断目前路径是否满足目标路径

    public List&lt;List&]]></description><category></category></item><item><title><![CDATA[剑指 Offer 31. 栈的压入、弹出序列]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121719456</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121719456</guid><author>HUIEX</author><pubDate>Sat, 04 Dec 2021 18:08:53 +0800</pubDate><description><![CDATA[建立一个辅助栈
向辅助栈中放入pushed栈中的元素
同时查找栈顶的元素 （根据popper数组的指针指向的数）
如果没有找到就继续入栈，如果找到就出栈，并且吧指针向后移动
当全部入栈时候，结束
public boolean validateStackSequences(int[] pushed, int[] popped) {
        /** 建立一个辅助栈*/
        Stack&lt;Integer&gt; stack = new Stack&lt;&gt;();

        /]]></description><category></category></item><item><title><![CDATA[剑指 Offer 46. 把数字翻译成字符串]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121714041</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121714041</guid><author>HUIEX</author><pubDate>Sat, 04 Dec 2021 12:37:11 +0800</pubDate><description><![CDATA[动态规划
思路：
其实和青蛙跳台阶一个道理
当有 n 个数的排列方式为
1. 第n个数字无法和前面的数字无法组合时
排列方式为：前 n-1个数的排列方式 加上当前数字，数量为 fn-1（前n-1个数字饿排列方式）
2. 第n个数字可以和前面的数字组合时
排列方式为： 前 n-1个数的排列方式 加上当前数字，数量为 fn-1（前n-1个数字饿排列方式）和 前n-2个数的排列方式 （fn-2）
两种情况，只需要判断 第n个数字是否可以和前面的数字组合
如果组合的数字为 10 到 25 就说明可以组合
转移方程：]]></description><category></category></item><item><title><![CDATA[剑指 Offer 49. 丑数]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121711648</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121711648</guid><author>HUIEX</author><pubDate>Sat, 04 Dec 2021 10:09:54 +0800</pubDate><description><![CDATA[动态规划  三指针
思想：
在已有的丑数序列上每一个数都必须乘2， 乘3， 乘5，然后选取其中最小的丑数，这样才不会漏掉某些丑数，
初始化： 第一个丑数为1，arr[0] = 1
转移方程： 丑数 == 某较小丑数 × 某因子  即 min = (a2,b3,c*5)
最优子结构： arr[a],arr[b],arr[c]
来自k神的图




/** 动态规划  三指针*/
    public int nthUglyNumber(int n) {
        if (n == 0) return 0]]></description><category></category></item><item><title><![CDATA[剑指 Offer 14- I. 剪绳子]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121642430</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121642430</guid><author>HUIEX</author><pubDate>Tue, 30 Nov 2021 20:50:31 +0800</pubDate><description><![CDATA[贪心
 *  思想：当n大于4时，尽可能多的剪出长度为3的段，3就是最优的,
 *  当 n 被剪到小于4时，就不用再减，因为小于4时剪还不如不剪
 *  如果给的n直接就小于4，没办法，特殊值，特殊处理，不剪也得剪

    public int cuttingRope(int n) {
        if (n == 2) return 1;
        if (n == 3) return 2;
        if (n == 4) return 4;
        int res = 1;]]></description><category></category></item><item><title><![CDATA[剑指 Offer 33. 二叉搜索树的后序遍历序列]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121641551</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121641551</guid><author>HUIEX</author><pubDate>Tue, 30 Nov 2021 20:13:06 +0800</pubDate><description><![CDATA[因为是搜索二叉树，所以 左结点 &lt; root &lt; 右结点
先遍历找到 大于数组最后一个数（也就是root）的索引
则 [left,i-1]为右子树的区间，[i,right-1]为左子树的区间
判断右子树区间内的数是否都小于 root（也就是postorder[right]）判断左子树区间内的数是否都大于 root
public class Offer33 {

    private int[] postorder;

    public boolean verifyPostorder(int]]></description><category></category></item><item><title><![CDATA[剑指 Offer 07. 重建二叉树]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121637720</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121637720</guid><author>HUIEX</author><pubDate>Tue, 30 Nov 2021 17:13:47 +0800</pubDate><description><![CDATA[整体思想为：

先通过先序找到中序中root的位置，
再通过中序root的位置找到左子树的区间，和右子树的区间
递归左右子树
当穿过叶子结点结束


public class Offer07 {
    /** 先通过先序找到中序中root的位置，
     * 再通过中序root的位置找到左子树的区间，和右子树的区间
     * 递归左右子树
     *
     * 当穿过叶子结点结束
     * */

    private HashMap&lt;Integer,Integer&gt; map]]></description><category></category></item><item><title><![CDATA[剑指 Offer 04. 二维数组中的查找]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121620039</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121620039</guid><author>HUIEX</author><pubDate>Mon, 29 Nov 2021 21:29:21 +0800</pubDate><description><![CDATA[有点类似于二叉树了，从左上角开始，通过不断判断，将边界缩小（类似于这一题顺时针打印列表 https://blog.youkuaiyun.com/HUIEX/article/details/121564439）

	/** 从右上角开始，往下变大，往右边小*/
    /** 设置边界 up,down,left,right ,当up &lt; down,right &lt; left,结束查找，即没有找到*/
    /** 如果目标数小于当前数，就向右移动，如果目标数大于当前数，就像下移动*/

    public ]]></description><category></category></item><item><title><![CDATA[剑指 Offer 62. 约瑟夫环问题（动态规划法）]]></title><link>https://blog.youkuaiyun.com/HUIEX/article/details/121619867</link><guid>https://blog.youkuaiyun.com/HUIEX/article/details/121619867</guid><author>HUIEX</author><pubDate>Mon, 29 Nov 2021 21:22:10 +0800</pubDate><description><![CDATA[https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/javajie-jue-yue-se-fu-huan-wen-ti-gao-su-ni-wei-sh/

fx = (fx + m) % i;转移方程就直接记住吧，可以照着这个图去穷举分析，理解一下这个方程
	/** 动态规划 /数学解法 约瑟夫环*/
    public int lastRemaining(int n, in]]></description><category></category></item></channel></rss>