一魚多吃 用比大小的技巧 計算高峰與低谷的數目 Count Hills and Valleys in an Array

更新於 發佈於 閱讀時間約 7 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給一個輸入陣列,裡面的數字分別代表每個index對應到的高度,要求我們計算山峰與低谷的數目,總共有多少個

山峰 Hill: 比最靠近高度不相同的兩個鄰居的高度還要高。

低谷 Valley:比最靠近高度不相同的兩個鄰居的高度還要低。


測試範例

Example 1:

Input: nums = [2,4,1,1,6,5]
Output: 3
Explanation:
At index 0: There is no non-equal neighbor of 2 on the left, so index 0 is neither a hill nor a valley.
At index 1: The closest non-equal neighbors of 4 are 2 and 1. Since 4 > 2 and 4 > 1, index 1 is a hill.
At index 2: The closest non-equal neighbors of 1 are 4 and 6. Since 1 < 4 and 1 < 6, index 2 is a valley.
At index 3: The closest non-equal neighbors of 1 are 4 and 6. Since 1 < 4 and 1 < 6, index 3 is a valley, but note that it is part of the same valley as index 2.
At index 4: The closest non-equal neighbors of 6 are 1 and 5. Since 6 > 1 and 6 > 5, index 4 is a hill.
At index 5: There is no non-equal neighbor of 5 on the right, so index 5 is neither a hill nor a valley.
There are 3 hills and valleys so we return 3.

Example 2:

Input: nums = [6,6,5,5,4,1]
Output: 0
Explanation:
At index 0: There is no non-equal neighbor of 6 on the left, so index 0 is neither a hill nor a valley.
At index 1: There is no non-equal neighbor of 6 on the left, so index 1 is neither a hill nor a valley.
At index 2: The closest non-equal neighbors of 5 are 6 and 4. Since 5 < 6 and 5 > 4, index 2 is neither a hill nor a valley.
At index 3: The closest non-equal neighbors of 5 are 6 and 4. Since 5 < 6 and 5 > 4, index 3 is neither a hill nor a valley.
At index 4: The closest non-equal neighbors of 4 are 5 and 1. Since 4 < 5 and 4 > 1, index 4 is neither a hill nor a valley.
At index 5: There is no non-equal neighbor of 1 on the right, so index 5 is neither a hill nor a valley.
There are 0 hills and valleys so we return 0.

約束條件

Constraints:

  • 3 <= nums.length <= 100
  • 1 <= nums[i] <= 100

演算法

raw-image

反璞歸真,我們就把自己當成登山者,左邊是登山入口,從左邊開始,沿著山陵起伏走到右邊終點。

沿途中先上坡,再下坡的地方就是hill山峰,計數器就累加一。

同理類推

沿途中先下坡,再上坡的地方就是valley低谷,計數器再累加一。

最後計數器的值就是最終答案,也是題目所求。

附註:
山峰低谷的概念,很像我們在微積分學過的相對最大值,和相對最小值


程式碼

class Solution:
 def countHillValley(self, nums: List[int]) -> int:
  
  INIT, UP_HILL, DOWN_HILL = 0, 1, 2
  state = INIT

  # counter of {hill, valley}
  counter = 0

  for i in range( 1, len(nums) ):
   
   # Now we are goind up
   if nums[i] > nums[i-1]:
    if state == DOWN_HILL:
     # previous state is DOWN_HILL, but now it is UP_HILL
     # we just pass thorugh a valley
     counter +=1

    state = UP_HILL
   
   # Now we are goind down
   elif nums[i] < nums[i-1]:
    if state == UP_HILL:
     # previous state is UP_HILL, but now it is DOWN_HILL
     # we just pass thorugh a hill
     counter +=1

    state = DOWN_HILL

  return counter
    

複雜度分析

時間複雜度:

O( n ) 從左到右掃描一遍,每個數字拿去和前面的數字比大小。

空間複查度:

O( 1 ) 只有用到固定大小的臨時變數,占用的記憶體空間為常數級別O(1)。


關鍵知識點

這題算是前面那題單調數列的延伸題,從遞增、遞減的變化,
去找出山峰、低谷對應的變化規律分別是 先遞增再遞減先遞減再遞增

可以複習相關的題目,去鞏固知識點(找最小值、最大值、和遞增遞減的變化)。

單調數列尋找絕對最大值尋找相對最大值


Reference:

[1] Python O(n) by simulation [w/ Visualiztion] - Count Hills and Valleys in an Array - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
題目會給我們一個陣列,分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
題目會給我們一個陣列,分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
爬升 1,664 M單程10.3KM 🛤️D1 武陵山莊 ▸新達山屋 品田山 海拔3,303M,百岳22,武陵四秀之首,台灣百岳「十峻」之一 遠觀品田山的山形像「品」和「田」兩字的堆疊。 池有山 海拔3,303M,百岳52,「六易」之一,因山嶺西部草原有新達池、亞美池與品田池等數座高山池塘,故名
Thumbnail
兩神山正如意料中那麼遠,卻是意料之外的秀麗。非常漂亮的林道隨著潺潺小溪作伴一路陡上,漫山的蟲子大白天開趴不停高叫。
#小百岳043 之前小百岳幾乎都是自己一個人抽空去爬的,現在要找到一群人同時有空的時間,或是去協調出遊的行程,有時候都覺得挺麻煩的。 這次抓準了228連假,揪了一波以前社團的人來爬小百岳,是第一座一群人一起爬完的小百岳。 三汀山不算難走,只有少數路段必較陡峭,和之前爬聚興山的感覺滿像的。這座山
01/01/2017 山海中的島與峰—梅樂隘口   七點….四十八分, 五千二百公尺。 出了卡瑞之後,一直上坡。 然後… 開始走斜坡, 上坡以後又下坡, 下坡以後…..又走斜坡….上坡……。 剛才我們走過一個最大的斜坡, 再往下攀, 才能夠到基地營。 這段路… 真得很辛苦
01/01/2017 山海中的島與峰—倒數   清晨六點五十一分,天氣晴。   我己經可以看到梅樂峰的峰頂,小小的一點出現在遠方的山崚線上。 今早打包,越來越快,己經養成一些習慣。 我把一些需要的東西,放在最上面,最不常用的則放在下面。 打包時,最後才放進去的,也一定是到營地後最先穿
01/01/2017 山海中的島與峰—腹瀉   今天由四千三百公尺上升到五千公尺。 將到卡瑞前,我的頭又有點疼了,休息時跟傑藍提了一下。 小小的登山隊,就我和建宏兩個登山客。 嚮導們總是會建議著我們作法,來改善我們遇到的問題。   到了山屋後,蘇里曼好意的要我喝點大蒜湯,認為可以改善
12/15/2016  山海中的島與峰—考試   沒有什麼正式的會面。 傑藍介紹攀登嚮導蘇里曼給我和建宏認識。 也指了三個挑夫給我們,但連名字也不講了。   在山裏,挑夫就是挑夫,沒有名字。 或是說,他們的名字就是挑夫。 如果以階級來分,他們就是最底層的人。 這時我才知道,原來剛
06/25/2016 山海中的島與峰—笑傲山林   建宏:七頂峰,有點遙遠。   當歸:世界太大了,山也太多。我目標定在6165,這樣就快樂多了。   事情總會有個起頭,就在這段無心的對話中,一段旅程早己開始盟芽,只是當時我們都不清楚,接下來發生的事。   但一如往常我所說的,山,
Thumbnail
見山是山,見山不是山,見山還是山 通常社會經驗不足,或者是涉世未深的人,甚至是很少去對生活許多方面進行過深入思考的人,很容易犯只從一個人的外在表現就判斷對方是怎樣為人的錯誤! 而這樣的人不一定都是年紀較輕的人,許多年長的人也有同樣的問題. 許多處在這一個層次的人
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
爬升 1,664 M單程10.3KM 🛤️D1 武陵山莊 ▸新達山屋 品田山 海拔3,303M,百岳22,武陵四秀之首,台灣百岳「十峻」之一 遠觀品田山的山形像「品」和「田」兩字的堆疊。 池有山 海拔3,303M,百岳52,「六易」之一,因山嶺西部草原有新達池、亞美池與品田池等數座高山池塘,故名
Thumbnail
兩神山正如意料中那麼遠,卻是意料之外的秀麗。非常漂亮的林道隨著潺潺小溪作伴一路陡上,漫山的蟲子大白天開趴不停高叫。
#小百岳043 之前小百岳幾乎都是自己一個人抽空去爬的,現在要找到一群人同時有空的時間,或是去協調出遊的行程,有時候都覺得挺麻煩的。 這次抓準了228連假,揪了一波以前社團的人來爬小百岳,是第一座一群人一起爬完的小百岳。 三汀山不算難走,只有少數路段必較陡峭,和之前爬聚興山的感覺滿像的。這座山
01/01/2017 山海中的島與峰—梅樂隘口   七點….四十八分, 五千二百公尺。 出了卡瑞之後,一直上坡。 然後… 開始走斜坡, 上坡以後又下坡, 下坡以後…..又走斜坡….上坡……。 剛才我們走過一個最大的斜坡, 再往下攀, 才能夠到基地營。 這段路… 真得很辛苦
01/01/2017 山海中的島與峰—倒數   清晨六點五十一分,天氣晴。   我己經可以看到梅樂峰的峰頂,小小的一點出現在遠方的山崚線上。 今早打包,越來越快,己經養成一些習慣。 我把一些需要的東西,放在最上面,最不常用的則放在下面。 打包時,最後才放進去的,也一定是到營地後最先穿
01/01/2017 山海中的島與峰—腹瀉   今天由四千三百公尺上升到五千公尺。 將到卡瑞前,我的頭又有點疼了,休息時跟傑藍提了一下。 小小的登山隊,就我和建宏兩個登山客。 嚮導們總是會建議著我們作法,來改善我們遇到的問題。   到了山屋後,蘇里曼好意的要我喝點大蒜湯,認為可以改善
12/15/2016  山海中的島與峰—考試   沒有什麼正式的會面。 傑藍介紹攀登嚮導蘇里曼給我和建宏認識。 也指了三個挑夫給我們,但連名字也不講了。   在山裏,挑夫就是挑夫,沒有名字。 或是說,他們的名字就是挑夫。 如果以階級來分,他們就是最底層的人。 這時我才知道,原來剛
06/25/2016 山海中的島與峰—笑傲山林   建宏:七頂峰,有點遙遠。   當歸:世界太大了,山也太多。我目標定在6165,這樣就快樂多了。   事情總會有個起頭,就在這段無心的對話中,一段旅程早己開始盟芽,只是當時我們都不清楚,接下來發生的事。   但一如往常我所說的,山,
Thumbnail
見山是山,見山不是山,見山還是山 通常社會經驗不足,或者是涉世未深的人,甚至是很少去對生活許多方面進行過深入思考的人,很容易犯只從一個人的外在表現就判斷對方是怎樣為人的錯誤! 而這樣的人不一定都是年紀較輕的人,許多年長的人也有同樣的問題. 許多處在這一個層次的人