![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题笔记
文章平均质量分 56
fullmoon7
这个作者很懒,什么都没留下…
展开
-
73.矩阵置零
题目描述分析若直接在遍历数组的过程中修改,会分不清后续的0是修改后的还是原来就存在的。所以需要用额外的空间来存储原来的数组中是否存在0,且区分各算法的优异性两个额外数组描述用两个标记数组来记录每一行和每一列是否有0出现(用来更新矩阵)。接着遍历一次矩阵,根据这两个标记数组来进行更新。代码void setZeroes(int** matrix, int matrixSize, int* matrixColSize){ int m = matrixSize, n = matrixCol原创 2022-02-17 15:01:29 · 424 阅读 · 0 评论 -
118.杨辉三角
题目描述分析数学法利用杨辉三角的生成公式,数值等于其两肩数值之和。即可求解/** * Return an array of arrays of size *returnSize. * The sizes of the arrays are returned as *returnColumnSizes array. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls f原创 2022-02-15 17:31:11 · 475 阅读 · 0 评论 -
566.重置矩阵
题目描述分析矩阵映射先将m*n的矩阵映射为一维数组,再将其映射为r*c的二维矩阵。其中二维映射为一维的公式如下x=i∗n+jx = i*n+jx=i∗n+j而一维映射为二维的公式如下{i=x/nj=x%n\left\{\begin{aligned}i = x/n\\\\j = x\%n\end{aligned}\right.⎩⎪⎨⎪⎧i=x/nj=x%n而由二维直接映射为二维的公式如下before[x/c][x%c]=after[x/n][x%c]before原创 2022-02-14 19:41:21 · 461 阅读 · 0 评论 -
leetcode刷题笔记——121.(题目自查)
题目描述分析一次遍历描述由于暴力枚举会超过时间复杂度,因此需要一个复杂度低于O(N^2)的算法,考虑到O(NlogN)或O(N),但是因为本题数组原本的顺序很关键,因此O(NlogN)对应的快排算法不奏效。于是就是O(N),也就是遍历一次数组,那么想到在顺序访问每一个元素时,都求出其在当天售出能达到的最大利润,并求出这些利润的最大值。而要求出这些理论,就需要知道每一天的历史最低价,而这是可以通过一个变量储存来线性实现的,因此O(N)的算法能够实现。代码int maxProfit(int* pr原创 2022-02-11 23:27:06 · 250 阅读 · 0 评论 -
leetcode刷题笔记——350.两个数组的交集 Ⅱ
题目描述分析快排&双指针描述原来给的数组是没有排序的,快排后时间复杂度为O(MlogM+NlogN)。然后利用双指针,时间复杂度为O(M+N)。因此总时间复杂度为O(MlogM+NlogN)。由于一开始不知道交集的元素个数,因此需要开出大小为min{m,n}的空间来暂时存储返回值,计数后再存入目标数组中。空间复杂度为O(min{m,n})。※若c++可以直接创建一个vector(?),不需要额外数组,时间复杂度可降低为为O(1)。代码/** * Note: The returne原创 2022-02-10 19:11:22 · 527 阅读 · 0 评论 -
leetcode刷题笔记——88.合并两个有序数组
题目描述分析双指针分析定义指向两个数组头部的双指针。每次比较双指针指向的元素,将较小的元素移动到tmp数组中,并将其指针向后移一个位置。知道两个数组遍历完。时间复杂度是O(m+n)。※但空间复杂度达到了O(m+n),因为需要另外建立tmp数组来储存排序完的序列。※想要降低空间复杂度可以利用nums1数组中原先空闲的n个位置(详见下一个算法“逆向双指针”)代码void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2S原创 2022-02-09 17:47:28 · 701 阅读 · 0 评论 -
leetcode刷题笔记——1.两数之和
题目描述分析暴力枚举描述对数组每个元素x,遍历寻找元素target-x。并注意到在遍历时,当前元素已与位于其之前的元素匹配过,于是只需要在其之后的元素中查找即可。代码/** * Note: The returned array must be malloced, assume caller calls free(). */int* twoSum(int* nums, int numsSize, int target, int* returnSize){ for(int i = 0原创 2022-02-09 14:24:05 · 187 阅读 · 0 评论 -
leetcode刷题笔记——53.最大子数组和
题目描述分析贪心描述复杂度为O(n),每输入一个顺序表元素就产生一个状态,全部输入完就产生最终状态。代码int maxSubArray(int* nums, int numsSize){ if(numsSize == 0) return nums[0]; int sum = nums[0],tmpSum=0; for(int i=0;i<numsSize;i++){ tmpSum+=nums[i]; if(i!=0&原创 2022-02-08 22:33:05 · 119 阅读 · 0 评论 -
leetcode刷题笔记——217.存在重复元素
最简单的想法是对每个元素与其之前的元素进行比较,但这种算法的时间复杂度是O(N^2),会超过题目的限制。于是考虑降低时间复杂度,思考O(NlogN)的做法,想到可以采取快速排序,然后检测排序后数组是否有相邻元素相等,这样时间复杂度就降到了NlogN。原创 2022-02-07 19:10:37 · 389 阅读 · 0 评论