前言
這題是一題動態規劃問題,目標是擷取不連續的元素,全部相加起來選出最優解,因只用了一層迴圈,時間複雜度可估 O(n)
,這裡有 JAVA 和 Python 的寫法。
題目
You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security systems connected and it will automatically contact the police if two adjacent houses were broken into on the same night.
Given an integer array
nums
representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.
你是一個專業的小偷,計畫了搶劫街道上的房子,每個房子藏有一定數量的錢,阻止你的唯一條件是房子之間有相連的安全系統,如果相連的房子同一晚被闖入,就會通知警方。
給定一個整數陣列
nums
代表每一間房子的金額,回傳擷取最高的金額且沒有驚動警察。
題目連結:https://leetcode.com/problems/house-robber/
題目限制
1 <= nums.length <= 100
0 <= nums[i] <= 400
範例
1 | Input: nums = [1,2,3,1] |
1 | Input: nums = [2,7,9,3,1] |
思路&筆記
- 擷取不連續的元素,全部相加起來,這歸類在動態規劃的想法,是利用先前的計算結果來推導目前的最優解。
- 我們將兩個變數 rob 和 notrob,分別表示如果搶當前房屋和不搶當前房屋時,能夠得到的最大金額。
- 在遍歷每個房屋時,透過更新這兩個變數,計算出最終的最大金額。
JAVA 實現
1 | public int rob(int[] num) { |
Python 實現
使用了和 Java 一樣的邏輯執行,換成 Python 的寫法。
1 | class Solution: |
成績
Language | Runtime | Memory |
---|---|---|
Java | 0ms | 40.62MB |
Python | 48ms | 16.33MB |