代码随想录算法训练营Day31 | 455.分发饼干、376.摆动序列、53.最大子数组和

455.分发饼干

很简单的思路:小孩和饼干分别排个序,逐个匹配即可

确实有那种感觉了:这也叫算法吗?(

int findContentChildren(vector& g, vector& s) {
	std::sort(g.begin(), g.end());
	std::sort(s.begin(), s.end());

	int ans = 0;

	for (int gIndex = 0, sIndex = 0; gIndex < g.size() && sIndex < s.size();) {
		// 吃得饱就吃,吃不饱就看下一块稍大点的够不够吃饱
		if (s[sIndex] >= g[gIndex]) {
			++ans;
			++gIndex;
			++sIndex;
		}
		else {
			++sIndex;
		}
	}
	return ans;
}

376.摆动序列

开始没看清楚题意写成最长连续子序列了、

最长连续子序列

int wiggleMaxLength(vector& nums) {
	if (nums.size() == 1)
		return 1;

	bool pre = false;
	int ans = 1;
	int count = 0;

	for (int i = 1; i < nums.size(); ++i) {
		int diff = nums[i] - nums[i - 1];
		if (diff == 0) {
			count = 0;
			continue;
		}
		bool cur = diff > 0;
		if (count == 0) {
			count = 2;
		}
		else if(pre + cur == 1) {
			++count;
			if (count > ans)
				ans = count;
		}
		else {
			count = 1;
		}
		pre = cur;
	}
	return ans;
}

为了保持连续,需要额外判断什么时候对序列进行切割,参数的初始化也更麻烦。

题意理解错了,就当多做了道扩展题吧(

写完发现不对啊,不需要是连续的。想了半天脑子没转过弯,找了文字解析看到图一眼就明白了:

代码随想录算法训练营Day31 | 455.分发饼干、376.摆动序列、53.最大子数组和_第1张图片

简单来说——计算转折点数量即可 

思路非常简单,但写起来还是有一些细节的,比如diff==0时是需要特殊处理的(我的写法中cur和pre都设置为了bool,>0时为true,false其实对应了<0和==0两种情况,所以需要单独处理)

(写完发现这不比连续子序列简单多了)

int wiggleMaxLength(vector& nums) {
	if (nums.size() == 1)
		return 1;

	bool pre;
	int ans = 1;

	for (int i = 1; i < nums.size(); ++i) {
		int diff = nums[i] - nums[i - 1];
		// 相等直接跳过(解决相等时cur的判定问题)
		if (diff == 0)
			continue;

		bool cur = diff > 0;
		// pre + cur == 1表示两者异或,此时为折角
		if (ans == 1 || pre + cur == 1) {
			++ans;
			// 只有在折角处才更新pre
			pre = cur;
		}
	}
	return ans;
}

53.最大子数组和

(过于简单,不禁感叹中等题间亦有差距)

这题的关键是想明白什么情况下需要切割之前的序列:当 总和小于0当前元素大于总和 时切割之前的序列

(写出来一共没几行,直到AC出来前一刻还在想应该没有这么简单吧)

int maxSubArray(vector& nums) {
	int ans = nums[0];
	int sum = nums[0];

	for (int i = 1; i < nums.size(); ++i) {
		// 当sum小于0且当前值大于sum时舍弃之前的所有元素
		if (sum < 0 && nums[i] > sum)
			sum = nums[i];
		// 其他情况无脑累加即可
		else
			sum += nums[i];
		// 记录过程中的最大值
		if (sum > ans)
			ans = sum;
	}
	return ans;
}

总结

第一天做贪心,感觉是真的奇妙,有思路就简单到怀疑人生,脑子拐不过弯就死活想不出。再品几天看看能不能品出点啥。

你可能感兴趣的:(算法,数据结构)