<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dong的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/weixin_36634831</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; weixin_36634831]]></copyright><item><title><![CDATA[Vim基本操作]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/124442290</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/124442290</guid><author>weixin_36634831</author><pubDate>Wed, 27 Apr 2022 08:33:28 +0800</pubDate><description><![CDATA[Vim
三个主要模式

normal mode(command mode)
Insert mode
visual mode

normal mode =&gt; insert mode

在下方插入一行: o
在上方插入一行:O
在当前光标后插入:a
在当前光标前插入:i
在行尾插入:A
在行首插入:I

光标移动
基础移动

上下左右：hjkl
移动到第一行：gg
移动到最后一行：G
移动到指定行：nG

进阶移动


移动到下一个单词的开头：w


移动到下一个单词的结尾：e


移动到上一个单词的开头]]></description><category></category></item><item><title><![CDATA[LeetCode 84. Largest Rectangle in Histogram C++ 单调栈]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/107034014</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/107034014</guid><author>weixin_36634831</author><pubDate>Tue, 30 Jun 2020 10:11:10 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为：给你一个数组，这个数组代表了一个柱状图（数组中的每个元素代表每个柱子的高度），让你求出这个柱状图中能取到的面积最大的矩形面积。

单调栈：栈中元素保持单调递增或递减的单调性。其中栈的单调性是指元素出栈后的序列的单调性，因此栈顶元素大于栈底元素的单调栈是递减栈，反之是递增栈。
这题可以用递减栈来做
顺序遍历原序列：
如果栈为空或栈顶元素对应的数组元素小于等于目前遍历到的元素，则把当前元素的下标入栈
否则，最大的面积就可能出现在之前的元素中（可以这么想，如果元]]></description><category></category></item><item><title><![CDATA[LeetCode 301. Remove Invalid Parentheses C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106987646</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106987646</guid><author>weixin_36634831</author><pubDate>Sat, 27 Jun 2020 21:00:25 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为，给定一个字符串，让你移除最少的不合法的括号，让剩下的字符串合法，所给的字符串中可能含有(、)之外的字符。返回所有合法的字符串。
这题个人感觉比较难，ac前参考了很多别人的博客。
做这题时，我们需要明确以下几个事情：
1、如何判断一个括号字符串是否合法？一个长度为n的字符串下标为0~n-1，那么对于任何一个0 ~n-2上的字符，都需要保证左括号的数量&gt;=右括号的数量，否则就是不合法的；在n-1上，如果左括号数量=右括号数量，那么这个串最终就是合法的，否]]></description><category></category></item><item><title><![CDATA[LeetCode 581. Shortest Unsorted Continuous Subarray]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106885105</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106885105</guid><author>weixin_36634831</author><pubDate>Sun, 21 Jun 2020 14:45:51 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为：给定一个数组，找出其中的最短未排序连续子串。
e.g [2,6,4,8,10,9,15]这个序列，我们只要把中间的子串：[6, 4, 8, 10, 9]排好序，整个原数组就有序了。
不需要排序的元素就是排序前和排序后在同一位置上的元素。而且因为要求找出一个连续子串，那么，我们只需要找出最左边和最右边的排序前后下标改变的元素就可以了。
其实这整个过程就像选择排序一样，每次都在剩余元素中选出最小值，放在已经有序的子串后面，重复这个过程，就可以达到整体有序。
一]]></description><category></category></item><item><title><![CDATA[LeetCode 287. Find the Duplicate Number]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106808403</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106808403</guid><author>weixin_36634831</author><pubDate>Wed, 17 Jun 2020 18:54:28 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
discuss里的一种解法
时间o(n) 空间o(1) 方法是把数组看成有环链表来做
很多博客没分析为什么能把该题看成有环链表？自己想的，记录一下。
我们先考虑这种情况：长度为n的数组，1～n数字正好每个出现一次
index  0 1 2 … n-1
nums  1 2 3 … n
设一个指针p=0，迭代时用p=nums[p]来更新p，那么根据nums中1～n正好各出现一次可知（nums的值用来当作下标index），因此正好可以根据p=nums[p]遍历长度为n的]]></description><category></category></item><item><title><![CDATA[RMQ问题之ST算法 C++实现]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106390403</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106390403</guid><author>weixin_36634831</author><pubDate>Wed, 27 May 2020 21:19:36 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
RMQ(Range Minimum / Maximum Query)问题是指给定一个数组，有很多的query，问你该数组[i,j]区间里的极大/小值是多少。
注意，该问题的难点在于很多query，因此对每一个query都进行遍历求最值的暴力算法肯定不行
对于给定数组，并不会更新数组的RMQ问题，我们可以采用ST算法来做
ST算法的具体做法就是
定义dp[i][j]为区间[i,i+2^j-1]里的极值，即从i开始的连续2 ^j个值里的极值
容易想到，当区间长度为1时]]></description><category></category></item><item><title><![CDATA[LeetCode 221. Maximal Square C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106322626</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106322626</guid><author>weixin_36634831</author><pubDate>Sun, 24 May 2020 22:44:28 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为给定一个二维数组，其中元素都有0和1组成，找到最大的正方形（其中元素都为1）算出其面积
定义二维数组dp，其中dp[i][j]的含义是，以（i，j）这个位置为右下角的正方形边长
那么考虑dp[i][j]怎么求
dp[i-1][j-1]代表以（i-1，j-1）为右下角的最大正方形边长
那么若要把(i,j)接在(i-1,j-1)之后组成一个更大的正方形
首先(i,j)这个位置必须是元素1
其次(i,j)要能和(i-1,j-1)组成新正方形，那么要考虑这个新正方形]]></description><category></category></item><item><title><![CDATA[LeetCode 1071. Greatest Common Divisor of Strings C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106260009</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106260009</guid><author>weixin_36634831</author><pubDate>Thu, 21 May 2020 16:25:01 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为：给定字符串str1，str2，找出这两字符串的最大的公共循环节
例如ababab和ab的最大公共循环节是ab
abababab和abab的最大公共循环节abab
那么，若str1和str2存在公共循环节，那么str1和str2的最小循环节应该是相同的
例如 abababab和abab的最小循环节都是ab，那么它们之间必定存在公共循环节
那么由最小循环节相同我们可以知道 str1+str2==str2+str1
否则肯定不存在公共循环节
那么怎么求最大公共循]]></description><category></category></item><item><title><![CDATA[模式串匹配之KMP算法&BM算法&sunday算法]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106243646</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106243646</guid><author>weixin_36634831</author><pubDate>Wed, 20 May 2020 20:39:29 +0800</pubDate><description><![CDATA[KMP算法解决了这样一个字符串匹配的问题：有一个文本串S，和一个模式串P，现在要查找P在S中的位置。
这个算法减少了暴力算法中的文本串指针的回溯，每次失配时只回溯模式串p的指针，极大提高了效率
//
// Created by DongChenglong on 2020/5/13.
//

#include &lt;cstdio&gt;
#include &lt;string&gt;

using namespace std;

void getnext(int next[], string s) {
  ]]></description><category></category></item><item><title><![CDATA[LeetCode 234. Palindrome Linked List C++ 快慢指针]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106193086</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106193086</guid><author>weixin_36634831</author><pubDate>Mon, 18 May 2020 15:14:06 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为给定一个链表，每个节点存一个0～9的数字，叫你判断这个链表的内容是否为一个回文串。
思路就是利用快慢指针，快指针每次走两步，慢指针每次走一步，当快指针抵达链表尾部的时候，慢指针到达链表中间，需要注意的是，因为回文串是正读泛读都一样的字符串，因此慢指针移动时，我们需要把链表前半部分的next指针做一个reverse，这样我们就可以在o(n)时间o(1)空间判断是否是回文了。
按照这个思路，我写了以下代码
写的逻辑很混乱
虽然自己测试没什么问题，但是submit]]></description><category></category></item><item><title><![CDATA[LeetCode 141. Linked List Cycle C++ 快慢指针]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106163579</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106163579</guid><author>weixin_36634831</author><pubDate>Sat, 16 May 2020 19:06:37 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为，给你一个链表，这个链表的尾节点的next可能连接到了之前的某个节点，就形成了一个环，请你判断
所给的链表是否含有环。
我自己的做法就很暴力，开了set，边遍历边存下指针，判断是否有之前出现过的指针重复出现，若重复出现则
必定存在环。
在Discuss里看到了一种快慢指针解法，觉得太太太巧妙了！
设两个指针，同时出发，但一个指针每次走两步，一个指针每次走一步，若存在环，则两个指针经过一定步数
之后必定会相遇，快慢指针只需o(1)的空间复杂度。
class S]]></description><category></category></item><item><title><![CDATA[LeetCode 155. Min Stack C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106161264</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106161264</guid><author>weixin_36634831</author><pubDate>Sat, 16 May 2020 16:46:58 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
这题的题意一开始看错了
我看题目还以为让实现最小堆（写这句话的时候突然反应过来堆的英文是heap QAQ）
其实题目就是让你实现一个普通的栈，有常规的push、pop、top操作
另外让你在o（1）时间内实现查找栈中的最小元素
那么，因为栈是FILO的数据结构，我们只需另外开一个栈，来记录到某个位置时栈中的最小元素
拿入栈的元素和另外这个辅助栈的栈顶元素比较
若入栈元素小，则成为新的栈中最小元素
否则要把原来的栈顶元素再一次入栈，表示到这个位置为止的最小值
cla]]></description><category></category></item><item><title><![CDATA[LeetCode 1025. Divisor Game C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106048480</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106048480</guid><author>weixin_36634831</author><pubDate>Mon, 11 May 2020 10:40:47 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为，Alice和bob玩一个游戏，给定一个数字N，每个人从(0,N)这个区间选出一个能整除N的因子x(N%x==0)，然后N替换为N-x，换一个选手重复这个过程，谁无法重复这个过程了谁就输了。alice先手。
这道题我最初的做法就是列了前9次游戏的可能性，发现如果初始的N是偶数，就是alice赢，初始的N是奇数，就是bob赢。
class Solution {
public:
    bool divisorGame(int N) {
        retu]]></description><category></category></item><item><title><![CDATA[LeetCode 198 LeetCode 213 LeetCode 337 House Robber 系列]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/106035897</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/106035897</guid><author>weixin_36634831</author><pubDate>Sun, 10 May 2020 15:14:27 +0800</pubDate><description><![CDATA[Problem
题目链接：
House Robber
House Robber II
House Robber III
Solution
三题的背景都一样：有一些房子，每幢房子有一定价值，一个强盗去抢劫这些房子，抢劫了某个房子就能获得对应价值，不过这些房子按照一定的规则相连，强盗不能把直接相邻的两个房子都抢劫了，否则会触发警报，问你强盗最多能抢到多少钱。
该系列的第一题，这些房子就是按照直线排列的
设房子编号为1-n，定义dp[i]为从1-i号房最多能抢多少钱
对于第i个房子，有两种策略，抢或不抢
若不抢，]]></description><category></category></item><item><title><![CDATA[LeetCode 312. Burst Balloons C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/105958875</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/105958875</guid><author>weixin_36634831</author><pubDate>Wed, 06 May 2020 21:12:07 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
此题题意为，给你n个气球，气球上有数字，你可以任意戳破第i个气球，你就会得到nums[i-1] * nums[i] * nums[i+1] 个硬币，然后第i个气球消失。问你戳破所有气球，最多能得到多少个硬币。
此题暴力的想法就是去枚举所有戳破的策略，但是，戳破n个气球的全排列有n!种方案，解空间实在太大。
想不出好的解法
以下思路完全参考此博文
定义dp...]]></description><category></category></item><item><title><![CDATA[背包问题求方案数]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/105932628</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/105932628</guid><author>weixin_36634831</author><pubDate>Tue, 05 May 2020 14:59:08 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
此题在01背包的基础上，需要你求出最优选法的方案数
需要另开一个数组来记录方案数。
此处需要注意，虽然是01背包的另一种问法，但此题需要把dp[1…m]初始化为负无穷。这样做的原因是，如果dp数组全部初始化为0，那么dp[k]的含义为容量为k时背包装的最大价值（注意此处不一定被装满了），那么这样就会造成重复计数的问题。若把dp[1…m]初始化为负无穷，那...]]></description><category></category></item><item><title><![CDATA[LeetCode 239. Sliding Window Maximum C++ 单调队列]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/105870863</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/105870863</guid><author>weixin_36634831</author><pubDate>Thu, 30 Apr 2020 22:49:59 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为给定一个数组，给定一个长度为k滑动窗口，这个滑动窗口从数组最左边滑到数组最右边，每次滑动的时候，让你求位于滑动窗口内的数字的最大值。
此题最暴力的解法就是，枚举所有起点i，每次都从i开始遍历k个数字找出最大值，时间复杂度o(n^2)
如果利用单调队列，那么我们就可以把时间复杂度降到o(n)
单调队列的队首元素一定是当前滑动窗口内的最大值，整个单调队...]]></description><category></category></item><item><title><![CDATA[LeetCode 416. Partition Equal Subset Sum C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/105832010</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/105832010</guid><author>weixin_36634831</author><pubDate>Wed, 29 Apr 2020 09:43:34 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为给你一个只包含正整数的非空数组，让你判断是否能把这个数组分成两部分，使得两部分的数字之和相等。
若原数组所有数字之和是奇数，那么我们肯定不能分成两个和相等的子数组。
若原数组所有数字之和是偶数，总和为sum，则可以把原题转化成背包问题：给你n个物品，n个物品分别有他们的质量，问你是否能从n件物品中选出若干件，这若干件的质量正好能装满容量为sum/2...]]></description><category></category></item><item><title><![CDATA[LeetCode 139. Word Break C++]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/105808735</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/105808735</guid><author>weixin_36634831</author><pubDate>Tue, 28 Apr 2020 11:16:10 +0800</pubDate><description><![CDATA[Problem
题目链接
Solution
题意为：给你一个非空字符串s，一个单词列表，让你判断是否能把s分割成若干单词（单词必须在所给列表里出现过）
dp[i]表示s[0,i]是否能正确分割。
那dp[i]怎么算呢？我们只需要遍历j属于[0,i]，用j把[0,i]的字符串分割成两部分，[0,j]和[j+1,i]，[0,j]区间是否能正确分割直接用dp[j]就可以知道，然后再去查找[j+1,i]子...]]></description><category></category></item><item><title><![CDATA[Catalan卡特兰数]]></title><link>https://blog.youkuaiyun.com/weixin_36634831/article/details/105801101</link><guid>https://blog.youkuaiyun.com/weixin_36634831/article/details/105801101</guid><author>weixin_36634831</author><pubDate>Mon, 27 Apr 2020 22:34:12 +0800</pubDate><description><![CDATA[卡特兰数是组合数学中一个常出现在各种计数问题中的数列，其前几项为（从第零项开始） : 1, 1, 2, 5, 14, 42…
计算卡特兰数的通项公式：h(n)=C(2n,n)/(n+1)
卡特兰数的应用
卡特兰数经常出现在OI以及ACM中，在生活中也有广泛的应用。下面举几个例子。
1、进出栈问题：栈是一种先进后出（FILO，First In Last Out）的数据结构．如下图1，1,2,3,4顺...]]></description><category></category></item></channel></rss>