[제안을 가리키는 검|6. 봉우리를 찾아서]

0. 피크 찾기

이미지-20230411002039278

핵심:

  • 피크 값의 첨자를 반환하면 됩니다.
  • 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)인 것을 보면 이진탐색이 우선순위를 가지나 이진탐색의 전제는 순서성인 것 같다. 주문이 필요합니다, 주문 하세요. 답은 한쪽 면에 표시될 것입니다.

이미지-20230411001932419

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은 경계 논의를 줄입니다.
  • [왼쪽,오른쪽]의 범위는 답이 있는 영역임을 참고하세요
  • 마지막으로 왼쪽==오른쪽일 때 피크 위치를 찾습니다.

이미지-20230411000822800

Supongo que te gusta

Origin blog.csdn.net/qq_64428099/article/details/130073265
Recomendado
Clasificación