一、问题描述
给你一个下标从 0 开始的整数数组 nums
。如果两侧距 i
最近的不相等邻居的值均小于 nums[i]
,则下标 i
是 nums
中,某个峰的一部分。
类似地,如果两侧距 i
最近的不相等邻居的值均大于 nums[i]
,则下标 i
是 nums
中某个谷的一部分。对于相邻下标 i
和 j
,如果 nums[i] == nums[j]
, 则认为这两下标属于 同一个 峰或谷,返回 nums
中峰和谷的数量。
注意: 要使某个下标所做峰或谷的一部分,那么它左右两侧必须 都 存在不相等邻居,
题目链接:数组中的峰谷数量
二、题目要求
样例
输入: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。
考察
数组判重、循环判断 建议用时20~35min
三、问题分析
这一题我刚拿到手想用双指针来着,但脑子想着想着就乱了,后来为了省事,索性直接判重输出结果判断。
以上面的样例为例,假如相邻的数字相同,我就去掉如下所示:
nums = [2,4,1,1,6,5] nums = [2,4,1, 6,5]
这样就可以计算除去首尾的所有元素了。
那如何去掉相邻的相同数字?
再开一个数组v,第一个数字直接存储,随后每个数字和前一个对比,不相同存入新数组,否则继续判断。
四、编码实现
classSolution { public: intcountHillValley(vector<int>&nums) { inti,j,ans=0;//初始数据vector<int>v;//定义数组v.push_back(nums[0]);//第一个数字for(i=1;i<nums.size();i++)//循环判重 { if(nums[i]!=nums[i-1]) v.push_back(nums[i]); } for(i=1;i<v.size()-1;i++)//峰谷计算 { if(v[i]>v[i-1]&&v[i]>v[i+1]||v[i]<v[i-1]&&v[i]<v[i+1]) ans++;//计数 } returnans;//输出结果 } };