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;    
    }
};

猜你喜欢

转载自www.cnblogs.com/dacc123/p/12337398.html