- 博客(12)
- 收藏
- 关注
原创 73.矩阵置零
题目描述分析若直接在遍历数组的过程中修改,会分不清后续的0是修改后的还是原来就存在的。所以需要用额外的空间来存储原来的数组中是否存在0,且区分各算法的优异性两个额外数组描述用两个标记数组来记录每一行和每一列是否有0出现(用来更新矩阵)。接着遍历一次矩阵,根据这两个标记数组来进行更新。代码void setZeroes(int** matrix, int matrixSize, int* matrixColSize){ int m = matrixSize, n = matrixCol
2022-02-17 15:01:29
410
原创 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
456
原创 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
434
原创 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
243
原创 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
510
原创 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
680
原创 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
181
原创 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
112
原创 leetcode刷题笔记——217.存在重复元素
最简单的想法是对每个元素与其之前的元素进行比较,但这种算法的时间复杂度是O(N^2),会超过题目的限制。于是考虑降低时间复杂度,思考O(NlogN)的做法,想到可以采取快速排序,然后检测排序后数组是否有相邻元素相等,这样时间复杂度就降到了NlogN。
2022-02-07 19:10:37
369
原创 C语言初学过程中几种基本的数据类型
平常做题如果不在意数据类型,输入的数据就容易超出定义的范围,导致WA。所以今天来总结一下C语言常见的数据类型,包括其大小范围,输入输出符号,占用字符数。整型int 即short int 整型变量,占用2字节,范围:-2的15次方~2的15次方-1 ※ 其区间长度,刚好是2的16次方。 用%d来输入输出long 即long int 长整型变量,占用4个字节,范围:-2的31次方~2的31次方-1 ※其区间长度,刚好是2的32...
2020-10-01 14:52:54
1195
原创 关于c语言指针的一些认识
关于c语言指针的一些认识指针的初始化 初始化的目的是让指针知道指向哪个地址,以防止其指向一些“危险”地址。其方法有两种。 第一:在声明指针的时候告知变量的地址。例如int i=1;int *p=&i; 第二:不初始化指针,在后直接将地址赋值给指针。例如int i=1;int *p;p=&i; 但要注意,如下写法是错误的。int i=1;int *p;*p=&...
2020-09-27 15:25:18
86
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人