“星辰野草,造出无边的天地~”
最⻓递增⼦序列
(1) 题目解析
(2) 算法原理
class Solution {
public:int lengthOfLIS(vector<int>& nums) {// 使用dp int n = nums.size(), ret = 1;// 初始化为1vector<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;// 哪个分支暗含“相等” 不能跳过midif(nums[i] > vec[mid]) left = mid+1;else right=mid;}// 更新较小值vec[left] = nums[i];}}return vec.size();}
};
递增的三元⼦序列
(1) 题目解析
这题同上一道题相差无几!甚至更为简单,因为我们只需要判断这个子序列长度是否超过3。
(2) 算法原理
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]; // 替换belse a = nums[i];}return false;}
};
最⻓连续递增序列
(1) 题目解析
(2) 算法原理
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) 算法原理
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) 算法原理
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;}
};
本篇到此结束,感谢你的阅读。
祝你好运,向阳而生~