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);
}
}
4732

被折叠的 条评论
为什么被折叠?



