[Leetcode] 33. Search in Rotated Sorted Array
Problem
숫자로 주워진 배열에서 타겟값의 인덱스를 찾는 문제. O(logn) (배열이 정렬된 상태에서 회전되어있음)
Solution
O(logn) 으로 풀기위해서
이진탐색을 이용함.
- 회전의 유무를 파악하고 있다면 회전하는 인덱스를 찾아낸다.
- 회전하는 인덱스를 찾다가 타겟값이 운좋게 나오면 바로 해당 값을 리턴
- 회전하는 인덱스를 찾는 방법
- mid의 값이 left의 값보다 크다면 오름차순인 정상적인 배열이고, 아니라면 그 부분은 회전이 일어난 부분이다. 이 조건을 이용해서 회전하는 부분의 영역을 좁혀간다.
- 회전하는 부분이 있을때, 타겟이 어느 범위에 있는지 확인하고 해당하는 범위안에서 이진탐색을통해 타겟값을 찾아낸다.
JS Code
javascript
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
function bsPosition () {
let left = 0, right = nums.length
while(left < right) {
const mid = Math.floor((left + right) / 2)
if (nums[mid] === target) return mid // 회전을 찾기전에 운좋게 타겟을 발견할 경우
if (nums[left] < nums[mid]) left = mid
else right = mid
}
return left + 1
}
const rotatedIdx = bsPosition()
const isRotated = () => rotatedIdx !== nums.length
function bsFindTarget (pLeft, pRight) {
let left = pLeft, right = pRight
while(left < right) {
const mid = Math.floor((left + right) / 2)
if (nums[mid] < target) left = mid + 1
else right = mid
}
return target === nums[left] ? left : -1
}
if (isRotated()) {
return nums[0] <= target ? bsFindTarget(0, rotatedIdx) : bsFindTarget(rotatedIdx, nums.length)
} else {
return bsFindTarget(0,nums.length)
}
};