这是悦乐书的第310次更新,第331篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754)。你站在无限数字线的0号位置。在目的地有个target。在每次移动中,您可以向左或向右移动。在第n次移动(从1开始)期间,你可以走n步。返回到达目的地所需的最少步骤数。例如:

输入:target = 3

输出:2

说明:在第一步中,我们从0步进到1。在第二步,我们从1步骤到3。



输入:target = 2

输出:3

说明:在第一步中,我们从0步进到1。在第二步,我们从1步进到-1。在第三步,我们从-1步到2。



注意:target将是[-10 ^ 9,10 ^ 9]范围内的非零整数。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

此解法只是一种思路。因为每一步都有两种选择,往左或往右,一层一层展开,其结构类似树,因此可以构建一个二叉树,在构建二叉树的过程中,判断二叉树的节点值是否等于target。

03 第二种解法

在无从下手的情况下,我们来分析下几种情况:

第一,因为给的target可正可负,所以当target为负数时,其实与target为正数时是对称的,结果一样,所以在方法开始前,可以将其转为正数。

第二,如果一直是向左移动,移动的步数就变成了一个等差数列,总共移动的步数就是Nx(1+N)/2,如果其总步数等于目标值,这就是最优解,就可以直接返回移动的步数。

第三,既有左移,也有右移时,此时计算Nx(1+N)/2的值比target大,分为两种情况:

(1)Nx(1+N)/2 - target的差为偶数。例如总步数为1+2+3=6,target为4,两者相差为2,需要走三次,但是需要将第一步往左走,才能满足条件。只要是相差为偶数,就只需要差除以2的商的那一步往左走即可。

(2)Nx(1+N)/2 - target的差为奇数。此时上面的情况就不能满足了,就只能增加步数,那么是增加几步呢?此时我们需要去判断N了,如果N为偶数,需要再走一步,如果N为奇数,需要再走两步。例如target为5,已经走了三步,此时步数和为6,还需要再走两步,并且第5步需要往左走,也就是1+2+3+4-5=5。

  1. public int reachNumber(int target) {
  2. target = Math.abs(target);
  3. int result = 0;
  4. long i = 0;
  5. while (i*(i+1) < 2*target) {
  6. i++;
  7. }
  8. if (i*(i+1)/2 == target) {
  9. result = (int)i;
  10. } else {
  11. if ((i*(i+1)/2 - target)%2 == 0) {
  12. result = (int)i;
  13. } else {
  14. if (i%2 == 0) {
  15. result = (int)i+1;
  16. } else {
  17. result = (int)i+2;
  18. }
  19. }
  20. }
  21. return result;
  22. }

04 第三种解法

对于上面第二种解法,我们还可以再简化下,将求和和判断放在了一个循环中处理,依旧是做减法判断差值的奇偶,因为不满足条件就一直做累加,只有差值为偶数时才会退出循环。

  1. public int reachNumber(int target) {
  2. target = Math.abs(target);
  3. int result = 0, sum = 0;
  4. while (sum < target || (sum-target)%2 != 0) {
  5. result++;
  6. sum += result;
  7. }
  8. return result;
  9. }

05 小结

算法专题目前已日更超过五个月,算法题文章179+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Reach a Number(Java实现)的更多相关文章

  1. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  2. LeetCode算法题-Convert a Number to Hexadecimal(Java实现)

    这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...

  3. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  4. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  5. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  6. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

  7. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  8. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  9. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

随机推荐

  1. c/c++ 动态库与静态库的制作和使用

    静态库的用法 静态库的文件名 libxxx.a -->对应windows的.lib文件 做静态库的命令: ar rcs libxxx.a file1.o file2.o file.o 使用静态库 ...

  2. Ginger的第一篇博客

    怀着无感的心情,没有技术的身体,写下第一篇博客作为标记. 目前应该会搞清楚数据结构上相关的操作.算法,然后用c语言实现后记录在博客. 我是有目标的咸鱼! 2019/4/19

  3. 流行的报表生成工具-JXLS

    如果你还在为灵活的生成各种复杂报表犯愁,在为常用报表工具消耗大量内存担心.我推荐一个很好用的开源的Java报表生成工具. 本工具封装了强大的POI.但与POI不同的是,它可以用很简洁的代码生成复查的, ...

  4. Java实现单链表

    真正的动态数据结构(引用和指针) 优点:真正的动态,不需要处理固定容量的问题. 缺点:丧失随机访问的能力. 链表就像寻宝,我们拿到藏宝图开始出发寻宝,每找到一个地方后,里面藏着下一步应该去哪里寻找.一 ...

  5. 深入学习ThreadLocal原理

    上文我们学习了ThreadLocal的基本用法以及基本原理,ThreadLocal中的方法并不多,基本用到的也就get.set.remove等方法,但是其核心逻辑还是在定义在ThreadLocal内部 ...

  6. Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1.虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建.栈里面存着的是一种叫“栈 ...

  7. Data Lake Analytics + OSS数据文件格式处理大全

    0. 前言 Data Lake Analytics是Serverless化的云上交互式查询分析服务.用户可以使用标准的SQL语句,对存储在OSS.TableStore上的数据无需移动,直接进行查询分析 ...

  8. Python两步实现关联规则Apriori算法,参考机器学习实战,包括频繁项集的构建以及关联规则的挖掘

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  9. ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)

    之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键 ...

  10. 简简单单的Vue3(插件开发,路由系统,状态管理)

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 插件 路由(vue-router) 状态管理模式(Vuex) 那在上篇文章,我们讲了, ...