原创

[百战LeetCode][21.寻找峰值]


==========================努力奋斗财源广进==========================

一、算法题目

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

1、我的题解

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
        int len = nums.length;
        if(len == 1) return 0;
        if(nums[0] > nums[1]) return 0;
        if(nums[len-1] > nums[len-2]) return len-1;
        int left = 0, right = len - 1, ans = -1;
        while(left <= right){
            int mid = (left + right)/2;
            if(nums[mid] > nums[mid+1] && nums[mid] > nums[mid-1]){
                ans = mid;
                break;
            }
            if(nums[mid] < nums[mid+1]){
                left = mid + 1;
            } else{
                right = mid - 1;
            }
        }
        return ans;
    }
}

2、优秀题解

 public int findPeakElement (int[] nums) {
        // write code here
        //简单题
        int len = nums.length;
        if( len == 1) return 0;
        if(nums[0] > nums[1]) return 0;
        if(nums[len-1] > nums[len-2]) return len - 1;
        int left = 0, right = len - 1;
        while(left < right){
            int mid = (left + right) / 2;
            if(nums[mid] > nums[mid+1]){
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;

三、解法心得

此题解法为最优,就是使用二分法。 首先要处理特殊值,就是数组长度为1的时候,数组为2的时候,以及数组前两个和后两个的值的时候。 当数组大于2时,再考虑其他的。 使用到的主要思想就是爬坡。取中点当成标杆值,和后一个值进行比对。根据比值结果再进行判断。当标杆值小于后一个值的时候,往后就一定存在峰值。当标杆值大于后一个值的时候,往前就一定存在峰值。

四、自我监督

评论区记录复习记录

算法刷题
  • 作者:北斗七点半联系作者
  • 发表时间:2022-07-21 23:21
  • 版权声明:禁止转载
  • 非公众号转发
  • 评论