当前位置: 首页 > 面试题库 >

我们如何有效地从数组中找到第二个最大值?

杨利
2023-03-14
问题内容

是否可以通过仅遍历整数数组从整数数组中找到第二个最大数字?

例如,我有一个由五个整数组成的数组,我想从中找到第二个最大数字。这是我在采访中进行的尝试:

#define MIN -1
int main()
{
    int max=MIN,second_max=MIN;
    int arr[6]={0,1,2,3,4,5};
    for(int i=0;i<5;i++){
        cout<<"::"<<arr[i];
    }
    for(int i=0;i<5;i++){
        if(arr[i]>max){
            second_max=max;
            max=arr[i];          
        }
    }
    cout<<endl<<"Second Max:"<<second_max;
    int i;
    cin>>i;
    return 0;
}

但是,访调员提出了测试用例int arr[6]={5,4,3,2,1,0};,这阻止了它if第二次进入条件。我对面试官说,唯一的方法是将数组解析两次(两个for循环)。有人有更好的解决方案吗?


问题答案:

你的初始化maxsecond_max-1有缺陷。如果数组具有类似的值{-2,-3,-4}怎么办?

相反,您可以做的是获取数组的前2个元素(假设数组至少包含2个元素),将它们进行比较,将较小的一个分配给second_max,将较大的一个分配给max

if(arr[0] > arr[1]) {
 second_max = arr[1];
 max = arr[0];
} else {
 second_max = arr[0];
 max = arr[1];
}

然后从第三个元素开始进行比较,maxsecond_max根据需要更新和/或:

for(int i = 2; i < arr_len; i++){
    // use >= n not just > as max and second_max can hav same value. Ex:{1,2,3,3}   
    if(arr[i] >= max){  
        second_max=max;
        max=arr[i];          
    }
    else if(arr[i] > second_max){
        second_max=arr[i];
    }
}


 类似资料:
  • 从一个布尔数组中找到第i个布尔值,例如:数组是{true, true, false, false, true},该方法将输出int,显示第3个true值,即4。 我已经尝试过一些代码,它可以工作,但我需要使用递归,而不是while函数。

  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?

  • 问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条

  • 我正在制作一个数组,它从1-100生成随机数。然后,在最后,我将从列表中输出最大值和最小值。但是,我不知道如何找到/调用max和min,我尝试使用math方法函数(如math.min()),但我认为它对数组不起作用。这是我的代码(下划线是我想要调用最大值和最小值的地方,但我不知道如何调用)。 }

  • 问题内容: 我只是在练习一些MIT Java作业。但是,我不确定如何找到第二大数字。http://ocw.csail.mit.edu/f/13 问题答案: 仅对数组进行排序以查找订单统计信息太浪费了。您可以通过遵循与现有算法相似的算法找到第二大元素,并使用一个代表第二大数字的附加变量。 当前,下一个元素可以大于最大值或等于/小于最大值,因此单个元素就足够了: 考虑两个变量,下一个元素可能是 大于最

  • 问题内容: 假设我在NumPy中有一个包含连续微分函数求值的数组,我想找到局部最小值。没有噪音,因此每个点的值都低于其所有邻居的值都满足我的局部最小值标准。 我有以下列表推导,适用于二维数组,忽略了边界上的潜在最小值: 但是,这很慢。我也想使它适用于任意数量的尺寸。例如,是否有一种简单的方法来获取任何维度数组中的点的所有邻居?还是我完全以错误的方式来解决这个问题?我应该改用吗? 问题答案: 可以使

  • 问题内容: 假设我有一个对象数组。并且对象具有属性。除了逐一读取对象并逐一比较值之外,是否还有其他捷径可做?谢谢。 问题答案: 您可以简单地将用户数组映射到用户年龄数组和查找最大年龄数组:

  • 问题内容: 我试过函数,但它给出了声明的值。该函数给出一个错误。 码: 输出在这里,我需要数组中的全部项目(即)。 问题答案: Go中的数组是固定大小的:在Go中创建数组后,以后就无法更改其大小。这是这样一种程度,即一个阵列的长度是阵列类型的一部分(这意味着类型和2层不同的类型)。就是说,某种数组类型的值的长度始终是相同的,并且由其类型决定。例如,类型为array的值的长度始终为,(可以使用内置函