0. 피크 찾기
핵심:
- 피크 값의 첨자를 반환하면 됩니다.
- nums[-1]=nums[n]=음의 무한대
입력: nums = [1,2,3,1]
출력: 2
설명: 3은 최고 요소이고 함수는 해당 인덱스 2를 반환해야 합니다.
1. 바보들을 위한 프로그래밍 (그냥 재미로)
class Solution {
public:
int findPeakElement(vector<int>& a) {
int n=a.size();
if(n==1)
{
return 0;
}
if(n==2)
{
if(a[0]>a[1])
{
return 0;
}
else
{
return 1;
}
}
for(int i=1;i<n-1;i++)
{
if(a[0]>a[1]) return 0;
if(a[n-2]<a[n-1]) return n-1;
if(a[i]>a[i-1]&&a[i]>a[i+1]) return i;
}
return -1;
}
};
2. 두 가지 점
질문에서 요구하는 시간복잡도가 o(logN)인 것을 보면 이진탐색이 우선순위를 가지나 이진탐색의 전제는 순서성인 것 같다. 주문이 필요합니다, 주문 만 하세요. 답은 한쪽 면에 표시될 것입니다.
int findPeakElement(int* nums, int numsSize){
int left=0,right=numsSize-1;
while(left<right)//
{
int mid=left+(right-left)/2;
if(nums[mid+1]>=nums[mid])
{
left=mid+1;//
}
else if(nums[mid+1]<nums[mid])
{
right=mid;//
}
}
return left;
}
핵심:
- 정수나눗셈 mid=(left+right)/2, 반내림의 특성으로 인해 배열 요소의 개수가 2보다 크거나 같은 경우에는 mid+1 첨자가 반드시 존재해야 합니다(배열 요소가 같을 때). 1, left==right , 루프에 들어 가지 않음) mid-1 아래 첨자는 반드시 존재하지 않으며 mid-1>=0은 경계 논의를 줄입니다.
- [왼쪽,오른쪽]의 범위는 답이 있는 영역임을 참고하세요
- 마지막으로 왼쪽==오른쪽일 때 피크 위치를 찾습니다.