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排序是内部有优化的。
浙公网安备 33010602011771号