LeetCode 754(python 3)

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
第一次写博客很激动呀…刚刚开始这个题我是先写出一些情况想找规律,然而…
后来借助大佬的思路,哈哈哈哈哈哈哈,不停学习的小白要继续加油呀!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值