当前位置: 首页 > news >正文

【leetcode每日一题】565数组嵌套

在这里插入图片描述

思路流程:

思路v1.0

  1. 先学会写 s[0] ,用一个ans数组接收元素,每次往ans里添加的时候,先判断一下
    • 这个index会不会超出数组的长度。
    • ans里有没有这个元素。
  2. s[0] 写完,就是用一个for循环,算出所有的 s[i],每次算出来的时候跟最大长度进行比较,维护最大长度。

代码如下:


/*** @param {number[]} nums* @return {number}*/
const getILen = (nums,i) =>{let arr = []arr.push(nums[i])let index = arr[arr.length-1]while(index<nums.length && !arr.includes(nums[index])){arr.push(nums[index])index = arr[arr.length-1]}return arr.length
}
var arrayNesting = function(nums) {let max = 0;for(let i=0;i<nums.length;i++){max = Math.max(max,getILen(nums,i))}return max;
};

思路v1.1

由于index 是 num[i] ,而提示中说 0≤ nums[i]<n ,因此不必考虑index益处的可能性。

代码如下:


/*** @param {number[]} nums* @return {number}*/
const getILen = (nums,i) =>{let arr = []arr.push(nums[i])let index = arr[arr.length-1]while(!arr.includes(nums[index])){arr.push(nums[index])index = arr[arr.length-1]}return arr.length
}
var arrayNesting = function(nums) {let max = 0;for(let i=0;i<nums.length;i++){max = Math.max(max,getILen(nums,i))}return max;
};

在这里插入图片描述

思路v2.0

每次都需要去arr里遍历,时间复杂度很高,因此可以优化。

去arr里遍历 → 每次将nums数组中的一个元素放入到arr时,同时将这个元素改成-1,下次取得时候发现是-1就不取了。当一个for迭代结束,将nums数组恢复。

/*** @param {number[]} nums* @return {number}*/
const getILen = (nums,i) =>{let arr = []let temp = [...nums];while(temp[i]!=-1){arr.push(temp[i]);let index = temp[i];temp[i] = -1;i = index}return arr.length
}
var arrayNesting = function(nums) {let max = 0;for(let i=0;i<nums.length;i++){max = Math.max(max,getILen(nums,i))}return max;
};

在这里插入图片描述

从 854→869

思路v2.1

使用arr存放,再计算arr.length 只是为了计算长度,可以优化点,使用count计数。

/*** @param {number[]} nums* @return {number}*/
const getILen = (nums,i) =>{let count = 0let temp = [...nums];while(temp[i]!=-1){count++;let index = temp[i];temp[i] = -1;i = index}return count
}
var arrayNesting = function(nums) {let max = 0;for(let i=0;i<nums.length;i++){max = Math.max(max,getILen(nums,i))}return max;
};

在这里插入图片描述

从 869→875

思路v3.0

由于

 let temp = [...nums];

的时间复杂度是O(N),因此依然会超时。

看题解发现是省略了这个步骤,我本来以为如果省略了这个步骤就会将原来的nums数组修改掉。会导致下次进入for迭代的时候使用的是被破环的数组。

后来想了很久才发现,下次for循环迭代并不会去取上次for迭代里的元素,原因如下:

在这里插入图片描述

在进行第一次迭代的数据,如果后面的迭代使用到这次的数据,也会是一个重复的链路。

s[0] : 0→5→6→2→0

s[2] : 2→0→5→6→2

原因: arr 元素是没有重复的,如果要取到某个元素,就只能从同一个元素进入。因此,只要某次迭代遍历过一次的元素,下次迭代再遇到,获取到的集合都是同一个,因此可以将这种迭代跳过。

因此,直接破环原始数组,直接不进入迭代!!

在这里插入图片描述

相关文章:

  • 蓝桥杯-01简介
  • 互联网上门洗鞋店小程序
  • TOD和PPS精确时间同步技术
  • 在 Linux 中重命名文件和目录
  • css之选择第一个或最后一个元素、第n个标签、选择偶数或奇数标签、选择最后n个标签、等差数列标签的选择、first、last、nth、child
  • 【密码学引论】Hash密码
  • 简易版扫雷+代码分析
  • LuatOS-SOC接口文档(air780E)--pwm - PWM模块
  • Elasticsearch 聚合查询(Aggregation)详解
  • k8s中pod的hostport端口突然无法访问故障处理
  • ArcGIS中如何建立土地利用规划数据库
  • 【算法心得】When data range not large, try Bucket sort
  • 【Linux基础】Linux常见指令总结及周边小知识
  • 02-鸿蒙学习之4.0todoList练习
  • PTA: 螺旋矩阵
  • Google 是如何开发 Web 框架的
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • DataBase in Android
  • Django 博客开发教程 16 - 统计文章阅读量
  • ES6核心特性
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • java取消线程实例
  • Java小白进阶笔记(3)-初级面向对象
  • js ES6 求数组的交集,并集,还有差集
  • PHP CLI应用的调试原理
  • Python_OOP
  • Python学习之路13-记分
  • React系列之 Redux 架构模式
  • 百度小程序遇到的问题
  • 编写符合Python风格的对象
  • 二维平面内的碰撞检测【一】
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 设计模式走一遍---观察者模式
  • HanLP分词命名实体提取详解
  • Java性能优化之JVM GC(垃圾回收机制)
  • raise 与 raise ... from 的区别
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Lua:Lua调用C++生成的DLL库
  • #传输# #传输数据判断#
  • #预处理和函数的对比以及条件编译
  • $.ajax()参数及用法
  • ${ }的特别功能
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (zhuan) 一些RL的文献(及笔记)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (四)汇编语言——简单程序
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Sublime Text3配置Lua运行环境
  • (转)程序员技术练级攻略