【C++】二分查找

35.搜索插⼊位置

  1. 存在 target:返回其第一个出现位置

  2. 不存在:返回插入后保持有序的下标

    class Solution
    {
    public:
    int peakIndexInMountainArray(vector& arr)
    {
    int left = 0;
    int right = arr.size() - 2;
    while (left < right)
    {
    int mid = left + (right - left+1) / 2;
    //上升坡,峰顶在mid的右边
    if (arr[mid] > arr[mid - 1])
    {
    left = mid;
    }
    else //下降,峰顶在mid的左边
    {
    right = mid - 1;
    }

    复制代码
       }
       //right=left  (此时峰顶的索引)
       return left;

    }
    };

21. ⼭峰数组的峰顶

复制代码
class Solution
{
public:
	int peakIndexInMountainArray(vector<int>& arr)
	{
		int left = 0;
		int right = arr.size() - 1;
		while (left < right)
		{
			int mid = left + (right - left) / 2;
			//上升坡,峰顶在mid的右边
			if (arr[mid] > arr[mid - 1])
			{
				left = mid;
			}
			else  //下降,峰顶在mid的左边
			{
				right = mid - 1;
			}

			//right=left  (此时峰顶的索引)
			return left;
		}
	}
};

暴力解法

复制代码
class Solution
{
public:
	int peakIndexInMountainArray(vector<int>& arr)
	{
		//峰顶不在数组首尾
		for (int i = 1; i < arr.size() - 1; i++)
		{
			//当一个元素大于左右相邻的元素时,是峰顶,否则返回-1
			if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
			{
				return i;
			}
		}
	
		return -1;

	}
};