首页 > 其他分享 >AcWing秋招每日一题——week3

AcWing秋招每日一题——week3

时间:2022-08-28 16:44:38浏览次数:60  
标签:arr 下标 int 步数 step 秋招 week3 id AcWing

1、跳跃游戏

题目

给你一个整数数组 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
请你返回到达数组最后一个元素的下标处所需的 最少操作次数 。

注意:任何时候你都不能跳到数组外面。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/jump-game-iv
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

class Solution {
public:
    queue<pair<int,int> > q;//队列存放下标和对应的下标距离
    unordered_set<int> vis;//已经访问过的下标

    void visit(int id,int step){
        if(!vis.count(id)){
            vis.insert(id);
            q.push({id,step});
        }
    }
    
    int minJumps(vector<int>& arr) {
        int n = arr.size();
        unordered_map<int,vector<int>> hash;//用来存放对应索引的下标
        for(int i = 0;i<n;i++){
            hash[arr[i]].push_back(i);
        }
        q.push({0,0});//起点放入队列中
        vis.insert(0);//将该下标放入队列中
        while(!q.empty()){
            auto [id,step] = q.front();//队列中的第一个元素信息拿出来
            q.pop();
            if(id==n-1){return step;}//当到达最后一个时,退出
            step++;//进入下一步,步数加一
            //以下三种方式跳转
            //1、跳到下一个相同的值处
            if(hash.count(arr[id]))
            for(auto k : hash[arr[id]]){visit(k,step);}//去访问每一个与当前id相同或的索引
            hash.erase(arr[id]);
      //2、跳到左边 if(id-1>=0) visit(id-1,step);
      //3、跳到右边
       if(id+1<n) visit(id+1,step); } 

return 0; } };

 

 

 

 理解

每一步能跳转的有三种情况

1、跳到相同值

2、向左跳

3、向右跳

所以可以初始化一个队列q,将点放进去,然后将这个点能到的点依次放进去,之后可以实现每一次进入循环的step都是有序的,每进入一次训循环,step+1;

最后返回step是第一次到达最后一个点的情况,由前可知,此必为最小的步数;

另外hash.erase(arr[id]); 用来删除已经遍历过所有相同id。原因:如果不删除,在下一次碰到相同的id,其步数必定比之前大,那么就相当于其中的步数是浪费的,所以直接删去,可以节省时间。

标签:arr,下标,int,步数,step,秋招,week3,id,AcWing
From: https://www.cnblogs.com/nlyide/p/16632934.html

相关文章

  • AcWing杯 - 第66场周赛
    比赛链接:[第66场周赛](竞赛-AcWing)先放代码,题解慢慢补AAcWing4606.奇偶判断#include<set>#include<map>#include<queue>#include<stack>#include<cmath>#i......
  • Acwing 第 66 场周赛 A-C
    2A,来晚+中间有事,第三题没写,但是写第三题的时候也感觉犯迷糊,读懂题意就好了AAcWing4606.奇偶判断题意:判断末位是偶数还是奇数跳过 BAcWing4607.字母补全题意......
  • 23届秋招美团内推推推!开始啦!!
    自我介绍本人为20届应届生,在19年秋招期间,拿到了网易、小米、美团等企业的Offer,最后和美团双向奔赴,在美团工作的这两年,可以说是收获满满,推荐大家来到美团这个温暖的......
  • 美团秋招笔试四道编程题(第一场)
    第一题小美是美团的一名鲜花快递员,鲜花是一种保质期非常短的商品,所以需要尽快送到客户手中,公司对于骑手的一个要求就是要规划送花的线路,使得骑手送完所有订单走的路程尽可......
  • AcWIng 86. 分隔链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListN......
  • 23届秋招美团内推推推!开始啦!!
    自我介绍本人为20届应届生,在19年秋招期间,拿到了网易、小米、美团等企业的Offer,最后和美团双向奔赴,在美团工作的这两年,可以说是收获满满,推荐大家来到美团这个温暖的大......
  • 算法秋招之【最小生成树】
    cvte笔试遇到了该题型,特此学习。首先,最小生成树是与图、图论相关的概念花时间看b站的视频:[算法训练营-最小生成树]:最小生成树:简单来说最小生成树就是用最少的代价使......
  • [AcWing 167] 木棒
    DFS剪枝点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10;intn;intw[N];intsum,len;boolst......
  • 开坑之Acwing算法进阶课题单
    当初五折的时候冲动消费买下的,现在看题单内容挺丰富的,适合打基础,也适合存板子,于是回来刷.(不一定看视频)需要学习的知识点包括1图论1.1网络流1.1.1最大流1.1.1.1算......
  • AcWing算法基础课---第一讲基础算法---05位运算
    ###整数n的二进制数的第k位数```n>>k&1```###lowbit运算```lowbit(x)x&(~x+1)=x&(-x)```###AcWing801.二进制中1的个数```#include<iostream>usingn......