方法:贪心
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res = 0;
for (int i = 1; i < prices.size(); ++i) {
int cur = prices[i] - prices[i-1];
if (cur > 0) res += cur;
}
return res;
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:dp
class Solution {
#define maxn 100010
int dp[maxn][2];
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
dp[0][0] -= prices[0];
for (int i = 1; i < prices.size(); ++i) {
dp[i][0] = max(dp[i-1][0], dp[i-1][1] - prices[i]); //(前i天持有的剩余最大资本)
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]); //(前i天持有的最大资本)
}
return max(dp[n-1][0], dp[n-1][1]);
}
};
$时间复杂度O(n),空间复杂度O(n)
方法:贪心
class Solution {
public:
bool canJump(vector<int>& nums) {
int cur = 0;
for (int i = 0; i <= cur; ++i) {
cur = max(cur, nums[i] + i);
if (cur >= nums.size() - 1) return true;
}
return false;
}
};
$时间复杂度O(n),空间复杂度O(1)
方法:贪心
class Solution {
public:
//next为当前覆盖的最大范围,cur为之前覆盖的最大范围体现了从局部最优到全局最优的目的
int jump(vector<int>& nums) {
int cur = 0, next = 0, res = 0;
for (int i = 0; i < nums.size() - 1; ++i) {
next = max(next, nums[i] + i);
if (i == cur) {
cur = next;
++res;
}
}
return res;
}
};
$时间复杂度O(n),空间复杂度O(1)