给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
示例 2: 输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
说明: 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
我们可以不考虑输出结果的顺序。
进阶: 如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

我的算法:

第一版:

class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1 == null || nums1.length ==0 || nums2 == null || nums2.length == 0) {
return new int[0];
} int num1Len = nums1.length;
int num2Len = nums2.length;
int pos = 0;
int arr[] = new int[Math.min(num1Len,num2Len)];
if (num1Len > num2Len) {
for (int i = 0,j; i < num2Len; i++) {
j = 0;
while (j < num1Len && nums2[i] != nums1[j++]){}
j--;
if (nums1[j] == nums2[i]) {
if (j != num1Len -1) {
nums1[j] = nums1[num1Len -1];
num1Len --;
}
else {
num1Len --;
}
arr[pos++] = nums2[i];
}
}
}else {
for (int i = 0,j; i < num1Len; i++) {
j = 0;
while (j < num2Len && nums1[i] != nums2[j++]){}
j--;
if (nums2[j] == nums1[i]) {
if (j != num2Len -1) {
nums2[j] = nums2[num2Len -1];
num2Len --;
}
else {
num2Len --;
}
arr[pos++] = nums1[i];
}
}
}
// pos--;
if (pos != -1) {
int[] result = new int[pos];
System.arraycopy(arr,0,result,0,pos);
return result;
}else {
return new int[0];
} }
}

感觉代码写的很糟糕,两块一样的代码,写了两边,看了别人写的,优化了下:

第二版本:12 ms

class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1 == null || nums1.length ==0 || nums2 == null || nums2.length == 0) {
return new int[0];
} int num1Len = nums1.length;
int num2Len = nums2.length;
if (num1Len < num2Len) {
return intersect(nums2 , nums1);
}
int pos = 0;
int arr[] = new int[Math.min(num1Len,num2Len)]; for (int i = 0,j; i < num2Len; i++) {
j = 0;
while (j < num1Len && nums2[i] != nums1[j++]){}
j--;
if (nums1[j] == nums2[i]) {
if (j != num1Len -1) {
nums1[j] = nums1[num1Len -1];
num1Len --;
}
else {
num1Len --;
}
arr[pos++] = nums2[i];
}
}
if (pos != -1) {
int[] result = new int[pos];
System.arraycopy(arr,0,result,0,pos);
return result;
}else {
return new int[0];
} }
}

网上最快的算法:

class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if(nums1.length == 0 || nums2.length == 0) {
return new int[0];
}
int[] ret1 = new int[Math.max(nums1.length, nums2.length)];
int len1 = 0;
boolean[] bl1 = new boolean[ret1.length];
for (int i=0; i < nums2.length; i++) {
int start = 0;
while( (start = find(nums1, nums2[i], start)) != -1 ) {
if(bl1[start] == false) {
ret1[len1++] = nums2[i];
bl1[start] = true;
break;
}
start++;
}
}
return Arrays.copyOfRange(ret1, 0, len1);
} private int find(int[] nums, int val, int start) {
for (; start < nums.length; start ++) {
if (nums[start] == val) {
return start;
}
}
return -1;
} }

说实话,我看不出来这个最快的算法为什么快?想不通。。。

加油吧,算法小白。。。。

算法------------数组----------------两个数组的交集 II的更多相关文章

  1. 初级算法-6.两个数组的交集 II

    题目描述: 给定两个数组,编写一个函数来计算它们的交集. 示例 : 输入: nums1 = [,,,], nums2 = [,] 输出: [,] 示例 : 输入: nums1 = [,,], nums ...

  2. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  3. 前端与算法 leetcode 350. 两个数组的交集 II

    目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...

  4. LeetCode初级算法之数组:350 两个数组的交集 II

    两个数组的交集 II 题目地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/ 给定两个数组,编写一个函数来计算它们的交 ...

  5. 【初级算法】6. 两个数组的交集 II

    题目如下: 给定两个数组,写一个方法来计算它们的交集. 例如: 给定 nums1 = [, , , ], nums2 = [, ], 返回 [, ]. 注意: 输出结果中每个元素出现的次数,应与元素在 ...

  6. 6、两个数组的交集 II

    6.两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: n ...

  7. 【Leetcode】【简单】【350. 两个数组的交集 II】【JavaScript】

    题目描述 350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2] 示例 2 ...

  8. Java实现 LeetCode 350 两个数组的交集 II(二)

    350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入 ...

  9. 【leetcode 简单】 第八十五题 两个数组的交集 II

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...

随机推荐

  1. hibernate 映射 数据库number 映射为 double 为空 报错问题

    将 数据库表 映射成hibernate 实体类时 将number --- double 如果数据库中number 为空,查找数据时将报错 Can not set double field ***** ...

  2. [USACO11DEC]Umbrellas for Cows

    嘟嘟嘟 我dp真是太弱了,这么简单dp都不会. 令dp[i]表示前 i 头牛头被遮住了的最低成本.则dp[i] = min{dp[i], dp[j - 1] + c[a[i] - a[j] + 1]} ...

  3. 决策树在sklearn中的实现

    1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...

  4. js 获取后台数据分页

    页面创建一个存放内容的容器,以及分页的容器: <div id="content"></div> <div id="pager"&g ...

  5. 如何清理Macbook垃圾文件

    如何清理Macbook垃圾文件,腾出更多硬盘空间 在Macbook使用久之后,会发现本来还富裕的硬盘,变得越来越少,尤其现在Macbook使用容量很小的固态硬盘.在此种情况下,该如何清理Macbook ...

  6. Vue教程:计算属性computed与侦听器watch(三)

    计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  7. java中强引用、软引用、弱引用、幻象引用有什么区别?分别使用在什么场景?

    不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响. 1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃 ...

  8. 08 Oracle表碎片查询以及整理(高水位线)

    Oracle表碎片查询以及整理(高水位线) 1.表碎片的来源 当针对一个表的删除操作很多时,表会产生大量碎片.删除操作释放的空间不会被插入操作立即重用,甚至永远也不会被重用. 2.怎样确定是否有表碎片 ...

  9. 06 hash join (Oracle里的哈希连接原理)

    hash join (Oracle里的哈希连接原理) 2015年09月25日 17:00:28 阅读数:2188 哈希连接(HASH JOIN)是一种两个表在做表连接时主要依靠哈希运算来得到连接结果集 ...

  10. OpenGL 3 and OpenGL 4 with GLSL

    Here are some OpenGL samples with advance features. NeHe OpenGL tutorial focus on the OpenGL fixed p ...