【递增栈】个人练习-Leetcode-845. Longest Mountain in Array

这篇具有很好参考价值的文章主要介绍了【递增栈】个人练习-Leetcode-845. Longest Mountain in Array。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接:https://leetcode.cn/problems/longest-mountain-in-array/

题目大意:给出一个数组arr[],定义【山数组】为【长度大于等于3】【前面部分递增,后面部分递减,存在一个山峰元素】的数组。求arr[]中的最长的是【山数组】的子列。

思路:递增栈当然可以,不过刚好想到另一个写法,感觉还行,于是就这么做了。维护两个数组left[], right[]left[i]表示从i开始向左递减(即可以作为山峰的左半段)最远的下标;同理,right[i]表示从i开始向右递减(即可以作为山峰的右半段)最远的下标。那么如果一个【山数组】以i为山峰,其长度就是right[i] - left[i] + 1。最开始初始化所有left[i] = right[i] = i,因为如果无法延伸(不递减),那么就是到自己为止。

对于left[],从左往右遍历,如果是从左往右递增(即从右往左递减)就将左边的下标“传递”过去。显然left[i] <= i,它的目的是从i尽可能往左延伸,下标越左越好。

对于right[],从右往左遍历,如果是从右往左递增(即从左往右递减)就将右边的下标“传递”过去。显然right[i] >= i,它的目的是从i尽可能往右延伸,下标越右越好。

因为山数组的长度大于等于3,因此遍历山峰只需从下标1N-2就好了。注意山数组需要【左边和右边都至少长度为1】,只有左半边或者右半边的不能构成山数组!遍历,保留最长的长度即可。

完整代码文章来源地址https://www.toymoban.com/news/detail-455025.html

class Solution {
public:
    int longestMountain(vector<int>& arr) {
        int N = arr.size();
        vector<int> left(N, 0);
        vector<int> right(N, 0);
        for (int i = 0; i < N; i++)
            left[i] = right[i] = i;
        
        for (int i = 0; i < N-1; i++) {
            if (arr[i] < arr[i+1])
                left[i+1] = left[i];
        }

        for (int i = N-1; i > 0; i--) {
            if (arr[i] < arr[i-1])
                right[i-1] = right[i];
        }

        int ans = 0;
        for (int i = 1; i < N-1; i++) {
            int lp = i - left[i], rp = right[i] - i;
            if (lp && rp) {
                int len = lp + rp + 1;
                ans = max(ans, len);
            }   
        }

        return ans;
    }
};

到了这里,关于【递增栈】个人练习-Leetcode-845. Longest Mountain in Array的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 2475. Number of Unequal Triplets in Array【数组,排序,哈希表】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月09日
    浏览(43)
  • LeetCode 2496. Maximum Value of a String in an Array【字符串,数组】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月11日
    浏览(57)
  • 个人练习-Leetcode-1024. Video Stitching

    题目链接:https://leetcode.cn/problems/video-stitching/ 题目大意:给出一个视频长度 time ,再给出一串 clips[][] 每个clip中 clip[0] 代表起始时间, clip[1] 代表结束时间。求能够覆盖 [0, time] 的所需的最小clip数。 思路:贪心算法。用 farest[i] 代表以 i 位置为起始时间能够到达的最远的结束

    2023年04月08日
    浏览(33)
  • 【排列组合】个人练习-Leetcode-62. Unique Paths

    题目链接:https://leetcode.cn/problems/unique-paths/ 题目大意:一个机器人从 m*n 的矩阵的左上角出发,目的地是右下角,每次只能向下或向右移动一格,求不同的路径的数量。 思路:就是排列组合。矩阵是 m*n ,实际上就是向下走 m-1 步,向右走 n-1 步,有多少种走法。 或者更简化

    2024年02月01日
    浏览(88)
  • 【set】个人练习-Leetcode-817. Linked List Components

    题目链接:https://leetcode.cn/problems/linked-list-components/description/ 题目大意:给出一个 vectorint nums ,其中有一些数字。再给出一个链表的头指针 head ,链表内的元素各不相同。如果链表中有某一段(长度大于等于1)的元素都在 nums 中出现过,那么就算一个component,求链表中的co

    2024年02月13日
    浏览(39)
  • 【贪心】个人练习-Leetcode-2195. Append K Integers With Minimal Sum

    题目链接:https://leetcode.cn/problems/append-k-integers-with-minimal-sum/ 题目大意:给出一个数组 nums[] ,现在要往里面追加 k 个【互不相同】且【未出现在 nums[] 中】的【正整数】,使得这 k 个数字之和最小。 思路:明显就是贪心,从 1 开始塞进去即可。但是单纯的【累加+用set判断是

    2024年02月02日
    浏览(47)
  • 【DFS+剪枝】个人练习-Leetcode-面试题 16.04. Tic-Tac-Toe LCCI

    题目链接:https://leetcode.cn/problems/tic-tac-toe-lcci/ 题目大意:给出一个 N*N 的棋盘格 board[][] ,走圈叉棋,判断输赢情况,某一方赢了返回该方的字符,若平局(棋盘满且没有一方赢)返回 Draw ,若结局未定(棋盘未满且没有一方赢)返回 Pending 思路:可以DFS做,并做一部分剪枝

    2024年02月02日
    浏览(36)
  • LeetCode //14. Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string “”.   Example 1: Input: strs = [“flower”,“flow”,“flight”] Output: “fl” Example 2: Input: strs = [“dog”,“racecar”,“car”] Output: “” Explanation: There is no common prefix among the inp

    2024年02月15日
    浏览(40)
  • Leetcode978. Longest Turbulent Subarray

    给定一个数组,找到最长的turbulent子数组的长度 turbulent子数组就是一增一减交替 其实这题也很简单,就是直接找子数组,不满足条件了,就重新开始算 时间复杂度 O ( n ) O(n) O ( n )

    2024年02月08日
    浏览(40)
  • LeetCode //C - 128. Longest Consecutive Sequence

    Given an unsorted array of integers nums , return the length of the longest consecutive elements sequence. You must write an algorithm that runs in O(n) time.   Example 1: Input: nums = [100,4,200,1,3,2] Output: 4 Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4. Example 2: Input: nums = [0,3,7,2,5,8,4,6,0,1]

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包