第一四零三_非递增顺序的最小子序列

题目链接

给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。
如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。
与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。
注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。

根据题意,我一开始的思路就是,先把数组进行排序,既然返回顺序是先按元素之和最大的,再按长度最小的,不如一开始就把最大的数一个一个弹出,直到弹出的数组的和大于剩余元素的和,期间将弹出的数保存在list中
看懂题目,一步一步写的蠢办法,说实话,这代码真下饭

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

/**
 * @author 无法手执玫瑰
 * 2020/08/0026 20:40
 */
public class 第一四零三_非递增顺序的最小子序列 {
    public static List<Integer> minSubsequence(int[] nums) {
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        int out = 0, all = 0;

        for(int j = 0;j<nums.length;j++){
            all+=nums[j];
        }
        List<Integer> a = new LinkedList<>();
        for(int i = nums.length -1; i>=0;i--){
            a.add(nums[i]);
            out +=nums[i];
            all -=nums[i];
            if(out > all){
                return a;
            }
        }
        return null;
    }
    public static void main(String[] args) {
        int[] nums = new int[]{4,4,7,6,7};
        System.out.println(minSubsequence(nums));
    }
}

posted @ 2020-08-26 21:12  无法手执玫瑰  阅读(41)  评论(0)    收藏  举报