334.递增的三元子序列
思路
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int len = nums.size();
if (len < 3) return false;
int small = INT_MAX, mid = INT_MAX;
for (auto& num : nums) {
if (num <= small) {
small = num;
}
else if (num <= mid) {
mid = num;
}
else if (num > mid) {
return true;
}
}
return false;
}
};
300.Longest Increasing Subsequence
思路
eg:
dp复杂度
时间:
O
(
N
2
)
O(N^2)
O(N2)
空间:
O
(
N
)
O(N)
O(N)
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int sz = nums.size();
if (sz <= 1)
return sz;
vector<int>dp(sz, 1);//初始化为1
for (int i = 1; i < sz; ++i) {//下标为i的元素
for (int j = 0; j < i; ++j) {//元素i前面的数
if (nums[i] > nums[j])
//遍历到 nums[i] 时,需要把下标 i 之前的所有的数都看一遍;
//只要 nums[i] 严格大于在它位置之前的某个数,那么 nums[i] 就可以接在这个数后面形成一个更长的上升子序列;
//因此,dp[i] 就等于下标 i 之前严格小于 nums[i] 的状态值的最大者 + 1
dp[i] = max(dp[i], dp[j] + 1);
}
}
//找出dp数组最大的(不是直接返回dp[sz - 1])
int res = 1;
for (auto& v : dp) {
res = max(res, v);
}
return res;
}
};
5500.乘积为正的最长子数组长度
思路
class Solution {
public:
int getMaxLen(vector<int>& nums) {
int res = 0;
vector<pair<int,int>>dp(nums.size() + 1);//算上当前字符,乘积结果为正/负的最长子序列长度
dp[0] = { 0,0 };//初始状态
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > 0) {
dp[i + 1].first = dp[i].first + 1;
//判断前一字符 neg状态是否为0
if (dp[i].second != 0)
dp[i + 1].second = dp[i].second + 1;
else
dp[i + 1].second = 0;
}
else if (nums[i] < 0) {
dp[i + 1].first = (dp[i].second != 0) ? (dp[i].second + 1) : 0;
dp[i + 1].second = dp[i].first + 1;
}
else {
dp[i + 1] = { 0,0 };
}
res = max(res, dp[i + 1].first);
}
return res;
}
};