你的赛车起始停留在位置 0,速度为 +1,正行驶在一个无限长的数轴上。(车也可以向负数方向行驶。)

你的车会根据一系列由 A(加速)和 R(倒车)组成的指令进行自动驾驶 。

当车得到指令 "A" 时, 将会做出以下操作: position += speed, speed *= 2。

当车得到指令 "R" 时, 将会做出以下操作:如果当前速度是正数,则将车速调整为 speed = -1 ;否则将车速调整为 speed = 1。  (当前所处位置不变。)

例如,当得到一系列指令 "AAR" 后, 你的车将会走过位置 0->1->3->3,并且速度变化为 1->2->4->-1。

现在给定一个目标位置,请给出能够到达目标位置的最短指令列表的长度。

示例 1:
输入: 
target = 3
输出: 2
解释: 
最短指令列表为 "AA"
位置变化为 0->1->3
示例 2:
输入: 
target = 6
输出: 5
解释: 
最短指令列表为 "AAARA"
位置变化为 0->1->3->7->7->6
说明:

1 <= target(目标位置) <= 10000。

官方题解中的方法二和我的方法类似,这里放出另一种方法(最短路)的代码。

class Solution {class node{int step,target;public node(int step,int target) {this.step=step;this.target=target;}}public int racecar(int target) {int K=33-Integer.numberOfLeadingZeros(target-1);int barrier=1<<K;int[] dis=new int[2*barrier+1];Arrays.fill(dis, Integer.MAX_VALUE);dis[target]=0;PriorityQueue<node> q=new PriorityQueue<node>((a,b)->a.step-b.step);q.add(new node(0,target));while(!q.isEmpty()) {node now=q.poll();int steps=now.step;int tar1=now.target;if(dis[Math.floorMod(tar1, dis.length)]>steps)continue;for(int k=0;k<=K;k++) {int walk=(1<<k)-1;int tar2=walk-tar1;int steps2=steps+k+(tar2!=0?1:0);if(Math.abs(tar2)<=barrier && steps2<dis[Math.floorMod(tar2, dis.length)]) {q.add(new node(steps2,tar2));dis[Math.floorMod(tar2, dis.length)]=steps2;}}}return dis[0];}
}

方法二:动态规划

class Solution {public int racecar(int target) {int[] dp=new int[target+3];Arrays.fill(dp, Integer.MAX_VALUE);dp[0]=0; dp[1]=1; dp[2]=4;for(int t=3;t<=target;t++) {//从最高位不为0的位算起,二进制表示的位数int k=32-Integer.numberOfLeadingZeros(t);if(t==(1<<k)-1) {dp[t]=k;continue;}for(int j=0;j<k-1;j++)dp[t]=Math.min(dp[t], dp[t-(1<<(k-1))+(1<<j)]+k-1+j+2);if((1<<k)-1-t<t)dp[t]=Math.min(dp[t], dp[(1<<k)-1-t]+k+1);}return dp[target];}
}

JAVA程序设计:赛车(LeetCode:818)相关推荐

  1. 《Java程序设计》第十一周学习总结

    20175334 <Java程序设计>第十一周学习总结 教材学习内容总结 第十三章 URL类 一个URL对象通常包含最基本的三部分信息:协议.地址.资源. URL对象调用 InputStr ...

  2. 20175320 2018-2019-2 《Java程序设计》第2周学习总结

    20175320 2018-2019-2 <Java程序设计>第2周学习总结 教材学习内容总结 本周学习了教材的第二章及第三章的内容.在这两章中介绍了Java编程中的基本数据类型与数组以及 ...

  3. 20145101《Java程序设计》第4周学习总结

    20145101<Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 继承:避免多个类间重复定义共同行为. 把相同代码提升为父类 运用extends关键字的子类会继承扩 ...

  4. java程序设计_Java程序设计:学习笔记(4-5)(未完工)

    声明: 本文内容基于"吉首大学软件学院-Java程序设计(Java面向对象程序设计)"网课与个人实践经验修改编写而成.本文属于Arcadia项目组成部分.若有错误或不足之处存在请联 ...

  5. 20155307 2016-2017-2 《Java程序设计》第10周学习总结

    20155307 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 网络编程:就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据 ...

  6. 20155204 2016-2017-2 《Java程序设计》第3周学习总结

    20155204 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 一个原始码中可以有多个类定义,但只能有一个公开类. 留心Scanner对于每一种类型的nex ...

  7. java课设推荐,《Java程序设计》课程设计报告推荐.docx

    <Java程序设计>课程设计报告推荐 <Java程序设计>课程设计报告2015-2016学年 第一学期设计题目整数进制转换学生姓名邹晓刚学 号0专业班级信管1303指导教师 姜 ...

  8. 计算机浙大网java网站,网络课程—非计算机专业JAVA程序设计语言

    <非计算机专业JAVA程序设计语言> 一.主要目标和主要内容: 该课程面向全校非计算机专业理工类本科生,是程序设计语言类必修的公共基础课之一.该课程的前导课程是<大学计算机基础> ...

  9. Java程序设计经典习题15道

    Java程序设计总复习题 1.编写一个Java程序在屏幕上输出"你好!".(p13,例1-1) //programme name Helloworld.java public cl ...

  10. java程序设计pdf下载_Java程序设计(迟立颖) PDF扫描版[21MB]

    Java程序设计由浅入深地介绍了Java的基础知识,并结合具体的实例重点阐述了Java面向对象的概念及其程序设计方法,还介绍了图形用户界面(GUI)等知识.全书共分11章,内容包括Java概述.Jav ...

最新文章

  1. mybatis逆向工程配置文件怎么再偷懒(懒出天际)
  2. 爬虫学习笔记(二十三)—— Appium+Mitmproxy
  3. Linux ubuntu对于cmake的版本更新
  4. 结对项目——最大子数组
  5. 【debian】解决debian中文安装后出现乱码的问题
  6. java adt eclipse_在eclipse中添加android ADT
  7. ESP32使用PCF8563时钟模块进行网络校时
  8. 交换机连接控制器_MESH路由器组网指南,各种连接方法
  9. html svg 线条动画,HTML5 SVG图形轮廓线条绘制动画插件-vivus
  10. 新浪微博分享错误代码列表
  11. 孤独的根号三 (Missing NUMBER)
  12. mysql 关闭防火墙 命令_CentOS7关闭防火墙命令
  13. c语言实数的存放形式,C51中float定义的实数存放形式
  14. Vagrant在,win7/win10系统下搭建使用
  15. 宇视科技设备SDK获取方式
  16. Python:1020 月饼
  17. [教你警告消除]Warning[Pe1072]: a declaration cannot have a label!
  18. 代码详解设计模式--观察者模式
  19. 支付通道跳转H5 WAP快捷支付
  20. ghost linux引导修复工具,GhostBSD 19.10 发布,UEFI多重引导的修复

热门文章

  1. 西门子S7-1200系列PLC定时器指令
  2. 【已解决】谷歌Chrome浏览器中如何打开或关闭网页的自动翻译功能?
  3. php的left join,Left Join
  4. IDEA打字冒火花教程
  5. 编译原理基本定义(文法、算符文法、算符优先文法、算符优先关系表、算符优先分析过程)
  6. ImGui 集成到 axmol 引擎
  7. 解决fullpage尾屏半屏问题
  8. seq to seq
  9. 函数中的arguments
  10. Android学习计划