鱼C论坛

 找回密码
 立即注册
查看: 1958|回复: 2

[技术交流] 747_至少是其他数字两倍的最大数

[复制链接]
发表于 2019-7-9 14:42:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. 在一个给定的数组nums中,总是存在一个最大元素 。

  2. 查找数组中的最大元素是否至少是数组中每个其他数字的两倍。

  3. 如果是,则返回最大元素的索引,否则返回-1。

  4. 示例 1:

  5. 输入: nums = [3, 6, 1, 0]
  6. 输出: 1
  7. 解释: 6是最大的整数, 对于数组中的其他整数,
  8. 6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.



  9. 示例 2:

  10. 输入: nums = [1, 2, 3, 4]
  11. 输出: -1
  12. 解释: 4没有超过3的两倍大, 所以我们返回 -1.
  13. 提示:
  14.     nums 的长度范围在[1, 50].
  15.     每个 nums[i] 的整数范围在 [0, 99].
  16. 来源:力扣(LeetCode)

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-9 14:46:39 | 显示全部楼层
  1. /*方法1:常规方法,两次循环找最大第二大数对应的index,然后比较.*/
  2. int dominantIndex(int* nums, int numsSize)
  3. {
  4.     int ret_index       =   -1  ;
  5.     int firstMaxIndex   =   0   ;
  6.     int secondMaxIndex  =   0   ;
  7.     int i               =   0   ;
  8.    
  9.     do
  10.     {   
  11.         if(numsSize == 1)
  12.         {
  13.             ret_index = 0;
  14.             break;
  15.         }
  16.         for(i = 0; i < numsSize ; i++)
  17.         {
  18.             if(nums[i]>nums[firstMaxIndex])
  19.             {
  20.                 firstMaxIndex = i;
  21.             }
  22.         }
  23.         
  24.         if(firstMaxIndex==0)
  25.         {
  26.             secondMaxIndex = 1;
  27.         }
  28.         
  29.         for(i=0;i<numsSize;i++)
  30.         {
  31.             if(i==firstMaxIndex)
  32.             {
  33.                 continue;
  34.             }
  35.             
  36.             if(nums[i]>nums[secondMaxIndex])
  37.             {
  38.                 secondMaxIndex = i;
  39.             }
  40.         }
  41.         if(nums[firstMaxIndex] >=2*nums[secondMaxIndex])
  42.         {
  43.             ret_index = firstMaxIndex;
  44.         }
  45.     }while(0);


  46.     return ret_index;
  47. }

  48. /*
  49. 执行结果:通过
  50. 显示详情
  51. 执行用时 :4 ms, 在所有 C 提交中击败了92.81%的用户
  52. 内存消耗 :6.9 MB, 在所有 C 提交中击败了79.49%的用户
  53. */
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-9 14:49:10 | 显示全部楼层
本帖最后由 风扫地 于 2019-7-10 22:01 编辑

方法2: 将原始数据heapify为大顶堆,取堆顶和孩子节点中较大的值,然后找出最值和第二大的值做做比較,若比較成功,在通過最值去查詢索引
显然,也可以使用索引堆降低查询索引的时间,此处未实现。

  1. void __shift_down(int* data, int size, int ind)
  2. {
  3.     int moreBiggerIndex =   0;
  4.     int temp            =   0;
  5.     while(2*ind<=size) /* 有左孩子就是有孩子*/
  6.     {
  7.         moreBiggerIndex = 2*ind;
  8.         if(  (moreBiggerIndex+1<=size)
  9.            &&(data[moreBiggerIndex+1]>data[moreBiggerIndex])
  10.         )
  11.         {
  12.             moreBiggerIndex += 1; /* 更新到右孩子*/   
  13.         }
  14.         
  15.         if(data[ind]<data[moreBiggerIndex])
  16.         {
  17.             temp = data[ind];
  18.             data[ind] = data[moreBiggerIndex];
  19.             data[moreBiggerIndex] = temp;
  20.             ind = moreBiggerIndex;
  21.         }
  22.         else
  23.         {
  24.             break;
  25.         }

  26.     }
  27. }

  28. void maxHeapify(int* nums , int size)
  29. {
  30.     int i = 0;
  31.     for(i=size/2;i>=1;i--)
  32.     {
  33.         __shift_down(nums,size,i);
  34.     }
  35.    
  36. }

  37. /*方法2:将原始数据heapify为大顶堆,取堆顶和孩子节点中较大的值,然后找出最值和第二大的值做做比較,若比較成功,在通過最值去查詢索引
  38. 显然,也可以使用索引堆降低查询索引的时间,此处未实现。

  39. */
  40. int dominantIndex(int* nums, int numsSize)
  41. {
  42.     int     ret_val         = -1;
  43.     int*    nums_buf        = NULL;
  44.     int     i               = 0;
  45.     int     secondMaxInd    = 0;
  46.     int     finded          = 0;
  47.     do
  48.     {
  49.         if(numsSize == 1)
  50.         {
  51.             ret_val = 0;
  52.             break;
  53.         }
  54.         
  55.         nums_buf = (int*)malloc(sizeof(int)*(numsSize+1));
  56.         if(nums_buf==NULL)
  57.         {
  58.             break;
  59.         }
  60.         nums_buf[0] = 0;
  61.         for(i=1;i<=numsSize;i++)
  62.         {
  63.             nums_buf[i] = nums[i-1];
  64.         }
  65.         
  66.         maxHeapify(nums_buf,numsSize);
  67.         secondMaxInd = 2;
  68.         if(   ((secondMaxInd+1)<=numsSize)
  69.             &&(nums_buf[secondMaxInd+1]>nums_buf[secondMaxInd])
  70.         )
  71.         {
  72.             secondMaxInd++;
  73.         }
  74.         
  75.         if(nums_buf[1] >= 2*nums_buf[secondMaxInd])
  76.         {
  77.             ret_val = nums_buf[1];
  78.             finded = 1;
  79.         }

  80.         
  81.     }while(0);
  82.    
  83.    
  84.    
  85.     if(nums_buf!=NULL)
  86.     {
  87.         free(nums_buf);
  88.         nums_buf = NULL;
  89.     }
  90.    
  91.     if(finded!=0)
  92.     {
  93.         for(i=0;i<numsSize;i++)
  94.         {
  95.             if(nums[i]==ret_val)
  96.             {
  97.                 ret_val = i;
  98.                 break;
  99.             }
  100.         }
  101.     }
  102.     return ret_val;
  103. }


  104. /*
  105. 执行结果:通过
  106. 显示详情
  107. 执行用时 :4 ms, 在所有 C 提交中击败了92.65% 的用户
  108. 内存消耗 :6.9 MB, 在所有 C 提交中击败了80.77%的用户
  109. */
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表