首页 > 试题广场 >

矩阵第K小

[编程题]矩阵第K小
  • 热度指数:683 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 的矩阵,每行每列都是升序排列的,请你找到矩阵中第 K 小的元素

数据范围:
示例1

输入

[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]],5

输出

5
示例2

输入

[[1,1,1],[1,1,1],[1,1,1]],5

输出

1
void heapAdjust(int heap[],int i,int n){//调整以i为节点的子树
	int cur=heap[i],j;
	for(j=i*2+1;j<n;j=j*2+1){//建立大根堆才能找到第k小元素
		if(j<n-1&&heap[j]<heap[j+1])//比较兄弟结点的大小
			j++;
		if(cur>=heap[j])
			break;
		heap[i]=heap[j];
		i=j;
	}
	heap[i]=cur;
}
int KthinMatrix(int** matrix, int matrixRowLen, int* matrixColLen, int k ) {
	int** arr=matrix;
	int row=matrixRowLen,col=*matrixColLen;
	int i,j,p=0,n=row*col;
	int* t=(int*)malloc(sizeof(int)*n);

	for(i=0;i<row;i++){//放到一维数组中
		memcpy(t+p*col,arr[i],sizeof(int)*col);
		p++;
	}
	for(i=k/2-1;i>=0;i--){//前k个元素进行堆调整
		heapAdjust(t,i,k);
	}
	for(i=k;i<n;i++){//后面元素一次和堆定元素比较
		if(t[i]<t[0]){
			t[0]=t[i];
			heapAdjust(t,0,k);
		}
	}
	return t[0];
}

发表于 2023-03-16 16:41:06 回复(0)

问题信息

难度:
3条回答 2267浏览

热门推荐

通过挑战的用户

查看代码