2022-07-13:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。
每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j :
i + 1 需满足:i + 1 < arr.length,
i - 1 需满足:i - 1 >= 0,
j 需满足:arr[i] == arr[j] 且 i != j。
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。
注意:任何时候你都不能跳到数组外面。
来自蔚来汽车。

答案2022-07-13:

存在左跳的可能。宽度优先遍历,层次遍历。

代码用rust编写。代码如下:

use std::collections::HashMap;
fn main() {
let mut arr: Vec<i32> = vec![100, -23, -23, 404, 100, 23, 23, 23, 3, 404];
let ans = min_jumps(&mut arr);
println!("ans = {}", ans);
} fn min_jumps(arr: &mut Vec<i32>) -> i32 {
let n = arr.len() as i32;
// 为了找某个值,有哪些位置,能快一些
// key : 某个值9,
// value : 列表:0,7,19
let mut value_index: HashMap<i32, Vec<i32>> = HashMap::new();
for i in 0..n {
if !value_index.contains_key(&arr[i as usize]) {
value_index.insert(arr[i as usize], vec![]);
}
value_index.get_mut(&arr[i as usize]).unwrap().push(i);
}
// i会有哪些展开:左,右,i通过自己的值,能蹦到哪些位置上去
// 宽度优先遍历,遍历过的位置,不希望重复处理
// visited[i] == false:i位置,之前没来过,可以处理
// visited[i] == true : i位置,之前来过,可以跳过
let mut visited: Vec<bool> = vec![];
for _ in 0..n {
visited.push(false);
}
let mut queue: Vec<i32> = vec![];
for _ in 0..n {
queue.push(0);
}
let mut l: i32 = 0;
let mut r: i32 = 0;
// 0位置加到队列里去
queue[r as usize] = 0;
r += 1;
visited[0] = true;
let mut jump = 0;
// 宽度优先遍历
// 一次,遍历一整层!
// 该技巧,多次出现!
while l != r {
// 队列里还有东西的意思!
// 此时的r记录!
// 0 1 2 | 3 4 5 6 7 8
// 当前层的终止位置
let tmp = r;
while l < tmp {
// 遍历当前层!
let cur = queue[l as usize];
if cur == n - 1 {
return jump;
}
if cur + 1 < n && !visited[(cur + 1) as usize] {
visited[(cur + 1) as usize] = true;
queue[r as usize] = cur + 1;
r += 1;
}
// cur > 0 cur - 1 >=0
if cur > 0 && !visited[(cur - 1) as usize] {
visited[(cur - 1) as usize] = true;
queue[r as usize] = cur - 1;
r += 1;
}
// i -> 9
// 值同样为9的那些位置,也能去
for next in value_index.get(&arr[cur as usize]).unwrap().iter() {
if !visited[*next as usize] {
visited[*next as usize] = true;
queue[r as usize] = *next;
r += 1;
}
}
// 重要优化!
value_index.insert(arr[cur as usize], vec![]);
l += 1;
}
jump += 1;
}
return -1;
}

执行结果如下:


左神java代码

2022-07-13:给你一个整数数组 arr ,你一开始在数组的第一个元素处(下标为 0)。 每一步,你可以从下标 i 跳到下标 i + 1 、i - 1 或者 j : i + 1 需满足:i +的更多相关文章

  1. 整数数组的定义,然后输入一个整数X,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j

    //整数数组的定义,然后输入一个整数x,假定X不在这个数组,返回小于X位置的最大数目i而超过X位置的最小数目j: //如果X在该阵列,返回位置的阵列中的数. 资源: #include<iostr ...

  2. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  3. C语言:对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

    //对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. #include <stdio.h& ...

  4. 2022 07 13 第一小组 田龙跃 Java再学习笔记

    1.类名命名规则: 只能由数字字母,下划线,美元符号组成(不能以数字开头,尽量不要用下划线开头) 2.注释(养成多写注释的好习惯) 单行注释 // ctrl+/ 多行注释 // ctrl+shirt+ ...

  5. 2022.07.13 vue3下pinia的简单使用及持久化

    使用前说明: 当前demo使用了vue3 + vite + typescript + pinia搭建的简单项目,主要介绍了在单文件组件(sfc)基础上使用pinia的用法,懒得看api的兄弟们,来这瞅 ...

  6. 求一个整数数组最大子数组之和,时间复杂度为N

    #include<iostream.h> int main () { ]={-,-,-,-,-,-,-,-,-,-}; ],sum=; ;i<;i++) { ) { sum=b[i] ...

  7. 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...

  8. LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...

  9. 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数

    #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...

  10. python 一个二维数组和一个整数,判断数组中是否含有该整数

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. de ...

随机推荐

  1. java8-并行计算

    java8提供一个fork/join framework,fork/join框架是ExecutorService接口的一个实现,它可以帮助你充分利用你电脑中的多核处理器,它的设计理念是将一个任务分割成 ...

  2. [转]常见的视频编码详解 Cinepak Codec by Radius

    AVI所采用的压缩算法并无统一的标准.也就是说,同样是以AVI为后缀的视频文件,其采用的压缩算法可能不同,需要相应的解压软件才能识别和回放该AVI文件.除了Microsoft公司之外,其他公司也推出了 ...

  3. Bootstarp5第四弹

    六.颜色 <div class="container mt-3">最基本的文本 <p class="text-muted">柔和的文本& ...

  4. Spring:现代Java开发的必备框架

    目录 Spring:现代Java开发的必备框架 Spring创建bean的生命周期以及对应的接口和注解 Spring使用三级缓存解决循环依赖的原理 Spring使用三级缓存创建bean的过程 Spri ...

  5. iText5实现Java生成PDF

    参考代码:https://github.com/youcong1996/study_simple_demo 参考博客:https://blog.csdn.net/weixin_37848710/art ...

  6. Python查找存储区0KB文件并记录下地址

    查找存储区域中0KB大小文件,可以根据需要变更指定大小. #-*- coding: utf-8 -*- #!/usr/bin/python from os.path import isdir,absp ...

  7. BeautifulSoup模块的使用方法

    本篇文章主要讲bs4模块(BeautifulSoup),这个模块能做么呢?用一句话来概括的话:beautifulsoup4 从HTML或XML文件中提取数据的Python库,用它来解析爬取回来的xml ...

  8. CSS必知必会

    CSS概念 css的使用是让网页具有统一美观的页面,css层叠样式表,简称样式表,文件后缀名.css css的规则由两部分构成:选择器以及一条或者多条声明 选择器:通常是需要改变的HTML元素 声明: ...

  9. 如何基于Security框架兼容多套用户密码加密方式

    一.说明 当已上线的系统存在使用其他的加密方式加密的密码数据,并且密码 不可逆 时,而新的数据采用了其他的加密方式,则需要同时兼容多种加密方式的密码校验. 例如下列几种情况: 旧系统用户的密码采用了 ...

  10. 云原生K8S精选的分布式可靠的键值存储etcd原理和实践

    @ 目录 概述 定义 应用场景 特性 为何使用etcd 术语 架构 原理 读操作 写操作 日志复制 部署 单示例快速部署 多实例集群部署 静态 etcd 动态发现 常见命令 概述 定义 etcd 官网 ...