- 给定一个数字n,表示一开始有编号1~n的树木,列成一条直线,
 给定一个有序数组arr,表示现在哪些树已经没了,arr[i]一定在[1,n]范围,
 给定一个数字m,表示你可以补种多少棵树。
 返回补种之后,最长的连续树木,有多少棵。
 滑动窗口的思想
public int longestTrees(int n,int m,int[] arr){
        System.out.printf("一共有{}棵树,其中有这么{}树是缺失的,给你{}这些树是可以进行补救的",n,arr,m);
        int ans =0;
        int start =1;
        System.out.printf("进行循环操作,循环变量i={},j={},j循环{}次",0,m,arr.length);
        for (int i=0,j=m;j<arr.length;i++,j++){
            ans = Math.max(ans,arr[j] - start);
            start = arr[i]+1;
        }
        System.out.printf("最后一次也要进行最大值比较");
        ans = Math.max(ans,n-start+1);
        System.out.printf("得到的结果为{},进行返回",ans);
        return ans;
    }
- a -> b,代表a在食物链中被b捕食,
 给定一个有向无环图,返回这个图中从最初级动物到最顶级捕食者的食物链有几条。
 来自理想汽车
- 一开始在0位置,每一次都可以向左或者向右跳,
 第i次能向左或者向右跳严格的i步。
 请问从0到x位置,至少跳几次可以到达。
 来自字节
 /**
     * 1- 1
     * 2- 3 1
     * 3- 6 4 2 0
     * 4- 10 8 6 4 2 0
     * 5- 15 13 11 9 7 5 3 1
     * ...
     * @param target
     * @return
     */
    public int reachNumber(long target){
        if (target ==0){
            return 0;
        }
        target = Math.abs(target);
        long l = 0;
        long r = target;
        long m = 0;
        long near = 0;
        while (l<=r){
            m = (l+r)/2;
            if (sum(m)>=target){
                near = m;
                r = m-1;
            }else {
                l = m+1;
            }
        }
        if (sum(near) == target){
            return (int) near;
        }
        if (((sum(near) - target) & 1) ==1){
            near++;
        }
        if (((sum(near) - target) & 1) ==1){
            near++;
        }
        return (int)near;
    }
    public static long sum(long n){
        return (n*(n+1))/2;
    }