알고리즘
[Binary Search] Find Minimum in Rotated Sorted Array
point_Man
2023. 9. 4. 22:57
회전 정렬 배열에서 최소값 찾기
Find Minimum in Rotated Sorted Array - LeetCode
Can you solve this real interview question? Find Minimum in Rotated Sorted Array - Suppose an array of length n sorted in ascending order is rotated between 1 and n times. For example, the array nums = [0,1,2,4,5,6,7] might become: * [4,5,6,7,0,1,2] if it
leetcode.com
n오름차순으로 정렬된 길이의 배열이 및 시간 사이에서 회전 된다고 가정합니다. 예를 들어 배열은 다음과 같을 수 있습니다.1nnums = [0,1,2,4,5,6,7]
- [4,5,6,7,0,1,2]시간 이 회전된 경우 4.
- [0,1,2,4,5,6,7]시간 이 회전된 경우 7.
배열을 한 번 회전하면 배열 [a[0], a[1], a[2], ..., a[n-1]]이 생성됩니다 [a[n-1], a[0], a[1], a[2], ..., a[n-2]].
고유 요소 nums의 정렬된 회전 배열이 주어지면 이 배열의 최소 요소를 반환합니다 .
다음에서 실행되는 알고리즘을 작성해야 합니다. O(log n) time.
예시 1:
입력: nums = [3,4,5,1,2]
출력: 1
설명: 원래 배열은 [1,2,3,4,5] 3번 회전되었습니다.
예 2:
입력: nums = [4,5,6,7,0,1,2]
출력: 0
설명: 원래 배열은 [0,1,2,4,5,6,7]이었고 4번 회전되었습니다.
예시 3:
입력: nums = [11,13,15,17]
출력: 11
설명: 원래 배열은 [11,13,15,17]이었고 4번 회전되었습니다.
제약:
- n == nums.length
- 1 <= n <= 5000
- -5000 <= nums[i] <= 5000
- 의 모든 정수는 고유nums 합니다 .
- nums1및 시간 사이에 정렬되고 회전됩니다 n.
문제풀이
class Solution {
public int findMin(int[] nums) {
int start = 0, end = nums.length - 1, ans = Integer.MAX_VALUE;
while(start <= end){
int mid = start + (end - start) / 2;
if(nums[start] <= nums[mid]){
ans = Math.min(ans, nums[start]);
start = mid + 1;
}
else{
ans = Math.min(ans, nums[end]);
end = end - 1;
}
}
return ans;
}
}
- 포인트를 start, mid, end 로 3가지를 설정하고 2진탐색 알고리즘을 사용하였습니다.
- nums[start] <= nums[mid] ( mid(4) <= start(7) ) 이면 ans(4) = 최소값(2,147,483,647 , 4) 가 된다.
- 그 후 start를 mid+1 값으로 설정하여 범위를 줄여 나갑니다.
- nums[start] <= nums[mid] 가 아닌 경우 end -1을 하여 끝에서부터 범위를 줄여 나갑니다.
- 시간복잡도는 O(logN)의 시간복잡도를 갖습니다.