852. 山脉数组的峰顶索引

题目

https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/

代码1

使用两个栈,一个栈记录数值,一个栈记录位置

注意javascript里没有栈这个概念,所以用array来模拟,生成array的时候,不能指定数组长度。

不然就会出现[ undefined, undefined, undefined, 1, 2, 3....这样的情况]

/**
 * @param {number[]} arr
 * @return {number}
 */
var peakIndexInMountainArray = function(arr) {
    let value = Array();
    value.push(arr[0]);

    let pos =Array();
    pos.push(0);
    
    for (let i = 0; i < arr.length; i++){
        if (arr[i] > value[value.length - 1]){
            pos.push(i);
            value.push(arr[i]);
        }else{
            pos.push(pos[pos.length - 1]);
            value.push(value[value.length - 1]);
        }
    }
    return pos[pos.length - 1]

};

代码2

利用山峰左侧递增,山峰右侧递减的的性质搞二分

为什么是left < right, 而不是left <= right? 这是因为right = mid

为什么是right = mid ? 因为如果right左移(也就是mid[i + 1] < mid[ i ]) ,峰值是有可能出现在mid处的,所以不能是right = mid -1 ; 

/**
 * @param {number[]} arr
 * @return {number}
 */
var peakIndexInMountainArray = function(arr) {
	//根据mid的大小比较来决定
	//如果mid右侧比mid大,那么,峰值一定在mid右侧,且肯定不出现在mid位置(mid, ...)
	//如果mid右侧比mid小,那么峰值一定出现在[.... ,mid]
	let left = 0;
	let right = arr.length - 1;


	while (left < right){
		let mid = left + Math.floor((right - left)/2);
		if (arr[mid] < arr[mid + 1]){
			left = mid + 1;
		}else{
			right = mid;
		}

	}
	return right;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值