携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情
又到了疯狂星期四的日子,我上火我不吃,就不给大家v50了 今天带来的是一到leetcode的每日一题
前言
[1403. 非递增顺序的最小子序列]【简单题】,是一个简单题中的中等题吧,如果在3min中内想到解决思路就很快了。
审题
给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。 如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。 与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。
注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。
根据题意可以知道答案需要的是从给出的序列中提出最大子序列,而满足该序列的元素之和比其他的大并组成一个序列即可,假设例子 [4,3,10,9,8] 里面最大的是10,但是9+8大于10,然后10+9又大于前者,并且其他元素加起来都没有他们两个大,那么答案就是10,9。
大致流程知道了我们具体解法就是把所有的元素加来,计算他们的总和,然后在给nums中的每一个数字拍个序从大到小,然后对长度除2,是因为一般的长度左边都是大的,那么右边小的都可以忽略不记录,排序后对每一个数字进行遍历,使用总和sum减去当前的数字,来对比总和是否小于,即可得出答案。
编码
class Solution {
public List<Integer> minSubsequence(int[] nums) {
Arrays.sort(nums);
int sum = Arrays.stream(nums).sum();
List<Integer> ans = new ArrayList<>();
int curSum = 0;
for (int i = nums.length - 1; i >= 0; i--) {
//加入答案
curSum += nums[i];
sum -= nums[i];
ans.add(nums[i]);
if (curSum > sum) {
break;
}
}
return ans;
}
}