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;    
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章