반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 미국유학생
- 파이데이아창의인재학과
- 사이드프로젝트
- 자바
- California State University Sacramento
- 2+2
- 미국대학생활
- 비전공자 git
- CSUS
- Java 스터디
- 미국대학
- 만다라트프로젝트
- jpa
- 미국유학
- 개발일지
- 유학생 준비물
- JVM아키텍처
- i-20
- 개인 프로젝트 개발일지
- 유학생대학생활
- 부산외대
- 해외유학
- 자바 스터디
- 케네스
- 복수학위제도
- 미국유학생활
- 케네스로그
- java
- Kenneth Park
- F1학생비자
Archives
- Today
- Total
케네스로그
[리트코드/자바] 704. Binary Search 본문
반응형
문제
정렬된 배열 nums와 찾고자 하는 정수 target이 주어질 때, target에 해당하는 nums의 index를 찾으세요. 만약 target이 배열 내에 존재하지 않는다면 -1을 리턴하세요.
테스트케이스
- nums = {-1, 0, 3, 5, 9, 12}
target = 9
output: 1
- nums = {-1, 0, 3, 5, 9, 12}
target = 2
output: -1
해설 및 풀이
로직
- 배열의 양 끝에 Left, right를 지정하고, 그 중앙에 위치한 값을 mid로 설정한다.
- target이 mid보다 크다면, left~mid구간을 탐색하며,
target이 mid보다 작다면, mid~right구간을 탐색한다. - 탐색하는 범위(길이)가 2가 될때까지 이를 반복한다.
- left, right값을 비교해서 target의 위치를 확인한다.
💡 중앙값과 오버플로우
중앙값을 구하는 방법은 (left+right)/2 를 통해서 할 수 있다. 하지만, 만약 left+right의 연산 결과값이 int 타입 표현범위를 벗어나는 경우엔 오버플로우가 발생할 수 있다. 이를 간단하게 피하는 방법은 중앙값의 의의를 통해 알 수 있다.
중앙 = 두 점 사이에서 각 점으로부터 동일한 거리에 위치한 지점
따라서, 각 점으로부터 동일한 거리(m)를 구하고, 시작점을 기준으로 m만큼 떨어진 곳의 위치를 구하면 된다. 이에 대한 수식은 다음과 같다.
mid = ((max-min) / 2) + min
자바 구현코드
class Solution {
public static int search(int[] nums, int target) {
int len = nums.length;
int left = 0;
int right = len-1;
int mid = 0;
while(right-left >= 2) {
mid = ((right - left) / 2) + left;
if(nums[mid] == target) {
return mid;
}
if(nums[mid] > target) {
right = mid;
} else {
left = mid;
}
}
if(nums[left] == target) {
return left;
} else if(nums[right] == target) {
return right;
} else {
return -1;
}
}
}
반응형
'Dev > 알고리즘' 카테고리의 다른 글
프로그래머스 - 신고 결과 받기 (0) | 2022.05.22 |
---|---|
[리트코드/자바] 35. Search Insert Position (0) | 2022.04.14 |
[리트코드/자바] 278. First Bad Version (0) | 2022.04.14 |
[리트코드/자바] 146. LRU Cache (0) | 2022.03.29 |