最佳观光组合
这一题一看就让人想到DP。当然本题的DP没有那么直接。我们用DP[i]来表示以i结尾的数对的情况下,取得最大值时另一个景点的坐标。这样就只要比较A[i-1]与A【DP[i-1]】减去位置差的大小,就可以得到DP[i]应该是哪一个数的坐标,具体原因不难想明白。然后可以进行一下优化,因为只需要用到DP【i-1】,所以可以把数组退化成变量,来将空间复杂度降至O(1).代码如下:注释里是DP数组。
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& A) {
int maxsight = A[0]+A[1]-1;
int length = A.size();
if(length == 2) return (A[0]+A[1]-1);
int dp = 0;
//vector<int> dp(length);
//dp[0] = 0;
//dp[1] = 0;
for(int i = 2; i < length; i++){
if(A[i-1]+i-1-dp >= A[dp])
dp = i-1;
//else dp = dp;
maxsight = max(maxsight, (A[i]+A[dp]+dp-i));
}
return maxsight;
}
};
检查平衡性
检查二叉树是否平衡。
思路就是自底向上求树的高度,同时维护一个全局变量,当某2棵左右子树高度差超过1时就改全局变量的值。最终返回全局变量。代码如下:
class Solution {
public:
bool isBalance = true;
int height(TreeNode* t){
if(t == NULL)
return 0;
int hl = height(t->left);
int hr = height(t->right);
if(abs(hr - hl) > 1.1)
isBalance = false;
return max(hr, hl) + 1;
}
bool isBalanced(TreeNode* root) {
height(root);
return isBalance;
}
};
合法二叉搜索树
判断一棵树是不是合法的BST。显然想到inorder后看看是不是有序数组。实际上只需要跟前一个比就行,所以不需要数组,一个变量就够了。注意这里的初值要小于INT_MIN以防意外。代码如下:
class Solution {
public:
long long v = INT_MIN;
bool ifv = true;
bool isValidBST(TreeNode* root) {
if(!root) return true;
v--;
helper(root);
return ifv;
}
void helper(TreeNode* root){
if(!root) return;
helper(root->left);
int p = root->val;
if(p <= v)
ifv = false;
v = p;
helper(root->right);
}
};
后继者
找给定节点的inorder后继。我的思路就是inorder,然后当遍历到给定节点时做一个预警,将下一个节点值取出,当结果取出之后就可以无脑返回,不用浪费时间。用一个布尔全局变量来预警。代码如下:
class Solution {
public:
TreeNode* res = NULL;
bool flag = false;
int m = 0;
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
if(!root)
return NULL;
m = p->val;
inorder(root);
return res;
}
void inorder(TreeNode* root){
if(!root || res)
return;
inorder(root->left);
if(flag){
res = root;
flag = false;
}
else if(root->val == m)
flag = true;
inorder(root->right);
}
};