首页 > 其他分享 >2834. 找出美丽数组的最小和-360

2834. 找出美丽数组的最小和-360

时间:2023-08-28 21:47:05浏览次数:36  
标签:target nums int long 美丽 数组 2834 360

找出美丽数组的最小和

给你两个正整数:n 和 target 。

如果数组 nums 满足下述条件,则称其为 美丽数组 。

nums.length == n.
nums 由两两互不相同的正整数组成。
在范围 [0, n-1] 内,不存在 两个 不同 下标 i 和 j ,使得 nums[i] + nums[j] == target 。
返回符合条件的美丽数组所可能具备的 最小 和。

示例 1:

输入:n = 2, target = 3
输出:4
解释:nums = [1,3] 是美丽数组。

  • nums 的长度为 n = 2 。
  • nums 由两两互不相同的正整数组成。
  • 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
    可以证明 4 是符合条件的美丽数组所可能具备的最小和。
    示例 2:

输入:n = 3, target = 3
输出:8
解释:
nums = [1,3,4] 是美丽数组。

  • nums 的长度为 n = 3 。
  • nums 由两两互不相同的正整数组成。
  • 不存在两个不同下标 i 和 j ,使得 nums[i] + nums[j] == 3 。
    可以证明 8 是符合条件的美丽数组所可能具备的最小和。
    示例 3:

输入:n = 1, target = 1
输出:1
解释:nums = [1] 是美丽数组。

提示:

\(1 <= n <= 10^5\)
\(1 <= target <= 10^5\)

解题思路1

见代码注释,直接构造整个数组。时间复杂度O(n)。

code1

class Solution {
public:
    //美丽数组的定义:
    //1.长度为n
    //2.两两互不相同的正整数
    //3.两两相加不等于target
    //符合条件的最小和
    
    //选1不能选target-1
    //选2不能选target-2
    //...
    
    long long minimumPossibleSum(int n, int target) {
        
        long long int ans = 0;
        int cnt = 0,idx = 1;
        set<int> choose;
        while(cnt < n)
        {
            if(!choose.count(target-idx))
            {
                ans += idx;
                choose.insert(idx);
                cnt ++;
            }
            //for(auto item : choose) cout<<item<<" ";
            //cout<<cnt<<endl;
            idx++;
        }
        
        return ans;
    }
};

解题思路2:数学

可以发现:
1和target-1选1;
2和target-2选2;
....
一直到\(\lfloor \frac{target}{2} \rfloor\),可以直接选择。
取m = min(\(\lfloor \frac{target}{2} \rfloor\),n),那么第一段的和为:

\[\frac{m(m+1)}{2} \]

第二段还需要选择n - m个数,最小值为target,最大值为target+n-m-1,那么第二段的和为:

\[\frac{(2target + n - m - 1)(n-m)}{2} \]

code2

class Solution {
public:
    long long minimumPossibleSum(int n, int target) {
        long long int m = min(target / 2,n);

        return m * (m + 1) / 2 + (2 * target + n - m -1)*(n - m) / 2;
    }
};

标签:target,nums,int,long,美丽,数组,2834,360
From: https://www.cnblogs.com/huangxk23/p/17663443.html

相关文章

  • 第 360 场周赛 (二进制枚举、树上倍增)
    2833. 距离原点最远的点 本题要求最远的距离,所有‘_’必须全为左或全为右。利用前缀和的思想看看L多还是R多,最后加上_的数目就是答案。classSolution{public:intfurthestDistanceFromOrigin(stringmoves){intn=moves.size();inttt=0,l......
  • 2835. 使子序列的和等于目标的最少操作次数-360
    使子序列的和等于目标的最少操作次数给你一个下标从0开始的数组nums,它包含非负整数,且全部为2的幂,同时给你一个整数target。一次操作中,你必须对数组做以下修改:选择数组中一个元素nums[i],满足nums[i]>1。将nums[i]从数组中删除。在nums的末尾添加两个......
  • 数组二分查找:35. 搜索插入位置、34. 在排序数组中查找元素的第一个和最后一个位置
    35. 搜索插入位置1classSolution:2defsearchInsert(self,nums:List[int],target:int)->int:3left,right=0,len(nums)-145whileleft<=right:#左闭右闭6mid=left+(right-left)//27ifnum......
  • 数据结构(数组模拟与STL)
    通过数组模拟栈intstk[N],top;voidinit(){//初始化 top=0;}boolisEmpty(){//判断是否为空 returntop==0;}boolisFull(){ returntop>=MAX-1;}voidpush(intx){if(isFull())//错误(上溢)stk[++top]=x;}intpop(){if......
  • Redis存取多维对象或数组
    最近阅读tp5的底层类的实现,看到了大神的Redis类的实现,觉得非常的简洁明了,而且统一了所有的get,set,在更新一下,非常值得参考/***读取缓存*@accesspublic*@paramstring$name缓存变量名*@parammixed$default默认值*@returnmixed......
  • 不用循环和递归判断值在数组中的索引
    ////数组集合string[]str=newstring[]{"a","b","c","d","e","f","g"};////要查找的字符串stringNum="c";////使用Linq查询,将索引和值查出来,////新建一个匿名类,属性包括aabool类型,和Index索引......
  • C++—数组
    5数组5.1概述所谓数组,就是一个集合,里面存放了相同类型的数据元素特点1:数组中的每个数据元素都是相同的数据类型特点2:数组是由连续的内存位置组成的5.2一维数组5.2.1一维数组定义方式一维数组定义的三种方式:数据类型数组名[数组长度];数据类型数组名[数组长度......
  • 数组章节的进阶54. 螺旋矩阵
    54. 螺旋矩阵1classSolution:2defspiralOrder(self,matrix:List[List[int]])->List[int]:3m,n=len(matrix),len(matrix[0])4res=[]#存放遍历后的结果5startx=starty=067foroffsetinrange(min(m,......
  • 后缀数组典题
    后缀数组典题约定:\(sa_i\)表示将所有后缀排序后第\(i\)小的后缀的编号,\(rk_i\)表示后缀\(i\)的排名,\(hgt_i=lcp(sa[i],sa[i-1])\)[NOI2016]优秀的拆分求一个字符串的子串能被拆成\(AABB\)形式的方案数,其中\(A,B\)均为字符串(\(|S|\leq300000\))。\(O(n^2)\)枚举......
  • 多行多列合并成一列内存数组的结果
    问题:多行多列合并成一列内存数组的结果函数公式解决:{=PHONETIC(OFFSET(A1:E1,ROW(1:23)-1,))}用Offset函数生成一个多维引用,每个平面分别是A:E表的每一行。利用Phonetic函数将每个平面里的内容进行合并。此公式的缺陷在于被合并的内容只能是文本,如果数据源中包含数值、日......