近日另一友人也去google面试,被问及一算法题如下:
x,y为两个有序数组(升序),长度分别为M和N,矩阵m为一M*N的两维数组,其中m[i][j] = x[i] + y[j]。 设计一算法求矩阵中第K小的元素。
我所想的算法如下,与大家分享交流,看看有什么可以改进的。首先这题让我直觉上就想到了merge sort。其实每个m[i] ( 0<=i<M )本身就是一个升序的一维数组。也就是说m是由M个有序数组组成,只要两两对这两个有序数组做merge sort,取前K个结果即可,代码的时间复杂度应该是O(K * min(M,N) )
import java.util.Arrays;
public class KthInMatrix {
//初始化两个输入的升序数组
static int x[] = {2,4,9,10,23,77};
static int y[] = {6,9,11,22,34,45,78};
static int K = 10;
static int M = x.length;
static int N = y.length;
static int MIN = 0;
static int MAX = 0;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(getKthInMatrix());
}
//找到第K个小的数,如果K大于M*N,返回Integer.MAX_VALUE
public static int getKthInMatrix()
{
printMatrix();
//决定换行merge还是按列merge,按小的那个merge,这里分两个方法做,以减少判断带来的开销
//虽然带码会有些冗余,但应该performance会好点
if ( M > N)
{
MIN = N;
MAX = M;
int[] temp = x;
x = y;
y = temp;
}
else
{
MIN = M;
MAX = N;
}
return mergebyMin();
}
public static int mergebyMin()
{
//存放K个最小的数
int temp[] = new int[K];
int result[] = new int[K];
Arrays.fill( result , Integer.MAX_VALUE);
for (int i = 0 ; i < MIN ; i ++ )
{
int j = 0, k = 0, index = 0;
//j, k , index 分别为游历 m[i] , temp 和 result的坐标 , index < K 保证了 k < K
while (j < MAX && index < K)
{
//计算当前坐标的值
int m = x[i] + y[j];
if ( m < result[k])
{
temp[index ++] = m;
j ++ ;
} else
{
temp[index ++] = result[k ++];
}
}
while ( index < K )
{
if (j < MAX)
temp[index ++] = x[i] + y[j ++];
else
temp[index ++] = result[k ++];
}
result = temp;
temp = new int[K];
}
return result[K-1];
}
//打印下数组m,这个方法是多余的,只是为了输出m的值,以供我们方便用肉眼验证程序的正确性
public static void printMatrix()
{
for ( int i = 0; i < M; i ++)
{
for ( int j = 0; j < N; j ++)
{
System.out.printf("%5d," , x[i]+y[j]);
}
System.out.println();
}
}
}
分享到:
相关推荐
python面试题-2023(面试).docxpython面试题-2023(面试).docxpython面试题-2023(面试).docxpython面试题-2023(面试).docxpython面试题-2023(面试).docxpython面试题-2023(面试).docxpython面试题-2023(面试)....
第378题是关于在有序矩阵中找到第K小的元素,这涉及到数组处理、排序算法以及二分查找等核心概念。下面我们将深入探讨这个问题及其解决方案。 ### 1. 有序矩阵 有序矩阵是指矩阵中的每一行和每一列都是从小到大排列...
上海Linux运维工程师-面试题-个人总结).docx上海Linux运维工程师-面试题-个人总结).docx上海Linux运维工程师-面试题-个人总结).docx上海Linux运维工程师-面试题-个人总结).docx上海Linux运维工程师-面试题-个人总结)...
Shopee前端面试岗-面试题-历年面经 Shopee前端面试岗-面试题-历年面经 Shopee前端面试岗-面试题-历年面经 Shopee前端面试岗-面试题-历年面经 Shopee 前端岗开发面经汇总 本系列将提供Shopee 前端岗位历年面经,所有...
链表的反转、二叉树的遍历(前序、中序、后序)、栈的应用(如括号匹配、表达式求值)等都是常见的面试题。理解并熟练运用这些基本概念,不仅可以提升编程技能,也有助于在面试中脱颖而出。 这个"算法大全-面试题-...
在面试题中,我们可以看到数据分析的应用,例如找到每个国家第三高的山峰。数据分析是指对数据进行处理、转换、分析和解释,以便获取有价值的信息和结论。 * 数据分析步骤:问题定义、数据收集、数据清洁、数据分析...
性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖...
假如你现在有一只小兔子,第四年的时候开始生小兔,以后每年生一只,假设生的都是母兔。请问第N年的时候你有多少兔子
java数据库面试题--个人专用java数据库面试题--个人专用java数据库面试题--个人专用java数据库面试题--个人专用java数据库面试题--个人专用java数据库面试题--个人专用
"j.doc"和"Java陷阱一箩筐----面试题集.doc"很可能包含了面试中常见的陷阱问题,比如Java内存模型、垃圾回收机制、并发编程中的同步与锁,以及优化技巧等。这些问题旨在测试求职者在实际开发中解决问题的能力。 ...
01-Java公司面试真题 02-Java面试文档 03-大数据面试文档 04-Java必知必会108题01-Java公司面试真题 02-Java面试文档 03-大数据面试文档 04-Java必知必会108题01-Java公司面试真题 02-Java面试文档 03-大数据面试...
文档web前端笔试题-面试题-复习题文档web前端笔试题-面试题-复习题
- **找倒数第k个元素**:可以使用双指针,一个指针先向前移动k步,然后两个指针同时移动,当先移动的指针到达末尾时,另一个指针即指向倒数第k个元素。 - **找中间元素**:快慢指针法,快指针每次移动两步,慢指针...
(小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序面试题小程序...
大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-1.mp4 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-2.mp4 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-3.mp4 大厂...
因为字数限制 下面目录只是部分 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-1.mp4 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-2.mp4 大厂面试题第一季-阿里篇-001-P7程序员...
因为字数限制 下面目录只是部分 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-1.mp4 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-2.mp4 大厂面试题第一季-阿里篇-001-P7程序员...
因为字数限制 下面目录只是部分 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-1.mp4 大厂面试题第一季-阿里篇-001-P7程序员面试这样解题数据库索引-2.mp4 大厂面试题第一季-阿里篇-001-P7程序员...
最新各大公司企业真实面试题-面试题(信然公司).doc最新各大公司企业真实面试题-面试题(信然公司).doc最新各大公司企业真实面试题-面试题(信然公司).doc