LeetCode - 회전 정렬 배열에서 최소값 찾기
14242 단어 gojavascriptalgorithmsprogramming
문제 설명
오름차순으로 정렬된 길이 n의 배열이 1에서 n번 사이에서 회전한다고 가정합니다.
예를 들어 배열 nums = [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]]을 1번 회전하면 결과가 나타납니다.
배열 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]에서.
고유 요소의 정렬된 회전 배열 숫자가 주어지면 이 배열의 최소 요소를 반환합니다.
O(log n) 시간에 실행되는 알고리즘을 작성해야 합니다.
다음에서 가져온 문제 설명: https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/ .
예 1:
Input: nums = [3, 4, 5, 1, 2]
Output: 1
Explanation: The original array was [1, 2, 3, 4, 5] rotated 3 times.
예 2:
Input: nums = [4, 5, 6, 7, 0, 1, 2]
Output: 0
Explanation: The original array was [0, 1, 2, 4, 5, 6, 7] and it was rotated 4 times.
예 3:
Input: nums = [11, 13, 15, 17]
Output: 11
Explanation: The original array was [11, 13, 15, 17] and it was rotated 4 times.
제약:
- n == nums.length
- 1 <= n <= 5000
- -5000 <= nums[i] <= 5000
- All the integers of nums are unique
- nums is sorted and rotated between 1 and n times
설명
무차별 대입 방식
순진한 접근 방식은 O(N) 시간이 걸리는 선형 검색을 수행하는 것입니다. (i - 1) 번째 인덱스 다음에 더 작은 숫자가 나타나는 i 번째 인덱스를 찾아야 합니다.
이진 검색
배열이 회전하지만 정렬되기 때문에 이진 검색 구현을 수정할 수 있습니다. 회전된 배열에는 정렬된 두 개의 세그먼트가 있습니다. 정렬이 방해받는 인덱스는 배열의 가장 작은 요소에서 발생합니다.
알고리즘을 확인해 봅시다:
- set low = 0
high = nums.size() - 1
- loop while low < high
- set mid = low + (high - low) / 2
- if nums[low] <= nums[mid] && nums[high] >= nums[mid]
- set high = mid - 1
- else if nums[low] <= nums[mid] && nums[high] <= nums[mid]
- set low = mid + 1
- else if nums[mid] <= nums[low]
- set high = mid
- return nums[low]
C++, Golang 및 Javascript의 솔루션을 확인해 봅시다.
C++ 솔루션
class Solution {
public:
int findMin(vector<int>& nums) {
int low = 0;
int high = nums.size() - 1;
while(low < high) {
int mid = low + (high - low) / 2;
if(nums[low] <= nums[mid] && nums[high] >= nums[mid])
high = mid - 1;
else if(nums[low] <= nums[mid] && nums[high] <= nums[mid])
low = mid + 1;
else if(nums[mid] <= nums[low])
high = mid;
}
return nums[low];
}
};
골랑 솔루션
func findMin(nums []int) int {
low, mid := 0, 0
high := len(nums) - 1
for low < high {
mid = low + (high - low) / 2
if nums[low] <= nums[mid] && nums[high] >= nums[mid] {
high = mid - 1
} else if nums[low] <= nums[mid] && nums[high] <= nums[mid] {
low = mid + 1
} else if nums[mid] <= nums[low] {
high = mid
}
}
return nums[low];
}
자바스크립트 솔루션
var findMin = function(nums) {
let low = 0;
let high = nums.length - 1;
while(low < high) {
let mid = low + Math.floor((high - low) / 2);
if(nums[low] <= nums[mid] && nums[high] >= nums[mid])
high = mid - 1;
else if(nums[low] <= nums[mid] && nums[high] <= nums[mid])
low = mid + 1;
else if(nums[mid] <= nums[low])
high = mid;
}
return nums[low];
};
알고리즘을 시험 실행해 봅시다.
Input: nums = [4, 5, 6, 7, 0, 1, 2]
Step 1: low = 0
high = nums.size() - 1
= 7 - 1
= 6
Step 2: loop while low < high
0 < 6
true
mid = low + (high - low) / 2
= 0 + (6 - 0) / 2
= 3
if nums[low] <= nums[mid] && nums[high] >= nums[mid]
nums[0] <= nums[3] && nums[6] >= nums[3]
4 <= 7 && 2 >= 7
false
else if nums[low] <= nums[mid] && nums[high] >= nums[mid]
nums[0] <= nums[3] && nums[6] <= nums[3]
4 <= 7 && 2 <= 7
true
low = mid + 1
= 3 + 1
= 4
Step 3: loop while low < high
4 < 6
true
mid = low + (high - low) / 2
= 4 + (6 - 4) / 2
= 4 + 1
= 5
if nums[low] <= nums[mid] && nums[high] >= nums[mid]
nums[4] <= nums[5] && nums[6] >= nums[5]
0 <= 1 && 2 >= 1
true
high = mid - 1
= 5 - 1
= 4
Step 4: loop while low < high
4 < 4
false
Step 5: return nums[low]
nums[4]
0
We return the answer as 0.
Reference
이 문제에 관하여(LeetCode - 회전 정렬 배열에서 최소값 찾기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/_alkesh26/leetcode-find-minimum-in-rotated-sorted-array-3ooj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)