![](https://img-blog.csdnimg.cn/2019091813595558.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetcode&剑指offer
文章平均质量分 58
刷题
另一种可喜风流
这个作者很懒,什么都没留下…
展开
-
【剑指Offer】构建乘积数组(暴力 / 分解)
目录题目描述1、暴力解法2、进阶解法题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)1、暴力解法B[i]是指A[i]中除了第i个元素的所有乘积,那就直接两层循环时间复杂度O(n^2),空间复杂度O(n)class S原创 2020-07-16 17:06:50 · 116 阅读 · 0 评论 -
【剑指Offer】合并两个排序的链表(双指针)
目录题目描述解法:双指针题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解法:双指针/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead原创 2020-07-19 22:23:58 · 124 阅读 · 0 评论 -
【剑指Offer】不用加减乘除做加法(异或:无进位的和 + 相与并左移1位:进位和)
这里写目录标题题目描述位运算(异或+相与并左移)题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。位运算(异或+相与并左移)两个数异或:相当于不考虑进位的和(0+1或1+0就是1)两个数相与并且左移1位:相当于进位和(1+1=10才有进位,左移1位是因为将进位值移高一位,便于后续继续相加)如果进位为0(即第二个结果为0),则直接返回第一个结果;否则,两个结果继续相加。class Solution {public: int Add(int num原创 2020-07-16 17:37:36 · 237 阅读 · 0 评论 -
【剑指Offer】反转链表(三个连续指针顺着链表逐个反转)
目录题目描述解法题目描述输入一个链表,反转链表后,输出新链表的表头。解法三个连续的指针,顺着链表依次反转即可。每次操作都保证:pre指向新链表的头结点phead指向原链表的头结点nexthead指向原链表的第二个结点然后将原链表的头结点连接新链表的头结点即可,pHead->next = pre;如此循环操作时间复杂度O(N),N是链表长度时间复杂度O(1)/*struct ListNode { int val; struct ListNode *next; Li原创 2020-07-19 15:42:01 · 208 阅读 · 0 评论 -
【剑指Offer】数组中出现次数超过一半的数字( 快排O(NlogN) ,抵消法O(N) , hashmapO(N) )
目录题目描述思路快排O(NlogN)题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路快排O(NlogN)先快排,然后从中间数开始,双指针往两边遍历,记录和中间数连续相同的个数,一旦断掉,直接break。class Solution {public: int MoreThanHalfNum_Solution(vect原创 2020-07-22 22:18:46 · 136 阅读 · 0 评论 -
【剑指Offer】二叉树深度(队列实现BFS、递归实现DFS)、二叉树镜像 (队列实现BFS)
这里写目录标题题目描述广度优先搜索BFS(队列)题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。广度优先搜索BFS(队列)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class S原创 2020-07-16 20:26:17 · 184 阅读 · 0 评论 -
【剑指Offer】旋转数组的最小数字(顺序遍历找分界点)
目录题目描述思路:顺序遍历找分界点题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:顺序遍历找分界点数组大小为0,请返回0顺序遍历数组:因为数组非递减排序,所以第一个没遵守规则的元素就是该数组的最小值若前面遍历没找到,说明数组完全遵守非递减排序,最小值为第原创 2020-07-17 15:20:24 · 107 阅读 · 0 评论 -
【剑指Offer】**字符串的排列(不重复的全排列组合:dfs在已经固定了前pos个字符的情况下,遍历确定确定下标为pos的新字符,然后继续对后面的字符进行排列组合)
目录题目描述DFS思路题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。DFS思路核心要点dfs(str, pos):在已经固定了前pos个字符的情况下,dfs对后面的字符串进行排列组合,即[pos,str.length()]怎么排列组合:通过确定首位字符(即下标为pos的字原创 2020-07-18 16:56:32 · 187 阅读 · 0 评论 -
【剑指Offer】二进制1的个数(减1后的数和原数相与,能将最低位的1置0)
目录题目描述思路题目描述输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。思路循环操作:减去1后的数和原数相与,能将最低位的1置0每次操作都会将最低位的1置0,所以能操作的次数=1的个数举例:输入二进制数1100,和减去1之后的结果做与运算,1100&1011=1000,从原来整数最右边一个1那一位开始所有位都会变成0。那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。class Solution {public: int NumberO原创 2020-07-18 13:52:46 · 459 阅读 · 0 评论 -
【剑指Offer】跳台阶(普通递归太多重复时间复杂度O(2^n) -> 动态规划O(n))
目录题目描述解法普通递归:太多重复时间复杂度O(2^n)动态规划:时间复杂度:O(n)题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解法普通递归:太多重复时间复杂度O(2^n)时间复杂度:O(2^n)空间复杂度:O(1)class Solution {public: int jumpFloor(int number) { if(number<=1) retur原创 2020-07-17 16:48:00 · 789 阅读 · 0 评论 -
【剑指Offer】数组中只出现一次的两个数字(其余数都出现两次)(普通排序 / 满足交换律的异或)
目录题目描述解法排序然后左右比较满足交换律的异或题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解法排序然后左右比较先将数组升序排序。从第一个数开始,比较相邻两个数字xi,xi+1:如果相同,则往后移两位,继续比较;如果不同,则判断xi和前面数字是否也不同,xi+1和后面数字是否也不同,这样判断它数值的唯一性。需要注意最后一个数字没参与比较,所以如果结果还差一个数,那就是差的最后这个数字。时间复杂度O(NlogN):N是数组大小,因为原创 2020-07-19 21:56:51 · 172 阅读 · 0 评论 -
【剑指Offer】斐波那契数列(普通递归存在大量重复->优化递归 -> 动态规划)
目录题目描述普通递归:太多重复动态规划题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39普通递归:太多重复斐波那契数列:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)缺点:测试用例里可能会准备着一个超大的n来让Stack Overflow,为什么会溢出?因为重复计算,而且重复的情况还很严重,举个小点的例子,n=4,看看程序怎么跑的:Fibonacci(4)= Fibonacci(原创 2020-07-17 16:27:41 · 229 阅读 · 0 评论 -
【剑指Offer】重建二叉树(给出前序中序,递归构建)
这里写目录标题题目描述递归构建二叉树题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。递归构建二叉树前序序列的第一个元素就是根结点找到根结点在中序序列中的位置indexInVin,以此为界,两边分为左右子树indexInVin也是左子树的长度,因此可将左右子树对应的前序序列也找出递归构建左右子树/原创 2020-07-17 15:02:46 · 195 阅读 · 0 评论 -
【剑指Offer】**圆圈中最后剩下的数(循环链表暴力法O(NM);数学解法O(N):上一轮中的位置是当前索引往后移m位再对上轮人数取模)
目录题目描述循环链表暴力法题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦原创 2020-07-18 21:09:53 · 141 阅读 · 0 评论 -
【leetcode database】组合两个表、第二高的薪水、第N高的薪水、分数排名、超过经理收入的员工、查找重复的电子邮箱、 从不订购的客户
目录175. 组合两个表题目思路:left join176. 第二高的薪水题目思路order by desc, limit offset175. 组合两个表题目表1: Person,PersonId 是上表主键+-------------+---------+| 列名 | 类型 |+-------------+---------+| PersonId | int || FirstName | varchar || LastName | var原创 2020-09-24 17:36:00 · 458 阅读 · 0 评论 -
【leetcode】300. 最长上升子序列(动态规划:dp[i] 表示以 nums[i] 结尾的「上升子序列」的长度)
目录题目思路题目思路参考leetcode清晰思路状态定义成:dp[i] 表示以 nums[i] 结尾的「上升子序列」的长度。注意:这个定义中 nums[i] 必须被选取,且必须是这个子序列的最后一个元素。遍历到 nums[i] 时,需要把下标 i 之前的所有的数都看一遍;只要 nums[i] 严格大于在它位置之前的某个数,那么 nums[i] 就可以接在这个数后面形成一个更长的上升子序列;因此,dp[i] 就等于下标 i 之前严格小于 nums[i] 的状态值的最大者 +1。...原创 2020-09-08 22:55:06 · 220 阅读 · 0 评论 -
【leetcode】406. 根据身高重建队列(按身高降序排序,依次取出高个放到合适位置,list容器,辅助函数advance(it, n) )
目录题目思路代码题目假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]思路参考leetcode清晰思路核心思路非常简单:先把人员按身高降序排序,然后依原创 2020-09-08 22:42:07 · 617 阅读 · 0 评论 -
【leetcode】15. 三数之和(排序+左右双指针)
目录题目思路题目给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]思路leetcode清晰思路leetcode代码交流时间复杂度O(N^2), 空间复杂度O(1)1. 先对数原创 2020-09-08 21:52:04 · 129 阅读 · 0 评论 -
【leetcode】1. 两数之和(题设保证了每种输入的唯一性所以用哈希表)
目录题目思路题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]思路因为题设保证了每种输入的唯一性,所以我们把每个元素nums[i]都存入哈希表,在存入之前判断target-nu原创 2020-09-08 19:57:45 · 169 阅读 · 0 评论 -
【leetcode】1004. 最大连续1的个数 III (滑动窗口:每次判断窗口内0的个数来移动左指针。接着右指针右走一步)
目录题目滑动窗口:每次判断窗口内0的个数来移动左指针。接着右指针右走一步题目给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。示例 1:输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2输出:6解释: [1,1,1,0,0,1,1,1,1,1,1]粗体数字从 0 翻转到 1,最长的子数组长度为 6。示例 2:输入:A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0原创 2020-09-04 20:53:30 · 149 阅读 · 0 评论 -
【leetcode】518. 零钱兑换 II(动态规划,dp[k,i]表示在coins[0...k-1]中选取硬币可以凑成总金额i的组合数)
目录题目思路:动态规划,注意是组合,不是排列题目这次不求凑成总金额所需的最少硬币个数,而是求组合总数。给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amount = 3, coins = [2]输出: 0解释: 只用面额2的原创 2020-08-23 18:42:04 · 418 阅读 · 0 评论 -
【leetcode】322. 零钱兑换(硬币无限所以是完全背包问题,状态方程定义dp[i]表示凑成总金额i所需的最少硬币个数)
目录class Solution {public: int coinChange(vector<int>& coins, int amount) { /* 硬币无限,完全背包问题。动态规划。 状态方程定义dp[i]表示凑成总金额i所需的最少硬币个数。 初试dp[0]=0,最终要求的是dp[amount] 状态转移方程:对于每一种硬币coins[j],我可以选择放进来或者不放。如果不放,那么dp[i原创 2020-08-16 18:49:23 · 264 阅读 · 0 评论 -
【leetcode】**416. 分割等和子集(0/1背包问题:dp[i][j]表示从下标[0,i]中挑选出几个元素组成和为j的可能性)
目录题目思路背包问题:二维数组dp[i][j]题目给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11].示例 2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.思路背包问题:二维数组dp[i][j]0/1背原创 2020-08-16 15:42:26 · 186 阅读 · 0 评论 -
【剑指Offer】最长不含重复字符的子字符串(动态规划+哈希表更新每个字符最近一次出现的下标位置)
目录题目思路动态规划+哈希表节省空间题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须原创 2020-08-14 14:58:37 · 107 阅读 · 0 评论 -
【剑指Offer】**序列化二叉树(二叉树的层序遍历输出用队列bfs;根据数组构建二叉树:队列)
目录题目根据数组构建二叉树:用队列,依次取一个结点然后按数组顺序构建左右孩子题目请实现两个函数,分别用来序列化和反序列化二叉树。示例: 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 "[1,2,3,null,null,4,5]"根据数组构建二叉树:用队列,依次取一个结点然后按数组顺序构建左右孩子根据数组nums[i]构建二叉树:将根结点放入队列,同时记录已构造结点个数cnt=1;然后每次从队列中取出一个结点,构建其左原创 2020-08-11 22:03:49 · 155 阅读 · 0 评论 -
【剑指Offer】和为s的连续正数序列(暴力法;解一元二次方程;滑动窗口)
目录题目思路暴力法 O(N*开方N)数据解法:一元二次方程求解 O(N)滑动窗口题目输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]] 限制:1 <= target <= 10^5思路暴力法原创 2020-08-11 18:25:57 · 122 阅读 · 0 评论 -
【剑指Offer】机器人的运动范围(dfs递归思想;bfs)
目录题目思路dfs递归思想bfs题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输原创 2020-08-11 16:47:40 · 97 阅读 · 0 评论 -
【剑指Offer】用两个栈实现队列(顺序存栈便于push,逆序存栈便于pop)
目录题目描述解法题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解法两个栈实现一个队列:所有元素要么顺序存在stack1(便于push),要么逆序存在stack2(便于pop),因此每次push和pop之前都要保证元素都存在对应的栈中了class Solution{public: //两个栈实现一个队列: //所有元素要么顺序存在stack1(便于push),要么逆序存在stack2(便于pop), //因此每次push和po原创 2020-07-17 14:02:54 · 187 阅读 · 0 评论 -
【leetcode】141. 环形链表(用hashset存储已遍历的结点;快慢指针如果有环就一定会相遇,否则会指向尾部NULL)
目录题目思路用hashset存储已遍历的结点快慢指针题目给定一个链表,判断链表中是否有环。思路用hashset存储已遍历的结点时间复杂度O(N)空间复杂度O(N)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class原创 2020-08-09 16:38:10 · 142 阅读 · 0 评论 -
【剑指Offer】**最小的k个数(利用快排思想的快速选择 / 堆排序)
目录题目思路利用快排思想的快速选择堆排序题目输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2: 输入:arr = [0,1,2,1], k = 1输出:[0] 限制:0 <= k <= arr.length <= 100000 <= arr[i] <= 10000思原创 2020-08-07 22:21:52 · 166 阅读 · 0 评论 -
【leetcode】200. 岛屿数量(bfs/dfs)
目录题目bfs广度优先搜索题目bfs广度优先搜索bfs:每次遇到一个点,如果是0,直接跳过,如果是1,就判断这个点flag是否被遍历过,如果没被遍历过,从这点开始进行bfs,需要借助队列的辅助空间,同时注意把这个岛屿走过的点都标记flag=1,bfs结束时岛屿数量加一。或者不需要另外开辟空间存储flag,对于遍历过的‘1’,直接将其值改为0即可。pair类型定义在#include class Solution {public: /* bfs:每次遇到一个点,如果是0,直接跳原创 2020-08-05 10:46:52 · 218 阅读 · 0 评论 -
【leetcode】146. LRU缓存机制(只写了思路,代码未写)
目录题目思路题目运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字/值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。进阶原创 2020-08-04 21:50:42 · 188 阅读 · 0 评论 -
【leetcode】35. **复制带随机指针的链表(深拷贝!利用哈希表来存原结点和拷贝结点的一一对应关系)
目录题目暴力法:哈希表存原结点和拷贝结点的一一对应关系题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例 1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还原创 2020-08-04 20:50:21 · 154 阅读 · 0 评论 -
【leetcode】102.二叉树的层序遍历(用队列实现的bfs广度优先搜索)
目录题目bfs题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]bfs时间复杂度:O(N),N为结点个数,需要遍历每个结点空间复杂度:O(N),辅助空间用到队列,而队列最大长度等于层结点个数的最大值/** * Defi原创 2020-08-04 17:40:43 · 173 阅读 · 0 评论 -
【leetcode】合并两个有序数组(题设nums1 有足够的空间,所以双指针从后往前遍历,先找最大数)
目录题目双指针从后往前遍历题目给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出: [1,2,2,3,5,6原创 2020-08-04 15:39:04 · 170 阅读 · 0 评论 -
【剑指Offer】连续子数组的最大和(动态规划:状态定义dp[i]表示以nums[i]结尾的连续子串的最大和)
目录题目动态规划题目输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100动态规划状态定义:dp[i]表示必须以nums[i]结尾的连续原创 2020-08-04 15:13:10 · 171 阅读 · 0 评论 -
【剑指Offer】**把数字翻译成字符串(1.dfs 2.动态规划?)
这里写自定义目录标题题目思路dfs动态规划?题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi" 提示:0 <= num < 231思路df原创 2020-08-02 17:17:53 · 129 阅读 · 0 评论 -
【剑指Offer】数组中重复的数字(1. 集合容器set元素唯一 2. 原地置换让数字i保存到下标为i的位置)
目录题目思路集合容器set元素唯一性:O(N)+O(N)原地置换让数字i保存到下标为i的位置:O(N)+O(1)题目找出数组中重复的数字:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000思路集合容器set元素唯一性:O(N)原创 2020-08-02 16:29:49 · 233 阅读 · 2 评论 -
【剑指Offer】顺时针打印矩阵(不断沿着四条边界遍历,缩小边界值)
目录题目思路:不断沿着四条边界遍历,缩小边界值题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <=原创 2020-08-02 15:53:19 · 178 阅读 · 0 评论 -
【剑指Offer】**数组中的逆序对(归并排序!)
目录题目描述归并排序题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5限制:0 <= 数组长度 <= 50000归并排序leetcode官方视频讲解很不错!大概思路:归并排序:递归的将数组拆分为两个分组,直到拆分至分组个数为1(因为1个数的时候默认是有序的),然后开始回升,不断地去有序合并被拆分的两个分组(此时的两个分组已经排好序了)。与普原创 2020-08-01 22:12:17 · 141 阅读 · 0 评论