wy的leetcode刷题记录_Day54
声明
本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2022-11-29
前言
补
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. 二叉搜索树的最小绝对差
题目介绍
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3]
输出:1
示例 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);
}
};
收获
巩固了中序遍历和二叉搜索树的知识。