Leetcode-69: Sqrt(x)
2018-03-28 13:49
513 查看
这题我就用binary search做的,用牛顿迭代法应该更快。
解法1: binary search
注意:
1) 当x=INT32_MAX时,long long j=x+1会等于0。因为x+1还是integer,溢出后等于0,所以要加(long long)。
2) mid^2<=x<=(mid+1)^2时,要注意是否应该返回x+1。
3) j的上界可能不需要到x+1,下次要仔细想想。#include <iostream>
using namespace std;
int mySqrt(int x) {
long long i=0, j=(long long)x+1; //if j=x+1, then j=0!!!
while(i<j) {
long long mid=i+(j-i)/2;
if (mid*mid > x) {
j=mid;
}else if ((mid+1)*(mid+1)<x) {
i=mid+1;
}else { //mid^2<=x<=(mid+1)^2
if ((mid+1)*(mid+1)==x) return mid+1;
return mid;
}
}
}
int main()
{
cout<<mySqrt(4)<<endl;
cout<<mySqrt(9)<<endl;
cout<<mySqrt(10)<<endl;
cout<<mySqrt(2147395599)<<endl;
cout<<mySqrt(2147483647)<<endl; //maximum of INT_32!
return 0;
}解法2: 牛顿迭代法 (下次补充)
解法1: binary search
注意:
1) 当x=INT32_MAX时,long long j=x+1会等于0。因为x+1还是integer,溢出后等于0,所以要加(long long)。
2) mid^2<=x<=(mid+1)^2时,要注意是否应该返回x+1。
3) j的上界可能不需要到x+1,下次要仔细想想。#include <iostream>
using namespace std;
int mySqrt(int x) {
long long i=0, j=(long long)x+1; //if j=x+1, then j=0!!!
while(i<j) {
long long mid=i+(j-i)/2;
if (mid*mid > x) {
j=mid;
}else if ((mid+1)*(mid+1)<x) {
i=mid+1;
}else { //mid^2<=x<=(mid+1)^2
if ((mid+1)*(mid+1)==x) return mid+1;
return mid;
}
}
}
int main()
{
cout<<mySqrt(4)<<endl;
cout<<mySqrt(9)<<endl;
cout<<mySqrt(10)<<endl;
cout<<mySqrt(2147395599)<<endl;
cout<<mySqrt(2147483647)<<endl; //maximum of INT_32!
return 0;
}解法2: 牛顿迭代法 (下次补充)
相关文章推荐
- 【Leetcode】69. Sqrt(x) 【溢出?如何防止?】
- LeetCode 69. Sqrt(x)
- [leetcode 69] Sqrt(x)
- 【LeetCode】69. Sqrt(x)解法及注释
- leetcode 69. Sqrt(x)
- [LeetCode] 69. Sqrt(x)
- leetcode 69. Sqrt(x)
- leetcode 69 Sqrt(x)
- leetcode 69 sqrt(x)
- leetcode_69题——Sqrt(x)(二分查找,还有个溢出问题的研究)
- LeetCode 69. Sqrt(x)
- LeetCode:69. Sqrt(x)
- LeetCode-69. Sqrt(x)
- [leetcode]69. Sqrt(x)
- leetcode - 69.Sqrt(x)
- Leetcode 69. Sqrt(x)
- Leetcode-69. Sqrt(x)
- leetcode --69. Sqrt(x)
- Leetcode:69. Sqrt(x)
- [leetcode] 【分治法】 69. Sqrt(x)