给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路:递归,维护以每个点为开始往下延伸的路径的最大值回传给父节点,同时更新答案最大值。
/**
* 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:
int ans = -1e9;
int dfs(TreeNode* rt){
if(rt == NULL) return 0;
int left = 0, right = 0;
left = dfs(rt->left);
right = dfs(rt->right);
int imax = rt->val + max(left, right);
ans = max(ans, rt->val + left + right);
return max(imax,0);
}
int maxPathSum(TreeNode* root) {
dfs(root);
return ans;
}
};
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
思路:比如直线经过点A B C,那么以A为原点,AB和AC的直线斜率将会一样,斜率不好计数,hash分子分母就行。
class Solution {
public:
int maxPoints(vector<vector<int>>& points) {
int len = points.size();
if(len == 0) return 0;
if(len == 1) return 1;
map<pair<int,int>,int>mp;
int ans = 0;
for(int i=0; i<len; ++i){
mp.clear();
int ians = 0, same = 0;
for(int j=i+1; j<len; ++j){
int x = points[j][0]-points[i][0];
int y = points[j][1]-points[i][1];
if(x || y){
int g = __gcd(abs(x),abs(y));
x /= g, y /= g;
if(x == 0) y = 1;
else if(y == 0) x = 1;
else if(x < 0) x = -x, y = -y;
}
else{
++same;
continue;
}
int tmp = ++mp[make_pair(x,y)];
ians = max(ians, tmp);
}
ans = max(ans, ians+same+1);
}
return ans;
}
};