สมมติว่าเรามีอาร์เรย์จำนวนเต็ม nums และจำนวนเต็ม k ซับอาร์เรย์เรียกว่า "ดี" (nice) ถ้ามีจำนวนคี่เท่ากับ k ต้องการหาจำนวนซับอาร์เรย์ที่ดี
ตัวอย่าง: [1,1,2,1,1], k = 3 ผลลัพธ์: 2 ซับอาร์เรย์คือ [1,1,2,1] และ [1,2,1,1]
ขั้นตอนการแก้ปัญหา (ตำแหน่งของเลขคี่)
ans := 0, n := ขนาดของ nums- เก็บดัชนีของเลขคี่ทั้งหมดไว้ในอาร์เรย์
odd - ถ้า
ขนาดของ odd >= k:- วนลูป
i = 0, j = k-1ถึงขนาดของ odd - 1เพิ่มi, jทีละ 1:left := odd[i] + 1ถ้าi = 0มิฉะนั้นodd[i] - odd[i-1]right := n - odd[j]ถ้าj = ขนาดของ odd - 1มิฉะนั้นodd[j+1] - odd[j]ans := ans + left * right
- วนลูป
- คืนค่า
ans
ตัวอย่างโค้ด (C++)
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numberOfSubarrays(vector<int>& nums, int k) {
int ans = 0;
int n = nums.size();
vector <int> odd;
for(int i = 0; i < n; i++) {
if(nums[i] % 2 == 1) odd.push_back(i);
}
if(odd.size() >= k) {
for(int i = 0, j = k-1; j < odd.size(); i++, j++) {
int left = (i == 0) ? odd[i] + 1 : odd[i] - odd[i-1];
int right = (j == odd.size()-1) ? n - odd[j] : odd[j+1] - odd[j];
ans += left * right;
}
}
return ans;
}
};
int main() {
vector<int> v = {1,1,2,1,1};
Solution ob;
cout << ob.numberOfSubarrays(v, 3);
}
อินพุต
[1,1,2,1,1] 3
เอาต์พุต
2