leetcode 754 解法即感想
题目描述:在一根无限长的数轴上,你站在0的位置。终点在target的位置。
每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。
返回到达终点需要的最小移动次数。
0.首先对于每一步a,只有两种可能,+或-,两种情况相差2*a
例如:target是3,那么return 2,因为第一次移动一步,第二次移动两步到达3这个target位置。
1.正负数没有差别,正数如何到达,相应的负数改变符号即可。因此我们可以通过abs函数将问题转化为只考虑正数。
2.设sum是从1到n的和,比较sum和target的大小,如果sum比target小,我们继续向前移;如果sum-target>=0,分情况讨论:i.sum=target,return n;ii.sum>target,令diff=sum-target,如果diff为偶数,根据0可以知道,只需改变diff/2的符号就可以达到目的;如果diff为奇数,diff+1是偶数,又1+2+…+n=sum,1+2+…-(diff+1)/2+…+n=sum-(diff+1)=target-1.sum比target大却又不可以通过转换前面的符号来达到目的,因此我们想到再加上一个n+1,此时newsum-target=diff+n+1,如果n为偶数,显然我们应该return n+1,如果n为奇数呢?回到1+2+…+n=sum, 1+2+…-(diff+1)/2+…+n=sum-(diff+1)=target-1,我们改写一下即可,1+2+…-(diff+1)/2+…+n-(n+1)+n+2=sum-(diff+1)+1=target-1+1=target,所以return n+2
代码如下:
def reachtarget(target):
target=abs(target)
sum=0
for i in range(1,10**9):
sum+=i
if sum>=target:
if sum=target or (sum-target)%2==0:
return i
if i%2==0:
return i+1
return i+2
3.改进:通过上面的分析我们可以知道,那个n要么是刚好满足n*(n+1)/2==target,要么满足diff是偶数,所以我们可以这样写:def reachtarget(target): sum=0 for i in range(1,10**9): sum+=i if sum>=target: if (sum-target)%2==0: return i
第一次写博客很激动呀…刚刚开始这个题我是先写出一些情况想找规律,然而…
后来借助大佬的思路,哈哈哈哈哈哈哈,不停学习的小白要继续加油呀!!!