分享

求取列表“峰与谷”

 算法与编程之美 2022-04-20

1 引言

        本题来源于力扣周赛的第一题,目的是通过独特的算法加上简单的编程解决问题。

2 问题描述

   给你一个下标从 0 开始的整数数组 nums 。如果两侧距 i 最近的不相等邻居的值均小于 nums[i] ,则下标 i nums 中,某个峰的一部分。类似地,如果两侧距 i 最近的不相等邻居的值均大于 nums[i] ,则下标 i nums 中某个谷的一部分。对于相邻下标 i j ,如果 nums[i] == nums[j] , 则认为这两下标属于 同一个 峰或谷。
注意,要使某个下标所做峰或谷的一部分,那么它左右两侧必须 都 存在不相等邻居。
返回
nums 中峰和谷的数量。
示例
1
输入:
nums = [2,4,1,1,6,5]
输出:3
解释:
在下标
0 :由于 2 的左侧不存在不相等邻居,所以下标 0 既不是峰也不是谷。
在下标
1 4 的最近不相等邻居是 2 1 。由于 4 > 2 4 > 1 ,下标 1 是一个峰。
在下标
2 1 的最近不相等邻居是 4 6 。由于 1 < 4 1 < 6 ,下标 2 是一个谷。
在下标
3 1 的最近不相等邻居是 4 6 。由于 1 < 4 1 < 6 ,下标 3 符合谷的定义,但需要注意它和下标 2 是同一个谷的一部分。
在下标
4 6 的最近不相等邻居是 1 5 。由于 6 > 1 6 > 5 ,下标 4 是一个峰。
在下标
5 :由于 5 的右侧不存在不相等邻居,所以下标 5 既不是峰也不是谷。
共有
3 个峰和谷,所以返回 3

3 算法描述

本题解题的思路在于判断列表内数据的特点,我们根据题目的描述可以知道峰与谷的特点(峰:一个元素比前一个和后一个元素大)(谷:一个元素比前一个元素和后一个元素小)。通过前面两个特点我们就可以通过循环进行判断,但我们还需要注意的一点是峰值的元素可以跟后一个元素一样,谷值的特点也可以和后一个元素一样。同时因为这道题目的特殊性,我们还需要对列表中相邻的两个元素进行去重。

4 代码

def wz():
    num = []
    for x in range(len(nums) - 1):
        if nums[x] != nums[x + 1]:
            num.append(nums[x])
    num.append(nums[-1])
    n = 0
    for i in range(1, len(num) - 1):
        if (num[i] > num[i - 1] and num[i] >= num[i + 1]) or (num[i] < num[i - 1] and num[i] <= num[i + 1]):
            n += 1
        else:
            n += 0
    return n


nums = [5, 7, 7, 1, 7]
print(wz())

5 结语

通过对题目的判定,想到最简单的方法,再加以实现,这才是编程的魅力。

稿件来源:深度学习与文旅应用实验室(DLETA) 

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多