跳格子/贪心算法例题详解:LeetCode605.种花问题
今天做了一道很有意思的題目,雖然是分屬于貪心算法的一個題目,但是解法多樣,十分有趣,且不是很難理解,所以想在這里分享給大家。
題目描述:
假設有一個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。
給你一個整數數組??flowerbed 表示花壇,由若干 0 和 1 組成,其中 0 表示沒種植花,1 表示種植了花。另有一個數?n ,能否在不打破種植規則的情況下種入?n?朵花?能則返回 true ,不能則返回 false。
示例 1:
輸入:flowerbed = [1,0,0,0,1], n = 1
輸出:true
示例 2:
輸入:flowerbed = [1,0,0,0,1], n = 2
輸出:false
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/can-place-flowers
這個題目我在這里為大家講解兩種方法:跳格子和貪心算法,二者各有其優勢。
方法一:貪心算法
思路分析:
首先為大家介紹貪心算法的一種解題步驟,這種方法在思路上其實更為簡單,我們只需要考慮當前位置和相鄰位置是否都為0,若是,則修改相關數據。這種方法的代碼十分簡潔,一個遍歷數組嵌套一個判斷語句。
最需要注意的一個點就是關于邊界的判斷問題:當判斷位置是開頭結尾時,是不存在左鄰點或右鄰點的,所以對于i==0的情況,我們不判斷左鄰點是否為0,而改為判斷是否當前位置為初始點,末尾點同理。
代碼如下:
class Solution { public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int length=flowerbed.size();for(int i=0;i<length;i++){if(flowerbed[i] == 0 && (i == 0 || flowerbed[i-1] == 0) && (i == length-1 || flowerbed[i+1] == 0)){flowerbed[i]=1;n--;}}return n<=0;} };運行結果展示:
可以看到這種方法的效率中規中矩,但是其思路十分簡單,代碼也十分的簡潔?。
方法二:跳格子
這種方法的思路相比于貪心算法更為的巧妙:
首先我們明確一個前提:已給數列中是不存在相鄰花朵的,以此為前提,我們從頭遍歷(用跳格子的方法甚至不需要完整遍歷一次數組)。
毫無疑問,每個位置只有0/1兩種情況。
當位置為1的時候,是什么情況呢?
如果當前位置已經是1,說明什么?下一位必定是空位,而且必然不能種花(因為左面已經有一朵花了),因此我們可以直接跳到下下位(i+2)
當位置為0的時候,又會是什么情況呢?
大家可以思考一下,我們是通過跳格子的方法來到這一位的,每次碰到1都會跳兩格,這意味著當前位置前一位必定是0,因此我們只需要判斷下一位是否為0
若為0,則說明這個位置可以種花,我們將n減去一個數字,并且繼續跳兩位(因為種下以后當前位置可以視為1,步驟就和第一種情況一樣了),
若為1,則說明下一位為1,且下下位為0,因此我們直接跳三步,繼續下一次判斷
在這里有一個注意點:我們要考慮是否到達邊界的情況,如果說跳到了最后一位,即length-1,則必然可以種下,因為右面沒有數字,而左面又為0,如果繼續按照之前的判斷方法(判斷下一位是否為0)的話,就會導致內存溢出
代碼如下:
class Solution { public:bool canPlaceFlowers(vector<int>& flowerbed, int n) {int len=flowerbed.size(),i;for(i=0;i<len &&n!=0;){if(flowerbed[i]==1)i+=2;//判斷是否到達尾部必須放在前面,不然會內存溢出報錯else if(i==len-1 || flowerbed[i+1]==0){n--;i+=2;}elsei+=3;}return n==0;} };運行結果展示:
?
可以看到用跳格子的方法,時間效率很高,因為我們沒有遍歷整個數組,還是挑選了其中最關鍵的一部分。?
?
以上便是對這個問題兩種解決方法的闡述,在leetcode的評論區中還有很多優質的解答,大家可以參考一下。歡迎大家在評論區積極評論和提問,我會盡最大能力去幫助大家結局。下面是該題目的網址。
力扣https://leetcode-cn.com/problems/can-place-flowers/
?
總結
以上是生活随笔為你收集整理的跳格子/贪心算法例题详解:LeetCode605.种花问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为HCNE—网络工程师培训教材
- 下一篇: win10电脑桌面上使用工作跟进提醒办公