【leetcode】Reach a Number
题目:
You are standing at position 0 on an infinite number line. There is a goal at position target. 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. Example 1:
Input: target = 3
Output: 2
Explanation:
On the first move we step from 0 to 1.
On the second step we step from 1 to 3.
Example 2:
Input: target = 2
Output: 3
Explanation:
On the first move we step from 0 to 1.
On the second move we step from 1 to -1.
On the third move we step from -1 to 2.
Note:
target will be a non-zero integer in the range [-10^9, 10^9].
解题思路:
看完题目后,我脑子里首先出现的是动态规划算法解决这一类问题。但是仔细想想,又觉得不太对,首先target的范围很大,没有这个大的数组可以保存中间结果。之后脑子里闪过了无数的方法,但都被一一否决了。万般无奈之下,想起了“找规律”的老办法。题目要求是从0开始,第n次操作可以到达target,那么可以先试试找出每次操作可以到达的的number,是否能够发现其中的规律。
function unique(a) {
var res = []; for (var i = 0, len = a.length; i < len; i++) {
var item = a[i]; for (var j = 0, jLen = res.length; j < jLen; j++) {
if (res[j] === item)
break;
} if (j === jLen)
res.push(item);
} return res;
} var reachNumber = function(target) {
var l = [0]
for(var i = 1;i < 6;i++){
var tl = []
while(l.length > 0){
var t = l.pop()
tl.push(t-i)
tl.push(t+i)
}
var tl = unique(tl).sort(function(a,b){
return a-b})
//console.log(i,':',tl[0],tl[1],tl[2],tl[3])
console.log(i,':',tl)
for(var j =0;j<tl.length;j++){
l.push(tl[j])
}
}
}; reachNumber()
输出的结果如下:
1 ':' [ -1, 1 ]
2 ':' [ -3, -1, 1, 3 ]
3 ':' [ -6, -4, -2, 0, 2, 4, 6 ]
4 ':' [ -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10 ]
5 ':' [ -15, -13, -11, -9, -7, -5, -3, -1, 1, 3, 5, 7, 9, 11, 13, 15 ]
为了控制输出的长度,这里设置了i<6的条件,其实适当把i放大,会发现更明显的规律。
这里就直接把规律列出来了:
a. 第n次操作能到达的最大范围是 -(1+2+...+n)和 (1+2+...+n);
b. 负数的number和正数的number是对称的,可以令target = abs(target);
c. n%4 == 0或者n%4 == 3的时候,只能移动到小于偶数的number;
d. n%4 == 1或者n%4 == 2的时候,只能移动到奇数的number;
所以,要找出最小的n,可以到达abs(target)分两种情况:
1. abs(target)是偶数,需要满足上面的a和c两个条件;
2.abs(target)是奇数,需要满足上面的a和d两个条件;
代码如下:
var reachNumber = function(target) {
if (target < 0){
target = -target
}
if(target == 1 || target == -1){
return 1
}
var isOdd = target%2
var count = 1;
var t = 1;
while(count++) {
t += count
if (t >= target && isOdd == 0 && (count % 4 == 3 || count % 4 == 0)) {
return count;
}
else if (t >= target && isOdd != 0 && (count % 4 == 1 || count % 4 == 2)) {
return count
} }
}; console.log(reachNumber(1))
【leetcode】Reach a Number的更多相关文章
- 【LeetCode】375. Guess Number Higher or Lower II 解题报告(Python)
[LeetCode]375. Guess Number Higher or Lower II 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://f ...
- 【LeetCode】137. Single Number II 解题报告(Python)
[LeetCode]137. Single Number II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/single- ...
- 【LeetCode】306. Additive Number 解题报告(Python)
[LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- 【LeetCode】452. Minimum Number of Arrows to Burst Balloons 解题报告(Python)
[LeetCode]452. Minimum Number of Arrows to Burst Balloons 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https ...
- 【LeetCode】65. Valid Number
Difficulty: Hard More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...
- 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 贪心算法 日期 题目地址:https://leetc ...
- 【Leetcode】179. Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- 【Leetcode】264. Ugly Number II ,丑数
原题 Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime facto ...
- 【leetcode】1189. Maximum Number of Balloons
题目如下: Given a string text, you want to use the characters of text to form as many instances of the w ...
随机推荐
- Dynamic Web TWAIN——网页扫描SDK
下载地址:[https://www.dynamsoft.com/Support/DWTGuide/Dynamic%20Web%20TWAIN%20SDK.html] API:[http://devel ...
- SVM的推导和理解
主要记录了SVM思想的理解,关键环节的推导过程,主要是作为准备面试的需要. 1.准备知识-点到直线距离 点\(x_0\)到超平面(直线)\(w^Tx+b=0\)的距离,可通过如下公式计算: \[ d ...
- 20191209 Linux就该这么学(5)
5. 用户身份与文件权限 5.1 用户的身份和能力 Linux 系统的管理员之所以是 root,并不是因为它的名字叫 root,而是因为该用户的身份号码即 UID( User IDentificati ...
- [JS] 文本框判断输入的内容是否为数字
可以通过触发文本框的onchange事件来对输入的内容进行判断是否为数字 文本框的属性设置: 把onchange的属性对应的js函数写好即可 参数传输的是当前控件的value值,即text值 < ...
- The system has no LUN copy license
[问题描述] ipsan作为cinder后端的时候,通过快照创建磁盘失败,报以下错误: { u 'data': {}, u 'error': { u 'code': 1077950181, u 'de ...
- Elasticsearch-数据的存储、搜索(干货)
ES-深入功能ES中数据是如何组织的?逻辑设计:用于索引和搜索的基本单位是文档,可以将其认为是关系数据库里的一行.文档以类型来分组,类型包含若干文档,类似表格包含若干行.最终,一个或多个类型存在于同一 ...
- BZOJ 1303 中位数图 题解
题面 因为所求的是中位数,所以考虑改变原序列.把大于 b 的数全部变为 1,小于 b 的数变为 −1,等于 b 则为 0.问题就变为求存在几个包含 b的区间和为 0 . 根据乘法原理,我们枚举每一个l ...
- linux 终端的用户与主机名
首先这个属于Linux中的$PS1的变量,你可以通过 echo $PS1查看你当前的变量值. 默认的PS1变量值是 [\u@\h \W]\$,每个参数的含义 "root":表示当前 ...
- Voting CodeForces - 749C (set,模拟)
大意: n个人, 两个党派, 轮流投票, 两种操作(1)ban掉一个人 (2)投票, 每轮一个未被ban的人可以进行一次操作(1)或操作(2), 求最终哪个党派得票最多. 显然先ban人会更优, 所以 ...
- [JavaScript] es6规则总结
let 和 const let 是块级作用域 let 声明的变量只在其所在的作用域内生效 <script> { var today = "周3"; let yester ...