一天一大 leet(两个数组的交集 II)难度:简单-Day20200713
时间:2022-07-25
本文章向大家介绍一天一大 leet(两个数组的交集 II)难度:简单-Day20200713,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定两个数组,编写一个函数来计算它们的交集。
示例
- 示例 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 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
抛砖引玉
- 遍历其中一个数组 nums1 在另外一个数组 nums2 红检查是否存在该元素
- 存在放入结果中,并在 nums2 中清除
- 不存在则不作任何操作
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function (nums1, nums2) {
let _result = []
for (let i = 0; i < nums1.length; i++) {
let index = nums2.indexOf(nums1[i])
if (index > -1) {
_result.push(nums1[i])
nums2.splice(index, 1)
}
}
return _result
}
官方答案:
- 哈希表
- 利用 map 记录较短数组中每个数组出现的次数
- 遍历较长数组到 map 中检查这个数组是否在 map 中且遇到次数不为 0
- 次数大于 0,存放到结果数组中,且更新 map 中统计的个数
- 小于等 0,则这个数字在较短数组没出现
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function (nums1, nums2) {
if (nums1.length > nums2.length) {
return intersect(nums2, nums1)
}
let map = new Map()
for (let i = 0; i < nums1.length; i++) {
let count = (map.get(nums1[i]) || 0) + 1
map.set(nums1[i], count)
}
let _result = []
for (let i = 0; i < nums2.length; i++) {
let count = map.get(nums2[i]) || 0
if (count > 0) {
_result.push(nums2[i])
map.set(nums2[i], count - 1)
}
}
return _result
}
- 排序
- 先对两个数组排序优化循环
- 从零遍历两个数组,比较两个数组不用指针下的元素大小
- 其中一个数组当前指针下数字小,则后移指针去查询到比另外一个数组指针下等于小于其的数
- 两数相同记录到结果中切两个指针同时后移
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function (nums1, nums2) {
nums1.sort((a, b) => a - b)
nums2.sort((a, b) => a - b)
let len1 = nums1.length,
len2 = nums2.length,
_result = [],
i = 0,
j = 0,
index = 0
while (i < len1 && j < len2) {
if (nums1[i] < nums2[j]) {
i++
} else if (nums1[i] > nums2[j]) {
j++
} else {
_result[index] = nums1[i]
i++
j++
index++
}
}
return _result
}
- 记录一个发邮件的cs文件
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(56)-插件---单文件上传与easyui使用fancybox
- xml-rpc(2)-first demo_v2
- xml-rpc(1)-first demo
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-工作流设计-表单布局
- 网站源文件被注入了iframe代码—ARP欺骗的木马病毒攻击
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--工作流演示截图
- 基于CPPN与GAN+VAE生成高分辨率图像
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控
- (收藏)搭建.NET Framework 3.0开发环境 及SharePoint 2007/WSS 3环境
- WCF技术剖析之八:ClientBase<T>中对ChannelFactory<T>的缓存机制
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(48)-工作流设计-起草新申请
- 把windows2003“搬”到手机上。
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 学以致用设计模式 之 “组合模式”
- 学以致用C++设计模式 之 “观察者模式”
- 学以致用C++设计模式 之 “门面模式“
- 学以致用C++设计模式 之 “状态模式”
- 学以致用设计模式 之 “享元模式”
- 程序员必备数据结构:堆
- 程序员必备数据结构:栈
- 【C++ STL】停下你到处找 hash_map 使用教程的手,看我的就好了
- 【C++】同样是讲解逆波兰式,为何这篇就图文并茂,通俗易懂呢?
- 学以致用C++设计模式 “建造者模式”
- 你会不会处理多线程中的对象管理?
- 操作系统入门(二)进程
- Prometheus监控神器-服务发现篇(一)
- 给女同事讲解MySQL数据库设计范式与反范式,她夸我“技术好”
- 重拾Java Web应用的基础体系结构