深度优先搜索解题算法2
题目1:重新安排行程
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 出发
如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前
示例 1:
输入: [[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]]
输出: [“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”]
解释: 另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”]。但是它自然排序更大更靠后
解题思路:深度优先搜索
class Solution {
public:
unordered_map<string,multiset<string>>map;
vector<string> res;
vector<string> findItinerary(vector<vector<string>>& tickets) {
for(auto& t:tickets){
map[t[0]].insert(t[1]);
}
dfs("JFK");
return vector<string>(res.rbegin(),res.rend());
}
void dfs(string from){
while(map[from].size()!=0){
string next = *map[from].begin();
map[from].erase(map[from].begin());
dfs(next);
}
res.push_back(from);
}
};
题目2:打家劫舍
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。
计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。
示例 1:
输入: [3,2,3,null,3,null,1]
3
/ \
2 3
\ \
3 1
输出: 7
解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.
示例 2:
输入: [3,4,5,1,3,null,1]
3
/ \
4 5
/ \ \
1 3 1
输出: 9
解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9.
解题思路:深度优先搜索和相邻关系,每个节点有偷和不偷两种可能,如果偷,则子节点不可以偷,但可以偷孙子节点,如果不偷当前节点,则可以偷子节点.
C++ 参考代码
class Solution {
public:
int rob(TreeNode* root) {
if(root == NULL) return 0;
//偷取该节点
int s1 = root->val;