三种方法求解两个数组的交集

package com.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//求两个数组的交集
public class FindIntersectionBetweenTwoArrays {

    //算法一:暴力搜索,时间复杂度O(n^2),空间复杂度O(1)
    public ArrayList<Integer> getIntersection(int[] arr, int[] arr2) {

        ArrayList<Integer> res = new ArrayList<Integer>();
        if(arr == null || arr.length == 0 || arr2 == null || arr2.length == 0) {
            return res;
        }

        for(int i = 0;i < arr.length;i ++) {
            int temp = arr[i];
            for(int j = 0;j < arr.length;j ++) {
                if(arr2[j] == temp && !res.contains(temp)) {
                    res.add(temp);
                    break;
                }
            }
        }
        return res;
    }

    //算法二:先排序,然后定义两个指针,时间复杂度O(nlogn) (排序),空间复杂度O(1)
    public ArrayList<Integer> getIntersection2(int[] arr, int[] arr2) {

        ArrayList<Integer> res = new ArrayList<Integer>();
        if(arr == null || arr.length == 0 || arr2 == null || arr2.length == 0) {
            return res;
        }

        Arrays.sort(arr);
        Arrays.sort(arr2);
        int i = 0;
        int j = 0;
        while(i < arr.length && j < arr2.length) {
            if(arr[i] < arr2[j]) {
                i ++;
            }
            else if(arr[i] > arr2[j]) {
                j ++;
            }
            else {
                if(!res.contains(arr[i])) {
                    res.add(arr[i]);
                }
                i ++;
                j ++;
            }
        }
        return res;
    }

    //算法三:map计数,时间复杂度O(n),空间复杂度O(n),空间换时间
    public ArrayList<Integer> getIntersection3(int[] arr, int[] arr2) {

        ArrayList<Integer> res = new ArrayList<Integer>();
        if(arr == null || arr.length == 0 || arr2 == null || arr2.length == 0) {
            return res;
        }

        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i = 0;i < arr.length;i ++) {
            int key = arr[i];
            if(map.containsKey(key)) {
                int value = map.get(key);
                value ++;
                map.put(key, value);
            }
            else {
                map.put(key, 1);
            }
        }
        for(int i = 0;i < arr2.length;i ++) {
            int key = arr2[i];
            if(map.containsKey(key) && !res.contains(key)) {
                res.add(key);
            }
        }
        return res;

    }

    public static void main(String[] args) {

        int[] arr = {1,2,5,3,3,4};
        int[] arr2 = {2,3,3,4,5,6};
        FindIntersectionBetweenTwoArrays fb = new FindIntersectionBetweenTwoArrays();
        List<Integer> res = fb.getIntersection3(arr, arr2);
        System.out.println(res);
    }
}
————————————————
版权声明:本文为CSDN博主「奇零可草」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhou15755387780/article/details/81317561

原文地址:https://www.cnblogs.com/u013533289/p/11676719.html

时间: 2024-10-11 17:03:04

三种方法求解两个数组的交集的相关文章

三种方法求解约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 方法1:使用stl::list模拟环形链表,参考剑指offer 代码: #include <iostream> #include <list> using namespace std; int lastNumber(unsigned int n,un

Qt打开外部程序的三种方法(两种阻塞,一种不阻塞)

Qt打开外部程序 [cpp] view plaincopy //1.通过调用系统函数 system("opt/myApp"); //这是linux下的,windows下可以用WinExec等函数 //2.通过QProcess,阻塞调用 QProcess::execute("/opt/myApp"); //绝对路径和相对路径都可以,windows下要带exe后缀,系统应用如记事本notepad可直接输入打开 //3.通过QProcess,非阻塞调用 QProcess 

三种方法求最大子数组的和

这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典. 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组.比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8. 下面按照时间复杂度逐步优化的顺序依次给出这三种算法. 暴力求解法 该方法的思想非常简单,先找出从第1个元素开始的最大子数组,而后再从第2个元素

三种方法交换两个变量的值

#include<stdio.h> void Swap1(int x, int y)//使用了中间值 { int temp; temp = x; x = y; y = temp; printf("第一种%d,%d\n",x,y); } void Swap2(int x, int y)//未使用中间值 { x = x + y; y = x - y; x = x - y; printf("第二种%d,%d\n",x,y); } void Swap3(int

三种方法打印列表(数组)

#方法一 member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] i=0 lenth=len(member) while i<lenth: print(member[i],member[i+1]) i+=2 #方法二 member = ['小甲鱼', 88, '黑夜', 90, '迷途', 85, '怡静', 90, '秋舞斜阳', 88] i=0 for string in member: print(member[i],m

交换两个整数的三种方法

package com.zby.bubble; /** * <class description> 三种方法交换两个整数的值 * * @author zby * */ public class Exchange { public static void main(String[] args) { splitLine(); exchange1(Integer.MAX_VALUE, Integer.MAX_VALUE - 1); exchange1(99, 100); exchange1(Inte

js之二维数组定义和初始化三种方法

方法一:直接定义并且初始化,这种遇到数量少的情况可以用 var _TheArray = [["0-1","0-2"],["1-1","1-2"],["2-1","2-2"]] 方法二:未知长度的二维数组 var tArray = new Array();   //先声明一维 for(var k=0;k<i;k++){        //一维长度为i,i为变量,可以根据实际情况改变

JS数组去重的三种方法

<!DOCTYPE html> <html>     <head>         <meta charset="UTF-8">         <title>数组去重</title>     </head>     <body>         <script type="text/javascript">             //注意有一个元素是空的

mfc 在VC的两个对话框类中传递参数的三种方法

弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下: 1. 我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMDDDlg类.在主对话框上我放置了一个标签页(Tab Control)控件,其实现的功能是当单击标签提示A时进入页面A,即对话框A(所对应的类为CDialogChild1),单击B时进入对话框B(CDialogChild2). 整个工程的框架已经设计好了,在对话框A和对话框B上放置了许多控件,现在我想