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

2023-11-28 07:45

本文主要是介绍【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 元素是没有重复的,如果要取到某个元素,就只能从同一个元素进入。因此,只要某次迭代遍历过一次的元素,下次迭代再遇到,获取到的集合都是同一个,因此可以将这种迭代跳过。

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

在这里插入图片描述

这篇关于【leetcode每日一题】565数组嵌套的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429329

相关文章

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的