给你一个数组 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]

    提示:

    1 <= nums.length <= 500

    1 <= nums[i] <= 100

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/minimum-subsequence-in-non-increasing-order

    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    根据提示:可以通过数组记录方式来代替排序

    1. class Solution {
    2. public List<Integer> minSubsequence(int[] nums) {
    3. List<Integer> result = new ArrayList<>();
    4. int[] ints = new int[101];
    5. int sum = 0;
    6. int resultSum = 0;
    7. for (int i = 0; i < nums.length; i++) {
    8. ints[nums[i]]++;
    9. sum += nums[i];
    10. }
    11. int halfSum = sum >> 1;
    12. for (int i = ints.length - 1; i > 0 && resultSum <= halfSum; ) {
    13. if (ints[i] != 0) {
    14. resultSum += i;
    15. result.add(i);
    16. ints[i]--;
    17. } else {
    18. i--;
    19. }
    20. }
    21. return result;
    22. }
    23. }

    我的解:

    class Solution {
        public List<Integer> minSubsequence(int[] nums) {
            List<Integer> list = new ArrayList<>();
            Arrays.sort(nums);
            int allSum = 0;
            int current = 0;
            for (int n : nums) allSum += n;
            for(int i = nums.length - 1; i >= 0; i--){
                list.add(nums[i]);
                current += nums[i];
                if(current > allSum - current) break;
            }
            return list;
        }
    }