LeetCode刷题笔记-数据结构-day5
Posted ΘLLΘ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题笔记-数据结构-day5相关的知识,希望对你有一定的参考价值。
文章目录
LeetCode刷题笔记-数据结构-day5
334.递增的三元子序列
1.题目描述
原题链接:334. 递增的三元子序列
2.解题思路
题目要求:你能实现时间复杂度为 O(n)
,空间复杂度为 O(1)
的解决方案吗?
算法:贪心
这里我们使用贪心,用两个数a
和b
表示遍历中最小的两个数,我们只需要在找出比b
大的的第三个数就行。
具体操作(当前遍历的数为x
):
- 如果
x<=a
。则将最小值a
修改为x
- 如果上面的不满足,但是
x<=b
则将第二小的值修改为x
- 如果上面两个都不满足,说明此时的数已经大于前面两个,条件构成,返回
true
需要注意的是,可以会有 4(a)、6(b)、3(x)
这种情况,也就是说如果x
比a
还小,那就把a
的值设为x
,然后继续遍历找最终的答案(这样的话a
会跑到b
的后边,但是不要紧,因为在b
的前边,老a
还是满足的),我们最终的第三个数只需要大于b
即可!
3.代码
class Solution
public:
bool increasingTriplet(vector<int>& nums)
int a=INT_MAX,b=INT_MAX;
for(auto x:nums)
if(x<=a) a=x;
else if(x<=b) b=x;
else return true;
return false;
;
238.除自身以外数组的乘积
1.题目描述
原题链接:238. 除自身以外数组的乘积
2.解题思路
题目要求:不要使用除法,且在 O(n)
时间复杂度内完成此题。尽量在常数空间复杂度内完成
我们可以两次遍历数组:
- 第一次从左边遍历,用一个数
t
记录前缀乘积 - 第二次从右边遍历,
t
重新置为1
,记录后缀乘积 - 每个位置的结果只需要乘上遍历到该的位置的
t
即可 - 最终时间复杂度
O(n)
,空间复杂度O(1)
。
3.代码
class Solution
public:
vector<int> productExceptSelf(vector<int>& nums)
int n=nums.size();
vector<int> res(n,1);
int t=1;
for(int i=0;i<n;i++)
res[i]*=t;
t*=nums[i];
t=1;
for(int i=n-1;i>=0;i--)
res[i]*=t;
t*=nums[i];
return res;
;
560.和为 K 的子数组
1.题目描述
原题链接:560. 和为 K 的子数组
2.解题思路
算法:前缀和+哈希表
我们可以用哈希表hash
记录前缀和sum
出现的次数。每次只需要hash[sum]++
即可,hash[0]=1
需要特别处理。
当我们遍历到某个位置的时候,hash[sum-k]
的值就是前面出现的和为 k
的连续子数组的个数。
3.代码
class Solution
public:
int subarraySum(vector<int>& nums, int k)
map<int,int> hash;
int sum=0;
int res=0;
hash[0]=1;
for(auto x:nums)
sum+=x;
res+=hash[sum-k];
hash[sum]++;
return res;
;
以上是关于LeetCode刷题笔记-数据结构-day5的主要内容,如果未能解决你的问题,请参考以下文章