两度理解错了题意,后面发现[2,1]与[1,2]其实都符合要求,首先子数组需要连续,并且子数组可以无序:
class Solution {
public:
/*
int count(int m,int n) {
int x = 1;
int y = m;
if (n == 0) {
return 1;
}
for (int i = 1; i < n; i++) {
x = x * i;
y = y * (m - i);
}
return y / x;
}
*/
int countSubarrays(vector<int>& nums, int k) {
int n = nums.size();
vector<int> temp;
bool is_k = false;
int left = 0;
int right = 0;
for (int i = 0; i < n; i++) {
if (is_k) {
if (nums[i] > k) {
right++;
temp.push_back(nums[i]);
}
}
else {
if (nums[i] == k) {
temp.push_back(nums[i]);
is_k = true;
}
else if(nums[i] < k) {
left++;
temp.push_back(nums[i]);
}
}
}
if (left == 0) {
return right + 1;
}
if (right == 0) {
return 1;
}
if(left >= right){
return 2 * right + 1;
}
else{
return 2 * left + 2;
}
/*
int num = 1;
int res = 1;
while (num <= left && num <= right) {
res += count(left, num)* count(right, num) + count(left, num - 1) * count(right, num);
num++;
}
*/
}
};
正解:
class Solution {
public:
int countSubarrays(vector<int>& nums, int k) {
unordered_map<int, int> cnt;
cnt[0] = 1;
int sum = 0, ans = 0, start = 0;
for (int i = 0; i < nums.size();i++) {
if (nums[i] > k)
sum++;
else if (nums[i] < k)
sum--;
if (start || nums[i] == k) {
if (nums[i] == k)
start = 1;
ans += cnt[sum] + cnt[sum - 1];
}
else
++cnt[sum];
}
return ans;
}
};
想法:很久没碰过C++了,对哈希表操作很不熟悉了