Leetcode 路径问题 112(是否有路径bool)

sum值有可能为负

 Path Sum
Given a binary tree and a sum, determine if the tree has a root-to-leaf 
path such adding up all the values along the path equals the given sum.
Note: A leaf is a node with no children.

Example:
Given the below binary tree and sum = 22,

      5
     / \
    4   8
   /   / \
  11  13  4
 /  \      \
7    2      1

return true, as there exist a root-to-leaf path 5->4->11->2 which sum is
22.

其实这两种解法思路都是一样的,只不过第一种解法免去了分类讨论直接来个 或 更加的简洁

 bool hasPathSum(TreeNode *root, int sum) {
        if (root == NULL) return false;
        if (root->val == sum && root->left ==  NULL && root->right == NULL) return true;
        return hasPathSum(root->left, sum-root->val) || hasPathSum(root->right, sum-root->val);
    }

下边是自己写的代码大体思想private
1用一个result分别在根,左子树,右子树看有没有满足的路径,result是出口,如果在以上三处找到路径会返回true,否则返回result的初值false

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
        vector<vector<int>>result;
        if(root==NULL){
            return false;
        }
        return corefunction(root,sum);              
    }
private:
    bool corefunction(TreeNode*root,int sum){
        bool result=false;
        if(root->val-sum==0&&root->left==NULL&&root->right==NULL){
            result =true;
        }
        else{
            if(root->left!=NULL&&result==false){
                result=corefunction(root->left,sum-root->val);
            }
            if(root->right!=NULL&&result==false){
                result=corefunction(root->right,sum-root->val);
            }
        }
        return result;
    }

};
### Dijkstra算法LeetCode中的应用 #### 1631. 最小体力消耗路径 此题要求找到一条从左上角到右下角的路径,使得路径上的最大绝对高度差最小。可以利用Dijkstra算法来解决这个问题,在每次扩展节点时记录当前的最大高度差,并以此作为优先级队列的选择标准[^1]。 ```cpp class Solution { public: int minimumEffortPath(vector<vector<int>>& heights) { using PII = pair<int, int>; priority_queue<PII, vector<PII>, greater<>> pq; const int dirs[] = {-1, 0, 1, 0, -1}; int m = (int)heights.size(); int n = (int)heights[0].size(); vector<vector<bool>> visited(m, vector<bool>(n)); pq.emplace(0, 0); while (!pq.empty()) { auto [effort, code] = pq.top(); pq.pop(); int i = code / n, j = code % n; if (visited[i][j]) continue; if (i == m-1 && j == n-1) return effort; visited[i][j] = true; for (int d = 0; d < 4; ++d) { int r = i + dirs[d], c = j + dirs[d+1]; if (r >= 0 && r < m && c >= 0 && c < n && !visited[r][c]) pq.emplace(max(effort, abs(heights[i][j]-heights[r][c])), r*n+c); } } __builtin_unreachable(); } }; ``` #### 1368. 使网格至少有一个有效路径的最小代价 该问题旨在寻找一种方法改变某些边的方向,从而让起点能够到达终点,目标是最小化修改的成本总和。这里同样采用Dijkstra变种的方式处理有向图中最短问题[^3]。 ```python import heapq from typing import List def minCost(self, grid: List[List[int]]) -> int: M,N=len(grid),len(grid[0]) dis=[[float('inf')]*N for _ in range(M)] q=[(0,0,0)] #(distance,x,y) while q: cur_dis,i,j=heapq.heappop(q) if not (0<=i<M and 0<=j<N):continue if dis[i][j]<=cur_dis:continue dis[i][j]=cur_dis directions={1:(0,1),2:(0,-1),3:(1,0),4:(-1,0)} next_directions=[directions.get(grid[i][j]),(-grid[i][j]%2*2+1,0),(0,-grid[i][j]%2*2+1)] for di,dj in next_directions+[v for k,v in directions.items()]: ni,nj=i+di,j+dj new_cost=(cur_dis+(ni!=i or nj!=j)) heapq.heappush(q,(new_cost,ni,nj)) return dis[-1][-1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值