本次周赛只有第四题难,然后因为忘记链表节点的指针怎么初始化而在第三题花费了大量时间。
总结一下就是:
6248. 统计中位数为 K 的子数组
给你一个长度为 n
的数组 nums
,该数组由从 1
到 n
的 不同 整数组成。另给你一个正整数 k
。
统计并返回 num
中的 中位数 等于 k
的非空子数组的数目。
注意:
- 数组的中位数是按 递增 顺序排列后位于 中间 的那个元素,如果数组长度为偶数,则中位数是位于中间靠 左 的那个元素。
- 例如,
[2,3,1,4]
的中位数是 2
,[8,4,3,5,1]
的中位数是 4
。
- 子数组是数组中的一个连续部分。
示例 1:
输入:nums = [3,2,1,4,5], k = 4
输出:3
解释:中位数等于 4 的子数组有:[4]、[4,5] 和 [1,4,5] 。
示例 2:
输入:nums = [2,3,1], k = 3
输出:1
解释:[3] 是唯一一个中位数等于 3 的子数组。
提示:
-
n == nums.length
-
1 <= n <= 105
-
1 <= nums[i], k <= n
-
nums
中的整数互不相同
Solution
可以将数组按照中位数点分成左右两份,用哈希表存储右边的状态,遍历左边匹配右边。
class Solution {
public:
int countSubarrays(vector<int>& nums, int k) {
unordered_map<int, int> cnt_right;
int n = nums.size();
int t;
for(int i=0;i<n;i++){
if(nums[i]==k){
t = i;
break;
}
}
int cnt = 0;
cnt_right[0]=1;
for(int i=t+1;i<n;i++){
if(nums[i]>nums[t])cnt_right[++cnt]++;
else cnt_right[--cnt]++;
}
cnt = 0;
int res = 0;
for(int i=t;i>=0;i--){
if(nums[i]>nums[t])cnt++;
else if(nums[i]<nums[t])cnt--;
res+=cnt_right[-cnt];
res+=cnt_right[-cnt+1];
}
return res;
}
};
什么时候才能AC啊。。。