鱼C论坛

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

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

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

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

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

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

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

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

示例 1:

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

 

示例 2:

输入: nums = [1, 2, 3, 4]
输出: -1
解释: 4没有超过3的两倍大, 所以我们返回 -1.
提示:
    nums 的长度范围在[1, 50].
    每个 nums[i] 的整数范围在 [0, 99].
来源:力扣(LeetCode)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-7-9 14:46:39 | 显示全部楼层
/*方法1:常规方法,两次循环找最大第二大数对应的index,然后比较.*/
int dominantIndex(int* nums, int numsSize)
{
    int ret_index       =   -1  ;
    int firstMaxIndex   =   0   ;
    int secondMaxIndex  =   0   ;
    int i               =   0   ;
    
    do
    {    
        if(numsSize == 1)
        {
            ret_index = 0;
            break;
        }
        for(i = 0; i < numsSize ; i++)
        {
            if(nums[i]>nums[firstMaxIndex])
            {
                firstMaxIndex = i;
            }
        }
        
        if(firstMaxIndex==0)
        {
            secondMaxIndex = 1;
        }
        
        for(i=0;i<numsSize;i++)
        {
            if(i==firstMaxIndex)
            {
                continue;
            }
            
            if(nums[i]>nums[secondMaxIndex])
            {
                secondMaxIndex = i;
            }
        }
        if(nums[firstMaxIndex] >=2*nums[secondMaxIndex])
        {
            ret_index = firstMaxIndex;
        }
    }while(0);


    return ret_index;
}

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

使用道具 举报

 楼主| 发表于 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%的用户
*/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 03:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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