LeetCode-贪心算法(分发饼干、摆动序列、最大子数组和、买卖股票的最佳时机 II、跳跃游戏、跳跃游戏 II、K 次取反后最大化的数组和)

455. 分发饼干

代码

方法一:

class Solution {	//455. 分发饼干 遍历孩子  小胃口得到小饼干
public:
	int findContentChildren(vector<int>& g, vector<int>& s) {
		int result = 0;
		sort(g.begin(), g.end());
		sort(s.begin(), s.end());
		int j = 0;
		for (int i = 0; i < g.size(); ++i) {
			while (j < s.size() && g[i] > s[j]) {
				j++;
			}
			if (j >= s.size()) break;
			result++;
			j++;
		}
		return result;
	}
};

方法二:

class Solution {	//455. 分发饼干 遍历饼干 小饼干先喂饱小胃口
public:
	int findContentChildren(vector<int>& g, vector<int>& s) {
		sort(g.begin(), g.end());
		sort(s.begin(), s.end());
		int index = 0;
		for (int i = 0; i < s.size(); ++i) {
			if (index < g.size() && g[index] <= s[i])
				index++;
		}
		return index;
	}
};
int main() {
	vector<int> g = { 1, 2, 3 };
	vector<int> s = { 3 };
	Solution s1;
	int result = s1.findContentChildren(g, s);
	printf("%d\n", result);
	return 0;
}

376. 摆动序列

代码

class Solution {	//376. 摆动序列	计算峰值的个数
public:
	int wiggleMaxLength(vector<int>& nums) {
		if (nums.size() <= 1)return nums.size();
		int result = 1;
		int curDiff = 0;
		int preDiff = 0;
		for (int i = 0; i < nums.size() - 1; ++i) {
			curDiff = nums[i + 1] - nums[i];
			if ((preDiff <= 0 && curDiff>0) || (preDiff >= 0 && curDiff < 0)) {
				result++;
				preDiff = curDiff;
			}
		}
		return result;
	}
};

53. 最大子数组和

代码

class Solution {	//53. 最大子数组和	累加和 一旦累加和小于0,就重新开始计算
public:
	int maxSubArray(vector<int>& nums) {
		int result = INT_MIN;
		int count = 0;
		for (int i = 0; i < nums.size(); ++i) {
			count += nums[i];
			if (result < count) {
				result = count;
			}
			if (count <= 0) count = 0;
		}
		return result;
	}
};

122. 买卖股票的最佳时机 II

代码

class Solution {	//122. 买卖股票的最佳时机 II	画一个折线图,只计算上升部分的值
public:
	int maxProfit(vector<int>& prices) {
		int result = 0;
		for (int i = 1; i < prices.size(); ++i) {
			result += max(prices[i] - prices[i - 1], 0);
		}
		return result;
	}
};

int main() {
	vector<int> prices = { 7, 6, 4, 3, 1 };
	Solution s;
	int result = s.maxProfit(prices);
	printf("%d\n", result);
	return 0;
}

55. 跳跃游戏

代码

class Solution {	//55. 跳跃游戏 每次取最大跳跃步数(最大跳跃范围),然后每次移动一步,更新最大跳跃范围,看最后能否覆盖终点
public:
	bool canJump(vector<int>& nums) {
		int range = nums[0];
		if (range == 0 && nums.size() > 1) return false;
		for (int i = 1; i < nums.size(); ++i) {
			if (i + nums[i] > range) {	
				range = i + nums[i];
			}
			if (i != nums.size()-1 && range <= i)return false;
		}
		return true;
	}
};

int main() {
	vector<int> nums = { 3, 2, 1, 0, 4 };
	Solution s;
	bool result = s.canJump(nums);
	cout << result << endl;
	return 0;
}

45. 跳跃游戏 II

代码

class Solution {	//45. 跳跃游戏 II	
public:
	int jump(vector<int>& nums) {	//移动下标,到达当前最远距离下标时,还没到终点,步数就加1,来增加覆盖距离
		if (nums.size() == 1)return 0;
		int curDistance = 0;
		int ans = 0;
		int nextDistance = 0;
		for (int i = 0; i < nums.size(); ++i) {
			nextDistance = max(i + nums[i], nextDistance);
			if (i == curDistance) {
				if (curDistance != nums.size() - 1) {
					ans++;
					curDistance = nextDistance;
					if (nextDistance >= nums.size() - 1) break;
				}
				else break;
			}
		}
		return ans;
	}
};

1005. K 次取反后最大化的数组和

代码

class Solution {	//1005. K 次取反后最大化的数组和  
	//首先对数组排序,j从下标0开始,循环k次,如果nums[j]为负数,变为正数,j++;
	//如果nums[j]=0,剩余次数全都给0,跳出;
	//如果nums[j]>0,将数组重新排序,选择最小的值,也就是第一个值,将剩余次数全部给第一个值,跳出
	//注意:如果数组全为负数,可能出出现将所有负数全部转为正数之后还有次数,此时让j变为0,从头开始继续将剩余次数选择完,其实就是将剩余次数全部给此时数组中的最小值
public:
	int largestSumAfterKNegations(vector<int>& nums, int k) {
		int sum = 0;
		sort(nums.begin(), nums.end());
		int j = 0;
		for (int i = 0; i < k; i++) {
			if (j >= nums.size())j = 0;
			if (nums[j] < 0) {
				nums[j] = -nums[j];
				j++;
			}
			else if (nums[j] == 0) break;
			else if (nums[j] > 0){
				sort(nums.begin(), nums.end());
				j = 0;
				if ((k - i) % 2 != 0) {
					nums[j] = -nums[j];
				}
				break;
			}
		}
		for (int i = 0; i < nums.size(); i++) {
			sum += nums[i];
		}
		return sum;
	}
};

int main() {
	vector<int> nums = { -4,-2,-3 };
	int k = 4;
	Solution s;
	int result = s.largestSumAfterKNegations(nums, k);
	cout << result << endl;
	return 0;
}

参考资料:

代码随想录

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海螺蜜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值