2024年6月8日 星期六

[1296] Divide Array in Sets of K Consecutive Numbers

姐妹題來了~結果用C 寫hash table 真是許多眉角= =

之一是 看別人寫法,sorting 完之後,算每個數字出現的次數時,最後會順便回填原本的array,也就是remove duplicate 的意思,所以做完會變成:
1. 原本的array 由小排到大,但每個數字只會出現一次。
2. hash array存了每個數字出現的次數,這裡的index 跟原本的array 現在會變成mapping的狀態。

然後就是要算 k個相鄰是不是分別差1 ,且出現的頻率夠不夠扣掉這樣。
原本的寫法是比較多if xxxx return false的,後來發現可以合起來(?)
但這樣寫了雖然行數比較少,但以後回來看一定看不懂吧哈哈哈(奔入雨中)
int comp(const void *a, const void *b)
{
return (*(int*)a - *(int*)b);
}

bool isPossibleDivide(int* nums, int numsSize, int k) {
if (numsSize%k !=0)
return false;
qsort(nums, numsSize, sizeof(int), comp);
int *hash = calloc (numsSize, sizeof(int));
int idx = 0;
int now = nums[0];
for (int i=0; i< numsSize; i++)
{
if (nums[i]== nums[idx])
hash[idx]++;
else
{
idx++;
hash[idx]++;
nums[idx] = nums[i];
}
}
int hash_len = idx+1;
if (k>hash_len)
return false;
else if (k==1)
return true;

idx = 0;
for (int i=0; i< numsSize/k; i++)
{
while (idx < hash_len && hash[idx]==0)
idx++;

if (idx ==hash_len)
return true;
for (int j=0; j<k-1; j++)
{
if (nums[idx+j+1]-nums[idx+j] != 1 || hash[idx+k-1] <=0 || hash[idx+j]<=0)
return false;
hash[idx+j]--;
}
hash[idx+k-1]--;
}
return true;
}

沒有留言:

張貼留言