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. DataTable 导出到TXT

    public static string cExportTXT(DataView dv) { try { SaveFileDialog saveFileDialog1 = new SaveFileDi ...

  2. React16下报错引发整个页面crash的解决方法

    如果报错没有没有被catch,将会引起整个React组件树的unmounting 解决方法:在生命周期中增加componentDidCatch https://reactjs.org/blog/201 ...

  3. Node.js server使用

    一.创建项目 #创建项目目录 cd /data mkdir webroot cd webroot #初始化git git init vim .gitignore 输入: node_modules/ 保 ...

  4. 关于python print函数format 格式化

    关于python print函数format 格式化  Your Guide to the Python print() Function https://realpython.com/python- ...

  5. Unity Joint用法及案例

    目录 什么是Joint 有哪些Joint Joint计算原理 自由度配置 Axis与Anchor Limit与Spring Drive与Target Joint应用案例 车轮 旋转 悬挂系统 吊臂 旋 ...

  6. Flex布局原理【转载】

    引言 CSS3中的 Flexible Box,或者叫flexbox,是用于排列元素的一种布局模式. 顾名思义,弹性布局中的元素是有伸展和收缩自身的能力的. 相比于原来的布局方式,如float.posi ...

  7. Laf v1.0 发布:函数计算只有两种,30s 放弃的和 30s 上线的

    一般情况下,开发一个系统都需要前端和后端,仅靠一个人几乎无法胜任,需要考虑的特性和功能非常多,比如: 需要一个数据库来存放数据: 需要一个文件存储来存放各种文件,比如图片文件: 后端需要提供接口供前端 ...

  8. ACM-NEFUOJ-P239回文数

    #include<bits/stdc++.h> using namespace std; int n,p[1000],len,p1[1000]; int f() { int i; for( ...

  9. [ACM]Uva839-Not So Mobile(树状天平)

    在输入过程中同时进行数据处理,代码简洁,效率较高 #include<iostream> #include<cstdio> using namespace std; bool s ...

  10. 什么时候需要使用try-catch

    代码执行预料不到的情况,或出错的可能性很大时,使用try-catch语句 构造一个文件输入流(上传文件时,线上环境的内存情况不确定)出错的可能性很大 文件上传写入, 数据库事务的提交,还有摄像头和打印 ...