领扣-754 到达终点数字 Reach a Number MD
| 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的更多相关文章
- [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 ...
- Java实现 LeetCode 754 到达终点数字(暴力+反向)
754. 到达终点数字 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数 ...
- 领扣-1/167 两数之和 Two Sum MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- LeetCode 754. Reach a Number到达终点数字
题目 在一根无限长的数轴上,你站在0的位置.终点在target的位置. 每次你可以选择向左或向右移动.第 n 次移动(从 1 开始),可以走 n 步. 返回到达终点需要的最小移动次数. 示例 1: 输 ...
- 领扣(LeetCode)数字转换为十六进制数 个人题解
给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写. 十六进制字符串中不能包含多余的前导零.如果要转化的数 ...
- 到达一个数 Reach a Number
2018-09-24 14:19:58 问题描述: 问题求解: 初看到这个问题,直觉上认为可以通过BFS遍历解空间进行求解,因为本质上来说,这个问题和棋盘上移动马的问题是一类问题,都是可以转化成图的问 ...
- LeetCode 754. Reach a Number
754. Reach a Number(到达终点数字) 链接:https://leetcode-cn.com/problems/reach-a-number/ 题目: 在一根无限长的数轴上,你站在0的 ...
- 领扣-121/122/123/188 最佳买卖时机 Best Time to Buy and Sell MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 领扣-209 长度最小的子数组 Minimum Size Subarray Sum MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
随机推荐
- hihoCoder.1465.后缀自动机五 重复旋律8(后缀自动机)
题目链接 \(Description\) 给定母串S,求模式串的循环同构串在S中的出现次数. \(Solution\) 将模式串s复制一遍,在母串的SAM上匹配,记录以每个位置作为后缀所能匹配的最大长 ...
- 如何用dat批处理文件关闭某端口对应程序-Windows自动化命令
如何用dat批处理文件关闭某端口对应程序? 网上找到的大部分都是手动操作,第一步先查出端口,第二步在根据上一步查到的端口手动去关闭进程.但我的需求不是这样的,我需要全自动处理.用于 dubbo 服务进 ...
- 回忆Ajax ๑乛◡乛๑
东西越多,记不完,也记不住,笔记是最好的记忆了. 回顾以前的ajax的写法,简单封装一个ajax. //data = { // url: "url", // method: &qu ...
- MySQL 集群
MySQL Galera介绍 主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正的并行复制,行级 ...
- 解决Windows x86网易云音乐不能将音乐下载到SD卡的BUG
由于我个人最常用的电脑是Surface pro4 256G版本,装了不少生产力空间还挺吃紧的,音乐之类的必然都存单独的SD卡里.用UWP版本的网易云音乐倒是没问题,最近问题来了,UWP版本的网易云音乐 ...
- HTML5中的跨文档消息传递
跨文档消息传送(cross-document messaging),有时候也简称为XDM,指的是来自不同域的页面间传递消息.例如,www.w3cmm.com域中的一个页面与一个位于内嵌框架中的p2p. ...
- stm-ledstrip : Driver and test routine for WS2811 RGB-LED
stm-ledstrip : Driver and test routine for WS2811 RGB-LED #include "ws2812.h" #include < ...
- JS删除String里某个字符的方法
关于JS删除String里的字符的方法,一般使用replace()方法.但是这个方法只会删除一次,如果需要将string里的所以字符都删除就要用到正则. 1 2 3 4 var str = " ...
- 收集的MySQL的面试题分享给大家
1.怎样登陆mysql数据库 mysql -u username -p 2.怎样开启/关闭mysql服务 service mysql start/stop 3.查看mysql的状态 service m ...
- android音乐播放器开发 SweetMusicPlayer 摇一摇换歌
上一篇写了怎样在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,如今来讲讲摇一摇功能开发. 相同用了一个Service ...