回家的青蛙

package algorithm;

/*
//https://blog.csdn.net/u010062386/article/details/82695580?utm_source=app

青蛙在原点x=0,它可以向左或者向右跳,每次跳跃距离都在原先基础上加1,即第一次跳1,第二次跳2,第i次跳i.
当目标距离为t时,求跳跃到x=t时,最小的跳跃次数。

//题目也可为以下:
  题目:一条无限长的x轴,假设你站在原点,可以向左走也可以向右走,第n次走n步或者-n步,给一个target,问走到target的最小次数。

 思路:
如想走的次数最小,则尽量向右走,即尽量向前走:
 当所走的距离小于t时,则一直向前走,即向右走,如果大于t时,则需要向左走。假如第j步向左走,则和应该减去向左走的2倍,即2j.
 
 1+2+3+.+j+..+n=t ,即n*(n+1)/2 = t.  
 如果n*(n+1)/2 > t, 则去掉中间j步为: n*(n+1)/2 -2 *j =t。
 
 最小的步数是:恰好一直向右走到t
 n*(n+1)/2=t ,n*n+n=2t>n*n  n小于2t的开根号

 
 输入:6
 输出:3
 

 * */


public class FrogJump {

    //最小步数从某一值算起,n*(n+1)/2 -t =2j ,其中j>=0 且j<=n,当满足时,说明找到了步数n,
    // 即 n*(n+1)/2 -t 对2取摸 为0,说明找到了最小步数
    

    //当t=7时,n=3,此时不符合条件, n=4
            // 当n=4时,此时也不合法,此时是n=5,
          //当n=5时,符合则直接跳出,则最后返回5,
    public static int solution(int t){
        int n=(int)Math.sqrt(2*Math.abs(t));
        System.out.println("开始步数为="+n+" ,以后基于此递增");
        for(;(n*(n+1)/2-t)%2!=0;n++){ //一直运行,当不符合时,n++,当
               // n*(n+1)/2-t)%2==0 时,正好走完,此时
            
        }

        return n;
        
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int t=6;
        t=7;
        t=8;
        int result=solution(t);
        System.out.println("目标为"+t+",需要走的最小步数为:"+result);
    }

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值