淼淼刷力扣

前言

本人初次尝试写博客,希望各位看官大佬多多包容
有错误希望巨巨们提出来,我一定会及时改正,谢谢大家
在自己最好的年纪,找到了未来的目标
还有1年奋斗刷题,明年去面试实习,加油!

题目要求:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

整体思路

1、看题目要求,在一个数组上"查找"某个东西,我们最快速可以想到,那就枚举呗,我就从头向后查找,但是一旦数组很长,查找的东西在最后,那么就完蛋了,那么我们不妨就用二分检索,以lgn的时间复杂度找到目标,所以在数组上找目标,优先选择二分检索!!!!!!
2、本题很简单,就是可以把所有的数的排列理解成一个就一个山顶的高山,不用考虑太过于复杂。并且每次的mid左右,要么是递增的,要么是递减的,这都不是答案,如若是左右都小于mid处就找到答案了。

注意

因为"int mid = (left + right) / 2;"是向下取整,所以会得到一个特别的mid,即mid=0。这样的话mid-1会越界,但是mid一定不会是arr.size()-1,就保证了mid+1永不越界,所以判断的时候要把越界问题都考虑上。

具体代码一(内附注释):递归

class Solution {
public:
	int answer = -1;
	int peakIndexInMountainArray(vector<int>& arr) {
		find(arr, 0, arr.size() - 1);
		return answer;
	}
	void find(vector<int>& arr, int left, int right) {
		if (left > right) {//出口
			return;
		}
		int mid = (left + right) / 2;
		if (mid - 1 >= 0 && arr[mid] > arr[mid - 1] && arr[mid] > arr[mid + 1]) {
			answer = mid;//判断是不是目标,但同时要判断越不越界
		}
		else {
			if (arr[mid] - arr[mid + 1] > 0) {//这里一定用mid+1,因为mid+1保证了不越界
				find(arr, left, mid - 1);
			}
			else {
				find(arr, mid + 1, right);
			}
		}
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述

具体代码二(内附注释):迭代

class Solution {
public:
	int peakIndexInMountainArray(vector<int>& arr) {
		int left = 0;
		int right = arr.size() - 1;
		int ans = -1;
		while (left <= right) {
			int mid = (left + right) / 2;
			if (arr[mid] - arr[mid + 1] > 0) {//这里一定用mid+1,因为mid+1保证了不越界
				right = mid - 1;
				ans = mid;//这就像爬山一样,满足这个条件,就相当于我的后面比我小
				//那么我就可能是峰顶,如果又遇到了这个情况,那么就更新即可
				//最后一次的更新就是答案。
			}
			else {
				left = mid + 1;
			}
		}
		return ans;
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JLU_LYM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值