• Contest 176 LeetCode 1354. Construct Target Array With Multiple Sums(优先队列,递推)


    题目

    题意:举例:给你一个数组[9,3,5],问你这个数组是否可以由数组[1,1,1]经过某种变换得到。

            变换的步骤就是每次用数组的和,去替代数组中的某一个元素,直到达到目标数组。
    

    题解:我们从后往前递推,比如[9,3,5],那么它的上一个状态一定是[1,3,5] ,继续[1,3,1] --> [1,1,1] 最后能够到达[1,1,1]的就true。

    但是数组里的元素的数据范围是10^9 ,一步一步推是肯定超时的,我们可以从中寻找到规律,一次可以递推好几步,只要最大的数字经过一次递推之后还是最大的数字,假设经过n次递推,最大的数字才不是最大的,那么这n次递推可以一步得到,具体的公式可以自己研究下。

    typedef long long int _int;
    
    class Solution {
    public:
        priority_queue<_int> q;
        bool isPossible(vector<int>& target) {
            
            int len = target.size();
            _int sum = 0;
            for(int i=0;i<len;i++)
            {
                q.push((_int)target[i]);
                sum +=(_int) target[i];
            }
            
            while(1)
            {
                _int term = (_int)q.top();//第一小
                q.pop();
                if(term==sum&&term!=1)
                    return false;
                _int term2 = (_int) q.top();//第二小
                if(term==1)
                    break;
                if(term==term2)
                    return false;
    
                _int y = sum-term;
                _int res;
                
                if((term-term2)%y==0)
                    res = term2;
                else
                    res = term - ((term-term2)/y+1)*y;
                
                if(res<=0)
                    return false;
                
                q.push(res);
                sum = res + y;
            }
            
            return true;    
        }
    };
    
  • 相关阅读:
    第四次博客作业-结对项目
    软件工程第三次作业——关于软件质量保障初探
    java 自动生成四则运算式
    《构建之法》第一章学习笔记
    给大家分享一个小程序—2048
    Java异常处理认识
    轻松定位CPU飙高问题
    接手​「烂摊子」,管理者怎么办?
    业务中台建设篇
    互联网巨头“大中台,小前台”战略
  • 原文地址:https://www.cnblogs.com/dacc123/p/12337398.html
Copyright © 2020-2023  润新知