|

楼主 |
发表于 2019-7-9 14:49:10
|
显示全部楼层
本帖最后由 风扫地 于 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%的用户
- */
复制代码
|
|