【LeetCode 818】Race Car_leetcode racecar-程序员宅基地

技术标签: 搜索  动态规划  LeetCode  

题目描述

Your car starts at position 0 and speed +1 on an infinite number line. (Your car can go into negative positions.)

Your car drives automatically according to a sequence of instructions A (accelerate) and R (reverse).

When you get an instruction “A”, your car does the following: position += speed, speed *= 2.

When you get an instruction “R”, your car does the following: if your speed is positive then speed = -1 , otherwise speed = 1. (Your position stays the same.)

For example, after commands “AAR”, your car goes to positions 0->1->3->3, and your speed goes to 1->2->4->-1.

Now for some target position, say the length of the shortest sequence of instructions to get there.

Example 1:

Input: 
target = 3
Output: 2
Explanation: 
The shortest instruction sequence is "AA".
Your position goes from 0->1->3.

Example 2:

Input: 
target = 6
Output: 5
Explanation: 
The shortest instruction sequence is "AAARA".
Your position goes from 0->1->3->7->7->6.

Note:

1 <= target <= 10000.

思路

思路一:
BFS,从当前点开始搜,队列存储到达位置及对应的步数,每次从当前步数能到达的位置扩充。有两种扩充方式,加速和转弯。
注意剪枝,如果当前位置>2target 或者 <0 或者 speed > 2target,就没必要搜索了。
每个位置的转弯也只需要做一次,vis标记。
思路二:
记忆化搜索。搜索到达target的最小步数,如果不是一直前进能到达的位置,有两种可能,先到达后一个整数位置,再往回走。或者先到达前一个,往回走,再往前走。

代码

代码一:BFS

class Solution {
    
public:
    int racecar(int target) {
    
        unordered_set<string> vis;
        vis.insert("0_1");
        vis.insert("0_-1"); // pos zhuanxiang
        
        queue<pair<int, int>> que; // pos speed
        que.push({
    0, 1});
        int step = 0;
        
        while(!que.empty()) {
    
            int size = que.size();
            while(size--) {
    
                int pos = que.front().first;
                int speed = que.front().second;
                que.pop();
                
                int pos1 = pos+speed;
                int speed1 = speed*2;
                if (pos1 == target) return step+1;
                if (pos1 < 2*target && abs(speed1) < 2*target && pos1 > 0)
                    que.push({
    pos1, speed1});
                
                int pos2 = pos;
                int speed2 = speed > 0 ? -1 : 1;
                string cur = to_string(pos2)+"_"+to_string(speed2);
                if (vis.count(cur)) continue;
                que.push({
    pos2, speed2});
                vis.insert(cur);
            }
            step++;
        }
        
        return -1;
    }
};

代码二:记忆化搜索

class Solution {
    
public:
    int racecar(int target) {
    
        dp = vector<int>(target+1);
        return dfs(target);
    }
    
    int dfs(int target) {
    
        if (dp[target] > 0) return dp[target];
        int n = ceil(log2(target+1)); // up
        if (1<<n == target+1) return dp[target] = n;
        
        // 2^n - 1 > target
        // AnR
        dp[target] = n + 1 + dfs((1<<n)-1-target);
        
        // A(n-1)RAiR
        for (int m=0; m<n-1; ++m) {
    
            // dp[target] = min(dp[target], n-1+1+m+1+dfs(target- ((1<<(n-1))-1) + (1<<m)-1);
            dp[target] = min(dp[target], n+m+1+dfs(target- (1<<(n-1)) + (1<<m)));
        }
        
        return dp[target];
    }
private:
    vector<int> dp;
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iCode_girl/article/details/104505979

智能推荐

嵌入式Linux——DMA:在内核中简单使用DMA实现内存中数据传递_linux dma使用-程序员宅基地

文章浏览阅读1.3w次,点赞11次,收藏77次。简介: 本文主要介绍在内核中简单使用DMA实现内存数据传递。由于本篇文章中没有介绍与框架相关的程序,只是使用字符设备来操作DMA,同时也没有抽象的层次,因此本文中代码分析部分就相对简单。但我还是会将文章分为两部分,第一部分我将介绍与DMA相关的知识。而第二部分讲解在内核中如何通过代码实现DMA的数据传递。 Linux内核:linux-2.6.22.6 所用开发板:JZ2440 V..._linux dma使用

什么是软件开发生命周期?_软件开发周期-程序员宅基地

文章浏览阅读5.7k次,点赞2次,收藏17次。软件开发生命周期 (SDLC)(也称为应用程序开发生命周期)是规划、创建、测试和部署软件系统的过程。系统开发生命周期框架为系统设计人员和开发人员提供了一系列可遵循的活动。它由一组步骤或阶段组成,其中 SDLC 的每个阶段都使用前一个阶段的结果。SDLC 遵循对开发人员至关重要的重要阶段,例如规划、分析、设计和实施。就像在装配线上制造的任何东西一样,SDLC 旨在根据客户的要求,通过在预定的时间框架和成本估算内交付经过每个明确定义的阶段的系统,生产满足或超出客户期望的高质量系统。传统 / 瀑布 /_软件开发周期

BugkuCTF-MISC题Pokergame_pokergame bugku-程序员宅基地

文章浏览阅读877次,点赞6次,收藏2次。补充:用010hex打开zip文件。把504B0304后的第3、4个byte改成0000即将0900改为0000而504B0102后的第5、6个byte不需改成0000即可破解伪加密。解题下载,解压文件有hint.txt,king.jpg,kinglet.jpg,Poke.zip通过binwalk -e 和foremost分别分离king.jpg与kinglet.jpg从king.jpg分离得到:加密压缩包,加密了code.txt尝试爆破无果后,尝试伪加密,成功解压得到code.t_pokergame bugku

猿创征文|python二分查找解密 青少年编程电子学会python编程等级考试三级真题解析2021年03月_猿编程3月3日 作品大赛,答案。-程序员宅基地

文章浏览阅读640次。python二分查找解密2021年3月 python编程等级考试三级难度级别:中等,这题相对而言还是有一点小难度,难在文件操作,具体主要考查如下:分析题目和给定的部分代码,找到给定代码的解题思路input函数:从键盘获取对应的输入值int函数:将参数对象转化成整数类型sort函数:对列表进行从小到大排序(默认)for循环:for循环可以遍历任何有序的项及列表元素等等。while循环:不知道次数情况下推荐使用(只知道条件)if...else...语句:条件分支语句,不同的条件有不同的处理结果_猿编程3月3日 作品大赛,答案。

机器学习理论基础定义-程序员宅基地

文章浏览阅读986次,点赞22次,收藏22次。机器学习是人工智能(AI)的一个子领域,它专注于开发算法和模型,使计算机能够从中学习,并基于数据做出预测或决策。机器学习系统使用统计技术从大量数据中学习模式和关系,而不是被明确地编程来执行任务。机器学习中的学习过程包括在一个数据集上训练一个模型,该数据集由输入-输出对组成。该模型通过迭代地调整其参数来学习识别模式并进行预测。有几种类型的机器学习方法,包括有监督学习、无监督学习和强化学习。**监督学习:**在监督学习中,模型在一个有标记的数据集上进行训练,其中输入数据与相应的输出标签配对。

关于自卑,与君共勉_费洛伊德关于自卑的言论-程序员宅基地

文章浏览阅读1.7k次。关于自卑首先,我也没想到过有天会直面这个问题 关于自卑 其实也是很顺其自然的一件事情 我现在的方式是把所有的东西写在文字里,这样一来不仅可以对自己的行为做出方方面面的思考,还能顺带记住很多事情 以前的自己总是想,可是想法总是一瞬之间的事情,你只要停止了,想到的没动手,或者没去再思考,某个问题就会不了了之 这样的结果是浪费了宝贵的生命,连往后再拿出来作为谈资的机会都没有,试想你会对着你想要辩_费洛伊德关于自卑的言论

随便推点

2、centos7.6 yum安装postgres13_centos 7.6 安装配置 postgresql 13 详细步骤-程序员宅基地

文章浏览阅读93次。centos7.6安装postgres13_centos 7.6 安装配置 postgresql 13 详细步骤

C语言程序设计第六次作业——循环结构(2)-程序员宅基地

文章浏览阅读362次。(一)改错题序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数)。输入输出样例:Input eps:1E-4s = 0.835699源程序(有错误的程序)#include<stdio.h>int main(){int flag,n;double eps,it..._超过n次猜对无效

Python 配置文件之ConfigParser模块(实例、封装)_import configparser-程序员宅基地

文章浏览阅读633次。python3与python2使用configparser的区别import configparser #python3中为configparserimport ConfigParser #python中为ConfigParser一、ConfigParser简介ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为section..._import configparser

浅谈 Dojo 中的安全工具包_dojo toolkit不安全-程序员宅基地

文章浏览阅读4.5k次。安全工作一直是我们日常开发中需要注意的一个问题,对于 Web 开发而言,需要引起我们重视的主要就是 JavaScript 的安全性了。JavaScript 这样一种脚本语言可以运行在各种浏览器中,但是基于安全性的考虑,几乎所有的浏览器提供给 JavaScript 的接口都是很有限的,尤其是一些安全敏感的接口,如文件的读写操作,内存的控制等等。这么看似乎 JavaScript 不论怎样写都是非常安全_dojo toolkit不安全

python网络编程(TCP/IP、发邮件)_python利用tcpconnector 发送邮件-程序员宅基地

文章浏览阅读863次。python的TCP/IP 计算机为了联网,就必须规定通讯协议,早期的计算机网络是由各个厂商规定的一些协议,他们之间互不兼容。 为了把全世界的电脑能够连接到一起,那么就必须规定一套全球通用的协议,为了完成这个目标,互联网协议簇就是通讯协议标准,有了internet,任何私有网络,只要支持这个协议就可以联入互联网 因为互联网协议包含了上百种协议标准,但是最重要的两个协议就是TCP和IP..._python利用tcpconnector 发送邮件

Android 11.0 mtp在锁屏模式和息屏时禁止访问mtp文件夹功能实现_android 禁用mtp-程序员宅基地

文章浏览阅读362次。​在11.0的系统rom产品定制化开发中,由于系统对于mtp模式访问文件夹没有限制,就是在锁屏息屏状态下也是可以访问文件夹的,由于产品的需要要求在锁屏和息屏的情况下,禁止访问文件夹,就是需要实现如图效果​_android 禁用mtp

推荐文章

热门文章

相关标签