(1) Container With Most Water
取最左边的为left,最右边的为right,所有可能比这种大的情况只能是这两个高度较小的那一端向中间移动。一直循环这个动作,最大值肯定在其中[1]。
class Solution {
public:
int maxArea(vector<int> &height) {
int left=0,right=height.size()-1;
int maxarea=0,tmp;
while(left<right)
{
tmp=abs(left-right)*min(height[left],height[right]);
maxarea=max(tmp,maxarea);
if(height[left]<height[right])
left++;
else
right--;
}
return maxarea;
}
};
(2) Path Sum
class Solution {
public:
bool hasPathSum(TreeNode *root, int sum) {
if(!root)
return false;
if(root->val==sum && !root->left && !root->right)
return true;
return hasPathSum(root->left,sum-root->val) || hasPathSum(root->right,sum-root->val);
}
};
(3) Path Sum II
class Solution {
private:
void solve(TreeNode *root, int sum,vector<vector<int>> &ret,vector<int> tmp){
if(!root)
return;
if(root->val==sum && !root->left && !root->right)
{
tmp.push_back(root->val);
ret.push_back(tmp);
return;
}
tmp.push_back(root->val);
solve(root->left,sum-root->val,ret,tmp);
solve(root->right,sum-root->val,ret,tmp);
}
public:
vector<vector<int> > pathSum(TreeNode *root, int sum) {
vector<vector<int> > ret;
vector<int> tmp;
solve(root,sum,ret,tmp);
return ret;
}
};
参考:
[1] http://blog.csdn.net/doc_sgl/article/details/12188919