Leetcode2834. 找出美丽数组的最小和

Every day a Leetcode

题目来源:2834. 找出美丽数组的最小和

解法1:贪心

从最小正整数 1 开始枚举,设当前数为 num,如果 nums 里没有 target - num,就说明可以添加 num,依次填满直到有 n 个数即可。

用集合 nums 存储数据保证唯一性。

代码:

cpp 复制代码
class Solution
{
private:
    const int MOD = 1e9 + 7;

public:
    int minimumPossibleSum(int n, int target)
    {
        set<int> nums;
        nums.insert(1);
        int num = 2;
        while (nums.size() < n)
        {
            if (!nums.count(target - num))
                nums.insert(num);
            num++;
        }
        return accumulate(nums.begin(), nums.end(), 0LL) % MOD;
    }
};

结果:

复杂度分析:

时间复杂度:O(n)。

空间复杂度:O(n)。

解法2:数学

我们发现了规律,对于 [1, target−1] 内的数字:

  1. 1 和 target-1 只能选其中一个,为了使美丽数组的总和最小,我们选1。
  2. 2 和 target-2 只能选其中一个,为了使美丽数组的总和最小,我们选2。
  3. ...
  4. 一直到 ⌊target/2⌋,无论 target 是奇数还是偶数,它都可以选。

设 m = min(n, ⌊target/2⌋),我们选择1~m,总和为 m(m+1)/2。

此时还剩下 n-m 个数,只能从 target 开始往后选,一直到 target+n-m-1。

代码:

cpp 复制代码
/*
 * @lc app=leetcode.cn id=2834 lang=cpp
 *
 * [2834] 找出美丽数组的最小和
 */

// @lc code=start
// class Solution
// {
// private:
//     const int MOD = 1e9 + 7;

// public:
//     int minimumPossibleSum(int n, int target)
//     {
//         set<int> nums;
//         nums.insert(1);
//         int num = 2;
//         while (nums.size() < n)
//         {
//             if (!nums.count(target - num))
//                 nums.insert(num);
//             num++;
//         }
//         return accumulate(nums.begin(), nums.end(), 0LL) % MOD;
//     }
// };

class Solution
{
private:
    const int MOD = 1e9 + 7;

public:
    int minimumPossibleSum(int n, int target)
    {
        long long m = min(target / 2, n);
        return (cal(1, m) + cal(target, target + n - m - 1)) % MOD;
    }
    // 辅函数 - 返回 [left, right] 区间内元素和
    long long cal(int left, int right)
    {
        long long sum = 0;
        for (int i = left; i <= right; i++)
            sum += i;
        return sum;
    }
};
// @lc code=end

结果:

复杂度分析:

时间复杂度:O(1)。

空间复杂度:O(1)。

相关推荐
可为测控26 分钟前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨1 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
CodeClimb1 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
BoBoo文睡不醒1 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end2 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹2 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
北顾南栀倾寒3 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
银河梦想家3 小时前
【Day23 LeetCode】贪心算法题
leetcode·贪心算法
CM莫问3 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别
sz66cm3 小时前
LeetCode刷题 -- 45.跳跃游戏 II
算法·leetcode