4月打卡活动第21天 LeetCode第1248题:统计优美数组(中等)
- 题目:给你一个整数数组 nums 和一个整数 k。
如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。
请返回这个数组中「优美子数组」的数目。
- 解题思路:竟然忘记了双指针。。
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int ans = 0;
int num = 0;
int start = 0;
int end = 0;
int numS = -1;
int numE = 0;
for(int i=0;numE<nums.length;i++){
i = numS+1;
while(i<nums.length && nums[i]%2 == 0){
start++;
i++;
}
numS = i;
while(i<nums.length && num<k){
if(nums[i]%2 != 0){
num++;
}
i++;
}
while(i<nums.length && nums[i]%2 == 0){
end++;
i++;
}
numE = i;
if(num == k){
ans += (start+1)*(end+1);
start = 0;
end = 0;
num = 0;
}
}
return ans;
}
}
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int left = 0, right = 0, oddCnt = 0, res = 0;
while (right < nums.length) {
if ((nums[right++] & 1) == 1) {
oddCnt++;
}
if (oddCnt == k) {
int tmp = right;
while (right < nums.length && (nums[right] & 1) == 0) {
right++;
}
int rightEvenCnt = right - tmp;
int leftEvenCnt = 0;
while ((nums[left] & 1) == 0) {
leftEvenCnt++;
left++;
}
res += (leftEvenCnt + 1) * (rightEvenCnt + 1);
left++;
oddCnt--;
}
}
return res;
}
}
作者:sweetiee
链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays/solution/hua-dong-chuang-kou-qian-zhui-he-bi-xu-miao-dong-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public int numberOfSubarrays(int[] nums, int k) {
int[] prefixCnt = new int[nums.length + 1];
prefixCnt[0] = 1;
int res = 0, sum = 0;
for (int num: nums) {
sum += num & 1;
prefixCnt[sum]++;
if (sum >= k) {
res += prefixCnt[sum - k];
}
}
return res;
}
}
作者:sweetiee
链接:https://leetcode-cn.com/problems/count-number-of-nice-subarrays/solution/hua-dong-chuang-kou-qian-zhui-he-bi-xu-miao-dong-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。