LeetCode—贪心思想
保证每次操作都是局部最优的,从而使最后得到的结果是全局最优的。
1、T455 分发饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int i = 0;
int j = 0;
while(i < g.size() && j < s.size()){
if(g[i] <= s[j]){
i++;
j++;
}
else{
j++;
}
}
return i;
}
};
2、T135 分发糖果
class Solution {
public:
int candy(vector<int>& ratings) {
int length = ratings.size();
vector<int> candy(length, 1);
int num = 0;
for(int i = 1; i < length; i++){
if(ratings[i] > ratings[i-1]){
candy[i] = candy[i-1] + 1;
}
}
for(int i = length-1; i > 0; i--){
if(ratings[i] < ratings[i-1]){
candy[i-1] = max(candy[i-1], candy[i] + 1);
}
}
for(int i = 0; i < length; i++){
num += candy[i];
}
return num;
}
};
3、T435 无重叠区间
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), [](vector<int> a, vector<int> b){
return a[1] < b[1];
});
int out = 0;
int prev = intervals[0][1];
for(int i = 1; i < intervals.size(); i++){
if(intervals[i][0] < prev){
out++;
}
else{
prev = intervals[i][1];
}
}
return out;
}
};
4、T605 种花问题
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int count = 0;
int m = flowerbed.size();
int prev = -1;
for (int i = 0; i < m; ++i) {
if (flowerbed[i] == 1) {
if (prev < 0) {
count += i / 2;
} else {
count += (i - prev - 2) / 2;
}
prev = i;
}
}
if (prev < 0) {
count += (m + 1) / 2;
} else {
count += (m - prev - 1) / 2;
}
return count >= n;
}
};
5、T452 用最少数量的箭引爆气球
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(), points.end());
int ans = 1;
int end = points[0][1];
for(int i = 1; i < points.size(); i++){
if(points[i][0] <= end){
end = min(end, points[i][1]);
}
else{
ans++;
end = points[i][1];
}
}
return ans;
}
};
6、T763 划分字母区间
class Solution {
public:
vector<int> partitionLabels(string s) {
int last[26];
int length = s.size();
for (int i = 0; i < length; i++) {
last[s[i] - 'a'] = i;
}
vector<int> partition;
int start = 0, end = 0;
for (int i = 0; i < length; i++) {
end = max(end, last[s[i] - 'a']);
if (i == end) {
partition.push_back(end - start + 1);
start = end + 1;
}
}
return partition;
}
};
7、T122 买卖股票的最佳时机
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans = 0;
int n = prices.size();
for (int i = 1; i < n; ++i) {
ans += max(0, prices[i] - prices[i - 1]);
}
return ans;
}
};
8、T406 根据身高重建队列
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), [](vector<int> a, vector<int> b){
return a[0] > b[0] || (a[0] == b[0] && a[1] < b[1]);
});
vector<vector<int>> out;
for(vector<int> person : people){
out.insert(out.begin() + person[1], person);
}
return out;
}
};
9、T665 非递减数列
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int count = 0;
for (int i = 1; i < nums.size(); i++) {
if (nums[i] < nums[i - 1]) {
if (i == 1 || nums[i] >= nums[i - 2]) {
nums[i - 1] = nums[i];
} else {
nums[i] = nums[i - 1];
}
count ++;
}
}
return count <= 1;
}
};
10、T121 买卖股票的最佳时机
class Solution {
public:
int maxProfit(vector<int>& prices) {
int out = 0;
int res = prices[0];
for(int i = 1; i < prices.size(); i++){
res = min(res, prices[i]);
out = max(out, prices[i] - res);
}
return out;
}
};
11、T392 判断子序列
class Solution {
public:
bool isSubsequence(string s, string t) {
if(s.length() > t.length()){
return false;
}
int i = 0;
int j = 0;
while(i < s.length() && j < t.length()){
if(s[i] == t[j]){
i++;
j++;
}
else{
j++;
}
}
if(i == s.length()){
return true;
}
else{
return false;
}
}
};
12、T53 最大子序和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 0);
dp[0] = nums[0];
int res = nums[0];
for(int i = 1; i < n; i++){
dp[i] = max(nums[i], nums[i] + dp[i-1]);
res = max(res, dp[i]);
}
return res;
}
};
T1231.
T1247
T45
T621
T376