[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)
}
};