本帖最后由 风扫地 于 2019-7-10 22:01 编辑
方法2: 将原始数据heapify为大顶堆,取堆顶和孩子节点中较大的值,然后找出最值和第二大的值做做比較,若比較成功,在通過最值去查詢索引
显然,也可以使用索引堆降低查询索引的时间,此处未实现。
void __shift_down(int* data, int size, int ind)
{
int moreBiggerIndex = 0;
int temp = 0;
while(2*ind<=size) /* 有左孩子就是有孩子*/
{
moreBiggerIndex = 2*ind;
if( (moreBiggerIndex+1<=size)
&&(data[moreBiggerIndex+1]>data[moreBiggerIndex])
)
{
moreBiggerIndex += 1; /* 更新到右孩子*/
}
if(data[ind]<data[moreBiggerIndex])
{
temp = data[ind];
data[ind] = data[moreBiggerIndex];
data[moreBiggerIndex] = temp;
ind = moreBiggerIndex;
}
else
{
break;
}
}
}
void maxHeapify(int* nums , int size)
{
int i = 0;
for(i=size/2;i>=1;i--)
{
__shift_down(nums,size,i);
}
}
/*方法2:将原始数据heapify为大顶堆,取堆顶和孩子节点中较大的值,然后找出最值和第二大的值做做比較,若比較成功,在通過最值去查詢索引
显然,也可以使用索引堆降低查询索引的时间,此处未实现。
*/
int dominantIndex(int* nums, int numsSize)
{
int ret_val = -1;
int* nums_buf = NULL;
int i = 0;
int secondMaxInd = 0;
int finded = 0;
do
{
if(numsSize == 1)
{
ret_val = 0;
break;
}
nums_buf = (int*)malloc(sizeof(int)*(numsSize+1));
if(nums_buf==NULL)
{
break;
}
nums_buf[0] = 0;
for(i=1;i<=numsSize;i++)
{
nums_buf[i] = nums[i-1];
}
maxHeapify(nums_buf,numsSize);
secondMaxInd = 2;
if( ((secondMaxInd+1)<=numsSize)
&&(nums_buf[secondMaxInd+1]>nums_buf[secondMaxInd])
)
{
secondMaxInd++;
}
if(nums_buf[1] >= 2*nums_buf[secondMaxInd])
{
ret_val = nums_buf[1];
finded = 1;
}
}while(0);
if(nums_buf!=NULL)
{
free(nums_buf);
nums_buf = NULL;
}
if(finded!=0)
{
for(i=0;i<numsSize;i++)
{
if(nums[i]==ret_val)
{
ret_val = i;
break;
}
}
}
return ret_val;
}
/*
执行结果:通过
显示详情
执行用时 :4 ms, 在所有 C 提交中击败了92.65% 的用户
内存消耗 :6.9 MB, 在所有 C 提交中击败了80.77%的用户
*/
|