ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

LeetCode算法题-Reach a Number(Java实现)

2019-04-19 08:48:38  阅读:257  来源: 互联网

标签:Java target int Reach Number 算法 result 步数 解法


这是悦乐书的第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。

public int reachNumber(int target) {
    target = Math.abs(target);
    int result = 0;
    long i = 0;
    while (i*(i+1) < 2*target) {
        i++;
    }
    if (i*(i+1)/2 == target) {
        result = (int)i;
    } else {
        if ((i*(i+1)/2 - target)%2 == 0) {
            result = (int)i;
        } else {
            if (i%2 == 0) {
                result = (int)i+1;
            } else {
                result = (int)i+2;
            }
        }
    }
    return result;              
}


04 第三种解法

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

public int reachNumber(int target) {
    target = Math.abs(target);
    int result = 0, sum = 0;
    while (sum < target || (sum-target)%2 != 0) {
        result++;
        sum += result;
    }
    return result;              
}


05 小结

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

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

标签:Java,target,int,Reach,Number,算法,result,步数,解法
来源: https://www.cnblogs.com/xiaochuan94/p/10733790.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有