LeetCode No.368. Largest Divisible Subset

Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies: Si % Sj = 0 or Sj % Si = 0.

If there are multiple solutions, return any subset is fine.

Example 1:

nums: [1,2,3]

Result: [1,2] (of course, [1,3] will also be ok)

Example 2:

nums: [1,2,4,8]

Result: [1,2,4,8]

===================================================================

題目鏈接:https://leetcode.com/problems/largest-divisible-subset/

題目大意:求出數組中最長非嚴格遞增子序列,使得序列中任意相鄰一對數值滿足Si % Sj = 0 或者 Sj % Si = 0

思路:動態規劃,dp[i]記錄nums[i]作爲序列最後一位時的滿足條件的最長子序列長度。

參考代碼:

class Solution {
public:
    vector<int> largestDivisibleSubset(vector<int>& nums) {
        int n = nums.size() ;
        vector <int> ans ;
        if ( n == 0 )
            return ans ;
        sort ( nums.begin() , nums.end() ) ;//從小到大排序
        vector <int> pre ( n , 0 ) ;//記錄序列前一個的下標
        vector <int> dp ( n , 0 ) ;//記錄nums[i]個爲序列最後一位時的序列長度
        pre[0] = 0 ;
        dp[0] = 1 ;
        for ( int i = 1 ; i < n ; i ++ )
        {
            int p = i , sum = 1 ;
            for ( int j = 0 ; j < i ; j ++ )//尋找最長序列並記錄前一個下標
            {
                if ( nums[i] % nums[j] == 0 || nums[j] % nums[i] == 0 )
                {
                    if ( dp[j] + 1 > sum )
                    {
                        sum = dp[j] + 1 ;
                        p = j ;
                    }
                }
            }
            dp[i] = sum ;
            pre[i] = p ;
        }
        int as = 0 , temp = 0 ;
        for ( int i = 0 ; i < n ; i ++ )//找出最長序列最後一位下標
        {
            if ( dp[i] > as )
            {
                as = dp[i] ;
                temp = i ;
            }
        }
        while ( pre[temp] != temp ) //從後往前推,直到pre[temp] == temp說明到達序列第一位
        {
            ans.push_back ( nums[temp] ) ;
            temp = pre[temp] ;
        } 
        ans.push_back ( nums[temp] ) ;
        reverse ( ans.begin() , ans.end() ) ;//結果逆序
        return ans ;
    }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章