Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

领扣-754 到达终点数字 Reach a Number MD


目录

到达终点数字 Reach a Number MD

题目

在一根无限长的数轴上,你站在0的位置。终点在target的位置。

You are standing at position 0 on an infinite number line. There is a goal at position target.

每次你可以选择向左 向右移动。第 n 次移动(从 1 开始),可以走 n 步。

On each move, you can either go left or right. During the n-th move (starting from 1), you take n steps.

返回到达终点需要的最小移动次数。

Return the minimum number of steps required to reach the destination.

示例 1:

输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。

示例 2:

输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。

思路

首先

比如说目标值是4,那么如果我们一直向前走,直到累加步数 sum 正好大于等于target时,有:

0 + 1 = 1

1 + 2 = 3

3 + 3 = 6

我们发现 sum 超过了目标值 4,超过的距离为2,是偶数,那么实际上我们只要将加上距离为 1 的时候,不加 1,而是 -1,那么此时累加和就损失了 2,那么正好能到目标值 4,如下:

0 - 1 = -1

-1 + 2 = 1

1 + 3 = 4

所以这种情况下,最小的步数就是累加步数到 sum 所用的步数 n。


然后

如果说目标值是 7,有:

0 + 1 = 1

1 + 2 = 3

3 + 3 = 6

6 + 4 = 10

我们发现 sum 超过了目标值 7 的距离为3,是奇数,我现在可以这么处理这个奇数 3:

3 = 2 * 1 + 1

前面的偶数 2 可以按照上面的方式来处理,我只需要处理多出来的 1 即可。实际上 1 就很好处理了,我们只需再向前走 1 步,然后再向后走 1 步其实刚好就抵消了这个 1 。这个过程如下:

0 - 1 = -1

-1 + 2 = 1

1 + 3 = 4

4 + 4 = 8 //基准步数

8 + 5 = 13

13 - 6 = 7

所以这种情况下,最小的步数就是累加步数到 sum 所用的步数 n + 2。


然而

然而测试时发现,当 sum - target 为奇数时,某些情况下,我们这种方式的步数会比最优解大 1 ,就比如上面的目标值 7 。

下面我们分析一下。

target=7; sum=10; n=4;

我们再走一步的话 sum=7+5=15; sum-target=8;

看到没,我们再走一步之后 sum-target 变成偶数了,既然变成偶数了,我们当然就可以按照最初的方式来走了呀:

0 + 1 = 1

1 + 2 = 3

3 + 3 = 6

6 - 4 = 2 //基准步数

2 + 5 = 7

所以这种情况下,我们只需多走一步就可以了,不需要无脑的多走两步。


所以

上面当 sum - target 为奇数时多走一步就可以的条件是:

sum + (n+1) - target 为偶数

因为我们已经知道 sum - target 为奇数了,所以 n+1 肯定也为奇数,也就是说 n 为偶数。

也就是说,如果此时 n 为偶数,我们只需再多走一步就可以了。

那如果 n 为奇数呢?

我觉得有两种分析方式,一种就是我们上面最开始错误分析的那种,直接为 n + 2;另一种可以继续按照这种方式分析:

如果 tem = sum - target 为奇数

那么 tem + (n+1) + (n+2) = 2 (n+1) + (tem+1) 肯定为偶数,也即再多走 2 步 无论如何都是可以的了。

当然,这只能保证是可以到达终点的路径,但不能百分之百保证这是最佳的路径!

代码实现

class Solution {
public int reachNumber(int target) {
target = Math.abs(target); //处理负值的情况
int count = 0;
int sum = 0;
while (sum < target) {
count++;
sum += count;
}
if ((sum - target) % 2 != 0) {
if (count % 2 == 0) {
count += 1;
} else {
count += 2;
}
}
return count;
}
}

2018-12-7

领扣-754 到达终点数字 Reach a Number MD的更多相关文章

  1. [Swift]LeetCode754. 到达终点数字 | Reach a Number

    You are standing at position 0 on an infinite number line. There is a goal at position target. On ea ...

  2. Java实现 LeetCode 754 到达终点数字(暴力+反向)

    754. 到达终点数字 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数 ...

  3. 领扣-1/167 两数之和 Two Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. LeetCode 754. Reach a Number到达终点数字

    题目 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数. 示例 1: 输 ...

  5. 领扣(LeetCode)数字转换为十六进制数 个人题解

    给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...

  6. 到达一个数 Reach a Number

    2018-09-24 14:19:58 问题描述: 问题求解: 初看到这个问题,直觉上认为可以通过BFS遍历解空间进行求解,因为本质上来说,这个问题和棋盘上移动马的问题是一类问题,都是可以转化成图的问 ...

  7. LeetCode 754. Reach a Number

    754. Reach a Number(到达终点数字) 链接:https://leetcode-cn.com/problems/reach-a-number/ 题目: 在一根无限长的数轴上,你站在0的 ...

  8. 领扣-121/122/123/188 最佳买卖时机 Best Time to Buy and Sell MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. Web大前端面试题-Day2

    1.伪类与伪元素的区别? 1) 定义区别 伪类 伪类用于选择DOM树之外的信息,或是不能用简单选择器进行表示的信息. 前者包含那些匹配指定状态的元素,比如:visited,:active:后者包含那些 ...

  2. 代理设置。 安卓工作室配置用http代理。gradle可能需要这些http代理设置去访问互联网。例如下载依赖。 你想要复制ide的代理配置到这个项目的gradle属性文件吗?

    代理设置. 安卓工作室配置用http代理.gradle可能需要这些http代理设置去访问互联网.例如下载依赖. 你想要复制ide的代理配置到这个项目的gradle属性文件吗? 查看更多细节,请参阅开发 ...

  3. CentOS 7下软阵列的创建

    硬阵列和软阵列没有什么可比性,毕竟应用的场景不一样,比如硬阵列性能强劲,有额外的内存支持缓存使其更快,但也有缺点,以硬盘为个数,且如果其中某个硬盘的容量不齐,那么会以最小的容量为准,体现出硬阵列的不灵 ...

  4. OpenVPN的ipp.txt为空不生效的问题

    1.ipp.txt是分配固定IP使用的,但在tun模式下里面的ip地址不是写使用着的IP,而是30位子网中没有列举出来的启动一位,比如我要给客户机分配为10.8.0.6的IP,那么它这个文件填写的是1 ...

  5. dwz(jui)刷新当前dialog的方法

    做了个查看日志的功能,需要刷新查看当前的dialog,方法如下: 1 <script type="text/javascript"> 2 $("#bt_ref ...

  6. 虫趣:BAD POOL CALLER (par1: 0x20)

    [作者:张佩] [原文:http://www.yiiyee.cn/Blog/0x19-1/] 内核在管理内存的时候,为了提高内存使用效率,对于小片内存的申请(小于一个PAGE大小),都是通过内存池来操 ...

  7. MySQL是如何利用索引的

    http://fordba.com/spend-10-min-to-understand-how-mysql-use-index.html

  8. effective C++ 读书笔记 条款08

    条款08  别让异常逃离析构函数: 假设在析构函数其中发生了异常,程序可能会过早结束或者导致不明白行为(异常从析构函数传播出去) 看代码: #include <iostream> usin ...

  9. Javascript中的依赖注入

    首先通过带参函数来定义一个Javascript函数,相当于C#中的一个类. var Person = function(firstname, lastname){ this.firstname = f ...

  10. 使用Axure RP原型设计实践06,登录验证

    登录验证主要功能包括: ● 用户名错误,提示无效用户名,用户名和密码文本框清空● 用户名存在,密码错误,提示密码错误,密码清空,焦点进入密码框● 用户名和密码都正确,验证通过 本篇接着"使用 ...