일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- adb pair
- html
- github lfs
- react-native
- camera access
- npm package
- animation
- react-native-dotenv
- Each child in a list should have a unique "key" prop.
- github pdf
- dvh
- electron-packager
- rolldown
- 티스토리 성능
- silent printing
- 이미지 데이터 타입
- device in use
- Failed to compiled
- vercel git lfs
- Recoil
- custom printing
- ffi-napi
- github 100mb
- adb connect
- nextjs
- camera permission
- augmentedDevice
- Can't resolve
- ELECTRON
- Git
- Today
- Total
Bleeding edge
[leetcode] 34. Find First and Last Position of Element in Sorted Array - 자바스크립트 0607 본문
[leetcode] 34. Find First and Last Position of Element in Sorted Array - 자바스크립트 0607
codevil 2022. 6. 7. 13:47https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/
Find First and Last Position of Element in Sorted Array - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제에는 [nums, target] 두가지의 변수가 주어진다.
nums라는 정렬 안에 target이 들어있다고 하면, nums에서의 시작위치와 끝 위치를 return 하는 문제이다.
만일, nums에 target이 없다고 하면 [-1, -1]을 return한다.
1. Boundary Condition을 적는다면, nums가 빈 정렬이면 [-1, -1]을 return 한다.
if (nums.length === 0) return [-1, -1]
2. nums는 숫자로 정렬되어 있기 때문에, target이 nums[0]보다 작거나, nums[nums.length-1]보다 크면 [-1. -1]을 정렬한다
if (nums[start] > target || nums[end] < target) return [-1, -1]
문제 풀이를 위해 Binary Search를 적용한다
while (start <= end) {
let mid = Math.floor((start + end) / 2)
if (nums[mid] <= target) {
res = mid
start = mid + 1
} else {
end = mid - 1
}
}
이 Binary Search를 적용하여 얻는 값은 res이다.
res는, start와 end가 서로 크기가 같거나 end가 start보다 작아진 경우 target이 없는 것이기 때문에, 이 경우에는 return [-1, -1]을 해야한다
if (nums[res] !== target) return [-1, -1]
target이 여러개인 경우와 한개인 경우 두가지인 경우가 있다. 이 위치를 표시하기 위해서
let p1 = res
let p2 = res
두개의 점을 잡고
while (nums[p1] === target) {
p1 -= 1
}
while (nums[p2] === target) {
p2 += 1
}
target이 아닐 때까지 p1은 -1, p2는 +1을 적용한뒤
return [p1 + 1, p2 - 1]
값을 리턴해준다. 이때 각각 +1, -1을 해주는 이유는, 값이 달라질때까지 값을 변화시키기 때문에 target과 같은 값을 return 하려고하면 p1+1, p2-1을 해줘야한다.
전체 풀이이다
var searchRange = function (nums, target) {
let start = 0
let end = nums.length
let res = 0
if (nums.length === 0) return [-1, -1]
if (nums[start] > target || nums[end] < target) return [-1, -1]
while (start <= end) {
let mid = Math.floor((start + end) / 2)
if (nums[mid] <= target) {
res = mid
start = mid + 1
} else {
end = mid - 1
}
}
if (nums[res] !== target) return [-1, -1]
let p1 = res
let p2 = res
while (nums[p1] === target) {
p1 -= 1
}
while (nums[p2] === target) {
p2 += 1
}
return [p1 + 1, p2 - 1]
};
'코딩테스트 공부' 카테고리의 다른 글
[LeetCode] 43. Multiply Strings - 자바스크립트 0609 (0) | 2022.06.09 |
---|---|
[LeetCode]796. Rotate String - 자바스크립트 0609 (0) | 2022.06.09 |
[leetcode] 28. Implement strStr() - 자바스크립트 0607 (0) | 2022.06.07 |
[leetcode] 14. Longest Common Prefix - 자바스크립트 0607 (0) | 2022.06.07 |
[프로그래머스] 멀쩡한 사각형 - 자바스크립트 0606 (0) | 2022.06.06 |