日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

跳格子/贪心算法例题详解:LeetCode605.种花问题

發布時間:2023/12/20 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跳格子/贪心算法例题详解: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.种花问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。