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排序是内部有优化的。