第k步走+k或-k,到达数轴上某点的最少步骤

int reachNumber(int target) {
    // target<0往数轴左侧和target>0往数轴右侧情况对称
    target = abs(target);
    // 给1,2,...,k中一些数加上负号,设要加正号的和为A,要加负号的和为B
    // A+B=1+2+...+k=sum,A-B=target,B=(sum-target)/2
    // 要满足sum>=target且sum-target为偶数
    int sum = 0, k = 0;
    while (sum < target) 
        sum += ++k;
    int delta = sum - target;
    if (delta % 2 == 0) return k;
    // 最多再走两步,sum-target总能变成偶数
    // 走两步,是因为第一次加的k可能是偶数
    delta += ++k;
    if (delta % 2 == 0) return k;
    return k + 1 ;
}