๋์ด๋: Medium
ํค์๋: Array
๋ฌธ์
๋ฌธ์ ์๋ฌธ: https://leetcode.com/problems/find-peak-element/description/
Peak ์์๋ ์ด์๋ณด๋ค ์๊ฒฉํ๊ฒ ํฐ ์์๋ฅผ ๋ปํ๋ค. 0๋ถํฐ ์์ธ์ด ์ง์ ๋ ์ ์ ๋ฐฐ์ด nums๊ฐ ์ฃผ์ด์ก์ ๋, Peak ์์๋ฅผ ์ฐพ๊ณ ํด๋น ์์ธ์ ๋ฐํํ๋ผ. ๋ฐฐ์ด์ ์ฌ๋ฌ ๊ฐ์ Peak์ด ํฌํจ๋์ด ์์ผ๋ฉด ์ด๋ค Peak์ ์์ธ์ด๋ ๋ฐํํ ์ ์๋ค.
nums[-1] = nums[n] = -∞๋ก ๊ฐ์ฃผํด๋ ๋๋ค. ์ฆ, ๋ฐฐ์ด ์ธ๋ถ์ ์๋ ์ด์๋ณด๋ค ์์๋ ํญ์ ์๊ฒฉํ๊ฒ ํฌ๋ค๊ณ ๊ฐ์ฃผ๋๋ค.
O(log n) ์๊ฐ ๋ด์ ์คํ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํด์ผ ํ๋ค.
๋ฌธ์ ํ์ด
๋ฌธ์ ์์ฒด๋ง ๋๊ณ ๋ณด๋ฉด Medium ๋์ด๋๋ ์๋๋ค. ๊ฐ์ฅ ์ฝ๊ฒ ์๊ฐํด๋ณด๋ฉด O(n) ์์ iteration์ ๋๋ฉด์ pivot ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฐ์ ์ฐพ์์ ๋ฐํํด์ฃผ๋ฉด ๋๋ค. ํ์ง๋ง ๋ฌธ์ ์์ ๋ณต์ก๋๋ฅผ O(log n) ์ด๋ด๋ก ์ํํ๋๋ก ์ ํํ๋ค.
O(log n) ๋ณต์ก๋๋ก๋ถํฐ ์ฝ๊ฒ ๋ ์ฌ๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ด binary search์ด๋ค. ๊ทธ๋์ bin_search๋ฅผ ์ ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์ด๋ดค๋ค.
pivot์ ๊ฒฐ๊ตญ local / global maxima๊ธฐ ๋๋ฌธ์ ํ์ฌ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ ํฐ ๊ฐ์ด ์์ ๊ฒ ๊ฐ์ ๊ณณ์ ์ฐพ์์ ๋ฐ๋ผ๊ฐ๋ฉด ๋๋ค. ๋์ฑ์ด, ๋ง์ง๋ง ๊ฐ์ boundary์ ๊ฐ์ด -∞๋ก ๊ฐ์ฃผ๋๋ค๊ณ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ๋ณต์กํ๊ฒ ์๊ฐํ ๊ฒ ์๋ค.
mid๊ฐ์ ๊ธฐ์ค์ผ๋ก mid๋ณด๋ค ํฐ ๊ฐ์ด ์๋ ๋ฐฉํฅ์ผ๋ก search space๋ฅผ ์ขํ๋ค๊ฐ left = right๊ฐ ๋์์ ๋ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ฐํํด์ฃผ๋ฉด ๋๋ค. ์ค๋๋ง์ cpp๋ก ์์ฑํด๋ดค๋ค.
#include <vector>
using namespace std;
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
if(nums.size() <= 1){
return 0;
}
while(left < right){
int mid = (left + right) / 2;
if(nums[mid] < nums[mid+1]){
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};