著者: シャオシュン
出典: LeetCode
著作権は作者に帰属します。商業的転載の場合は著者に連絡して承認を求め、非商業的転載の場合は出典を明記してください。
トピック
例
一連の考え
タイトル -> 配列を指定して、中央値が k である部分配列の数を返します。
中央値が k の部分配列に等しい場合、条件を満たす部分配列を k の位置を中心に数えなければなりません。トピックは、k より大きい数値が k より小さい数値に等しいか、または等しいことを知っているため、カウントの便宜上、寄与率は 1 より大きく、寄与率 -1 より小さく、寄与率自体は 0 になります。
このようにして、プレフィックスの合計がカウントされ、k ビットが終了ビットとして使用され、左側の開始ビットのカウントが考慮され、合計は現在の値と現在の値から 1 を引いた値に等しくなります。つまり、k の後の区間の合計は 0,1 です。
コード
typedef struct {//哈希结构
int key;
int val;
UT_hash_handle hh;
} HashItem;
HashItem *hashFindItem(HashItem **obj, int key) {//查询key
HashItem *pEntry = NULL;
HASH_FIND_INT(*obj, &key, pEntry);
return pEntry;
}
bool hashAddItem(HashItem **obj, int key, int val) {//添加哈希结构
if (hashFindItem(obj, key)) {
return false;
}
HashItem *pEntry = (HashItem *)malloc(sizeof(HashItem));
pEntry->key = key;
pEntry->val = val;
HASH_ADD_INT(*obj, key, pEntry);
return true;
}
bool hashSetItem(HashItem **obj, int key, int val) {//设置哈希结构
HashItem *pEntry = hashFindItem(obj, key);
if (!pEntry) {
hashAddItem(obj, key, val);
} else {
pEntry->val = val;
}
return true;
}
int hashGetItem(HashItem **obj, int key, int defaultVal) {//获取哈希结构
HashItem *pEntry = hashFindItem(obj, key);
if (!pEntry) {
return defaultVal;
}
return pEntry->val;
}
void hashFree(HashItem **obj) {//销毁哈希表
HashItem *curr = NULL, *tmp = NULL;
HASH_ITER(hh, *obj, curr, tmp) {
HASH_DEL(*obj, curr);
free(curr);
}
}
static inline int sign(int num) {//取大小贡献
if (num == 0) {
return 0;
}
return num > 0 ? 1 : -1;
}
int countSubarrays(int* nums, int numsSize, int k) {
int kIndex = -1;
for (int i = 0; i < numsSize; i++) {//找k位置
if (nums[i] == k) {
kIndex = i;
break;
}
}
int ans = 0;
HashItem *counts = NULL;
hashAddItem(&counts, 0, 1);//入哈希表
int sum = 0;
for (int i = 0; i < numsSize; i++) {//遍历
sum += sign(nums[i] - k);
if (i < kIndex) {//小于k的位置
hashSetItem(&counts, sum, hashGetItem(&counts, sum, 0) + 1);
} else {//大于k的位置
int prev0 = hashGetItem(&counts, sum, 0);
int prev1 = hashGetItem(&counts, sum - 1, 0);//取贡献值
ans += prev0 + prev1;
}
}
hashFree(&counts);
return ans;
}
作者:小迅
链接:https://leetcode.cn/problems/count-subarrays-with-median-k/solutions/2172155/ha-xi-qian-zhui-he-zhu-shi-chao-ji-xiang-hgpu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。