LeetCode
文章平均质量分 66
九筒-
这个作者很懒,什么都没留下…
展开
-
LeetCode Top100特训
两数相加链接个人思路:将链表1转换为num1,链表2转换为num2,两数相加后再转换回链表。存在的问题:链表长度超过long long数字范围,无法做加法题解:此题需要模拟加法需要注意:进位的问题,最后一位进位的问题链表的遍历,新建链表,返回链表头结点ListNode* head = nullptr;ListNode* node = nullptr;if(head == nullptr){ head = node = new ListNode(cur);}else{ n原创 2022-04-09 11:31:41 · 785 阅读 · 0 评论 -
【LeetCode】【哈希表+双向链表】LRU 缓存 思路解析和代码
LRU 缓存题目链接个人思路采用C++的容器,没有手撕双向链表题意实现LRU的初始化,读取,写入,分别对应LRUCache()、get()、put()用到的理论和技术双向链表list的插入、删除、访问、迭代器、auto关键字map,插入、删除、访问类的初始化LRU机制思路LRU(Least Recently Used),最近最少使用算法,是页面置换算法的一种也叫最近最久未使用算法LRUCache():初始化内存的大小get():获取内存中的数据,若不存在返回-1put(原创 2022-03-12 18:44:53 · 936 阅读 · 0 评论 -
【LeetCode】【再探回溯法】全排列,求子集,组合总和,划分子集思路解析和代码
组合总和39.组合总和140.组合总和2个人思路题意概括:在一个数组中,找出数组中的一个子集,也就是一个组合,使得子集之和为target,并输出所有的结果39:强调数组元素是无重复的,每个数字也可以重复使用,组合之间不能相同40:强调数组元素可能有重复,每个数字只能使用一次,组合内的数字可以相同,但是组合与组合之间不能相同思路排列组合组合问题,还要求输出所有结果,这是典型回溯法需要好好想想以下三种情况元素可重复使用:dfs中,for循环中的递归语句,传入的是i而不是i + 1,表示当原创 2021-03-31 19:18:42 · 523 阅读 · 0 评论 -
【LeetCode】【回溯法】剑指 Offer 13. 机器人的运动范围 思路解析和代码(dfs:何时需要标记,何时需要撤销)
剑指 Offer 13. 机器人的运动范围题目链接个人思路思路已经是二刷了,思路很清楚,也知道采用dfs,也知道如何进行深度优先搜索,但是对于dfs中何时需要标记数据,何时需要撤销操作还是有点雾水对于此题来说,机器人只有向下和向右两种路径,因此在dfs过程中不需要撤销操作,即不用对vis[tx][ty]进行标记for(int i = 0; i < 4; ++i){ int tx = x + dir[i][0]; int ty = y + dir[i][1]; if(tx >=原创 2021-03-04 22:59:56 · 344 阅读 · 2 评论 -
【LeetCode】【动态规划】剑指 Offer 60. n个骰子的点数 思路解析和代码
剑指 Offer 60. n个骰子的点数题目链接个人思路题意要理解n个骰子是同时掷出,即最小值的点数是n,最大的点数是6 * n,共有6n种可能尤其注意最小值是n而不是1,不是将骰子一个接一个掷出去的思路重叠子问题:n个骰子,分为当前一个骰子(1 ~ 6)与其余n-1骰子的点数之和相加;n-1个骰子,可以分为当前一个骰子(1~6)与其余n-2个骰子的点数之和相加dp[i][j]表示:投掷i个骰子,得到点数j的次数是dp[i][j]边界:第一颗骰子只有0~6,dp[1][i] = 1 i的原创 2021-01-17 12:38:20 · 113 阅读 · 0 评论 -
【LeetCode】【数学】剑指 Offer 49. 丑数 思路解析和代码
剑指 Offer 49. 丑数题目链接个人思路题意准确理解:丑数是只能被2,3,5整除的数字,因此对一个数字是否是丑数,应让这个数字连续被2整除,连续被3整除,连续被5整除,若最后整除后剩下的数字是1,则说明是丑数,否则不是丑数思路错误思路最初理解成为数字能被2或3或5整除,发现理解有误而后又理解为不能被大于5的素数整除,所以使用素数打表,但无法存放大规模的素数优化思路——空间换时间所有的丑数都是之前的丑数的基础上乘2,乘3,乘5得到,因此将丑数保存在数组中,通过对已有丑数运算来得到原创 2021-01-16 11:07:44 · 137 阅读 · 0 评论 -
【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列 思路解析和代码
剑指 Offer 33. 二叉搜索树的后序遍历序列题目链接个人思路思路根据后序遍历的特点,根节点位于最后一位;根据二叉搜索树的特点,左子树小于根节点,右子树大于根节点;结合这两个性质,我们可以遍历后序序列,划分左右子树并与根节点进行比较,来判断是否能满足二叉搜索树后序遍历的条件,对左右子树进行递归判断遍历序列,将比root小的元素放入左子树序列中,当出现第一个比root大的结点break,此处为左右子树的分割位置构造右子树时,如果出现比root小的元素,说明该序列不满足二叉搜索树的条件,re原创 2021-01-13 10:06:20 · 123 阅读 · 0 评论 -
【LeetCode】【递归】剑指 Offer 16. 数值的整数次方 思路解析和代码
剑指 Offer 16. 数值的整数次方题目链接个人思路思路采用快速幂的方法,但中间有很多细节没有注意到负指数问题——需要求倒数(注意0没有倒数)负底数问题——需要判断指数的奇偶性大数指数问题——需要对指数取模(本题没有要求用long long,因此,超过一定范围的指数就不需要再计算了)代码优化&运算来判断奇偶性,注意&和“==”的优先级,应写为(n&1) == 1“>>” 右移做除2运算个人错误思路代码快速幂代码错了!!!!class原创 2021-01-05 15:05:27 · 105 阅读 · 0 评论 -
【LeetCode】【链表】剑指 Offer 35. 复杂链表的复制 思路解析和代码
剑指 Offer 35. 复杂链表的复制题目链接个人思路题意本题考查的是链表的深拷贝和浅拷贝ListNode* cur = head //是浅拷贝,cur与head共用一个地址ListNode* cur = new ListNode()//是深拷贝,二者地址不同此题的原链表和复制链表中,各自的指针(next和random)指向各自链表内数据的地址思路先复制next指针,构建出复制链在根据原链中的random,在复制链中构造random难点在于如何完成深拷贝,如何根据原链的rando原创 2020-12-16 20:51:17 · 108 阅读 · 0 评论 -
【LeetCode】【链表】剑指 Offer 24. 反转链表 思路解析和代码
剑指 Offer 24. 反转链表题目链接个人思路思路个人思路栈先遍历一遍数组,将所有元素存入栈中从栈中取出元素,构建链表注意:栈中最后一个元素的next要指向null,否则会构成一个环,因为原本最后一个元素的next是指向倒数第二个元素的(在栈中的位置)双指针思路(个人错误思路与正确思路对比)整体思路都是用pre指针标记前面的链表,要让当前元素的next指向前面的链表,并且还不丢失下一个元素错误思路错误代码含义正确思路正确代码含义temp = cur为了原创 2020-12-15 18:49:19 · 113 阅读 · 0 评论 -
【LeetCode】【链表】剑指 Offer 52. 两个链表的第一个公共节点 思路解析和代码
剑指 Offer 52. 两个链表的第一个公共节点题目链接个人思路思路暴力O(mn)双重循环求解,对比两个链中的每一个节点栈-空间换时间O(m+n),空间(m+n)由于第一个公共节点后面的所有节点均相等,因此可以从后往前遍历,直到找到最后一个相同的结点即为第一个公共节点,但由于单向链表无法逆序遍历,因此可以考虑使用栈辅助完成双指针O(m+n)先遍历两个链表,得到两个链表的长度求出长度之差temp在较长的链表中,先遍历temp个结点,然后两个链表一同遍历,此时碰到的第一个相同的结点即为原创 2020-12-14 12:20:33 · 416 阅读 · 0 评论 -
【LeetCode】【树】剑指 Offer 27. 二叉树的镜像 思路解析和代码
剑指 Offer 27. 二叉树的镜像题目链接个人思路题意镜像:根结点的左右子节点交换位置,即为镜像个人错误思路根据给出的用例,一开始理解成了是对二叉树逆层序遍历,即先右子节点再左子节点,这个思路只是对满二叉树适用正确思路对根节点的左右子节点交换,递归遍历左右子节点做相同的操作个人错误思路代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *lef原创 2020-12-11 11:18:25 · 96 阅读 · 0 评论 -
【LeetCode】【栈】剑指 Offer 59 - II. 队列的最大值 思路解析和代码
数组中的逆序对题目链接个人思路思路队列queue+双端队列dequequeue作为原队列存储数据,deque作为辅助队列存储最大值入队:queue正常入队;deque只存储最有可能成为最大值的元素,并将最大值放在队首,若当前元素比队尾元素大,则队尾元素出队(需要双端队列的pop_back),当前元素入队出队:queue正常出队;若出队元素刚好是deque的队首元素(即最大值),则一同出队,否则只有queue单独出队个人思路代码class MaxQueue {public: q原创 2020-12-04 14:30:58 · 91 阅读 · 0 评论 -
【LeetCode】【栈】剑指 Offer 30. 包含min函数的栈 思路解析和代码
剑指 Offer 30. 包含min函数的栈题目链接个人思路题意根据题目要求,既要能在O(1)内拿到最小元素,需要用一个数据结构辅助存储最小元素集合,包括次小元素又要能在O(1)内拿到栈顶元素,需要用栈存储思路栈+双端队列栈正常存储,进行出栈,入栈,访问栈顶元素双端队列,每次用队首元素和入队元素进行比较,将最小元素存储在队首;当栈顶元素出栈时,栈顶元素的位置一定是在队列的队首或队尾,在队列中找到栈顶元素出队即可栈+辅助栈栈正常存储,进行出栈,入栈,访问栈顶元素辅助栈,每原创 2020-12-03 10:00:45 · 208 阅读 · 0 评论 -
【LeetCode】【栈】剑指 Offer 09. 用两个栈实现队列 思路解析和代码
剑指 Offer 09. 用两个栈实现队列题目链接个人思路题意深入队列底层实现,用两个栈实现队列的插入和删除操作思路个人思路插入时:先把元素push进栈1,再将栈1中的所有元素挪到栈2中,此时栈2中的top即为队首元素(此处理解错题意了,插入时,题目并不要求显示出队列中元素的正确顺序,其实题目只要求删除时能先删掉最先入队的元素即可,并有返回值)删除时:先将栈1中的元素都挪到栈2中,再删去栈顶元素(最先入队的元素),再将剩余元素挪回栈1void appendTail(int value)原创 2020-12-01 14:14:52 · 107 阅读 · 0 评论 -
【LeetCode】【哈希表,动态规划,队列】剑指 Offer 48. 最长不含重复字符的子字符串 思路解析和代码
剑指 Offer 48. 最长不含重复字符的子字符串题目链接个人思路题意思路注意个人思路代码暴力+mapclass Solution {public: unordered_map<char, int> mp; int ans, temp; int lengthOfLongestSubstring(string s) { for(int i = 0; i < s.size(); ++i){ mp[s[i]原创 2020-11-27 14:57:35 · 167 阅读 · 0 评论 -
【LeetCode】【队列】剑指 Offer 59 - I. 滑动窗口的最大值 思路解析和代码
剑指 Offer 59 - I. 滑动窗口的最大值题目链接个人思路题意思路滑动窗口的原理符合队列先进先出的性质,因此要考虑使用队列关键要考虑一个问题如果pop出当前最大值,要如何再次寻找滑动窗口中的最大值暴力模拟deque模拟滑动窗口模拟第一次滑动窗口,使用temp表示当前最大值如果出队元素是当前最大值,则重新遍历一遍滑动窗口,重新选出当前最大值(由于deque可以用下标访问,因此选用deque)双端队列deque存放元素的索引,且队首元素为滑动窗口中的最大值如果当前元素有原创 2020-11-25 21:55:41 · 106 阅读 · 0 评论 -
【LeetCode】【树】剑指 Offer 68 - I,II. 二叉树的最近公共祖先 思路解析和代码
剑指 Offer 68 - I,II题目链接个人思路思路该题要求解最近公共祖先,关键是需要知道给出的两个结点p,q是在左子树还是在右子树,即关键是要知道p,q的准确位置,而不是结点出现的顺序理一下最初的错误思路,最初是想着如何划分左右子树来找p,q的位置只想到了当一个位于左子树一个位于右子树,则他们的公共祖先是根节点;但两节点存在父子关系,这样的情况还不知道如何处理;还想到了遍历树,因为祖先是存在先后关系的,通过遍历的方法找到最近公共祖先,遍历只能找出祖先出现的顺序,而不能准确得知结点的位原创 2020-11-24 21:33:52 · 95 阅读 · 0 评论 -
【LeetCode】【广度优先搜索】剑指 Offer 32 - II. 从上到下打印二叉树 II 思路解析和代码
剑指 Offer 32 - II. 从上到下打印二叉树 II题目链接个人思路题意树的层序遍历,leetcode使用二维vector,存储的时候略有不同思路个人思路打包存储节点及其层数优点是便于节点和层数的对应输出缺点是不便于代码实现二维vector是通过申请行空间实现的,较为繁琐简便思路获取当前层的所有节点,一次性push进一维vector层序遍历时,每次插入下一层的所有节点每层操作结束时,将一维vector存入二维vector中注意vector必须事先申请一原创 2020-11-16 11:40:25 · 98 阅读 · 0 评论 -
【LeetCode】【回溯法】剑指 Offer 12. 矩阵中的路径 思路解析和代码
剑指 Offer 12. 矩阵中的路径题目链接个人思路思路类似迷宫问题,增加了字符比对递归参数:二维矩阵,字符串,当前坐标x,y(二维矩阵中),当前字符串位置index递归出口:比对到最后一位,x,y越界,字符串不匹配,当前坐标已经被访问过递归体:上下左右移动,递归遍历注意由于可以从矩阵中的任意一格开始,因此要对整个矩阵遍历做dfs剪枝位置:要么在递归体for循环中,即回溯之前进行,即下次回溯即为满足题目条件的回溯;要么在递归出口位置剪枝,即每次递归时便对参数是否满足题目条件进行判原创 2020-11-15 10:54:09 · 100 阅读 · 0 评论 -
【LeetCode】【回溯法】剑指 Offer 34. 二叉树中和为某一值的路径 思路解析和代码
剑指 Offer 34. 二叉树中和为某一值的路径题目链接个人思路题意思路此题的子集属于排列树递归参数:当前的根节点root,目标sum,当前累加数字cur递归出口:当根节点为空时,直接return递归体:将root中的数据加入temp,进行累加,判断是否满足sum,递归访问左右子树(撤销选择的细节问题见下方)剪枝判断:如果cur == sum 且当前节点为叶子节点,则进行存储输出(return的细节问题见下方)注意为什么要撤销选择? 如果我们遍历到一条路径的叶节点了,原创 2020-11-13 12:05:11 · 119 阅读 · 0 评论 -
【LeetCode】【回溯法】剑指 Offer 38. 字符串的排列 思路解析和代码
剑指 Offer 38. 字符串的排列题目链接个人思路题意全排列问题,子集属于是排列树回溯思路①画出递归树,找到状态变量(回溯函数的参数),这一步非常重要※②根据题意,确立结束条件③找准选择列表(与函数参数相关),与第一步紧密关联※④判断是否需要剪枝⑤作出选择,递归调用,进入下一层⑥撤销选择核心是for循环中的递归,在递归调用之前“做选择”,在递归调用之后“撤销选择”。作者:show-me-the-code-2链接:https://leetcode-cn.com/problem原创 2020-11-13 09:41:42 · 129 阅读 · 1 评论 -
【动态规划】数字游戏 思路解析和代码
数字游戏题目链接个人思路思路这属于环形dp问题,而且数字划分并不是均等划分,可以在环形数组上任意位置进行截断,因此根据截断位置和截断次数,可以声明一个三维dp数组dp[i][j][k]表示:在(i,j)范围内分成k段的最大(最小)值因为要求两个值,因此要声明两个dp数组,maxdp,mindp思考:如何将环形数组转换为链式结构——采用对数组延长一倍进行存储,即原数据为:4,3,-1,2 =>延长一倍存放:4,3,-1,2,4,3,-1,2自顶向下分析:求最优解:求环形数组截成m原创 2020-11-12 13:54:29 · 269 阅读 · 0 评论 -
【动态规划】传球游戏 思路解析和代码
传球游戏题目链接个人思路思路题目有些抽象,代码不难,本题是要求出n个同学,经过m次传球,传回自己手里的方案数,我们要考虑从哪里可以传到自己手中,即方案数与自己的上家和下家有关,又因为大家是围成一个圆形的,第一个人和第n个人是上下家的关系,做题时要特别注意dp[i][j]表示:第i个人经过第j次传球的方案数为dp[i][j]自顶向下分析:求最优解:统计方案数问题,与台阶问题类似最优子结构:传到自己手中的方案数与自己的上家的方案数和下家的方案数有关,而且是加和的关系重叠子问题:要求出传到自己原创 2020-11-11 11:23:27 · 507 阅读 · 0 评论 -
【LeetCode】【回溯法】剑指 Offer 55 - II. 平衡二叉树思路解析和代码
剑指 Offer 55 - II. 平衡二叉树题目链接个人思路思路几个思考的问题:如何判断平衡二叉树?如何记录深度?如何记录每个节点的深度?深度:在算法编程中定义为从当前节点到叶子节点的最大路径长度如果一棵树只有一个结点,其深度为1如果根节点只有左子树没有右子树,深度为左子树深度如果根节点只有右子树没有左子树,深度为右子树深度如果根节点既有左子树又有右子树,深度为二者最大值+1int getDepth(TreeNode* root){ if(root ==原创 2020-11-11 10:22:34 · 105 阅读 · 0 评论 -
【LeetCode】【排序】剑指 Offer 45. 把数组排成最小的数 思路解析和代码
剑指 Offer 45. 把数组排成最小的数题目链接个人思路题意输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。思路最初思路将数值型数组转化为字符串数组,通过十进制取模获得每一位数值进行转化按字符升序排列,以满足数字小的在高位,数字大的在高位,但对于(3,30)无法处理到位正确思路在定义比较函数时,对两个字符串进行前后拼接,按拼接结果升序排列即可核心代码static bool cmp(string s1, string s2){原创 2020-11-07 12:02:08 · 100 阅读 · 0 评论 -
【LeetCode】【二分查找】剑指 Offer 11. 旋转数组的最小数字 思路解析和代码
剑指 Offer 11. 旋转数组的最小数字题目链接个人思路题意题目中的数组被分割成两部分,且两部分均为递增序列,找出序列中的最小元素,要利用递增数组的特性,要采用二分查找思路循环条件:根据旋转数组的特点,序列应满足第一个元素大于最后一个元素(特例1,2,3,4,5)二分查找(此处的mid,left,right表示数值):如果mid大于等于left,说明mid属于前一个递增数组,最小元素应该在mid 的后面;如果mid小于等于right,说明mid属于后一个递增数组,最小元素应该在mid前面原创 2020-11-06 10:29:20 · 90 阅读 · 0 评论 -
【LeetCode】【二分查找】剑指 Offer 53 - I. 在排序数组中查找数字 I 思路解析和代码
剑指 Offer 53 - I. 在排序数组中查找数字 I题目链接个人思路题目条件:数组已排好序,因此下意识就要想到二分查找思路一使用lower_bound(),找到第一个大于等于target的元素若元素不等于target,说明target在数组中不存在,返回0若元素等于target,则向后顺序遍历与target相等的元素,统计target的个数思路一注意向后顺序遍历的过程中,注意数组访问不要越界注意当数组长度为0的特例思路二使用两次二分查找,分别找出第一个target元素原创 2020-11-05 11:35:25 · 93 阅读 · 0 评论 -
【KMP+随机算法(Monta Carlo+Las Vegas)】字符串匹配 思路解析和代码
字符串匹配对于字符串X和模式串Y(由0-1组成),使用两类随机算法,蒙特卡洛和拉斯维加斯算法求解两串是否匹配,随后再使用KMP检验两串是否匹配进行验证,统计三种算法的运行时间和蒙特卡洛算法的错误率,分别对字符串X长度为50,500,5000,50000进行检验,模式串Y不能太短个人思路思路KMP算法next[j]表示模式串的子串0 ~ j与 子串 j+1 ~ 模式串.size() 的最长相等前后缀 的前缀的最后一位使用根据模式串,计算各位其对应的next[]数组执行KMP算法,遍历字符串X,原创 2020-11-04 20:31:04 · 2992 阅读 · 1 评论 -
【贪心法】奇数数组 思路解析和代码
奇数数组输入正整数n和长度为n(???? ≤ 105)的数列????????(1 ≤ a???? ≤ 109)。在一次操作中你可以选择一个偶数c,并且把所有等于c的数除以2。例如a = [6,8,12,6,3,12],选择c = 6进行一次操作后a = [3,8,12,3,3,12]。请问最少进行多少次操作后, ???????? 的所有数都变成奇数。请尝试设计算法进行计算。样例输入640 6 40 3 20 1样例输出4个人思路思路本题应该采用贪心策略,每次选择数组中最大的偶数作为操作数,原创 2020-10-31 21:22:54 · 706 阅读 · 0 评论 -
【动态规划】【传纸条问题】求矩阵路径最大值(两条路径不能重复) 思路解析和代码
【传纸条问题】求矩阵路径最大值(两条路径不能重复)题目链接个人思路题意可将问题简化为从矩阵的左上角走到右下角并返回左上角,且要求两条路径不能重复,求来回路径的权值最大思路错误思路:先从左上角到右下角,沿途做标记,再从右下角返回左上角(不走标记位置),这个思路错误的原因是:这样表示的是其中后者到达了现在的位置,而前者早已经到达了这里。这么做看似没有问题,但却忽略了题目上一个很重要的条件:两个路径不能重复。例如,对于dp[2][2][3][3],它有可能是从dp[1][1][3][3]走来的,而dp原创 2020-10-30 12:21:02 · 1326 阅读 · 2 评论 -
【POJ1088】【动态规划】滑雪问题 思路解析和代码
滑雪问题题目链接POJ不能解析#include<bits/stdc++.h>个人思路题意input:3 34 5 63 10 72 9 8output:9此题的最长的滑坡指的是滑坡的个数,每个格子代表一个滑坡,即从10开始出发,最长可以经过9个格子错误思路1:一开始以为的是滑坡长度(数值)之和最大,此时输出为54错误思路2:后来以为的是滑坡的出发点,此时输出为10思路整个思路可以类比最长下降子序列,与最长下降子序列相比,这个是二维的,且边界值并非dp[0][0]或d原创 2020-10-29 21:41:54 · 894 阅读 · 0 评论 -
【动态规划-备忘录法】最长公共子序列(输出所有解) 思路解析和代码
最长公共子序列上一篇动态规划总结个人思路对比备忘录方法(递归)和动态规划(递推)备忘录方法备忘录方法要用递归实现递归是自顶向下的解决问题的:即从目标开始,将问题划分,对子问题求解,直到边界递归前对备忘录进行查询,当前备忘录未被填写时,则进行递归,否则直接返回备忘录的内容(核心,提高算法效率)当整个问题的求解过程中有大量子问题无需求解时,备忘录更省时一般要对备忘录进行初始化,为了之后快速判断是否有已经填写过备忘录动态规划递推式通过循环实现递推式是自下而上解决问题的:即从边界开始,原创 2020-10-28 20:35:35 · 3390 阅读 · 0 评论 -
【LeetCode】【动态规划】剑指 Offer 47. 礼物的最大价值 思路解析和代码
剑指 Offer 47. 礼物的最大价值题目链接个人思路思路dp[i][j]表示从起点出发,当(i,j)时所获得的最大价值自顶向下分析:求最优解:求拿到礼物价值最大最优子结构:要走到终点获得价值最大,上一步无论是从上方过来的,还是从左方的应该是取他们二者的最大值(即,位于上一步的位置,只有向右和向下两种策略)重叠子问题:想要求中间第i步(坐标是i,j)的最大值dp[i][j],需要从dp[0][0]开始计算,直到求到当前位置;想要求终点的最大值dp[m-1][n-1],仍要从起点位置开始计原创 2020-10-26 21:33:00 · 107 阅读 · 0 评论 -
【LeetCode】【动态规划】剑指 Offer 63. 股票的最大利润 思路解析和代码
剑指 Offer 63. 股票的最大利润题目链接个人思路思路dp[i]状态数组表示:第i天后最高的价格为dp[i]自顶向下分析:求最优解:求股票的最大利润最优子结构:求出当天之后的最高价格,与当天价格做差,即可找到全局最优解重叠子问题:想要求出第2天的最高价格dp[2](假设一共5天),我们需要比较dp[3]与dp[4]与dp[5];想要求出第三天的最高价格,我们仍要比较dp[4]与dp[5]自下而上解决问题:边界:最后一天的最高价格为它本身状态转移:比较第i天的价格和第i+1天原创 2020-10-26 21:09:27 · 236 阅读 · 0 评论 -
【LeetCode】【动态规划/备忘录】剑指 Offer 14- I. 剪绳子
剑指 Offer 14- I. 剪绳子题目链接个人思路此题基于整数拆分,是整数拆分的变形。题意将绳子结为n段,对每段进行乘积并求出最大值。思路对给定长度n进行裁剪,其实可以分为两种情况:(f(n)表示将n裁剪为多个的最大乘积)将绳子n分解成两段f(n) = i * (n - i)将绳子n分解成两段以上的情况也就是将i和(n-i)进一步分解(即,对i进行分解,对n-i进行分解,对他们两个均进行分解)当i取值范围在[1,n-1]的时候,i与n-i的取值是对称的,因此(n-i)*f(i原创 2020-10-26 10:22:41 · 190 阅读 · 0 评论 -
【LeetCode】【分治法、摩尔投票法】主要元素(求众数)思路解析和代码
求众数使用分治策略求出序列中的众数思路划分:从中间的元素进行划分,找出该元素左右两边与中间数字相同的起始与终止界限解决:根据左右界限计算众数的个数回溯:当左右剩余元素数量大于当前众数的个数,进行回溯递归体:划分众数,并根据划分计算众数的个数递归边界:当左右剩余元素数量小于当前众数的个数,不再递归,递归结束代码#include <bits/stdc++.h>using namespace std;int n;int arr[15];map<int, int>原创 2020-10-12 21:32:36 · 267 阅读 · 0 评论 -
【LeetCode】【分治法】排序矩阵查找 思路解析和代码
排序矩阵查找题目链接个人思路思路看到排序和搜索,应该想到往二分搜索上靠拢个人思路代码暴力解法,超时class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m, n; m = matrix.size();//行 if(m == 0){ return fa原创 2020-10-14 14:58:01 · 446 阅读 · 0 评论 -
【LeetCode】【分治法】493. 翻转对 思路解析和代码
493. 翻转对题目链接个人思路思路与逆序对的分之思想类似,都是使用归并排序一开始的思路是完全照搬逆序对的思路,在比较两个元素大小时判断是否存在二倍的关系。不能按照逆序对求解的原因:两元素比较大小的过程中,i,j指针不断后移,会出现还没有找到合适的i时,j已经后移并跳过了满足条件的j。正是由于指针后移会影响到指针的求解,因此要把问题求解过程在比较大小之前完成个人思路代码错误代码void merge(vector<int>& nums, int L1, int R1,原创 2020-10-13 21:08:02 · 158 阅读 · 0 评论 -
【LeetCode】【分治法】215. 数组中的第K个最大元素思路解析和代码
215. 数组中的第K个最大元素题目链接个人思路思路通过对数组进行一些排序操作,使数组基本有序,进行求解个人思路代码mergeSort排序class Solution {public: int maxn = 100005; void merge(vector<int>& nums, int L1, int R1, int L2, int R2){ int i = L1, j = L2; int temp[maxn], in原创 2020-10-13 17:25:59 · 389 阅读 · 0 评论