
空间优化
abant2
世界上最菜的arcem
展开
-
leetcode 234 回文链表 空间优化
说是个简单题,做起来是真费劲。正常做也没啥事,题目非要要求O(1)空间,就很难受了。 做法:反转后面那部分链表,然后用两个指针比较即可。 难点一:找到链表中间 由于我们要预存链表中间位置,所以分奇数偶数两种情况讨论,用快慢指针找到中间即可。 难点二:反转链表 反转链表需要存两个指针:前指针和当前指针,每次要处理好这两个的关系,这样当next为空时所有的节点都反转完成。 /** * Definition for singly-linked list. * struct ListNode { * .原创 2021-08-03 23:51:10 · 196 阅读 · 1 评论 -
leetcode 160 相交链表 空间优化
这个题一看我就忍不住用map啊,真的是。链表的题实际还是挺有规律的,想这个题,可以发现,如果A走完一圈后走B的路,B走完一圈走A的路,就可以在相交处相遇。 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { p.原创 2021-08-02 17:11:43 · 74 阅读 · 0 评论 -
leetcode 238 除自身以外数组的乘积
解法一:前后缀乘积数组 通过计算得到前后缀乘积数组,之后累乘即可。 class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int n = nums.size(); vector<int> pre(n+1, 1), post(n+1, 1), ans(n); for(int i=0;i<n;i++) .原创 2021-07-28 14:23:29 · 106 阅读 · 0 评论 -
leetcode 9 回文数
此题一看就比较简单。先转字符串然后同时遍历即可。但是这样需要O(N)的空间。 能否压缩到O(1)呢,肯定是可以的,咱们从后往前存数,当存的数大于前面的数时,就可以判断了。要么相等,要么除以10后相等。 注意:要排出一些情况,如0结尾的,否则会出bug。 class Solution { public: bool isPalindrome(int x) { if(x == 0)return true; if(x < 0 || x%10 == 0)return f.原创 2021-07-17 17:29:32 · 84 阅读 · 0 评论 -
leetcode 27 空间优化(删除特定元素)
此题要删除数组中指定大小的元素,咱们只需把不等于这个值的元素从头到尾排好就行,就像剑指offer第5题的思路一样,此题还不用空间扩容,所以更简单了。 class Solution { public: int removeElement(vector<int>& nums, int val) { int ct = 0, p = 0; for(int i=0;i<nums.size();i++) { if(原创 2021-04-19 14:15:06 · 112 阅读 · 0 评论 -
leetcode 73 矩阵空间优化
此题的关键是要矩阵的第一行第一列来存储对应的行列是否要变0,提前记录好1行一列是否要变0,最后处理即可。 另一种思路(慢了) 由于矩阵不算太大,可以找一个矩阵里不存在的数作为标志数,横着扫一遍,全变0,存好标志数,再竖着来一遍,把标志数对应的列变0即可。 class Solution { public: void setZeroes(vector<vector<int>>& matrix) { if(matrix.size() == 0 || matr原创 2021-03-21 15:35:09 · 96 阅读 · 0 评论 -
leetcode 119 杨辉三角,一个数组解决
杨辉三角用多个数组很好解决,如果只用一个数组的话,涉及到迭代问题,以及不对称,然而这些问题可以通过简单地对齐和从后向前更新解决,代码如下: class Solution: def getRow(self, rowIndex: int) -> List[int]: ret = [1] for i in range(rowIndex): ret.append(1) for j in range(i, 0, -1):原创 2021-02-12 15:11:24 · 77 阅读 · 1 评论 -
leetcode 54 螺旋式生成矩阵
解法一:遇到障碍就停 此法需要建一个表来表示是否遍历过这个点。会有额外的空间复杂度,但是写起来比较简单。这里用了set是为了省事,实际用二维数组比较好。 class Solution { public: int violate(pair<int, int> p, int M, int N) { if(p.first >= 0 && p.first < M && p.second >= 0 && p.原创 2021-03-16 22:07:30 · 119 阅读 · 0 评论 -
剑指offer 05 节省空间空格替换
直接创建一个新数组来做这个题很容易。我们也可以在原数组上操作来节省空间。操作方法为先统计空格数目,然后将数组扩容,之后倒叙复制即可。由于字符串不支持单位赋值,只好转换成list操作。此外,对str连续赋值可以使用ljust,很快。 class Solution: def replaceSpace(self, s: str) -> str: s = list(s) num = 0 for c in s: if c == '原创 2021-03-09 10:52:06 · 86 阅读 · 0 评论 -
剑指offer 03 重复数字O(1)空间
这题看似很简单,一个字典就结束了。但仔细看题的话,还有更优秀的解法。本题正好是0到n-1填满整个数组,如果排序的话只要看原创 2021-03-08 17:12:25 · 80 阅读 · 0 评论 -
leetcode 448 隐藏哈希表
这个题肯定是要统计信息的,要统计没出现过的数字。最常见的做法就是用哈希表存,但这需要O(N)的空间复杂度。但实际上是不用的,我们可以直接将这个数组当做哈希表,只需用到模运算记录,代码如下: class Solution: def findDisappearedNumbers(self, nums: List[int]) -> List[int]: N = len(nums) for num in nums: nums[num%N-1]原创 2021-02-13 17:44:14 · 110 阅读 · 0 评论