给定两个数组,编写一个函数来计算它们的交集。示例 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. leetcode初级算法4.两个数组的交集 II

    leetcode初级算法4.两个数组的交集 II 仅为个人刷题记录,不提供解题思路 题解与收获 我的解法:(总结在代码中) public int[] intersect(int[] nums1, in ...

  2. 数组-两个数组的交集(两个集合)

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

  3. LeetCode算法题350:两个数组的交集II(Intersection of Two Arrays II)

    技术交流可以加: 本人微信:xcg852390212 本人qq:852390212 学习交流qq群1(已满): 962535112 学习交流qq群2: 780902027 两个数组的交集II Leet ...

  4. Leetcode算法题(C语言)7--两个数组的交集 II

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

  5. LeetCode 350. 两个数组的交集 II

    350. 两个数组的交集 II 难度简单640收藏分享切换为英文接收动态反馈 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集.返回结果中每个元素出现的次数,应与元素在两 ...

  6. 两个数组的交集 II

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

  7. leetCode 两个数组的交集 II 问题记录

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

  8. 2019-03-14-算法-进化(两个数组的交集 II)

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

  9. leetcode350. 两个数组的交集 II

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

最新文章

  1. 【Math】常见的几种最优化方法
  2. VS2008生成DLL文件的方法、引用dll文件以及意义
  3. vue 计算属性和data_Vue计算属性原理和使用场景
  4. cacti linux 模板,Cacti模板
  5. Android在View拉丝工艺和invalidate()和其他相关方法
  6. IP网络设计系列之-局域网设计
  7. Web安全-伪静态网页
  8. python中斐波那契数列_斐波那契数列–在Python,JavaScript,C ++,Java和Swift中进行了解释...
  9. OpenCV--solvePnp
  10. upupw启动mysql失败,Can't init tc log
  11. 多模态AI开发套件HiLens Kit:超强算力彰显云上实力
  12. SWF反编译软件Action Script Viewer ASV2011/06发布
  13. 新建计算机管理员用户,电脑我设置个新的用户 怎么切换不到默认的管理员用户登陆了...
  14. ExtJs4 学习一
  15. VUE的数据双向绑定
  16. 计算机通信的应用,计算机技术在通信中的应用
  17. 数学建模 论文 各部分 写作指导 及 获奖技巧讲解【美赛MCM/ICM】
  18. 计算机点阵存储空间,计算机存储量计算存储400个24*24点阵汉字字形所需的存储容量是________....
  19. ArcGIS插件安装通用问题汇总
  20. Python基础篇(九)-- 正则表达式

热门文章

  1. mysql insert union_在MySQL中使用INSERT INTO SELECT和UNION执行多次插入
  2. cgo引用定义不一致_应急照明、消防应急照明和疏散指示系统的定义与分类
  3. 防爆计算机最新报价,防爆计算机 工厂直销 价格优惠升级方便外形轻巧KJD127防爆计算机...
  4. 服务器运行速度影响哪些因素,影响服务器运行的九大因素
  5. 高斯-赛德尔迭代法简介
  6. ANSYS配合时如何选择重合面(打开爆炸视图)
  7. 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
  8. pyqt5 qscrollarea到达_在PYQT5中QscrollArea(滚动条)的使用方法
  9. node升级命令_Laravel Mix 4升级说明与“排坑儿”指南
  10. Django rest_framework 认证源码流程