LeetCode
小胡同的诗
千里之行,始于足下
展开
-
LeetCode287 寻找重复数(双指针 | 弗洛伊德判圈)
题目链接:leetcode287题面解题思路二分二分重复的数的答案,根据抽屉原理,数据中必有重复的数时间复杂度:O(nlogn)O(nlogn)O(nlogn) ,空间复杂度:O(1)O(1)O(1)双指针构造一个快慢指针,第一次相遇后,继续走c步到达环的起点也就是入度大于2的点,即重复的数。证明:设环之前的长度为a,环起点到相遇点长度为b,相遇点到环起点为c由于起初步长相差1,所以直到相遇时,快指针路程一定只比慢指针多k(b+c),也就是环的长度的整数倍并且两者的路程是两倍的关系原创 2020-12-07 09:00:59 · 282 阅读 · 0 评论 -
LeetCode315 计算右侧小于当前元素的个数(分治求逆序数)
题目链接:leetcode315给你一个数组,让你求每个位置的数后面比它小的数的数量。也就是以每个数字为头的逆序对的数量。解题思路树状数组、线段树先离散化一下,然后逆序统计每个位置前比该数字小的数。分治先离散化,再利用归并排序把数组逆序,并求后面的区间对前面区间的贡献。代码分治class Solution {public: vector<int> countSmaller(vector<int>& nums) { int n =原创 2020-10-31 17:51:25 · 222 阅读 · 1 评论 -
LeetCode777 在LR字符串中交换相邻字符(双指针)
题目链接:leetcode777题面题目大意L只能左移,R只能右移,并且移动的时候旁边要有X帮助,问能否从当前移动到目标串。解题思路对于一个串,我们只需要考虑非『X』的元素,因为一旦其他两者复原则『X』也随之复原。广搜口胡一下,空间复杂度可能很高,并且时间复杂度也不低,可以用双向广搜优化一下。代码略。双指针我们从左到右扫,如果当前串和目标串最近的一个非「X」元素不相等,则一定不能复原,因为无论如何都会存在两个移动区间相交的点;如果只能目标串的元素在当前元素能移动的相反方向,则也不能复原创 2020-10-20 22:12:32 · 306 阅读 · 0 评论 -
LeetCode442 数组中重复的数据(哈希)
题目链接:leetcode442题面题目大意略解题思路哈希这种问题大致可以分成两类,如果找重复两次的数可以用哈希;如果找不重复的数可以用异或,然后按某个位为 1 开始划分。本题要找重复两次的数,于是可以采用哈希,具体就是使得 nums(i)==inums(i)==inums(i)==i ,这样不重复的数一定归位,而重复的数一定有一个不能归位,那么找出那些不能归位的数即可。代码实现class Solution {public: vector<int> findDupl原创 2020-09-29 21:11:34 · 168 阅读 · 0 评论 -
LeetCode215 数组中的第K个最大元素(分治 | 快速排序)
题目链接:leetcode215题面题目大意求数组中第k大的数,注意区分第k大和第k小。解题思路暴力每次选取一个当前最大值,重复 K 次即可找到答案时间复杂度 O(nk)O(nk)O(nk),空间复杂度 O(1)O(1)O(1) 。大根堆维护一个大根堆,取前 K 个堆顶元素即可找到答案。时间复杂度 O(n+log2nk)O(n+log_2n^k)O(n+log2nk),空间复杂度 O(n)O(n)O(n)。分治实际上就是利用快速排序的思想,每次去确定一个数的位置,然后分治原创 2020-09-29 19:56:56 · 499 阅读 · 0 评论 -
LeetCode144 二叉树的前序遍历(Morris遍历 | 非递归栈遍历)
题目链接:leetcode144题面题目大意略解题思路大致方法有递归、利用栈实现非递归以及Morris遍历,对于Morris遍历可以看这篇文章 传送门。其中递归和非递归栈空间复杂度都是 O(log2n)O(\log_2n)O(log2n) ,Morris 遍历空间复杂度为 O(1)O(1)O(1) 。代码实现Morris 遍历/** * Definition for a binary tree node. * struct TreeNode { * int val;原创 2020-09-26 23:33:02 · 248 阅读 · 0 评论 -
LeetCode143 重排链表(双指针)
题目链接:leetcode143题面题目大意略解题思路首先用快慢指针找到链表的中点,并分成两个链表,为了方便操作,前面的链表的长度要大于等于后面的链表;接着,把后面的链表逆置,为了方便操作,前面链表的链尾可以暂时称位后面链表的头节点;最后将两个链表归并,由于归并操作要交替插入,于是我们结束的标志是后面链表完全插入到前面的链表的时候算法结束,这也是为什么我们要使得前面的链表元素不小于后面链表的原因。时间复杂度 O(n)O(n)O(n),空间复杂度 O(1)O(1)O(1)。代码实现/**原创 2020-09-26 22:21:52 · 117 阅读 · 0 评论 -
LeetCode 142 环形链表Ⅱ(双指针)
题目链接:leetcode142题面题目大意给你一个链表可能有环,如果有环输出环的入口节点,否则输出 NULL解题思路双指针首先快慢指针进行找环,之后根据滑动窗口寻找入口。我们可以大致证明一下:假设慢指针走的长度为 lalala ,快指针走的长度为 lblblb ,整个链表的节点个数为 sss。那么,整个环的长度可以等于 lb−lalb-lalb−la,非环部分的长度为 s−(lb−la)s-(lb-la)s−(lb−la) ,又因为快指针的长度为慢指针的两倍,即 lb=2lalb=原创 2020-09-22 23:58:18 · 671 阅读 · 0 评论 -
LeetCode138 复制带随机指针的链表(思维)
题目链接:leetcode138题面题目大意构造一个和原链表一模一样的链表,包括 random 指针。注意的是,操作结束后,原链表的结构不能被破坏。解题思路map根据结构,我们可以先构造出和原链表一模一样的链表,并使每个节点一一对应,这边可以使用一个 map 。然后遍历原链表的所有节点,对于原链表的random 指针我们可以根据查询 map 的内容进行相应的 random 指针修改。时间复杂度 O(nlogn)O(nlogn)O(nlogn),空间复杂度 O(n)O(n)O(n)。把原创 2020-09-21 18:44:38 · 114 阅读 · 0 评论 -
LeetCode134 加油站(贪心)
题目链接:leetcode题面题目大意gas表示到达 i 位置后能得到的充值cost表示从 i 离开后需要的消费问是否能够从前往后绕一圈回到原点解题思路易错点对于一个起点,即使途中所有的充值和消费大于等于0,但是途中某个位置一旦没油了就会终止。枚举枚举所有起点,暴力检查。时间复杂度 O(n2)O(n^2)O(n2),空间复杂度 O(1)O(1)O(1)。贪心容易想到能绕一圈的前提是所有的所有点的充值和消费求和要大于等于0,在此前提我们去找起点。对于一个合法的起点,我们应该尽原创 2020-09-21 10:44:57 · 125 阅读 · 0 评论 -
LeetCode 96 不同的二叉搜索树(动态规划 | 递推 | Catalan数)
题目链接:leetcode96题面题目大意求 n 个数字构成的二叉搜索树的种类数量解题思路与本题等价的题目有:凸多边形划分三角形的数量、一串数字通过栈构成的出栈序列数量、2n 长度的 01 串的种类(限制是前缀 1 的数量不少于 0 )等,最终其实可以归结于 Catalan 数的计数问题。以下主要介绍两种动态规划思想的递推,为了方便讲解,问题不妨假设转化为数字的进栈出栈问题:递推我们考虑,对于一串规模为 n 的数字,对于状态 f[i]f[i]f[i] 表示把第 iii 个数字为开头的出栈原创 2020-09-20 10:13:46 · 193 阅读 · 0 评论 -
LeetCode117.填充每个节点的下一个右侧节点指针 II(思维+dfs)
题目链接:leetcode117题面题目大意给你一个二叉树,树节点指针域中多给了一个next指针,让你在时间复杂度尽可能优的情况下把每层的节点利用next指针串成一个链表。解题思路BFS(二叉树层次遍历)利用队列,额外维护一个树的高度,之后按高度把每层的next指针串连起来。但由于使用到额外的空间,显然不是本题的最优解。时间复杂度:O(n)O(n)O(n),空间复杂度:O(n)O(n)O(n)。DFS+栈我们不难发现,需要处理 next 指针的节点除了整棵树的最右侧链外其余均需要。而原创 2020-09-19 08:30:03 · 156 阅读 · 0 评论 -
LeetCode109 有序链表转二叉搜索树(分治 | 双指针)
题目链接:leetcode109题面题目大意给你一个有序数组,让你转成一个平衡的二叉搜索树解题思路乍一看这道题似乎要构造一个 平衡二叉树,而平衡二叉树的实现方法有多种,例如: SplayTree、AVLTree、SBTree、RBTree等。但代码量感人,根据他人思路大致总结如下几种方法:寻找中位数+分治具体思路就是每次对于一个有序链表,取中位数作为根节点,之后左半边和右半边分别递归构造子树。能否满足平衡的限制呢?我们发现左右区间的元素数量最多相差 1 个,显然满足。如何寻找中位数呢?数原创 2020-09-17 10:08:05 · 156 阅读 · 0 评论 -
LeetCode747 至少是其他数字两倍的最大数(树形选择排序 | 锦标赛树)
题目链接:leetcode747题目大意解题思路问题中有说一定存在最大值,意思是这个最大值是唯一的。确定了问题主要是寻找最大值和次大值就可以愉快地解决了,主要思路有如下两种:线性扫描直接 for 一遍即可,如果只是考虑比较的次数,最差会达到 2∗n−22*n-22∗n−2时间复杂度 O(n)O(n)O(n),空间复杂度 O(n)O(n)O(n)锦标赛树这个树是树形选择排序的前置技能,也是堆排序的弱化版,因为空间复杂度较高,但优点是能够减少比较次数。对于本题,仅仅只要寻找最大值和次大值,构造原创 2020-09-16 02:16:56 · 171 阅读 · 0 评论 -
LeetCode98验证二叉搜索树(树形遍历 | 中序遍历)
题目链接:leetcode98题目大意给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路树形遍历自行定义一个搜索二叉树的上界和下界,对于一个节点如果在这个上下界之外就不为 BST ,否则就是。对于左子树上界则更新为当且节点的值,对于右子树则把下界更新为当前节点的值。中序遍历利用中序遍历就不用考虑上界的问题,因为遍历的顺序是从左原创 2020-09-11 12:06:41 · 178 阅读 · 0 评论 -
LeetCode94 二叉树的中序遍历(栈)
题目链接:leetcode94题目大意给定一个二叉树,返回它的中序 遍历。非递归实现解题思路栈+模拟大致的思路就是不断往左子树切换,直到左边为空后把当前的节点输出,然后转到右子树。如果右子树为空说明需要回溯,弹栈即可。代码实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2020-09-04 16:36:10 · 191 阅读 · 0 评论 -
LeetCode86 分隔链表(双指针)
题目链接:leetcode86题目大意给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5相对位置不变相当于稳定地区分,比如两个相等的数原本的位置划分后不能更改这个相对位置,不同的数更是如此。解题思路双指针可以维护两个链原创 2020-09-04 16:05:11 · 145 阅读 · 0 评论 -
LeetCode82 删除排序链表中的重复元素 II(思维)
题目链接:leetcode82题目大意给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例一:输入: 1->2->3->3->4->4->5输出: 1->2->5示例二:输入: 1->1->1->2->3输出: 2->3简而言之就是删掉原始序列中,所有出现次数大于1的元素。解题思路直接删除AC 的代码就是这个方法,但逻辑可能略显冗余。先建一个头节点使链表变成带头原创 2020-09-04 00:42:18 · 125 阅读 · 0 评论 -
LeetCode75 颜色分类(三指针)
题目链接:leetcode75题目大意给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。示例:输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]进阶:一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前原创 2020-09-02 23:55:45 · 122 阅读 · 0 评论 -
LeetCode73 矩阵置零(思维)
题目链接:leetcode63题目大意给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。示例1:输入:[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]解题思路1. 暴力模拟遍历 m*n 个点原创 2020-09-01 23:40:02 · 150 阅读 · 0 评论 -
LeetCode61旋转链表(循环链表操作)
题目链接:leetcode61题目大意给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL示例2:输入:原创 2020-08-27 21:41:25 · 212 阅读 · 0 评论 -
LeetCode60 第k个排列(搜索+剪枝 | 思维)
题目链接:leetcode60题目大意给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。说明:给定 n 的范围是 [1, 9]。给定 k 的范围是[1, n!]。输入: n = 3, k = 3输出: “213”输入: n = 4, k = 9输出: "2314"解题思路数学原创 2020-08-26 15:43:33 · 166 阅读 · 0 评论 -
LeetCode31 下一个排列(思维 next_permutation实现)
题目链接:leetcode31题目大意实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1解题思路next_permutation利用『algorithm』包下的 API ,当返回为false时说明完全逆序,反转原创 2020-08-25 15:28:13 · 142 阅读 · 0 评论 -
LeetCode42 接雨水(单调栈 | 联通块 | 动态规划预处理 | 双指针 | 容斥)
题目链接:leetcode42题目大意给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6解题思路首先要先明白一个通识,即木桶原理。木桶的容量取决于最低的挡板高度。暴力枚举对于每一个柱子,我们都可以单独计算它对整体容量的贡献,原创 2020-08-24 17:42:46 · 229 阅读 · 0 评论 -
LeetCode24两两交换链表中的节点(栈 | 递归 | 非递归)
题目链接:leetcode24题目大意给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.题目其实没有说清楚,两两交换的字眼容易误以为数据一定为偶数个,但根据测试结果来看有奇数的情况,多出来的那个不需要交换。也就是两个一组进行交换,最后无法构成两个的则不操作。解题思路栈由于是分别逆置一组中的两个元素,并且后面交换后原创 2020-08-22 01:21:01 · 210 阅读 · 0 评论 -
LeetCode19 删除链表的倒数第N个节点(快慢指针/滑动窗口)
题目链接:leetcode19题目大意给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.解题思路双指针/滑动窗口『剑指offer』有道和这题类似的,那题是找到倒数第k个点,但不用删除。链接。这题由于需要删除,所以找到倒数第k+1个元素,但可能不存在第k+1个元素,即k==n的case,最后特判一下就行了。原创 2020-08-20 23:43:29 · 131 阅读 · 0 评论 -
LeetCode17 电话号码的字母组合(回溯)
题目链接:leetcode17题目大意给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].解题思路回溯实际上就是输出类似位向量所有组合结果的解法。大水题,注意判空类型。实现代码class Solution { string Tab[10] = {"",原创 2020-08-20 23:00:32 · 156 阅读 · 0 评论 -
LeetCode11 盛最多水的容器(双指针)
题目链接:leetcode11题目大意给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8原创 2020-08-20 00:00:06 · 104 阅读 · 0 评论 -
LeetCode3 无重复字符的最长子串(滑动窗口)
题目链接:leetcode3题目大意给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是原创 2020-08-18 23:36:55 · 113 阅读 · 0 评论 -
LeetCode137 只出现一次的数字 II(状态自动机+数字逻辑代数)
题目链接:leetcode137题目大意给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。示例 1:输入: [2,2,3,2]输出: 3示例 2:输入: [0,1,0,1,0,1,99]输出: 99解题思路朴素算法我们可以利用一个 HashSet 统计每个数字出现的次数,于是就可以在时间复杂度与空间复杂度均为O(n)O(n)O(n)下找到答案状态自动机根据这串数字的特点我们可以发现,对于序列中任意一种数字,不是出现1次原创 2020-08-18 01:13:22 · 178 阅读 · 0 评论 -
LeetCode264丑数Ⅱ(动态规划 or 堆)
题目链接:leetcode264思路:堆每次把当前最小的丑数能递推到的丑数push进小根堆中,根据小根堆的性质每次pop一定是当前最小的丑数,复杂度O(nlogn)O(nlogn)O(nlogn)动态规划所有丑数的全集一定由2,3,5的倍数组成的集合以及1构成由于要按顺序输出丑数,即丑数集合要具有单调性枚举每个数字的倍数,显然一个数字的倍数集合单调递增维护三个指针每...原创 2019-09-23 10:09:50 · 312 阅读 · 0 评论 -
LeetCode121. 买卖股票的最佳时机(单调栈+动态规划)
题目链接:Leetcode121思路:1,找前面和它比最小的更新答案,可以维护一个单调栈解决,每次跟栈底比(实际上是单调队列,但不用控制窗口大小就是了)class Solution {public: int maxProfit(vector<int>& prices) { int n = prices.size(); if ...原创 2019-09-05 17:00:18 · 1029 阅读 · 0 评论 -
LeetCode337打家劫社Ⅲ(树形动态规划)
题目链接:leetdcode337思路:先序列化,再树形DP,上一个节点如果选取则下一层节点不会取,否则从下层选和不选选一个最大的传递上来。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; ...原创 2019-09-30 13:26:58 · 268 阅读 · 0 评论 -
LeetCode343. 整数拆分(动态规划)
Leetcode343思路:状态很好表示:dp[i]dp[i]dp[i]表示和为i的拆分数字积的最大值。关键在于前一个状态是拆了j数字,如果继续往下拆则是dp[i−j]∗jdp[i-j]*jdp[i−j]∗j,如果只拆成两部分就是j∗(i−j)j*(i-j)j∗(i−j)class Solution {public: int integerBreak(int n) { ...原创 2019-09-13 23:42:38 · 255 阅读 · 0 评论 -
LeetCode91解码方法(动态规划)
LeetCode91思路:dp[i]表示前i个数字能合法地转成字母,字母的种类数class Solution {public: int numDecodings(string s) { //dp[i]表示前i个数字能合法地转成字母,字母的种类数 int n = s.size(); vector<int> dp(n + 1,...原创 2019-09-12 22:11:31 · 1494 阅读 · 0 评论 -
LeetCode877. 石子游戏(博弈+动态规划)
题目链接:Leetcode877思路:dp[i][j]表示从下标i到j中去左边和取右边的最大值转移方程:dp[i][j]=max(dp[i+1][j]+val[i], dp[i][j-1]+val[j]);显然,根据这个状态的设定有dp[i][i]=val[i];除此之外,i<=j记忆化搜索:class Solution {public: bool stoneGa...原创 2019-09-10 23:05:34 · 239 阅读 · 0 评论 -
LeetCode338. 比特位计数(二进制+动态规划)
题目链接:Leetcode338思路:利用x&x-1很容易从前一个少1的数递推过来,复杂度O(n∗c)O(n*c)O(n∗c)class Solution {public: vector<int> countBits(int num) { //利用x&x-1快速计算比该数位小1的数然后递推 vector<int...原创 2019-09-10 00:02:11 · 157 阅读 · 0 评论 -
LeetCode986. 区间列表的交集(贪心)
题目链接:Leetcode986思路:贪心,由于排好序了,直接双指针扫,思路和归并排序合并比较类似,注意往后移动的条件是尾部,因为一个矩形的结束条件是尾部比完了,不能写成是头部class Solution {public: vector<vector<int>> intervalIntersection(vector<vector<int>...原创 2019-09-07 07:36:31 · 378 阅读 · 0 评论 -
LeetCode56. 合并区间(思维+贪心)
题目链接:Leetcode56思路:贪心,先按左端点排序并且在左端点相同的情况下右端点靠近左边的排前面,然后用双指针访问所有区间,当左端点大于前面的右端点说明两个区间互斥了,要把之前的并区间推入答案集中,由于是按左端点为第一关键字的排序,所以后面的只要更新右端点就够了。最后可能会没有更新,所以人为地加一个最大地区间保证这个区间之前地全部更新。这题实际上是让你求区间的并集,如果求交集呢?见Lee...原创 2019-09-06 23:45:28 · 191 阅读 · 0 评论 -
LeetCode279完全平方数(动态规划+类似SPFA的队列优化)
题目链接:LeetCode279Ps:拉格朗日四平方和定理思路:根据分析,每个大的平方数会由许多小的平方数转移过来,于是可以写出这样一个转移方程:dp[i+j2]=min(dp[i]+1,dp[i+j2])dp[i+j^2]=min(dp[i]+1,dp[i+j^2])dp[i+j2]=min(dp[i]+1,dp[i+j2]),于是我们可以枚举n以内的所有状态转移到n以内的更大的平方数,最...原创 2019-09-02 11:27:53 · 145 阅读 · 0 评论