快速求两个数组交集算法

  快速求出两个数组的交集的算法,如果用循环遍历的方法,其时间复杂度为O(N^N),在面试中一般不考虑这种方法。

  这里提供一种快速算法,算法实现步骤如下:

  1. 找到arr1的最大数max,创建一个max+1大小的数组result。

  2. 以arr1中的值作为result的下标,该索引处的值+1。

  3. 在result数组中遍历arr2中的值为下标处的值,如果该索引值不为0,则代表该值是两者的交集,保留。

  程序实现如下:

	/**
	 * 求两个数组的交集
	 * @param arr1
	 * @param arr2
	 * @return	数组交集
	 */
	private static int[] intersection(int[] arr1,int[] arr2){

		int[] result = null;

		ArrayList<Integer> list = new ArrayList<>();
		Arrays.sort(arr1);
		result = new int[arr1[arr1.length-1]+1];
		for (int i = 0; i < arr1.length; i++) {
			result[arr1[i]]++;
		}
		for (int i = 0; i < arr2.length; i++) {
			if (arr2[i]<=result.length&&result[arr2[i]]!=0) {
				list.add(arr2[i]);
			}
		}

        int[] returnarr = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
			returnarr[i] = list.get(i);
		}
		return returnarr;

	}

  

时间: 2024-08-09 19:08:03

快速求两个数组交集算法的相关文章

求两个数组的交集

问题: 给你两个排序的数组,求两个数组的交集. 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那么交集就是 3 5. 思路: 1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存.该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度. 2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分查找看是否在数组A里有B所对应的值,这样复杂度变成了O(N lg M). 这里,如果N 比 M 大,可以从A中取值,然后在B中判断是否有A

华为上机练习题--求两个数组的总和

题目: 求两个数组的和差:就是去掉两个数组中相同的元素 然后将两个数组中的元素存放在一个新的数组中,且数组A中元素要在B数组元素之前 如:输入: int[] a={1,2,4,7,6,9}; int[] b={2,4,3,10}; 输出: int[] c = {1, 7, 6, 9, 3, 10}; 分析: 剔除相同的元素要互相比较, 然后将不同的元素先后插入新的数组中, 所以我将重点放在比较上, 有可能效率有点低, 大家有什么好的想法可以分享下: 代码如下: package com.wenj.

Javascript 获取两个数组交集(重复)的项列表,支持List&lt;object&gt;

(function( window ){ var Utils = { //TODO 判断两个JSON是否相等 equals : function( param ,param2){ return JSON.stringify(param) === JSON.stringify(param2); }, //TODO 获取当前项在数组出现的个数 getCountByItem : function( objects,item){ var count = 0; for(var i = 0;i < obje

java中求两个数组(集合)的交集,并集,差集

对于两个数组 arr1=[1,3,4,5,8,9] arr2=[2,3,7,8,9] 求出交集与并集 test.java 1 import java.util.ArrayList; 2 import java.util.Collections; 3 4 5 public class test1 { 6 public static void main(String[] args) { 7 ArrayList<Integer> tmplist=new ArrayList<Integer>

ES6 Set求两个数组的并集、交集、差集;以及对数组去重

并集: const arr1 = [1, 2, 3, 2, 5]; const arr2 = [1, 4, 6, 8, 3]; // 将两个数组合并 const concatArr = [...arr1, ...arr2]; // 对数组去重 const set = new Set(concatArr); const newArr = [...set] 交集: const arr1 = [1, 2, 3, 2, 5]; const arr2 = [1, 4, 6, 8, 3]; const se

回顾面试题:计算两个数组交集

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

求两个数组的中位数

package kpp.base; /** * 求两个有序数组的中位数 * 此代码适用于两个数组长度不等的情况 * @author kpp * */ public class TwoArrayMedian { public static void main(String[] args) { // TODO Auto-generated method stub float a[] = {1,2,3,4}; //float b[] = {2,3,4,5,8,9,10}; float b[] = {8

php 求两个数组的差集应该注意的事情

对于 phper 来说 array_diff 这个函数应该知道它的用途,获取两个数组的差集,我理解中的差集是这样的 但是执行下代码会发现结果并不是 <?php $a = [1,2,3,4,5]; $b = [3,4,5,6,7]; $c = array_diff($a,$b); print_r($c); //输出 Array ( [0] => 1 [1] => 2 ) 我开始以为应该是会输出数组  [1,2,6,7] 才对的但是实际结果却不是,于是去翻下文档: 如图人家说的已经很清楚啦,

leetcode的题4:给定两个有序数组,求两个数组的中间值。

我的思路是,既然是有序数组,就可以按照归并排序法的思路,按照最后的归并过程. 建立一个新的数组,并对两个数组及归并数组目前的位置分别编号i,j,k. 将两个数组中较小的值推入i的位置,然后将被提取数据的数组及归并数组索引+1. 这个过程中需要考虑的问题是如果其中一个数组已经全部提取完成应如何处置. 以下是我的代码: class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<i