LeetCode算法题-Reach a Number(Java实现)
这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Reach a Number(Java实现)相关推荐
- LeetCode算法题-Convert a Number to Hexadecimal(Java实现)
这是悦乐书的第219次更新,第231篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第86题(顺位题号是405).给定一个整数,写一个算法将其转换为十六进制.对于负整数,使 ...
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
- LeetCode算法题-Design LinkedList(Java实现)
这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...
- LeetCode算法题-Detect Capital(Java实现)
这是悦乐书的第251次更新,第264篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第118题(顺位题号是520).给定一个单词,你需要判断其中大写字母的使用是否正确.当下 ...
- LeetCode算法题-Number Complement(Java实现-五种解法)
这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...
- LeetCode算法题-Reverse Linked List(Java实现)
这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...
- LeetCode算法题-Minimum Depth of Binary Tree(Java实现)
这是悦乐书的第168次更新,第170篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第27题(顺位题号是111).给定二叉树,找到它的最小深度.最小深度是沿从根节点到最近的 ...
- LeetCode算法题-Valid Palindrome II(Java实现)
这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...
- LeetCode算法题-K-diff Pairs in an Array(Java实现)
这是悦乐书的第254次更新,第267篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第121题(顺位题号是532).给定一个整数数组和一个整数k,您需要找到数组中唯一的k- ...
最新文章
- 如何从功能测试转化自动化测试?
- UNP总结 Chapter 11 名字与地址转换
- 小白的第一本python书_读书笔记:编程小白的第一本python入门书
- 异常:catch下的return;
- 【HNOI2007】紧急疏散
- WPF学习笔记 - 不一样的皇帝的新衣
- 为什么要使用反射机制
- 表达式求值(二叉树方法/C++语言描述)(二)
- 鲲鹏基础软件开发赛道openLooKeng赛题火热报名中,数十万大奖等您来收割
- Games101 计算机图形学课程笔记: Lecture14 Ray Tracing 2
- python怎么安装json_python里面怎么安装json包
- Matlab Tricks(十八)—— 矩阵间元素距离的计算
- html5 video标签嵌入视频
- 洛谷-UVA12676 Inverting Huffman(反转树)
- dB、dBm、dBw、dBμV、dBmV、dBV、dBv等单位介绍
- html 文字自动转大写
- 第五届模式识别与人工智能国际会议-PRAI 2022
- 百度广告屏蔽及游戏推广屏蔽
- 免费邮箱客户端设置方法大全
- PROE5.0运动仿真入门到精通视频教程