一行代码解 leetcode#162寻找峰值和#852山脉数组的峰顶索引

前言

最近在做 leetcode 刷题,刷到了 162.寻找峰值852.山脉数组的峰顶索引两道中等难度的题目,仔细思考发现解法可以是相同的。

题目详情

  1. 寻找峰值
javascript 复制代码
题目描述:
峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 `nums`,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 `任何一个峰值` 所在位置即可。

你可以假设 `nums[-1] = nums[n] = -∞` 。

你必须实现时间复杂度为 `O(log n)` 的算法来解决此问题。

示例 1:
输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

约束条件:
1. `1 <= nums.length <= 1000`
2. `-231 <= nums[i] <= 231 - 1`
3. 对于所有有效的 `i` 都有 `nums[i] != nums[i + 1]`
  1. 山脉数组的峰顶索引
javascript 复制代码
题目描述:
符合下列属性的数组 `arr` 称为 `山脉数组` :
1. `arr.length >= 3`
2. 存在 `i`(`0 < i < arr.length - 1`)使得:
    1. `arr[0] < arr[1] < ... arr[i-1] < arr[i]`
    2. `arr[i] > arr[i+1] > ... > arr[arr.length - 1]`

给你由整数组成的山脉数组 `arr` ,返回满足 `arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]` 的下标 `i` 。

你必须设计并实现时间复杂度为 `O(log(n))` 的解决方案。

示例:
输入: arr = [0,1,0]
输出: 1
解释: 1 是峰值元素,你的函数应该返回其索引 1。

约束条件:
1. `3 <= arr.length <= 105`
2. `0 <= arr[i] <= 106`
3. 题目数据保证 `arr` 是一个山脉数组

解题思路

  1. 寻找峰值 由于题目约束了 nums[-1] = nums[n] = -∞nums[i] != nums[i + 1],也就是说明数组中最大值两侧的元素均是小于最大值的,最大值所在的索引是一种解,即找到最大值所在的索引即可求解题目。针对最大值在数组的首位(index = 0)或者末尾(index = nums.length - 1)的情况,因为有约束 nums[-1] = nums[n] = -∞ 的存在,最大值对应的索引也是题目的解。综上,该题目可转换思路为求解最大值所在的索引即可。
  2. 山脉数组的峰顶索引 题目约束山峰数组满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] ,求解满足条件的 i。也就是说明 arr[i] 数山峰数组的最大值,求解山峰数组最大值所在的索引即是本题的答案了。 由此,两道题目都转换为求解数组中最大值对应的索引即可,因此也就可以用一行代码进行解答了:
typescript 复制代码
1. 寻找峰值
function findPeakElement(nums: number[]): number {
    return nums.reduce((prev, cur, index) => {
        return nums[prev] > cur ? prev : index
    }, 0)
};

2. 山脉数组的峰顶索引
function peakIndexInMountainArray(arr: number[]): number {
    return arr.reduce((prev, cur, index) => {
        return arr[prev] > cur ? prev : index
    }, 0)
};

求解数组最大值索引

  1. reduce 方法
typescript 复制代码
function findMaxIndex(nums: number[]) {
    return nums.reduce((prev, cur, index) => {
        return nums[prev] > cur ? prev : index
    }, 0);
}
  1. 遍历方法
typescript 复制代码
function findMaxIndex(nums: number[]) {
    let idx = 0;
    for (let i = 1; i < nums.length; ++i) {
        if (nums[i] > nums[idx]) {
            idx = i;
        }
    }
    return idx;
}
  1. findIndex 方法
typescript 复制代码
function findMaxIndex(nums: number[]) {
    const maxValue = Math.max(...nums);
    return nums.findIndex((val) => val === maxValue);
}
相关推荐
进取星辰8 分钟前
25、Tailwind:魔法速记术——React 19 样式新思路
前端·react.js·前端框架
June`11 分钟前
专题三:穷举vs暴搜vs深搜vs回溯vs剪枝(全排列)决策树与递归实现详解
c++·算法·深度优先·剪枝
vlln17 分钟前
适应性神经树:当深度学习遇上决策树的“生长法则”
人工智能·深度学习·算法·决策树·机器学习
x-cmd1 小时前
[250512] Node.js 24 发布:ClangCL 构建,升级 V8 引擎、集成 npm 11
前端·javascript·windows·npm·node.js
冲帕Chompa1 小时前
图论part09dijkstra算法
算法·图论
夏之小星星1 小时前
el-tree结合checkbox实现数据回显
前端·javascript·vue.js
·云扬·1 小时前
【PmHub后端篇】PmHub中基于Redis加Lua脚本的计数器算法限流实现
redis·算法·lua
周Echo周1 小时前
20、map和set、unordered_map、un_ordered_set的复现
c语言·开发语言·数据结构·c++·算法·leetcode·list
zkmall1 小时前
推荐算法工程化:ZKmall模板商城的B2C 商城的用户分层推荐策略
算法·机器学习·推荐算法
crazyme_61 小时前
前端自学入门:HTML 基础详解与学习路线指引
前端·学习·html