【LeetCode】896. Monotonic Array || 這一刻,意識到了自己的成長。

揚-avatar-img
發佈於Leetcode
更新 發佈閱讀 6 分鐘
Input: nums = [1,2,2,3]
Output: true
Input: nums = [6,5,4,4]
Output: true
Input: nums = [1,3,2]
Output: false

題目: 給一個陣列,判斷內容是不是遞增或遞減

第一版

class Solution {
public boolean isMonotonic(int[] nums) {
  boolean isIncrease = true;
  boolean isDecrease = true;
    for (int i = 0; i < nums.length - 1; i++) {
      if (nums[i] < nums[i+1]) {
        isDecrease = false;
        continue;
      }
      if (nums[i] > nums[i+1]) {
        isIncrease = false;
        continue;  
      }
    }
    return isIncrease || isDecrease;
  }
}


初始兩個boolean flag,在迴圈過程中判斷遞增、遞減性是否還是維持,否則就提前進入下一輪,其中如果是相等的情況並不影響結果,因此不用特別處理。

在通過測資的結果下,試著進行重構跟優化。flag一旦被改成false,其實也沒有繼續在迴圈中進行判斷的必要,因此試著把for迴全拆成兩個,各自對兩個flag進行判斷,改成以下版本。

第二版

class Solution {
  public boolean isMonotonic(int[] nums) {
    if (nums.length <= 1) {
      return true;
    }
    boolean isIncrease = true;
    boolean isDecrease = true;

    for (int i = 0; i < nums.length - 1; i++) {
      if (nums[i] < nums[i+1] && isDecrease) {
        isDecrease = false;
        break;
      }
    }
    for (int i = 0; i < nums.length - 1; i++) {
       if (nums[i] > nums[i+1] && isIncrease) {
        isIncrease = false;
        break;
       }
    }
    return isIncrease || isDecrease;
  }
}

程式碼多了重複的迴圈,但實際上針對flag一改變就可以提前結束迴圈,不會受制於另一個flag的判斷,反而速度上可以提升。另外,當測資陣列內只有一個數字,也沒有判斷的必要,可以提前回傳。

執行結果與第一版的記憶體使用同樣都是92MB上下,執行速度卻從5ms左右降到只需要2ms

第三版

class Solution {
  public boolean isMonotonic(int[] nums) {
    if (nums.length <= 1) {
      return true;
    }
    return isIncrease(nums) || isDecrease(nums);
  }

  private boolean isIncrease(int[] nums) {
    for (int i = 0; i < nums.length - 1; i++) {
      if (nums[i] > nums[i+1] ) {
        return false;
      }
    }
    return true;
  }

  private boolean isDecrease(int[] nums) {
    for (int i = 0; i < nums.length - 1; i++) {
      if (nums[i] < nums[i+1]) {
        return false;
      }
    }
    return true;
  }
}

最後,把判斷跟迴圈另外抽出來成method,原本主要的isMonotonic method也變得很直觀: 是遞增或者是遞減,就符合條件結果。

由於過程中也沒有另外建立變數,僅將輸入的陣列傳遞出去得到判斷,不會有其他的資源配置耗費。

raw-image

寫完之後

完成後本想看看討論區有沒有其他獨特的解法,突然發現這題官方有開放解答可以參考,發現第一個提供的解答跟我最終的版本差不多,只是我多處理了單一數字的特例。

  1. 從最初開始接觸程式,根本看不懂FORTRAN compiler吐給我的訊息
  2. 第一次刷Leetcode,光第一題就卡了大半天
  3. 慢慢可以寫出一版解答
  4. 解答後可以優化成更好的程式架構

這一刻,意識到了自己的成長。

留言
avatar-img
留言分享你的想法!
avatar-img
Err500
12會員
78內容數
遇到的坑、解過的題、新知識的探索、舊時代的遺毒!? 工作後我發現,文件更新往往跟不上新需求的更迭,犯錯的歷史總是不斷重演。因此,我改變了方式,蒐集從程式上、系統上的每一次異常處理過程,好讓再次遇到相同的問題時能快速應變。此專題就是我的錯題本,期待日後不管在工作上或交流上遇到難題,都能輕鬆地應答:有什麼難的,我都踩過。
Err500的其他內容
2024/09/17
◆ 句子(sentence)的定義:小寫字母拼成的單字所組成的字串,每個單字間由單一個空白字元進行分隔。 ◆ uncommon的定義:在單一句子內只出現一次,並且沒有出現在另外一句中。 ◆ 給兩個句子s1跟s2,回傳所有符合uncommon定義的單字,可以為任意順序。
Thumbnail
2024/09/17
◆ 句子(sentence)的定義:小寫字母拼成的單字所組成的字串,每個單字間由單一個空白字元進行分隔。 ◆ uncommon的定義:在單一句子內只出現一次,並且沒有出現在另外一句中。 ◆ 給兩個句子s1跟s2,回傳所有符合uncommon定義的單字,可以為任意順序。
Thumbnail
2023/04/15
題目 Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop
Thumbnail
2023/04/15
題目 Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop
Thumbnail
2021/10/09
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Thumbnail
2021/10/09
Input: head = [1,2,3,4,5], n = 2 Output: [1,2,3,5]
Thumbnail
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
老是從頭重算可不是好法子,把加過的累積值存起來備用,這才符合 Prefix Sum 的精神!
Thumbnail
老是從頭重算可不是好法子,把加過的累積值存起來備用,這才符合 Prefix Sum 的精神!
Thumbnail
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
Thumbnail
題目會給一個輸入陣列,要求我們判斷所有的數字是否構成一組單調數列。 也就是全部的數字構成一條單調遞增數列(逐漸變大), 或者一條單調遞減數列(逐漸變小)?
Thumbnail
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
Thumbnail
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
Thumbnail
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
Thumbnail
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
Thumbnail
題目:給定一個由 1 和 0 組成的數組,將等效的二進位值轉換為整數。 例如:[0, 0, 0, 1] 被視為 0001,即 1 的二進位表示法。
Thumbnail
題目:給定一個由 1 和 0 組成的數組,將等效的二進位值轉換為整數。 例如:[0, 0, 0, 1] 被視為 0001,即 1 的二進位表示法。
Thumbnail
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
Thumbnail
題目會給定一個陣列,每個數字都恰好出現兩次,只有一個數字是例外。 要求我們找出那個落單也就是例外的數字。
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
題目 Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop
Thumbnail
題目 Given two integer arrays pushed and popped each with distinct values, return true if this could have been the result of a sequence of push and pop
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News