1403非递增顺序的最小子序列

8月4日:

问题:

给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。

如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。

与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。

注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。

 

 我的代码:

package cn.com.da.lk;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/**
 * @deviceName 97738
 * @Author da
 * @Date 2022/8/4 9:31
 * @QQ 977389678
 * @Phone 15932639701
 */
public class Solution1403 {
    public static List<Integer> minSubsequence(int[] nums) {
        //转化为对象数组
        Integer[] arrs = new Integer[nums.length];
        for (int i = 0; i < nums.length; i++) {
            arrs[i] = Integer.valueOf(nums[i]);
        }
        //求和
        int sum =0;
        for (int i=0;i<arrs.length;i++)
        {
            sum = sum +nums[i];
        }
        //自定义排序
        Arrays.sort(arrs, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        int m=0;
        int n =0;
        //比较
        for (int i =0;(i<arrs.length)&&(m<=(sum-m));i++)
        {
            m = m + arrs[i];
            n++;
        }
        //转换为符合要求的输出对象
       List<Integer> arr = new ArrayList<>();
        for (int i=0;i<n;i++)
        {
            arr.add(arrs[i]);
        }
        return arr;
    }

    public static void main(String[] args) {
        int nums[] ={4,4,7,6,7};
        List<Integer> integers = minSubsequence(nums);
        for (Integer a:integers)
        {
            System.out.println(a);
        }
    }
}

总结:使用了自定义排序,也可以使用排序,然后位置倒换。或者使用别的排序方法,但是Array.sort排序是内部有优化的。

posted @ 2022-08-04 10:03  Abandoned_Software  阅读(16)  评论(0编辑  收藏  举报