747_至少是其他数字两倍的最大数
在一个给定的数组nums中,总是存在一个最大元素 。查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。
示例 1:
输入: nums =
输出: 1
解释: 6是最大的整数, 对于数组中的其他整数,
6大于数组中其他元素的两倍。6的索引是1, 所以我们返回1.
示例 2:
输入: nums =
输出: -1
解释: 4没有超过3的两倍大, 所以我们返回 -1.
提示:
nums 的长度范围在.
每个 nums 的整数范围在 .
来源:力扣(LeetCode)
/*方法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>nums)
{
firstMaxIndex = i;
}
}
if(firstMaxIndex==0)
{
secondMaxIndex = 1;
}
for(i=0;i<numsSize;i++)
{
if(i==firstMaxIndex)
{
continue;
}
if(nums>nums)
{
secondMaxIndex = i;
}
}
if(nums >=2*nums)
{
ret_index = firstMaxIndex;
}
}while(0);
return ret_index;
}
/*
执行结果:通过
显示详情
执行用时 :4 ms, 在所有 C 提交中击败了92.81%的用户
内存消耗 :6.9 MB, 在所有 C 提交中击败了79.49%的用户
*/ 本帖最后由 风扫地 于 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>data)
)
{
moreBiggerIndex += 1; /* 更新到右孩子*/
}
if(data<data)
{
temp = data;
data = data;
data = 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;
for(i=1;i<=numsSize;i++)
{
nums_buf = nums;
}
maxHeapify(nums_buf,numsSize);
secondMaxInd = 2;
if( ((secondMaxInd+1)<=numsSize)
&&(nums_buf>nums_buf)
)
{
secondMaxInd++;
}
if(nums_buf >= 2*nums_buf)
{
ret_val = nums_buf;
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==ret_val)
{
ret_val = i;
break;
}
}
}
return ret_val;
}
/*
执行结果:通过
显示详情
执行用时 :4 ms, 在所有 C 提交中击败了92.65% 的用户
内存消耗 :6.9 MB, 在所有 C 提交中击败了80.77%的用户
*/
页:
[1]