4个回答
展开全部
给个思路:
从行或者列开始都可以,选择元素数量少的,假设是行,然后遍历第一行找到最大的那个值记为a1,次大的记为a11,同时记下列号c1,c11
再遍历第二行,找出最大的记为a2,次大的记为a22,同时记下列号c2,c22
如果c1等于c2(即同列),比较a1 + a22和a2 + a11,保留值最大的组合
如果c1不等于c2(不同列),则保留a1,a2,淘汰a11和a22
继续遍历,并以此类推,只保存两个最大的且列号不同的值,如果列号相同则取最大值组合,这样就可以保证最后取得的是不同列不同行的和最大的两个值
复杂度应该是两个维度元素的积
仅供参考
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include<stdio.h>
int main()
{
int length[5][5] =
{
{0,1,3,6,8},
{2,6,10,3,14},
{5,6,9,4,8},
{11,15,0,19,3},
{6,18,11,2,2},
};//问题很简单啊,只要找出这个5*5的二维数组中第一大和第二大的数就ok
int NO1,NO2,a,b;
for(int i=0; i<5; i++)
for (int j=0; j<5; j++)
{
a = length[i][j];
b = length[i][j];
b<a;
if(NO1<a)
{
NO1=a;//得到最大的元素
printf("NO1 = %d\n",NO1);
scanf("i = %d j = %d\n",i,j);
}
if(NO2<b)
{
NO2=b;//得到第二大的元素
printf("NO2 = %d\n",NO2);
scanf("i = %d j = %d\n",i,j);
}
}
scanf("NO1 = %d\n",NO1);
scanf("NO2 = %d\n",NO2);
}
int main()
{
int length[5][5] =
{
{0,1,3,6,8},
{2,6,10,3,14},
{5,6,9,4,8},
{11,15,0,19,3},
{6,18,11,2,2},
};//问题很简单啊,只要找出这个5*5的二维数组中第一大和第二大的数就ok
int NO1,NO2,a,b;
for(int i=0; i<5; i++)
for (int j=0; j<5; j++)
{
a = length[i][j];
b = length[i][j];
b<a;
if(NO1<a)
{
NO1=a;//得到最大的元素
printf("NO1 = %d\n",NO1);
scanf("i = %d j = %d\n",i,j);
}
if(NO2<b)
{
NO2=b;//得到第二大的元素
printf("NO2 = %d\n",NO2);
scanf("i = %d j = %d\n",i,j);
}
}
scanf("NO1 = %d\n",NO1);
scanf("NO2 = %d\n",NO2);
}
追问
你 想的太简单了。如果最大和第二大只要在相同行或者相同列就不满足。你这个例子又不能说明全部。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1另开个数组记录数据数组中每个元素的位置(行号,列号)
2将数组中的数据进行排序,在移动数据的同时位置数组也进行相应移动
3选取最大值
4选取最大值后面的次大值
5比较行列号是否满足条件,满足则得到结果
6不满足再去找下一个次大的值进行5
2将数组中的数据进行排序,在移动数据的同时位置数组也进行相应移动
3选取最大值
4选取最大值后面的次大值
5比较行列号是否满足条件,满足则得到结果
6不满足再去找下一个次大的值进行5
更多追问追答
追问
把每个数组全排序显然不可能。数组元素都n^2个了。排序的时间复杂度不满足。
追答
寻找最大值,找到后将其行列值记录,将此值赋值成最小值
找最大值,找到后看其行列是否满足条件,满足则完成计算
不满足,将新找到的值赋值成最小值,重复2
以上是破坏数组数据的方法,如果不想破坏需要新开个数组记录顺序找到的最大值以便比较时排除。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询