问题: 给你两个排序的数组,求两个数组的交集。

比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5,n是a数组大小,m是b数组大小。

思路:

(1)从b数组遍历取值,然后把值与a数组的每一个值进行比较,如果有相等的,就保存下来,直到ab全部遍历完,这样时间复杂度就是O(nm)。

(2)把上面的改进一下,我们在把b里面的值与a比较时,我们采取二分搜索的方式(因为数组都是有序的),这样的话时间复杂度就会变为O(mlogn),如果a数组更小的话,我们会取a数组的值去和b比较,这样的话就是O(nlogm)。

(3)要做到O(n+m),上面两种显然是不可以的,这时我们采取双指针的方式,因为数组A B均排过序,所以,我们可以用两个“指针”分别指向两个数组的头部,如果其中一个比另一个小,移动小的那个数组的指针;如果相等,那么那个值是在交集里,保存该值,这时,同时移动两个数组的指针。一直这样操作下去,直到有一个指针已经超过数组范围。

代码如下:

public List<Integer> intersection(int[] A, int[] B) {
if (A == null || B == null || A.length == 0 || B.length == 0)
return null;
ArrayList<Integer> list = new ArrayList<Integer>();
int pointerA = 0;
int pointerB = 0;
while (pointerA != A.length && pointerB != B.length) {
if (A[pointerA] > B[pointerB]) {
pointerB++;
} else if (A[pointerA] < B[pointerB]) {
pointerA++;
} else {
list.add(A[pointerA]);
pointerA++;
pointerB++;
}
}
return list;
}

并集代码如下:

public List<Integer> union(int[] A, int[] B) {
if (A == null || B == null || A.length == 0 || B.length == 0)
return null;
ArrayList<Integer> list = new ArrayList<Integer>();
int pointerA = 0;
int pointerB = 0;
while (pointerA < A.length && pointerB < B.length) {
if (A[pointerA] > B[pointerB]) {
list.add(B[pointerB]);
pointerB++;
} else if (A[pointerA] < B[pointerB]) {
list.add(A[pointerA]);
pointerA++;
} else {
list.add(A[pointerA]);
pointerA++;
pointerB++;
}
}
// 退出来之后,把剩余的继续添加
while (pointerB <= B.length - 1) {
list.add(B[pointerB]);
pointerB++;
}
while (pointerA <= A.length - 1) {
list.add(A[pointerA]);
pointerA++;
}
return list;
}

  

求两个排序数组的交集和并集----时间复杂度O(n+m)的更多相关文章

  1. 求两个排序数组中位数 C++

    题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个有序数组的中位数.要求算法的时间复杂度为 O(log (m+n)) . 你可以假设 nums1 和 nu ...

  2. LeetCode:4_Median of Two Sorted Arrays | 求两个排序数组的中位数 | Hard

    题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  3. Leetcode4--->求两个排序数组的中位数

    题目:给定两个排序数组,求两个排序数组的中位数,要求时间复杂度为O(log(m+n)) 举例: Example 1: nums1 = [1, 3] nums2 = [2] The median is ...

  4. 2.Median of Two Sorted Arrays (两个排序数组的中位数)

    要求:Median of Two Sorted Arrays (求两个排序数组的中位数) 分析:1. 两个数组含有的数字总数为偶数或奇数两种情况.2. 有数组可能为空. 解决方法: 1.排序法 时间复 ...

  5. LeetCode(4):两个排序数组的中位数

    Hard! 题目描述: 有两个大小为 m 和 n 的排序数组 nums1 和 nums2 . 请找出两个排序数组的中位数并且总的运行时间复杂度为 O(log (m+n)) . 示例 1: nums1 ...

  6. 求两个有序数组的中位数或者第k小元素

    问题:两个已经排好序的数组,找出两个数组合并后的中位数(如果两个数组的元素数目是偶数,返回上中位数). 设两个数组分别是vec1和vec2,元素数目分别是n1.n2. 算法1:最简单的办法就是把两个数 ...

  7. LeetCode4. 两个排序数组的中位数

    4. 两个排序数组的中位数 问题描述 There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the ...

  8. 取两个String数组的交集

    import org.testng.annotations.Test; import java.util.HashMap; import java.util.LinkedList; import ja ...

  9. LeetCode-4. 两个排序数组的中位数(详解)

    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/description/ 有两个大小为 m 和 n 的排序数组 nums ...

随机推荐

  1. 微信小程序实现折叠面板

    wxml: <view class='help'> <view class='help_item'> <view class='title' data-index='1' ...

  2. SpringBoot的启动配置原理

    一.启动流程 创建SpringApplication对象 public class SpringApplication { public SpringApplication(Class... prim ...

  3. 原生js实现选项卡样式切换的几种方式。

    先分享一个不能实现的实例(因为es5没有块作用域) for(var i=0; i<list.length; i++ ) { list[i].onclick = function(){ tabch ...

  4. ARM与x86 CPU架构对比

    CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是CISC要用最少的机器语言指令 ...

  5. 在线播放mp4

    在线播放mp4 1.准备好支持再网页上播放的mp4格式 AVC(h264) 格式的mp4 2.用ckplayer控制播放 (1)到ckplayer下载js.如:http://www.ckplayer. ...

  6. 将服务端select设置为非阻塞,处理更多业务

    服务端代码: #include<WinSock2.h> #include<Windows.h> #include<vector> #include<stdio ...

  7. 使用Barrier分三步将大象放入冰箱

    class Program { //构造大象和冰箱 private static ElephantsAndFridges elephantsAndFridges = new ElephantsAndF ...

  8. 牛客CSP-S提高组赛前集训营3

    A 货物收集 显然是一个二分答案的题. #include<iostream> #include<cstdio> #include<cstring> #include ...

  9. Vue-项目重要配置

    Vue配置axios ''' 1)安装插件(一定要在项目目录下): >: cnpm install axios 2)在main.js中配置: import axios from 'axios' ...

  10. C# Transaction 事务处理 -环境事务

    一.TransactionScope 环境事务 static async Task TransactionScopeAsync() { using (var scope = new Transacti ...