一、数组
1.删除排序数组中的重复项(双指针):
(1)审题不清,效率不高
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto it = nums.begin();
while (it != nums.end() - 1)
{
if (*it == *(it + 1))
{
it = nums.erase(it);
}
else
{
++it;
}
}
return nums.size();
}
};
(2)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty())return 0;
int left = 0;
for (int right = 1; right < nums.size(); ++right)
{
if (nums[left] != nums[right])
{
nums[++left] = nums[right];
}
}
return ++left;
}
};
2.买卖股票的最佳时机II
(1)贪心算法
因为没有限制买卖的次数,所以我们可以理解为相邻两天的利润和
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.empty() || prices.size() == 1)return 0;
int profit = 0;
for (int i = 1; i < prices.size(); ++i)
{
if (prices[i] > prices[i - 1])
{
profit += (prices[i] - prices[i - 1]);
}
}
return profit;
}
};
(2)动态规划
定义一个二维数组dp表示这一天结束后的最大利润,dp[i][0]表示这一天结束手中没有股票,这可能是前一天结束后手中就没有股票,或者这一天结束后股票已经卖出;dp[i][1]表示这一天结束手中有股票,这也可能是前一天结束后手中的股票,今天没有购入,或者昨天结束后没有股票,今天买入了。
最后,如果要获得最大利润那就说明最后一天结束后手中是没有股票的。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int len = prices.size();
vector<vector<int>>dp(len, vector<int>(2, 0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i < len; ++i)
{
dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] =