题目:实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
解一:二分法
class Solution {
public int mySqrt(int x) {
if (x <=1 ) {
return x;
}
int low = 1, high = x;
int mid = low+(high-low)/2;
int sqrt = x/mid;
while (low<=high) {
if(sqrt == mid){
return mid;
}else if(sqrt<mid){
high = mid-1;
}else{
low = mid+1;
}
}
return high;
}
}
解二:牛顿迭代法
class Solution {
public int mySqrt(int x) {
if (x <=1 ) {
return x;
}
double res = 1, double last = 0;
while (res!=last) {
last = res;
res = (res+x/res)/2
}
return (int)res;
}
}
二分法查找:
//一般的二分法,不要求出现重复值时返回最左的值(最靠前的)
class Solution {
public int mySqrt(int[] arr,int key) {
int low = 0, high = arr.length-1;
int mid = low+high/2;
while (low<=high) {
if(arr[mid]==key){
return mid;
}else if(arr[mid]>key){
high = mid-1;
}else{
low = mid+1;
}
}
return -1;
}
}
二分法查找变种
//当数组中出现重复元素,需要查找最左元素时。
class Solution {
public int mySqrt(int[] arr,int key) {
int low = 0, high = arr.length-1;
int mid = low+high/2;
while (low<high) {
if(arr[mid]>=key){
high = mid;
}else{
low = mid+1;
}
}
return low;
}
}