这道题之前我想了很久,但是由于思路不对,一直没有很好解决,今晚看到了一个方案,顿时茅塞顿开
先贴上代码
int min = a[0][0];
int minOfRows[rows];
for(i = 0; i < rows; i++)
minOfRows[i] = 0;
minOfRows[0] = 1;
for(i = 1; i < k; i++)
{
min = INT_MAX;
for(j = 0; j < rows; j++)
{
if (minOfRows[j] < cols)
{
if(a[j][minOfRows[j]] < min)
{
min = a[j][minOfRows[j]];
r = j;
}
}
}
minOfRows[r]++;
}
解题思路
1) 对整个数组进行k次扫描
2)每一次扫描都包每一行的最小元素进行比较,找出这次比较中的最小值 min,如果这次找出的元素师在第i行第j列,那么第i行下一次比较就从j+1开始 (譬如说第一次扫描的最小值是0行的0列元素,那么第二次扫描第0行第0列元素就会被排除,第0行从第1列开始比较)
3)当第K次扫描后,所得的min就是整个数组的
思想出处
http://www.careercup.com/question?id=14880812
http://www.careercup.com/question?id=14875828
http://www.careercup.com/question?id=14766667