👀 문제
https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
👊 도전
1. 설계
- 이분탐색을 이용해 target을 하나 찾는다.
- 만약 target을 찾지 못한다면 {-1,-1}을 리턴한다.
- target이 있다면, 그곳을 기준으로 left, right를 두고 target이 아닌 값을 만날 때 까지 움직인다.
- left의 최소, right의 최대를 리턴한다.
2. 구현
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
32
33
34
35
36
37
38
39
40
41
/**
*
* @author HEESOO
*
*/
class Solution {
public int[] searchRange(int[] nums, int target) {
int mid=binarySearch(nums, target); // target 하나 찾기
if(mid==-1) return new int[]{-1,-1}; // 없을 경우
int[] answer=new int[2];
int left=mid;
while(0<=left){ // 왼쪽으로 계속 이동
if(nums[left]==target) answer[0]=left; // 값 갱신
else break; // target이 아니라면 종료
left--;
}
int right=mid;
while(right<nums.length){ // 오른쪽으로 이동
if(nums[right]==target) answer[1]=right;
else break;
right++;
}
return answer;
}
public int binarySearch(int[] nums, int target){ // 이분탐색
int left=0, right=nums.length-1;
while(left<=right){
int mid=(left+right)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]<target) left=mid+1;
else right=mid-1;
}
return -1;
}
}
3. 결과
🤟 성공 🤟
4. 설명
- target 값을 하나 찾는다
- 이분탐색(binarySearch)로 target을 하나 찾아 mid에 저장한다.
- mid==-1이면 배열에 target이 없는 것이므로 {-1,-1}을 리턴한다.
- mid 기준 왼쪽으로 이동하며 시작 target을 찾는다
- 변수 left를 두고, mid에서부터 하나씩 감소하며 앞으로 이동한다.
- nums[left]==target이면 answer[0에 인덱스 값을 넣는다.
- target이 아니라면 break한다.
- mid 기준 오른쪽으로 이동하며 마지막 target을 찾는다
- right를 두고 오른쪽으로 이동한다.
- nums[right]!=target이면 while문을 나온다.