"星辰野草,造出无边的天地~"
最⻓递增⼦序列
(1) 题目解析
(2) 算法原理
cpp
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
// 使用dp
int n = nums.size(), ret = 1;
// 初始化为1
vector<int> dp(n+1,1);
// 从第二个位置开始
for(int i=1;i<n;++i)
{
// 子序列搜索
for(int j=0;j<i;++j)
{
// 可以进行拼接
if(nums[j] < nums[i]) dp[i] = max(dp[i],dp[j] + 1);
}
ret = max(ret,dp[i]);
}
return ret;
}
};
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
// 使用贪心
vector<int> vec; // 记录子序列长度
vec.push_back(nums[0]); // 初始化
for(int i=1;i<nums.size();++i)
{
// 如果是最大的直接插入即可
if(vec.back() < nums[i]) vec.push_back(nums[i]);
else
{
// 二分查找
int left = 0,right = vec.size() - 1;
while(left < right)
{
int mid = (left + right) >> 1;
// 哪个分支暗含"相等" 不能跳过mid
if(nums[i] > vec[mid]) left = mid+1;
else right=mid;
}
// 更新较小值
vec[left] = nums[i];
}
}
return vec.size();
}
};
递增的三元⼦序列
(1) 题目解析
这题同上一道题相差无几!甚至更为简单,因为我们只需要判断这个子序列长度是否超过3。
(2) 算法原理
cpp
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
// 这里默认给b一个无穷大的值
// 由nums中的小数来替换
int a = nums[0],b = INT_MAX;
for(int i=1;i<nums.size();++i)
{
if(b < nums[i]) return true; // 找打了
else if(a < nums[i]) b = nums[i]; // 替换b
else a = nums[i];
}
return false;
}
};
最⻓连续递增序列
(1) 题目解析
(2) 算法原理
cpp
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
int n = nums.size();
int left = 0,right = 1,ret = 0;
while(left < n)
{
while(right < n && nums[right] > nums[right-1]) right++;
ret = max(ret,right - left);
left = right++;
}
return ret;
}
};
买卖股票的最佳时机
(1) 题目解析
(2) 算法原理
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int prevMin = prices[0], n = prices.size();
int ret = 0;
for(int i=1;i<n;++i)
{
ret = max(ret,prices[i] - prevMin);
prevMin = min(prevMin,prices[i]); // 更新
}
return ret;
}
};
买卖股票的最佳时机 Ⅱ
(1) 题目解析
(2) 算法原理
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 方法1:双指针+贪心
int n = prices.size();
int left = 0,right = left + 1;
int ret = 0;
while(left < n)
{
while(right < n && prices[right] > prices[right - 1]) right++;
ret += prices[right - 1] - prices[left];
left = right++;
}
return ret;
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 方法2:拆分交易
int ret = 0;
for(int i=0;i<prices.size()-1;++i)
{
if(prices[i] < prices[i+1]) ret += prices[i+1] - prices[i];
}
return ret;
}
};
本篇到此结束,感谢你的阅读。
祝你好运,向阳而生~