贪心算法:
比较传统的解释:将整个问题拆解为几个小问题,找到小问题的最优解,加起来就是整个问题的全局最优解。对于现在的我理解贪心就是一种感觉,给出证明很难,解题思路一般就是认真读题,发掘题目的条件,然后尝试给出算法。
一个显而易见的条件:水的面积取决于底边的长度和水池两边的最短边,因此可以首先选择最长的底边,然后在此基础上在选较高的水池的一边,在这个过程中计算面积最大值,保存即可。
class Solution {
public:
int maxArea(vector<int>& height) {
int maxArea = 0;
for (int i = 0, j = height.size() - 1; i < j; ) {
if (height[i] <= height[j]) {
maxArea = max((j - i) * height[i], maxArea);
i++;
} else {
maxArea = max((j - i) * height[j], maxArea);
j--;
}
}
return maxArea;
}
};
求解思路:累加每天股票变化的增加的部分,比如1和5是涨的,那么最后的结果肯定是涨的,所以需要把该部分累加。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int profit = 0;
for (int i = 0; i < prices.size(); i++) {
for (int j = i + 1; j < prices.size() && prices[j] - prices[i] >= 0; j++, i++) {
profit += prices[j] - prices[i];
}
}
return profit;
}
};
这道题的思路还是比较直观的,就是双指针判断然后处理删除的情况,关键在于怎么处理删除的情况需要重点理解,这里体现了根据局部解推出全局解的思想。
class Solution {
public:
bool validPalindrome(string s) {
int left = 0, right = s.size() - 1;
while (left < right) {
if (s[left] != s[right]) {
return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1);
}
left++;
right--;
}
return true;
}
bool isPalindrome(const string& s, int left, int right) {
while (left < right) {
if (s[left] != s[right]) {
return false;
}
left++;
right--;
}
return true;
}
};
标签:right,return,int,++,刷题,prices,贪心,Leetcode,left
From: https://blog.csdn.net/GouDanAndOcean/article/details/142906947