leetcode754

//很典型的数学推导 + 简单编程问题
//这个问题转换成1 , 2 ,3 ,...,n添加正负号求和等于t的问题 (这一步在做题的时候想到了),已知t 求解n的这样一个过程
//于是设正数部分是p 负数部分的和是q
//有 p + q = s(前n求和)
//有 p - q = t
//想见得到 s - t = 2q 注意这里2q直接看成偶数即可 等式右边直接看成一个约束条件 因为对于1~n满足这个等式de 
//q必然小于n 而可以取的又是连续整数 极其和 所以只需要枚举s-t是偶数并且大于等于0成立的最小n即可
//很典型的思路

class Solution {
public:
    int reachNumber(int target) {
        if(target < 0) target -= 2*target;
        int index = 1;
        while(1){
            int s = (index + 1) * index / 2;
            int temp = s - target;
            if(temp >= 0 && temp % 2 == 0)
                 break;
            index++;
        }
        return index;
    }
};

 

posted on 2019-09-22 15:28  在苏州的城边  阅读(220)  评论(0编辑  收藏  举报

导航