算法------------数组----------------两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集。
示例 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的更多相关文章
- 初级算法-6.两个数组的交集 II
题目描述: 给定两个数组,编写一个函数来计算它们的交集. 示例 : 输入: nums1 = [,,,], nums2 = [,] 输出: [,] 示例 : 输入: nums1 = [,,], nums ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- 前端与算法 leetcode 350. 两个数组的交集 II
目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...
- LeetCode初级算法之数组:350 两个数组的交集 II
两个数组的交集 II 题目地址:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/ 给定两个数组,编写一个函数来计算它们的交 ...
- 【初级算法】6. 两个数组的交集 II
题目如下: 给定两个数组,写一个方法来计算它们的交集. 例如: 给定 nums1 = [, , , ], nums2 = [, ], 返回 [, ]. 注意: 输出结果中每个元素出现的次数,应与元素在 ...
- 6、两个数组的交集 II
6.两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: n ...
- 【Leetcode】【简单】【350. 两个数组的交集 II】【JavaScript】
题目描述 350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2] 示例 2 ...
- Java实现 LeetCode 350 两个数组的交集 II(二)
350. 两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入 ...
- 【leetcode 简单】 第八十五题 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
随机推荐
- bzoj2000 [Hnoi2010]stone 取石头游戏
Description A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参加比赛. 与经典的取石子游戏相 ...
- UVa 11582 - Colossal Fibonacci Numbers!(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Avito Cool Challenge 2018 C. Colorful Bricks 【排列组合】
传送门:http://codeforces.com/contest/1081/problem/C C. Colorful Bricks time limit per test 2 seconds me ...
- 2spring注解:@Lazy,@Conditional,@import,FactoryBean接口
大致的工程内容也来源于上一篇博文! https://www.cnblogs.com/Mrchengs/p/10108603.html 1.@Lazy懒加载 懒加载:针对单实例的 单实例bean,默认在 ...
- window使用结束进程
在cmd中输入下面信息: 1. 查看所有进程占用的端口 :netstat -ano 2.查看占用指定端口的程序:netstat –ano|findstr 指定端口号 3.杀死相关的进程: 方法一:使用 ...
- Elementui 导航组件和Vuejs路由结合
Elementui 导航组件和Vuejs路由结合, 达到点击导航切换路由,根据路由定位导航 一下是nav.vue代码,导航数据以json格式配置 <template> <el-men ...
- 【luogu P2491 [SDOI2011]消防】 题解
题目链接:https://www.luogu.org/problemnew/show/P2491 题外话: OI一共只有三种题--会的题,不会的题,二分题. 题解: step 1 求树的直径,把树的直 ...
- Web打印连续的表格,自动根据行高分页
拿到这个需求,我已经蛋碎了一地,经过N天的攻克,终于是把它搞定了,只是不知道会不会在某种情况下出现BUG.表示我心虚没有敢做太多的测试.... ---------------------------- ...
- FreeRTOS 查询任务 剩余的栈空间的 方法
FreeRTOS 源码下载地址 1.官方文档提供了 函数 用来查询 任务 剩余 栈 空间,首先是看官方的文档解释(某位大神 翻译 的 官方文档.) 参数解释: xTask:被查询任 ...
- c++中如 <类名 类名::对象> 是什么意思
CComplex CComplex::add(CComplex &x) (这一句 不懂为何 类名 类名::对象) { CComplex y(real+x.real,image+x.image) ...