leetcode刷题记录-1403. 非递增顺序的最小子序列

·  阅读 383
leetcode刷题记录-1403. 非递增顺序的最小子序列

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

前言

今天的题目为简单,使用排序加上贪心的思想就能够简单的解决,学习一个数组求和函数reduce,能够让代码看起来更优雅一点

每日一题

今天的题目是 1403. 非递增顺序的最小子序列,难度为简单

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

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

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

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

 

示例 1:

输入:nums = [4,3,10,9,8]
输出:[10,9] 
解释:子序列 [10,9] 和 [10,8] 是最小的、满足元素之和大于其他各元素之和的子序列。但是 [10,9] 的元素之和最大。 
复制代码

示例 2:

输入:nums = [4,4,7,6,7]
输出:[7,7,6] 
解释:子序列 [7,7] 的和为 14 ,不严格大于剩下的其他元素之和(14 = 4 + 4 + 6)。因此,[7,6,7] 是满足题意的最小子序列。注意,元素按非递增顺序返回。 
复制代码

示例 3:

输入:nums = [6]
输出:[6]
复制代码

提示:

  • 1 <= nums.length <= 500
  • 1 <= nums[i] <= 100

题解

排序+贪心

题目要求我们从一个数组中找出几个数来,子序列并不要求要在原数组中按顺序排列,所以说可以随意去除几个元素,但是题目要求我们取出来的元素长度一定是最小的,那么首先就是考虑到需要排序,直接从大的数往下取,并且要求多个答案长度相等的情况下也是要取出的元素值总和最大,那么就毫无疑问直接排序然后从大往小一个个取出来加入数组当中。

所以我们只需要简单计算一下原来数组的总和,以及已经取出的元素的总和做一个对比,题目要求的是要取出的元素加起来严格大于剩余的元素,那么就是大于的关系。只要不满足这个关系我们就不断地从原数组取出数据,直到满足为止。

function minSubsequence(nums: number[]): number[] {
    let sum = nums.reduce((a,b) => a+b)
    let cur = 0
    let n = nums.length - 1
    nums = nums.sort((a,b)=>a-b)
    const ans = new Array<number>()
    while (cur <= sum) {
        sum -= nums[n]
        cur += nums[n]
        ans.push(nums[n])
        n--
    }
    return ans
};
复制代码

image.png

分类:
前端
收藏成功!
已添加到「」, 点击更改