wy的leetcode刷题记录_Day54

wy的leetcode刷题记录_Day54

声明

本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2022-11-29

前言


目录

  • wy的leetcode刷题记录_Day54
    • 声明
    • 前言
    • 813. 最大平均值和的分组
      • 题目介绍
      • 思路
      • 代码
      • 收获
    • 530. 二叉搜索树的最小绝对差
      • 题目介绍
      • 思路
      • 代码
      • 收获

813. 最大平均值和的分组

今天的每日一题是:813. 最大平均值和的分组

题目介绍

给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组 。 分数 由每个子数组内的平均值的总和构成。

注意我们必须使用 nums 数组中的每一个数进行分组,并且分数不一定需要是整数。

返回我们所能得到的最大 分数 是多少。答案误差在 10-6 内被视为是正确的。

示例 1:
输入: nums = [9,1,2,3,9], k = 3
输出: 20.00000
解释: nums 的最优分组是[9],[1, 2, 3], [9]. 得到的分数是 9 + (1 + 2 + 3) / 3 + 9 = 20. 我们也可以把 nums分成[9, 1], [2], [3, 9]. 这样的分组得到的分数为 5 + 2 + 6 = 13, 但不是最大值.

示例 2:
输入: nums = [1,2,3,4,5,6,7], k = 4
输出: 20.50000

思路

动态规划:
1、确定dp数组的含义:dp[i][j] 为考虑将前 i 个元素划分成 j 份的最大平均和。
2、确定dp数组的递推公式:首先,我们证明:划分的序列越多我们所得到的答案越大。对于遍历到dp[i][j]时,我们使用一个变量x,来遍历dp[i-x][j-1]来推出现在的dp[i][j],即用前面划分的结果基础上在进行划分,划分出来的序列应为x-i,其平均值为nums[i]+…nums[x]/(i-x);
3.初始化:对于所有的j=1的情况,其就是求整个序列的平均值。

代码

class Solution {
public:
    double largestSumOfAverages(vector<int>& nums, int k) {
        int n=nums.size();
        vector<double> pre_sum(n);
        pre_sum[0]=nums[0];
        for(int i=1;i<n;i++)
        {
            pre_sum[i]=pre_sum[i-1]+nums[i];
        }
        vector<vector<double>> dp(n,vector<double>(k));
        for(int i=0;i<n;i++)
        {
            dp[i][0]=pre_sum[i]/(i+1);
        }
        for(int j=1;j<k;j++)
        {
            for(int i=j;i<n;i++)
            {
                for(int x=j-1;x<i;x++)
                {
                    dp[i][j]=max(dp[i][j],dp[x][j-1]+(pre_sum[i]-pre_sum[x])/(i-x));
                }
            }
        }
        return dp[n-1][k-1];
    }
};

收获

530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差

题目介绍

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:
wy的leetcode刷题记录_Day54_第1张图片
输入:root = [4,2,6,1,3]
输出:1

示例 2:
wy的leetcode刷题记录_Day54_第2张图片
输入:root = [1,0,48,null,null,12,49]
输出:1

思路

首先根据前面几天的刷题我们知道,中序序列的二叉搜索树是一个升序的序列,于是我们通过中序遍历得到了中序序列,然后遍历中序序列来对比任意节点的差的最小值。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> arr;
    int getMinimumDifference(TreeNode* root) {
        mid_travel(root);
        int n=arr.size();
        if(n<2)
            return 0;

        int ans=arr[n-1];
        for(int i=1;i<n;i++)
        {
            ans=min(ans,arr[i]-arr[i-1]);
        }
        return ans;
    }
    void mid_travel(TreeNode* root)
    {
        if(!root)
            return;
        mid_travel(root->left);
        arr.push_back(root->val);
        mid_travel(root->right);
    }
};

收获

巩固了中序遍历和二叉搜索树的知识。

你可能感兴趣的:(C语言,Leetcode刷题记录,leetcode,算法,动态规划)