Sqrt(x)

Question

Implement int sqrt(int x).

Compute and return the square root of x.

My Solution

class Solution {
public:
	int mySqrt(int x) {
		/**
		* binary search a from [0, x], where a^2 = x.
		*/
		if (x < 0) return 0;
		return BSearchByLoop(x);
	}

	int BSearch(int x, int start, int end) {
		/**
		* binary search a from [start, end], where a^2 = x.
		* Note: when x is very big, stack overflow exception occurs.
		*
		* 1. if start > end, then return -1;
		* 2. tmp = (start + end) / 2
		* 3. if tmp^2 = x, then return tmp;
		* 4. if tmp^2 < x, then return BSearch(x, tmp + 1, end);
		* 5. if tmp^2 > x, then return BSearch(x, start, tmp - 1);
		*/

		if (0 == x || 1 == x) return x;

		if (start >= end) {
			if (start * start <= x) return start;
			else return start - 1;
		}

		int mid = (start + end) / 2;
		if (mid * mid == x) return mid;
		else if (mid * mid < x) return BSearch(x, mid + 1, end);
		else return BSearch(x, start, mid - 1);
	}

	int BSearchByLoop(int x)
	{
		/*
		1. if 0 == x or 1 == x, then return x;
		2. start = 0, end = x.
		3. if start > end, then return end;
		4. mid = (start + end) / 2;
		5. if mid^2 == x, return mid;
		6. if mid^2 > x, end = mid - 1; jmp 3;
		7. if mid^2 < x, start = mid + 1; jmp 3;
		*/

		if (0 == x || 1 == x) return x;
		int start = 0, end = x;
		while (start <= end)
		{
			long long mid = (end - start) / 2 + start; // mid*mid is probably bigger than 2^32
			if (mid * mid == x) return mid;
			else if (mid * mid > x) end = mid - 1;
			else start = mid + 1;
		}
		return end;
	}
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章