2023-07-15力扣今日三题

链接:

2366. 将数组排序的最少替换次数

题意:

一个正整数数组nums,每次操作可以将一个数字拆分成两个数字(C=>A+B),然后放回原来的位置(XCX=>XABX或XBAX),求将这个数组变成非递减数组的最少操作次数

解:

连摇三题困难真是蚌埠住了,前两题写不出来,本来这题也想要摇掉了,看了一眼这题标签是个贪心,又瞄了一眼提示,搞一哈

首先最后一个数字不应该拆,因为要非递减,最后数字越大越好,然后就是平均分可以保留更大的数字

然后从后往前遍历,如果这个数字(now)比后面这个数字(after)大,则我要拆分,同时拆分时要保留最大的数字,则用now/after计算拆分的组数,注意当now%after!=0结果需要加一,同时将拆分组数-1(需要次数)加入答案,然后将now拆为now/f

比如21 7,可知拆分为3个7;但是15 7,也是拆分3组(15//7+1),一组就是5(平均分保留最大的数字)

实际代码:

#include
using namespace std;
long long minimumReplacement(vector& nums)
{
    long long int ans=0;
    if(nums.size()<=1) return 0;
    auto it=nums.rbegin();
    for(int after=*it++;it!=nums.rend();it++)
    {
        int now=*it;
        if(now>after)
        {
            int f=now/after;if(now%after) f++;
            ans+=(f-1);*it=now/f;
            //cout< nums;int temp;
    cout<<"Ctrl + Z to input EOF"<>temp)
    {
        nums.push_back(temp);
    }
    
    int ans=minimumReplacement(nums);
    cout<

限制:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109

你可能感兴趣的:(力扣每日一题,leetcode)