小信的社交 [题解]

我们需要在给定的椅子布局中,找到最多可以坐多少个人,且每个人之间保持至少长度为 k 的距离。具体来说,如果某个椅子被占用(即字符为 ‘1’),那么其左右 k 范围内的椅子都不能再坐人。

解题思路
遍历椅子:从左到右遍历每个椅子。

检查是否可坐:对于每个空闲的椅子(即字符为 ‘0’),检查其左右 k 范围内是否有被占用的椅子。

标记占用:如果当前椅子可以坐人,则将其标记为占用(即将其字符改为 ‘1’),并增加可坐人数。

跳过不可坐的椅子:如果当前椅子不可坐,则跳过。

复杂度分析
时间复杂度:对于每组数据,最坏情况下需要遍历每个椅子,并且对于每个椅子检查 2k 范围内的椅子,因此时间复杂度为 O(n * k)。

空间复杂度:只使用了常数级别的额外空间,因此空间复杂度为 O(1)。

优化思路
由于 k 的范围可能较大,上述方法在最坏情况下可能会超时。可以考虑使用滑动窗口或前缀和等方法来优化检查范围的过程,从而将时间复杂度降低到 O(n)。

优化后的代码

		cin>>n>>k;
		for(int i=0;i<n;i++){
			char s;
			cin>>s;
			a[i]=s-'0';
			b[i]=0;//初始化前缀和数组
		}
		for(int i=0;i<n;i++){
			if(a[i]==1){
				。。。。。。//将不能坐人的位置标记
			}
		}
		for(int i=1;i<n;i++) ......//前缀和
		int f=-2147483647;
		......//遍历数组,寻找合法位置
		cout<<ans<<endl;

优化后的代码解释
b数组:记录每个位置左边最近的被占用的椅子的位置。

从右到左遍历:检查右边 k 范围内是否有被占用的椅子。

判断是否可以坐人:如果当前椅子左右 k 范围内都没有被占用的椅子,则可以坐人。

优化后的复杂度分析
时间复杂度:O(n),因为我们只需要遍历两次椅子数组。

空间复杂度:O(n),用于存储 b 数组。

通过这种优化,我们可以显著提高算法的效率,尤其是在 k 较大的情况下。

2 个赞

image

1 个赞

哎呀错别字而已

1 个赞

就是比较离谱

1 个赞

:face_with_raised_eyebrow:

1 个赞

建议改一下

1 个赞

好的

1 个赞

不是,你是不是想刷赞啊

1 个赞

刷赞有打卡贴

1 个赞

嘿嘿,我也来刷

1 个赞