题解 | 小红的01子序列构造(easy)
小红的01子序列构造(easy)
https://www.nowcoder.com/practice/ee0b6c6baa2642c182df8b4390126f9a
解法参考评论区大佬,虽然用例全能pass,但有个小疑问,l++使num减少,r++使num增大,这样一来一回的过程会不会让num错过k值?
#include <iostream> #include <cmath> using namespace std; typedef long long ll; int main() { ll n, k; cin >> n >> k; string s; cin >> s; ll l = 0, r = 0; //滑动窗口的左右边界 ll zero = 0, one = 0; //用来记录区间里面0和1的数量 ll num = 0; //01子序列的个数 (s[0] == '0') ? ++zero: ++one; //初始化 while(l < n && r < n) { if(num == k) { cout << l+1 << " " << r+1 << endl; return 0; } else if(num < k) { //01对太少了则将窗口右边界增大 ++r; if(s[r] == '0') ++zero; else { //为'1' num += zero; ++one; } } else { //太多了则将窗口左边界增大 if(s[l] == '1') --one; else { num -= one; --zero; } ++l; } } cout << -1 << endl; return 0; }