链接
题意
可以翻转任意k个0到1,问最长连续的1是多长?这里允许不连续。
思路
题目也可以转换成允许k个0的情况下右边的下标减去左边的下标的最大值是多少?
使用k个翻转的效果一定是大于等k-1翻转的,这里注意k不够的情况;基于此可以使用贪心的思路。
保存0的下标做查询优化
代码
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
vector<int> index;
for (int i = 0; i < nums.size(); ++i)
if (nums[i] == 0)
index.push_back(i);
if (index.size() <= k)
return nums.size();
int ans = index[0];
int l = 0;
while (l + k <= index.size())
{
int r = l + k;
int begin = (l == 0) ? 0 : index[l - 1];
int end = (r == index.size()) ? nums.size() : index[r];
ans = max(ans, end - begin - 1);
l++;
}
return ans;
}
};