学习目标:
leetcode刷题
学习内容:
买卖股票的最佳时机 II
(1):贪心算法
(2):动态规划
(3):
link:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2zsx1/
旋转数组
(1):暴力解法
(2):多次逆置
(3):
link:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
学习时间:
2021.4.21 中下午
学习产出:
(1):给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
第一种算法:(贪心算法)
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxprofit = 0; //设置maxprofit为利益最大
int n = prices.size();
for (int i = 1; i < n; ++i) {
maxprofit += max(0, prices[i] - prices[i - 1]); //利用max函数避免特殊情况
}
return maxprofit;
}
};
第二种算法;(动态规划) 不会
(2):给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
eg:
第一种思路(超出时间限制):首先将首末置换(最后一个数用temp保存),再将其他数依次后移。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k%=n;
int temp1; //temp用于暂存nums数组最后一个数
for(int i=0;i<k;++i)
{
temp1=nums[n-1];
for(int j=n-1;j>0;--j)
{
nums[j]=nums[j-1];
}
nums[0]=temp1;
}
}
};
第二种思路:多次使用逆转函数
void reverise(vector<int>& nums, int begin, int end)//构造逆转函数
{
int mid = (begin + end) / 2;
int temp;
end--;
for (int i = begin; i < mid; ++i) //循环逆转每个元素
{
temp = nums[begin];
nums[begin] = nums[end];
nums[end] = nums[begin];
end--;
begin++;
}
}
class Solutio {
public:
void rotate(vector<int>& nums, int k) {//调用函数
int n = nums.size();
k = k % n; //k可能大于n
reverise(nums, 0, n);//先全部逆转
reverise(nums, k, n);//后半段逆转
reverise(nums, 0, k);//前半段逆转
}
}
第三种思路:(不会)