classSolution { public: intlengthOfLongestSubstring(string s){ int n = s.size(), res = 0; unordered_map<char, int> hashmap; int l = 0, r = 0; while (r < n) { hashmap[s[r]] ++; while (hashmap[s[r]] > 1) { hashmap[s[l]] --; l ++; } res = max(res, r - l + 1); r ++; } return res; } };
classSolution { public: intnumberOfSubarrays(vector<int>& nums, int k){ // 一旦出现连续 ,就无法先排序了 // 但是可以考虑构造前缀和数组(原数组元素必须为正数 才能保证前缀和数组单调递增!!) 进行双指针或者二分 int res = 0; int cnt = 0, n = nums.size();
int l = 0, r = 0; while (r < n) { if (nums[r ++] & 1) cnt ++; if (cnt == k) { // 以上两条语句保证,进入这个判断语句,当前扫描到的数字一定是奇数 int tmp = r; while (r < n && (nums[r] & 1) == 0) { r ++; // 右指针右移,直到遇到下一个奇数或者越界 } // “1 2 2 1”为例子 r++ 后 r=1,经过循环后r=3 int rightEvenCnt = r - tmp; // 计算当前最后一个奇数右侧的偶数个数 int leftEvenCnt = 0; // 同理,计算当前窗口第一个奇数左侧的偶数个数 while ((nums[l] & 1) == 0) { leftEvenCnt ++; l ++; } // 左右的偶数均可以作为子数组的边界(也可以用奇数做边界) res += (rightEvenCnt + 1) * (leftEvenCnt + 1); l ++; // 破坏当前满足条件的窗口 cnt --; // 由于经过最近一个while循环,此时的nums[l]一定是奇数,相应的cnt要-- } } return res; } };