算法刷题 DAY52

198.打家劫舍

int rob(int* nums, int numsSize) {

    if(numsSize==0) return 0;
    if(numsSize==1) return nums[0];//i<2下面for循环会报溢出

    int dp[numsSize];
    dp[0]=nums[0];
    dp[1]=fmax(nums[0],nums[1]);
    //必须初始化前两个元素,因为递推式左侧由前两个推得→第三个及以后元素初始化为任意值均无影响

    for(int i=2;i<numsSize;i++){
        dp[i]=fmax(dp[i-2]+nums[i],dp[i-1]);
    }

    return dp[numsSize-1];
    
}

213.打家劫舍II

//将环形情况分解成线性情况

int max_money(int* nums,int left,int right){

    if(left>right) return 0;
    if(left==right) return nums[left];
    if(right-left==1) return fmax(nums[left],nums[right]);

    int dp[right+1];
    dp[left]=nums[left];
    dp[left+1]=fmax(nums[left],nums[left+1]);
    for(int i=left+2;i<=right;i++){
        dp[i]=fmax(dp[i-1],dp[i-2]+nums[i]);
    }

    return dp[right];
}


int rob(int* nums, int numsSize) {

    if(numsSize==0) return 0;
    if(numsSize==1) return nums[0];
    if(numsSize==2) return fmax(nums[0],nums[1]);

    int money_1=max_money(nums,0,numsSize-2);
    int money_2=max_money(nums,1,numsSize-1);

    return fmax(money_1,money_2);
    
}

337.打家劫舍3

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int* last_order(struct TreeNode* root) {

    int* dp = (int*)calloc(2, sizeof(int));
    if (!root)
        return dp;

    int* left_dp=last_order(root->left);//用指针而不是数组来接结果
    int* right_dp=last_order(root->right);

    dp[0]=fmax(left_dp[0],left_dp[1])+fmax(right_dp[0],right_dp[1]);//该节点不偷
    dp[1]=root->val+left_dp[0]+right_dp[0];//该节点偷
    return dp;

}

int rob(struct TreeNode* root) {

    int* dp=last_order(root);

    return fmax(dp[0],dp[1]);
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值