Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on dayi.
If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.
这是一个动态规划问题,maxpro、minprice是在这一个数组中不断更新变化的数据。maxpro=pirce[i]-minprice即可。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxPro = 0;
int minPrice = INT_MAX;
for(int i = 0; i < prices.size(); i++){
minPrice = min(minPrice, prices[i]);
maxPro = max(maxPro, prices[i] - minPrice);
}
return maxPro;
}
};
House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonightwithout alerting the police.
对于这类求极值的问题考虑动态规划Dynamic Programming来解,在一个一位数组中,其中f[i]表示到i位置时不相邻数能形成的最大和,当我们到达一个arr[i]时我们考虑该房间和arr[i-1]的前一个房间之和(要求不相邻)与f[i]进行比较而更新f[i],我们可以得到递推公式f[i] = max(num[i] + dp[i - 2], dp[i - 1]), 由此看出我们需要初始化f[0]和f[1],其中f[0]即为arr[0],f[1]此时应该为max(arr[0], arr[1])
class Solution {
public:
int rob(vector<int>& nums) {
const int n = nums.size();
if (n == 0) return 0;
if (n == 1) return nums[0];
if (n == 2) return max(nums[0], nums[1]);
vector<int> f(n, 0);
f[0] = nums[0];
f[1] = max(nums[0], nums[1]);
for (int i = 2; i < n; ++i)
f[i] = max(f[i-2] + nums[i], f[i-1]);
return f[n-1];
}
};