1

LeetCode-162-寻找峰值

 2 years ago
source link: https://segmentfault.com/a/1190000041347272
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

LeetCode-162-寻找峰值

发布于 1 月 27 日

题目描述:峰值元素是指其值大于左右相邻值的元素。

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

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:数组遍历

首先,判断两种特殊情况:

  • 如果只有一个元素,直接返回第一个元素的索引位;
  • 如果有两个元素,则根据判断这两个元素的大小直接返回相应的索引位。

如果数组nums不只有2个元素,则从第一个元素开始遍历判断是否是峰值:

  • 首先判断数组的第一位,如果大于第二位的值,则返回0;
  • 否则,遍历从1到nums.length-2的元素,判断是否是峰值,如果是峰值,直接返回相应的索引位;
  • 最后,如果没有找到峰值,判断最后一个元素是否大于前面的一个元素值,如果是,则返回最大的索引位,否则,返回-1表示没有峰值。
public class LeetCode_162 {
    public static int findPeakElement(int[] nums) {
        // 如果只有一个元素,直接返回第一个元素的索引位
        if (nums.length == 1) {
            return 0;
        }
        // 如果有两个元素,则根据判断这两个元素的大小直接返回相应的索引位
        if (nums.length == 2) {
            if (nums[0] > nums[1]) {
                return 0;
            } else {
                return 1;
            }
        }
        // 特殊判断数组的第一位,如果大于第二位的值,则返回0
        if (nums[0] > nums[1]) {
            return 0;
        }
        int index = 1;
        // 遍历从1到nums.length-2的元素,判断是否是峰值
        for (; index < nums.length - 1; index++) {
            if (nums[index] > nums[index - 1]) {
                if (nums[index] > nums[index + 1]) {
                    return index;
                }
            } else {
                if (nums[index] > nums[index + 1]) {
                    index++;
                }
            }
        }
        // 如果前面没有找到峰值,判断最后一个元素是否大于前面的一个元素值,如果是,则返回最大的索引位,否则,返回-1表示没有峰值
        if (nums[nums.length - 1] > nums[nums.length - 2]) {
            return nums.length - 1;
        } else {
            return -1;
        }
    }

    public static void main(String[] args) {
        int[] nums = new int[]{1, 2, 1, 3, 5, 6, 4};
        // 测试用例,期望返回值: 1或5
        System.out.println(findPeakElement(nums));
    }
}

【每日寄语】 你想赚这份钱,你就得吃这份苦。要做生活的强者,就不能在乎得失。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK