Search in Rotated Sorted Array - LeetCode
1 <= nums.length <= 5000
10^4 <= nums[i] <= 10^4
nums
are unique.nums
is an ascending array that is possibly rotated.10^4 <= target <= 10^4
이분탐색
회전이 안된 경우
일반 이분탐색 방법과 동일
회전이 된 경우
class Solution {
fun search(nums: IntArray, target: Int): Int {
fun checkInIncrease(from: Int, value: Int, to: Int): Boolean {
// 1 2 3 4 5 -> target = 4
return nums[from] <= value && value <= nums[to]
}
fun checkInRotate(from: Int, value: Int, to: Int): Boolean {
// 4 5 1 2 3 -> target = 5 or 2
return (nums[from] <= value && nums[from] > nums[to]) || (nums[to] >= value && nums[from] > nums[to])
}
var start = 0
var end = nums.size - 1
var mid = (start + end) / 2
while (start <= end && nums[mid] != target) {
if (nums[start] < nums[end]) { // rotate X
if (nums[mid] > target) end = mid - 1 else start = mid + 1
} else { // rotate
if (nums[mid] > target) {
if (checkInIncrease(start, target, mid) || checkInRotate(start, target, mid)) end = mid - 1 else start = mid + 1
} else {
if (checkInIncrease(mid, target, end) || checkInRotate(mid, target, end)) start = mid + 1 else end = mid - 1
}
}
mid = (start + end) / 2
}
return if (nums[mid] == target) mid else -1
}
}
시간 복잡도: 이분탐색 = log n