毎日アルゴリズム-16(非増分順序の最小サブシーケンス)

1219 ワード

配列numsをあげます.サブシーケンスの要素の和が、サブシーケンスに含まれていない要素の和よりも厳密に大きいサブシーケンスを抽出してください.
複数のソリューションが存在する場合は、長さが最も小さいサブシーケンスを返すだけです.まだ複数のソリューションがある場合は、要素の和が最大のサブシーケンスを返します.
サブ配列と異なる点は、「配列のサブシーケンス」が元の配列における要素の連続性を強調しないこと、すなわち、配列からいくつかの(分離しないかもしれない)要素を分離することによって得ることができることである.
問題データは、すべての制約条件を満たすソリューションが唯一であることを保証します.同時に、返される答えは非増分順に並べなければならない.
例1:入力:nums=[4,3,10,9,8]出力:[10,9]解釈:サブシーケンス[10,9]および[10,8]は、要素の和が他の各要素の和よりも小さいことを満たすサブシーケンスである.しかし[10,9]の要素の和は最大である.
例2:入力:nums=[4,4,7,6,7]出力:[7,7,6]解釈:サブシーケンス[7,7]の和は14であり、残りの他の要素の和(14=4+4+6)より厳密に大きくない.したがって,[7,6,7]は題意を満たす最小子シーケンスである.エレメントは非増分順に返されます.
例3:入力:nums=[6]出力:[6]ソース:力ボタンリンク:https://leetcode-cn.com/problems/minimum-subsequence-in-non-increasing-order
class Solution {
    public List minSubsequence(int[] nums) {
        List list = new ArrayList<>();
        int sum = 0, len = nums.length,ff = 0;
        for(int i:nums){
            sum += i;
        }
        Arrays.sort(nums);
        for(int i=len-1;i>=0;i--){
           ff+= nums[i];
            list.add(nums[i]);
            if(ff>(sum-ff)){
                return list;
            }
        }
        return list;
    }
}