首页 > 其他分享 >【LeetCode 162】寻找峰值

【LeetCode 162】寻找峰值

时间:2024-05-11 18:11:55浏览次数:25  
标签:right nums int mid 峰值 LeetCode 162 left

题目描述

原题链接: LeetCode.162 寻找峰值

解题思路

  • 数组相邻元素不相等, 峰值可能有多个, 整个数组的最大值肯定是峰值之一, 直接遍历数组获取最大值也能得到答案;
  • 但是写明复杂度要求O(log n)就是否定了最简单的O(n)遍历解法, 需要用二分法;
  • 按照题意数组边界另一端等同于无穷小, 可以直接分别按照首尾两个数字大小来判断首尾是否是峰值;
  • 如果首尾不是峰值, 说明在首位数组值是上升, 末尾数组是下降的趋势, 必然在中间某个位置至少存在一个峰值将元素趋势从上升变为下降;
  • 考虑连续三个元素的大小关系来判断峰值:
    1. nums[i - 1] < nums[i] > nums[i + 1], i就是峰值;
    2. nums[i - 1] < nums[i] < nums[i + 1], i位置仍然处于上升趋势, 要在大于i的右边区域继续查找;
    3. nums[i - 1] > nums[i] > nums[i + 1], i位置处于下降趋势, 在小于i的左边区域可以找到峰值;
    4. nums[i - 1] > nums[i] < nums[i + 1], i是谷底值, 左右两边区域都存在峰值;
  • 总结4种情况, nums[i] > nums[i + 1]时峰值可能是i本身或者要继续在[0, i-1]范围内找, nums[i] < nums[i + 1]时峰值都可以在[i + 1, n - 1]范围找到, 这就确定了二分逻辑;

解题代码

  • 个人倾向于使用的便于理解的写法:

      /**
       * 朴素好读懂的二分解法
       * 执行用时: 0 ms , 在所有 Java 提交中击败了 100.00% 的用户
       * 内存消耗: 41.24 MB , 在所有 Java 提交中击败了 83.37% 的用户
       * 编辑日期: 2024-05-10
       */
      public int findPeakElement(int[] nums) {
          if (nums.length == 1 || nums[1] < nums[0]) {
              return 0;
          }
          int right = nums.length - 1;
          if (nums[right - 1] < nums[right]) {
              return right;
          }
          int left = 0, ans = 0;
          while (left <= right) {
              int mid = left + ((right - left) >> 1);
              if (nums[mid] > nums[mid + 1]) {
                  right = mid - 1;
                  ans = mid;
              }
              else {
                  left = mid + 1;
              }
          }
          return ans;
      }
    
  • 更简洁的写法, 不熟悉的人看到可能要举几个例子才好理解:

      /**
       * 更简洁代码版本, 去除了边界判断和辅助变量ans
       * 执行用时: 0 ms , 在所有 Java 提交中击败了 100.00% 的用户
       * 内存消耗: 40.04 MB , 在所有 Java 提交中击败了 100.00% 的用户
       */
      public int findPeakElement(int[] nums) {
          int left = 0, right = nums.length - 1;
          while (left < right) {
              int mid = left + ((right - left) >> 1);
              if (nums[mid] < nums[mid + 1]) {
                  left = mid + 1;
              }
              else {
                  right = mid;
              }
          }
          return left;
      }
    

标签:right,nums,int,mid,峰值,LeetCode,162,left
From: https://www.cnblogs.com/coding-memory/p/18186954

相关文章

  • 669. 修剪二叉搜索树(leetcode)
    https://leetcode.cn/problems/trim-a-binary-search-tree/description/要点是区分在区间左边还是右边,在区间左边那么右子树也还有必要去查找删除,右边同理,返回的是删除后新树的根节点要注意函数要实现单层逻辑和完成闭环语义classSolution{//查找要删除的节点,进行......
  • 450. 删除二叉搜索树中的节点(leetcode)
    https://leetcode.cn/problems/delete-node-in-a-bst/要点是确定函数语义,单层递归逻辑,确定好有返回值的这种写法,分析出5种情况,递归的时候接收好递归的返回的新树的根节点即可classSolution{//函数语义(单层递归逻辑):查找要删除的节点,并且返回删除节点后新的树的......
  • [LeetCode] 最短的桥 双BFS Java
    Problem:934.最短的桥目录思路复杂度Code思路先找到第一个岛屿,根据每一个岛屿的岛屿块的位置多源查找这个块与第二个岛屿的距离,先找到的就是最少的距离同时,将已遍历过的岛屿标记为-1,避免重复入队复杂度时间复杂度:添加时间复杂度,示例:$O(n^2)$空间复杂度:添......
  • LeetCode 1186. Maximum Subarray Sum with One Deletion
    原题链接在这里:https://leetcode.com/problems/maximum-subarray-sum-with-one-deletion/description/题目:Givenanarrayofintegers,returnthemaximumsumfora non-empty subarray(contiguouselements)withatmostoneelementdeletion. Inotherwords,youwa......
  • LeetCode 2210. Count Hills and Valleys in an Array
    原题链接在这里:https://leetcode.com/problems/count-hills-and-valleys-in-an-array/description/题目:Youaregivena 0-indexed integerarray nums.Anindex i ispartofa hill in nums iftheclosestnon-equalneighborsof i aresmallerthan nums[i].......
  • 235. 二叉搜索树的最近公共祖先(leetcode)
    https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/要点是如果root是在p和q之间的值,意味着已经找到了最近公共祖先/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*rig......
  • 236. 二叉树的最近公共祖先(leetcode)
    https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/要点是后序遍历,这样就可以从树底开始搜索,寻找最近公共祖先classSolution{public://返回的是最近公共祖先,若返回null则说明没有TreeNode*lowestCommonAncestor(TreeNode*r......
  • arc162f-ti-jie
    arc162f思路$a_{x1,y2}\timesa_{x2,y2}\leqa_{x1,y2}\timesa_{x2,y1}$改为所有$a_{x1,y1}=a_{x2,y2}=1$,都有$a_{x1,y2}=a_{x2,y1}=1$。观察发现,第$i$行$a_{i,j_1}=\ldots=a_{i,j_{num}}=1,(j_1<\ldots<j_{num})$,第$ii,(ii>i)$行能取$1$的位置是$[1,j_1-1]$和......
  • leetCode 001.两数之和
    给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例1:输入:nums=[2,7,11,15],ta......
  • LeetCode 049. 字母异位词分组
    给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。示例1:输入:strs=["eat","tea","tan","ate","nat","bat"]输出:[["bat"],["nat","tan"],["......