1. 程式人生 > >【LeetCode】754. Reach a Number(C++)

【LeetCode】754. Reach a Number(C++)

題目:

You are standing at position 0 on an infinite number line. There is a goal at position target.

On each move, you can either go left or right. During the n-th move (starting from 1), you take n steps.

Return the minimum number of steps required to reach the destination. Example 1:

Input: target = 3 Output: 2 Explanation: On the first move we step from 0 to 1. On the second step we step from 1 to 3.

Example 2:

Input: target = 2 Output: 3 Explanation: On the first move we step from 0 to 1. On the second move we step from 1 to -1. On the third move we step from -1 to 2.

Note:

  • target will be a non-zero integer in the range [-10^9, 10^9].

理解:

實現:

class Solution {
public:
	int reachNumber(int target) {
		target = abs(target);
		//8.0 is necessary, otherwise 8*target is overflow
		long long k = ceil((-1 + sqrt(1 + 8.0 * target)) / 2.0);
		long long sum = (1 + k)*k / 2;
		if (sum == target) return k;
		long long diff = sum - target;
		if ((diff & 1) == 0)
			return k;
		else
            //k is odd, k+1 is even, k+2 is needed
			return (k & 1) ? k + 2 : k + 1;
	}
};

吃飯,理解下午補。(如果起得來。。)