알고리즘 에 서 는 넘 치지 않도록 부등식 변환 을 사용 할 수 있 습 니 다. leetcode: Sqrt (x), BigInteger 처리 넘 침
Math. pow (mid, 2) 와 x 의 크기 를 비교 하면 mid 와 x / mid 의 비교 로 대체 할 수 있 는데 이것 은 초등학교 수학 에서 습득 할 수 있 는 문제 이다.
이분법 과정 에서 넘 칠 수 있 는 상황 은 mid = (left + right) / 2 입 니 다. 만약 left + right 의 합 이 정수 범 위 를 초과 하면 완전히 넘 칠 수 있 습 니 다. 어떻게 합 니까?
조금 만 바 꿔 주세요 (left + right) / 2 = left + (right - left) / 2, 넘 치지 않 습 니 다!
문 제 를 풀 때 머리 를 쓰 면 문 제 를 해결 할 수 있 을 것 같다.
다음은 Sqrt 를 처리 하 는 코드 (이분법) 입 니 다.
public int mySqrt(int x) {
if(x <= 0) return 0;
int r = x/2+1;
int l = 1;
int mid=0;
while(l<=r){
mid = (l+r)/2;
if(mid==x/mid){
return mid;
}else if(mid>x/mid){
r = mid-1;
}else{
l = mid+1;
}
}
if(Math.pow(mid, 2)>x){
return mid-1;
}
return mid;
}
가끔 우 리 는 BigInteger 를 사용 하여 넘 치 는 것 을 처리 할 수 있 습 니 다. 이것 은 비장의 무기 로 모든 문 제 를 해결 할 수 있다 고 생각 했 지만 leetcode 는 BigInteger 를 모 릅 니 다. 다음은 BigInteger 를 사용 하여 해결 하 는 코드 입 니 다.
public int mySqrtUseBigInteger(int x) {
BigInteger xb = new BigInteger(x+"");
BigInteger r = new BigInteger((x/2+1)+"");
BigInteger l = new BigInteger("0");
BigInteger mid = new BigInteger("0");
BigInteger two = new BigInteger("2");
BigInteger one = new BigInteger("1");
while(l.compareTo(r)<0 || l.compareTo(r)==0){
mid = (l.add(r)).divide(two);
BigInteger pow = mid.multiply(mid);
if(pow.compareTo(xb)==0){
return mid.intValue();
}else if(pow.compareTo(xb)>0){
r = mid.subtract(one);
}else{
l = mid.add(one);
}
}
if(mid.multiply(mid).compareTo(xb)>0){
return mid.intValue()-1;
}
return mid.intValue();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.