java笔试算法 - 两个有序数组的公共部分
题目:两个有序数组的公共部分
坑:大于时间复杂度O(N)算0分
1.无脑遍历
public void FindCom(int[] a,int[] b){
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
if (a[i] == b[j]){
System.out.print(a[i]+" ");
}
}
}
}
时间复杂度O(N*M)
2.二分查找
public boolean binarySearch(int a,int[] b){
int left = 0;
int right = b.length-1;
while (left <= right){
int mid = (left+right)/2;
if (b[mid] > a){
right = mid-1;
}else if (b[mid] < a){
left = mid+1;
}else {
return true;
}
}
return false;
}
public void FindCom(int[] a,int[] b){
for (int i = 0; i < a.length; i++) {
if (binarySearch(a[i],b)){
System.out.print(a[i]+" ");
}
}
}
时间复杂度为O(M*logN)
3.HashHSet
public void FindCom(int[] a,int[] b){
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < a.length; i++) {
hashSet.add(a[i]);
}
for (int i = 0; i < b.length; i++) {
if (hashSet.contains(b[i])){
System.out.print(b[i]+" ");
}
}
}
时间复杂度为O(M+N),空间复杂度为O(M).
4.双指针法
public void FindCom(int[] a,int[] b){
for (int i = 0,j = 0; i < a.length && j < b.length ; ) {
if (a[i] < b[j]){
i++;
}else if (a[i] > b[j]){
j++;
}else {
System.out.print(a[i] + " ");
i++;
j++;
}
}
}
时间复杂度为O(M+N)
测试代码
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6,7,8,9};
int[] b = {1,3,5,7,9};
solution solution = new solution();
solution.FindCom(a,b);
}
总结:
多做,短时间内好方法是想不到的,有了一定的积累量才能快速反应。遇到双数组试者考虑双指针法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?