题解 | 小红的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;
}

全部评论

相关推荐

AAA专业长城贴瓷砖刘大爷:这样的简历我会直接丢进垃圾桶,花里胡哨的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务