<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[bengepai的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/bengepai</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; bengepai]]></copyright><item><title><![CDATA[算法技巧之滑动窗口]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/104365494</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/104365494</guid><author>bengepai</author><pubDate>Mon, 17 Feb 2020 22:06:32 +0800</pubDate><description><![CDATA[在算法题目中，经常会遇到给定一个数组，找出符合某种特性的连续子数组。这时候可以采用滑动窗口的方法。

例如，给定数组A = [1,1,3,2,1,0,2]，找出满足和小于等于5的最长连续子数组。

采用暴力的方法，需要用一层循环枚举子数组的起始位置，然后用第二层循环枚举子数组的长度，时间复杂度为O(N^2)。

采用滑动窗口的方式即可将算法复杂度降到O(N)。

其核心思想是，采用两个指针，分别指...]]></description><category></category></item><item><title><![CDATA[算法技巧之计算二维数组区域和]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/104294571</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/104294571</guid><author>bengepai</author><pubDate>Thu, 13 Feb 2020 18:03:14 +0800</pubDate><description><![CDATA[在做算法题目的过程中，经常会遇到二维数组的题目，并且要以二维数组的任意矩形区域的和作为先验知识来进行之后的推算。

例如：已知大小M*N的矩阵A，求矩阵内任意矩形区域的和。

如果采用暴力搜索的方式，则需要O(M^2N^2)的时间复杂度，即需要枚举矩形的左上坐标和右下坐标。采用前缀数组的方式则可以在O(MN)的时间复杂度下得到结果。

前缀数组P：大小为M*N，P[i][j]表示为以(0,0)为左...]]></description><category></category></item><item><title><![CDATA[Leetcode 171周赛]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/103949054</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/103949054</guid><author>bengepai</author><pubDate>Sun, 12 Jan 2020 20:39:52 +0800</pubDate><description><![CDATA[第一次参加周赛，共有4题，一个半小时。一题easy，两题medium, 一题hard。ac了前三题。

1. 是将整数转换成两个无零整数的和。这题的关键是如何判断一个整数有没有零。此处本人是采用将整数转换成string类型来查找有没有'0'字符。

2. 此题的意思是给定a,b,c三个数，看a,b的二进制最少翻转几次能使得或运算变成c。由于是在二进制上面进行操作，所以首先要转换成二进制表示。遍历c...]]></description><category></category></item><item><title><![CDATA[Leetcode 495]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/103901318</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/103901318</guid><author>bengepai</author><pubDate>Thu, 09 Jan 2020 08:50:11 +0800</pubDate><description><![CDATA[此题主要是根据中毒时间序列以及每次毒持续多少时间，来计算出总的中毒时间为多少。主要分两种情况，一种是在中毒结束前下一次中毒还没有到来，另一种是在中毒结束前就来了新的中毒。假设新来的中毒时间点为 point, 那么前者总的中毒时间需要加上 duration, 后者则需要加上 point - start。此外在遍历时需要不断的更新中毒的时间，以及中毒结束的时间，以此来判断新的中毒来的时侯是不是正处于中...]]></description><category></category></item><item><title><![CDATA[Leetcode 238]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/103712031</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/103712031</guid><author>bengepai</author><pubDate>Thu, 26 Dec 2019 11:21:15 +0800</pubDate><description><![CDATA[此题想要返回的是一个数组中每个元素除自身以外其他元素的乘积，并且不能使用除法操作。要求O(n)的时间复杂度，我们可以梳理一下，对于一个数组而言，采用O(n)的时间复杂度可以得到哪些东西：最大最小值均值求和，每个位之前的求和求最大最小和均值。正是使用这些O(n)能够得到这些最基本的信息，来构建整个题目的解。一开始我采用的是类似递归的思想来进行求解，发现这样做会使得复杂度更高。我们将整个问题拆分，既然...]]></description><category></category></item><item><title><![CDATA[Leetcode 11]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/103689803</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/103689803</guid><author>bengepai</author><pubDate>Tue, 24 Dec 2019 21:17:17 +0800</pubDate><description><![CDATA[此题是一道非常经典的算法题。给定一系列高度的横线，算其所能围成的盛水容器的面积最大多少。可以直观地发现整个盛水面积是与两个横线之间的距离以及他们的最小高度决定的。

一个非常直观的想法是遍历两两线段，取最大的面积，但是这样做很明显是超时的，所以一定有更加简单的方法来处理，也就是有一些情况是不需要考虑的。由于暴力遍历的时间复杂度是O(n^2)，由于二分的方式并不明显，所以考虑O(n)复杂度的算法。
...]]></description><category></category></item><item><title><![CDATA[Leetcode 343]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/103560645</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/103560645</guid><author>bengepai</author><pubDate>Mon, 16 Dec 2019 13:10:21 +0800</pubDate><description><![CDATA[此题的子结构还是非常容易发现的，给定一个正整数，将其划分成n个正整数之和，使其的乘积最大。一种直观的子结构就是 遍历1到n，把max(i * dp(n-i))找到。其中一个小陷阱是，由于在做dp的时候默认n-i是一定要划分成多个部分的，所以就忽略了i * (n-i)这种情况，所以我们在遍历的时候还需要考虑i*(n-i)的结果是不是最优的，代码如下：


class Solution(object)...]]></description><category></category></item><item><title><![CDATA[leetcode 116]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/103047138</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/103047138</guid><author>bengepai</author><pubDate>Wed, 13 Nov 2019 12:57:59 +0800</pubDate><description><![CDATA[本题想要将树内部的节点连接起来。这题的想法可以用BFS得到每层的节点，然后相连。也可以用DFS递归的方式去做。本人采用递归的方式处理该问题。为了能够进行内部连接，我们需要额外得到每棵树的最左边一排节点和最右边一排节点。因此重新定义函数额外返回这两个信息，然后将左子树的最右侧节点和右子树最左侧的节点相互连接，这样就可以得到最后我们的想要的结果。

代码如下：


"""
# Definition f...]]></description><category></category></item><item><title><![CDATA[leetcode 98]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102992943</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102992943</guid><author>bengepai</author><pubDate>Sat, 09 Nov 2019 22:45:08 +0800</pubDate><description><![CDATA[此题是想要判断一棵树是不是一个二叉搜索树，由于天然的子问题结构，所以采用递归的方式来判断，每次额外得到每棵树的最大最小值来辅助判断是不是满足条件，由于root==none的时候需要设置default value，这个value不太好设置还需要额外判断，所以人为列出了root.right == None和root.left ==None的请况。

代码如下：


# Definition for a...]]></description><category></category></item><item><title><![CDATA[Leetcode LCP 1]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102981272</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102981272</guid><author>bengepai</author><pubDate>Fri, 08 Nov 2019 22:38:50 +0800</pubDate><description><![CDATA[超级水题

代码如下：


class Solution(object):
    def game(self, guess, answer):
        """
        :type guess: List[int]
        :type answer: List[int]
        :rtype: int
        """
        sum=0
      ...]]></description><category></category></item><item><title><![CDATA[Leetcode 113]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102883060</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102883060</guid><author>bengepai</author><pubDate>Sun, 03 Nov 2019 15:38:42 +0800</pubDate><description><![CDATA[此题是给定目标想要找到从root到leaf的路径使得和为target。这题的递归划分很明显，就是左右子树然后和target-root.val。此外学习到一个小trick，就是在list中添加任意位置值的时候可以用list.insert(index, val)。

代码如下：


# Definition for a binary tree node.
# class TreeNode(object...]]></description><category></category></item><item><title><![CDATA[Leetcode 559]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102864446</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102864446</guid><author>bengepai</author><pubDate>Fri, 01 Nov 2019 20:49:10 +0800</pubDate><description><![CDATA[水题，递归遍历childern，判断高度最大的那个返回即可。

代码如下：


"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""
class Soluti...]]></description><category></category></item><item><title><![CDATA[leetcode 105]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102844556</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102844556</guid><author>bengepai</author><pubDate>Thu, 31 Oct 2019 19:55:53 +0800</pubDate><description><![CDATA[这题和之前根据后序遍历和中序遍历找树的题目一样，都是根据前序或者后序来找到根节点的值，然后再根据中序遍历找到root，从而将左右子树进行划分，然后递归的进行求解。

代码如下：


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.va...]]></description><category></category></item><item><title><![CDATA[Leetcode 104]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102828341</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102828341</guid><author>bengepai</author><pubDate>Wed, 30 Oct 2019 22:12:57 +0800</pubDate><description><![CDATA[水题，代码如下：


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(obj...]]></description><category></category></item><item><title><![CDATA[Leetcode 100]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102808659</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102808659</guid><author>bengepai</author><pubDate>Tue, 29 Oct 2019 21:10:34 +0800</pubDate><description><![CDATA[划水题，如果两个树root相同，则递归判断左右子树是否相同，否则返回False.

代码如下：


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#       ...]]></description><category></category></item><item><title><![CDATA[Leetcode 102]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102781606</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102781606</guid><author>bengepai</author><pubDate>Mon, 28 Oct 2019 15:15:24 +0800</pubDate><description><![CDATA[此题很简单，就是BFS，在遍历的时候加个标记，记录一下深度信息就好啦

代码如下：


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self...]]></description><category></category></item><item><title><![CDATA[leetcode 279]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102764278</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102764278</guid><author>bengepai</author><pubDate>Sun, 27 Oct 2019 10:20:51 +0800</pubDate><description><![CDATA[此题的想法也是递归，就是想如何拆分成子问题。由于子问题大量重复，所以定义个数组来记录一下中间的结果，也就是记忆化dp。子问题很好定义，给定一个数，我们找它所对应的最大平方根整数。那么对于该数所对应的所有结果，都是1到这个最大平方根内的所有数j的平方+self.numSquares(n - j**2)。那么只需要遍历一下，找到最小的返回即可。

代码如下：


class Solution(obje...]]></description><category></category></item><item><title><![CDATA[leetcode 1026]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102738821</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102738821</guid><author>bengepai</author><pubDate>Fri, 25 Oct 2019 10:55:08 +0800</pubDate><description><![CDATA[此题是想找到根节点和子节点的最大差值。关键是要找到子结构。可以发现最大差值是由每个子树的最大值和最小值决定的。因此我们新建一个函数，返回最大差值以及最大值最小值。当返回更上一层时，我们就可以更新这些值，并且根据最大最小值重新计算最大差值。

代码如下：


# Definition for a binary tree node.
# class TreeNode(object):
#     de...]]></description><category></category></item><item><title><![CDATA[leetcode 547]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102720216</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102720216</guid><author>bengepai</author><pubDate>Thu, 24 Oct 2019 11:46:48 +0800</pubDate><description><![CDATA[这题的大致意思是看看相互连通的子部分有多少个。这种题目的思想个人觉得都是用queue实现BFS的想法类似，都是把邻居先保存起来，逐层遍历。对于这题我们需要保存一个标识符，用于判断是否访问过，如果queue空了，我们再加入没有访问过的新的结点，同时计数器加一。

代码如下：


class Solution(object):
    def findCircleNum(self, M):
     ...]]></description><category></category></item><item><title><![CDATA[leetcode 515]]></title><link>https://blog.youkuaiyun.com/bengepai/article/details/102702351</link><guid>https://blog.youkuaiyun.com/bengepai/article/details/102702351</guid><author>bengepai</author><pubDate>Wed, 23 Oct 2019 15:26:43 +0800</pubDate><description><![CDATA[此题想要找到树中每一行的最大值，采用递归的方式去做。在子问题合并的时候依次遍历list，将更大的那个值保留下来，由于左右子树可能不等高，所以需要把更高的那个子树剩下的值在加进去，有点像排序时合并的操作。

代码如下：


# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x...]]></description><category></category></item></channel></rss>