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

比如: 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. java八大排序代码

    import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...

  2. maven 私服 nexus 安装

    1.去官方下载他的免费版,人民称为oss版(这一步自行百度去官网解决),官网:https://www.sonatype.com/ 2.下载好后,解压是两个文件夹: 3.配置环境变量:  4.安装生成w ...

  3. 基于Groovy编写Ngrinder脚本常用方法

    1.生成随机字符串(import org.apache.commons.lang.RandomStringUtils) 数字:RandomStringUtils.randomNumeric(lengt ...

  4. Win10系统Edge浏览器怎么截取网页长图?

    有时我们在工作演示时会需要截取网页上的图片,不过简单的截图可以,但如果需要截取超过屏幕大小的整个网页,你是不是就有些束手无策了.虽然拼接图片也是种方法,但毕竟还是不方便,下面好系统重装助手就教你在Wi ...

  5. 异步处理的框架Sanic的使用方法和小技巧

    Sanic是异步处理的框架,运用Sanic可以开发快速异步响应的web程序.想必大家看到这个都会比较期待和兴奋. 那么如何使用Sanic来实现快速响应呢?我们先来看一看Sanic的基本介绍. Sani ...

  6. 在idea中相同的字符串使用equals()进行比较时,返回值是flase问题

    最近在idea中遇到了一个编码的问题,我的程序是从前台传过来一个字符串,判断用户的角色(学生,教师,管理员), 在进行equals()判断时,返回的确是false,然后就在网上查了查,发现是编码的问题 ...

  7. 挺棒的七个Python图形应用GUI开发框架

    作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,目前市场上有大量Python GUI开发框架可供选择,Python wiki GUI programming给出了超过30个跨平 ...

  8. p4434 [COCI2017-2018#2] ​​Usmjeri

    思路 并查集的好题 考虑到求满足条件限制的方案数,显然观察样例可知结果就是2^x,x是互不影响的边的集合数量 然后考虑如何求互不影响的边的集合数量 可以使用并查集,用i和i+n表示这个点的父亲连向它的 ...

  9. 洛谷P1417 烹调方案【dp】

    题目:https://www.luogu.org/problemnew/show/P1417 题意: 一道菜有$a,b,c$三个值.烧一道菜的时间是$c$.得到的价值是,$a-t*b$其中$t$是菜完 ...

  10. Linq 分组查询

    根据部门分组 ,然后存储部门下所有员工 public class Custom { public string dname { get; set; } public List<Employees ...