leetcode随记备忘(10)

最佳观光组合
在这里插入图片描述
这一题一看就让人想到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);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值