
題目解析:給定陣列代表每間房的現金,不能偷相鄰的房子,找出最多能偷多少錢
解題思路:只有一間就直接回傳。設陣列v,把第一間和前兩間較大的值當基礎放入。接著丟進迴圈從第三間開始跑,比較「這間加前兩間」跟「只拿前一間」,挑大的塞進v。最後回傳v最後兩個數字較大的一個
class Solution {
public:
int rob(vector& nums) {
if(nums.size() == 1) return nums.back();
vector v;
v.push_back(nums[0]);
v.push_back(max(nums[1], nums[0]));
for(int i=2; i v(1005);
v[1] = 1;
v[2] = 2;
v[3] = 5;
for(int i=4; i<=n; i++){
v[i] = (2 * v[i-1] + v[i-3]) % mod;
}
return v[n];
}
};

題目解析:給定一個迷宮矩陣,找出從指定的起點走到最近出口(迷宮邊界的空地)最少需要走幾步,起點本身不能算作出口
解題思路:設一個變數ans來記錄最少步數。寫一個遞迴函數,把走過的路直接改成牆壁 '+' 防止重複走。每次檢查上下左右四個方向,如果是空地 '.' 就步數加1繼續遞迴走下去,如果走到邊界就把累積的步數跟ans比大小並更新,最後回傳ans
class Solution {
public:
int numTilings(int n) {
int mod = 1e9+7;
vector<long long int> v(1005);
v[1] = 1;
v[2] = 2;
v[3] = 5;
for(int i=4; i<=n; i++){
v[i] = (2 * v[i-1] + v[i-3]) % mod;
}
return v[n];
}
};

題目解析:機器人從網格左上角出發,只能往下或往右走,找出走到右下角有幾種路徑
解題思路:設二維陣列v,把最左邊和最上面那排的路徑數設為1。接著丟進雙層迴圈,每個格子的路徑數等於它上方加左方格子的總和。迴圈跑完,直接回傳右下角最後一格的數字
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> v(m, vector<int>(n));
for(int i=0; i<m; i++){
v[i][0] = 1;
}
for(int i=0; i<n; i++){
v[0][i] = 1;
}
for(int i=1; i<m; i++){
for(int j=1; j<n; j++){
v[i][j] = v[i-1][j] + v[i][j-1];
}
}
return v[m-1][n-1];
}
};