給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
例如,給定三角形:
[[2],
[3,4],
[6,5,7],
[4,1,8,3]
]自頂向下的最小路徑和為 11(即,2 + 3 + 5 + 1 = 11)。
class
solution
else
if(j==i)
else}}
for(
int i=
0;ireturn result;}}
;
給定乙個未排序的整數陣列,找出最長連續序列的長度。
要求演算法的時間複雜度為 o(n)。
示例:輸入: [100, 4, 200, 1, 3, 2]
輸出: 4
解釋: 最長連續序列是 [1, 2, 3, 4]。它的長度為 4。
思路:用set記錄元素,然後對於每乙個數不斷在set中找它的連續序列;如果num-1存在於set中,則不從這個數開始查詢。
class
solution
for(
auto num:nums)
else
num+=1
;}if(tmp_result>result)}}
return result;}}
;
給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。
說明:每次只能向下或者向右移動一步。
示例:輸入:
[[1,3,1],
[1,5,1],
[4,2,1]
]輸出: 7
解釋: 因為路徑 1→3→1→1→1 的總和最小。
class
solution
}else}}
else
}return0;
}bool
check
(int r,
int c)
else}}
;
乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。
機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角
[[0,0,0],
[0,1,0],
[0,0,0]
]輸出: 2
class
solution
grid[0]
[0]=
1;rows=grid.
size()
; cols=grid[0]
.size()
;int cur_r=
0,cur_c=0;
int pos_r,pos_c;
int a,b;
while
(true
)else
pos_r+=1
; pos_c-=1
;}}else
else
pos_r+=1
; pos_c-=1
;}}}
else
}return0;
}bool
check
(int r,
int c)
else}}
;
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後乙個位置。
輸入: [2,3,1,1,4]
輸出: true
解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後乙個位置。
思路: 維護乙個可到達的最大點
class
solution
}else}if
(range>=
(len-1)
)else}}
;
給定乙個非負整數陣列,你最初位於陣列的第乙個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。
思路: 用優先佇列記錄當前距離最小的節點,如果最小的節點不能到達當前節點則pop
其實更簡單的方法是直接貪婪的選擇能跳的更遠的下乙個節點
struct pair
bool
operator
<
(const pair& a)
const};
class
solution
else}}
return result;}}
;
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
class
solution
int j;
int result=0;
int left;
int right;
vectorbool
>>
dp(len,vector<
bool
>
(len,
false))
;for
(int l=
1; l<=len;l++)}
}else
if(l==1)
}}else}}
}}return s.
substr
(left,result);}
};
給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。
乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。
例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。
若這兩個字串沒有公共子串行,則返回 0。
class
solution
else}}
return dp[len1]
[len2];}
};
給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。
你可以對乙個單詞進行如下三種操作:
插入乙個字元
刪除乙個字元
替換乙個字元
class
solution
for(
int i=
0; i1;i++
)for
(int i=
1; i1;i++
)else}}
return dp[len1]
[len2];}
};
有 n 個物品和乙個大小為 m 的揹包. 給定陣列 a 表示每個物品的大小和陣列 v 表示每個物品的價值.
問最多能裝入揹包的總價值是多大?
class
solution
else}}
int result=dp[m]
[cats]
; dp.
clear()
;return result;}}
;
leetcode 動態規劃
題目如下 給定乙個整型陣列,至少有乙個元素,請計算子陣列最大乘積是多少?子陣列必須是原陣列中連續的一串數字構成的陣列。整數可正可負。例如 給定陣列 2,3,2,4 經過計算,得到最大乘積為6。子陣列為 2,3 根據原貼的解題思路,這道題可以用動態規劃來解,但難度在 呢?負負得正,就可惡在這裡。那這個...
Leetcode 動態規劃
題目 原題鏈結在這裡 最長字串鏈。給乙個單詞列表,找乙個詞鏈,使得詞鏈後乙個單詞由前乙個單詞增加乙個字元得到,求最長詞鏈長度。解答 1 根據詞鏈的定義,短的單詞可以由長的單詞減去單詞中乙個字元得到。因此可以先對單詞列表,按照單詞的長度從大到小排序。2 單詞的最大長度為 16,因此可以對於每個單詞 w...
leetcode 動態規劃
題目 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。思路 定義一維陣列dp用於記錄起始點到某一點最小距離,...