每日一题:1403. 非递增顺序的最小子序列

100 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
    }
}

耗时

image.png