알고리즘 심득 - 2 분 찾기
10546 단어 데이터 구조
2 분 검색 은 질서 있 는 배열 에서 특정한 요 소 를 찾 거나 특정한 요 소 를 삽입 하 는 데 자주 사용 된다. 2 분 검색 방법 에 대한 상세 한 소개 와 분석 은 이 큰 신 급 문 제 를 볼 수 있다. '배제 법' (감 치 사상) 으로 2 분 검색 문 제 를 쓰 고 다른 2 분 검색 모델 과 비교 할 수 있다.
검색 구간 에 대한 선택 이 다 를 때마다 여러 가지 템 플 릿 이 있 습 니 다. 여 기 는 제 가 가장 자주 사용 하 는 사고방식 템 플 릿 만 씁 니 다.
left = 0
right = arr.lenght-1
while(left < right) {
//
mid = Math.floor((left + right)/2)
if(target > arr[mid]) {
left = mid+1
} else {
right = mid
}
}
// return left left
// 1. target , left target
// 2. target , left target ,
return left
left 로 돌아 가 는 의 미 를 이해 하려 면 버클 의 이 문 제 를 푸 는 것 을 권장 합 니 다. 삽입 위 치 를 검색 하 는 것 을 권장 합 니 다.
배열 에 target 요소 가 있 는 지 판단 합 니 다.
target
이 있 는 지 판단 하려 면 먼저 if..else
에 하나의 target == arr[mid]
판단 을 추가 하고 찾 으 면 바로 return mid
해 야 한다. 그러나 여기 서 특수 한 상황 을 주의해 야 한다. 예 를 들 어 배열 [5,7,8,10]
에서 찾 으 면 10
바로 뛰 어 나 left=mid+1
순환 을 해 야 한다. 더 이상 left right
과 같 는 지 판단 할 수 없다.이 bug 를 해결 하기 위해 서 순환 이 끝 난 후에 판단 을 추가 합 니 다.// ,
left = 0
right = arr.lenght-1
while(left < right) {
//
mid = Math.floor((left + right)/2)
if(target > arr[mid]) {
left = mid+1
} else if(target == arr[mid]) {
return mid
} else {
right = mid
}
}
// , , left
if(arr[left] == target) return left
// -1
return -1
사실은 더 간단 한 해결 방법 이 있 습 니 다. 판단 조건 을 추가 하지 않 아 도 됩 니 다. 바로 처음에 값 을 부여 할 때
while
를 직접 양보 하고 right 에 길 이 를 하나 더 주면 기 존의 문 제 를 피 할 수 있 고 영원히 얻 지 못 할 것 입 니 다 target
. 없 을 것 입 니 다 right = arr.lenght
.정렬 배열 에 나타 난 숫자 를 통계 합 니 다.
var search = function(nums, target) {
let left = 0;
//
let right = nums.length;
let count = 0;
while(left < right) {
mid = Math.floor((right + left)/2);
if(nums[mid] > target) {
right = mid;
} else if(nums[mid] < target){
left = mid+1;
} else {
// ,
let a = mid;
let b = mid-1;
//
while(nums[mid] == nums[a]) {
a++;
count++;
}
//
while(nums[mid] == nums[b]) {
b--;
count++;
}
return count;
}
}
return count;
};
부분 정렬 배열 에서 의 응용
일부 배열 은 일부 질서 만 있 을 뿐 2 분 으로 요소 의 위 치 를 찾 을 수 있다. 예 를 들 어 회전 정렬 배열 을 검색 하 는 것 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.