描述:你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定乙個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。
思路:此題考查動態規劃演算法,只有一間屋子時,只能偷一間,有兩間屋子時,偷金額較大的那間,當數量大於2時,是否偷第k間屋子的標準在於第k間屋子的金額加上前k-2間屋子的最大搶劫金額 比 前k-1間屋子的最大搶劫金額要大。
題解:
class
solution
else
if(nums.length==1)
else
if(nums.length==2)
int[
]dp =
newint
[nums.length]
; dp[0]
=nums[0]
; dp[1]
=math.
max(nums[0]
,nums[1]
);for(
int i=
2;i)return dp[nums.length-1]
;}}
描述:在有向圖中, 我們從某個節點和每個轉向處開始, 沿著圖的有向邊走。 如果我們到達的節點是終點 (即它沒有連出的有向邊), 我們停止。
現在, 如果我們最後能走到終點,那麼我們的起始節點是最終安全的。 更具體地說, 存在乙個自然數 k, 無論選擇從**開始行走, 我們走了不到 k 步後必能停止在乙個終點。
哪些節點最終是安全的? 結果返回乙個有序的陣列。
該有向圖有 n 個節點,標籤為 0, 1, …, n-1, 其中 n 是 graph 的節點數. 圖以以下的形式給出: graph[i] 是節點 j 的乙個列表,滿足 (i, j) 是圖的一條有向邊。
思路:此題考查的演算法是圖的深度優先搜尋。我們先將所有節點標記為白色,即狀態1,此時所有節點都未曾訪問。我們從任意結點開始,做深度優先搜尋,每次搜尋將節點標記為灰色,即狀態2,表示已被訪問或在環中,當遍歷過程中遇見灰色節點時,則將此次遍歷的所有節點保持為灰色;如果在遍歷過程中沒有遇見灰色節點,則我們回溯到這個節點的時候將其置為黑色節點,表示是乙個安全的節點。
題解:
class
solution
}return ans;
}public
boolean
dfs(
int i,
int[
] color,
int[
] graph)
color[i]=1
;for
(int link:graph[i])}
color[i]=2
;return
true;}
}
註解:還有一種演算法,即利用拓撲排序
拓撲排序
定義:步驟:
先統計所有節點的入度,對於入度為0的節點就可以分離出來,然後把這個節點指向的節點的入度減一。
一直做改操作,直到所有的節點都被分離出來。
如果最後不存在入度為0的節點,那就說明有環,不存在拓撲排序,也就是很多題目的無解的情況。
此題如何利用拓撲排序呢?
我們在此題中需要不能走到環的節點,首先那些出度為0的節點必然可以,刪除這些節點並刪除指向他們的邊後,在此尋找出度為0的節點。我們構建乙個反向圖,改變所有有向邊的指向,此時我們的演算法過程即為拓撲排序,
題解:
class
solution
queue
queue=
newlinkedlist()
;for
(int i=
0;i)for
(int j:graph[i])}
while
(!queue.
isempty()
)}} list
ans=
newarraylist()
;for
(int i=
0;ireturn ans;
}}
529 掃雷遊戲
題目描述 讓我們一起來玩掃雷遊戲!給定乙個代表遊戲板的二維字元矩陣。m 代表乙個未挖出的地雷,e 代表乙個未挖出的空方塊,b 代表沒有相鄰 上,下,左,右,和所有4個對角線 地雷的已挖出的空白方塊,數字 1 到 8 表示有多少地雷與這塊已挖出的方塊相鄰,x 則表示乙個已挖出的地雷。如果乙個地雷 m ...
演算法準備 4 17
描述 給定正整數 n,找到若干個完全平方數 比如1,4,9,16,使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少 思路 動態規劃 動態規劃的核心將問題分解成小問題後,在計算規模較大的問題時,能夠用到規模較小的問題的解 我們建立乙個整型陣列res,res i 表示的是n i時的結果,計算第...
演算法準備 4 26
描述 從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2 10為數字本身,a為1,j為11,q為12,k為13,而大 小王為 0 可以看成任意數字。a 不能視為 14。思路 這題主要考察的是建模能力。我的思路是這樣的,只要排除0以外的最大值與最小值之差小於5且除0以外陣列中不存在...