LeetCode
CoderPro
这个作者很懒,什么都没留下…
展开
-
动态规划
动态规划算法最长回文子串算法设计对于这一题,我们可以先思考一下如何利用穷举法去做,其实本题使用穷举法的思路很好想,即通过双重循环穷举所有的子串,然后再对每个子串判断其是否为回文串,如果是回文串则记录下该子串的长度,并找出最大长度。但这样做效率显然是低下的,通过穷举法可以看出,这个问题的状态空间就是所有子串的最大回文串的长度,穷举法实际上是以一种比较暴力的方式对整个状态空间进行了遍历并得到了所有的状态值,因为对于每一个长度为n的子串而言,判断其是否为回文串需要o(n)o(n)o(n)的复杂度,因此我们原创 2020-08-22 20:02:30 · 131 阅读 · 1 评论 -
回文子串
回文子串通过动态规划算法来解,状态空间很好定义:dp(i,j)表示s[i,j]之间的子串是否为回文串,状态转移方程也很容易得出。class Solution {public: int countSubstrings(string s) { int dp[1000][1000]; int sum = 0; for(int i=0;i<s.size();i++){ for(int j=0;j<s.size()原创 2020-08-19 19:41:00 · 124 阅读 · 0 评论 -
分治算法
分治算法分治算法在程序设计中应用广泛,总体思想是将一个大的问题分解为子问题,再将子问题的解进行治理得到最终解,下面看几个问题。最大子列和本题要求我们求出具有最大和的连续子数组,运用分治法的思路为:将数组分为两个子数组,先求出左边数组的最大子列和再求出右边数组的最大子列和,这就是我们所说的分,接下来就是治,此时如何得到整个数组的最大子列和呢,能仅仅从左右两边数组的最大子列和求出最大值吗,可能不行,因为我们还需要考虑一种情况:即跨越左右边界的连续数组也有可能成为解,因此我们从边界出发向左右两个方向生长求出原创 2020-08-19 18:04:47 · 285 阅读 · 0 评论 -
有序链表转换二叉搜索树
有序链表转换二叉搜索树本题思路不难,由于链表本身已经有序了,根据二叉搜索树的性质,每次在当前的链表找到中点作为当前树的根节点,再将链表分割并递归构造子树。同时在寻找链表中点的时候采用快慢指针提高速度。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * .原创 2020-08-19 12:22:36 · 96 阅读 · 0 评论 -
leetcode696
一道简单题,但是刚拿到居然没有想出来,其实是有点不应该的。虽说官方解法不一定能马上想到,但是基于堆栈的方法应该是要想到的,也就是遇到0压入堆栈,遇到1时弹出,然后进行相关的计算。下面的代码还是采用官方解法,形成一个count列表再计算:class Solution: def countBinarySubstrings(self, s: str) -> int: idx,size = 0,len(s) count = [] cnt = 1原创 2020-08-10 20:24:24 · 116 阅读 · 0 评论 -
leetcode632
采用多路归并算法,需要构造一个小顶堆,注意写法class Solution { typedef pair<int,pair<int,int>> PI; public: vector<int> smallestRange(vector<vector<int>>& nums) { priority_queue<PI,vector<PI>,greater<PI>> H原创 2020-08-10 08:21:11 · 72 阅读 · 0 评论 -
并查集
union find并查集是用于管理元素分组情况的数据结构,注意并查集虽然可以进行合并操作但是无法进行分割操作。主要有下面两个操作:查询两个元素是否在同一组合并两个元素所在的组并查集操作并查集使用树作为数据结构(不一定是二叉树)合并从一个组的根向另一个组的根连一条边。这里一定要注意,合并的时候是把两个节点所在的树合并到一起,而不仅仅是将一个节点连到另一个节点上。查询查询两个元素是否在同一组内,只需查找它们是否在同一个树内(从两个节点向上走看是否能走到同一个根)。在具体实现中我们还有如原创 2020-05-14 22:24:36 · 121 阅读 · 0 评论 -
树形DP
树形dp接触到了两题将树与动态规划相结合的题目,有人将其称之为“树形dp”,不过做完之后感觉确实有所启发,对动态规划的理解又进了一步,因此写一篇blog来总结一下。543 Diameter of Binary Tree题解题目的意思是让我们求树的最大直径,题目中对直径的定义是任意两点之间的最大路径。这一题拿到手,通常我们先用递归的思想去分析。树的根节点连接着左右两棵子树,那我们可以定义dp(root)为以root的根节点的树的最大直径,那对于大问题我们可以去递归地求解dp(root->le原创 2020-05-10 21:32:08 · 178 阅读 · 0 评论