leetcode
leetcode 1301 ~ 1350
非递增顺序的最小子序列

非递增顺序的最小子序列

难度:

标签:

题目描述

代码结果

运行时间: 27 ms, 内存: 16.1 MB


/*
 * Solution Idea:
 * 1. Sort the array in descending order using Java Streams.
 * 2. Collect the sorted array into a list.
 * 3. Calculate the total sum of the array and then accumulate the elements in the list until the accumulated sum is greater than half of the total sum.
 * 4. Return the list.
 */
import java.util.*;
import java.util.stream.*;

public class Solution {
    public List<Integer> minSubsequence(int[] nums) {
        int totalSum = Arrays.stream(nums).sum();
        List<Integer> sortedList = Arrays.stream(nums)
                                         .boxed()
                                         .sorted(Comparator.reverseOrder())
                                         .collect(Collectors.toList());
        List<Integer> result = new ArrayList<>();
        int subSum = 0;
        for (int num : sortedList) {
            subSum += num;
            result.add(num);
            if (subSum > totalSum - subSum) break;
        }
        return result;
    }
}

解释

方法:

本题解采用了排序与累加的方法来寻找最小的子序列,满足子序列的元素之和严格大于未包含在子序列中的元素之和。首先,将数组按照非递增顺序排序,然后从前向后累加元素,同时计算剩余元素的总和。当累加和大于剩余元素的总和时,当前累加的部分即为所求的最小子序列。

时间复杂度:

O(n log n)

空间复杂度:

O(1)

代码细节讲解

🦆
在题解中,为什么选择将数组进行降序排序而不是升序或其他顺序?
选择进行降序排序的目的是为了尽快地收集到元素总和最大的子序列,从而使得该子序列的和超过剩余部分的总和。如果按升序排序,那么我们将从最小的元素开始累加,这样需要更多的元素才能使子序列的和超过剩余部分,从而导致子序列变长,不满足题目要求的最小子序列。降序排序确保了我们可以尽可能地使用较少的、数值较大的元素来快速达到超过剩余元素总和的目标。
🦆
题解提到的算法中,累加和一旦大于剩余元素总和就停止累加。这种做法是否会导致忽略可能存在的其他更短的子序列?
这种做法不会导致忽略更短的子序列。由于数组是降序排序的,最大的元素首先被加入到子序列中。如果我们继续寻找更短的子序列,而不是在累加和首次超过剩余总和时停止,那么由于剩余的元素都比已经选择的元素小,任何尝试用更小的元素替换已经选择的大元素,都将导致需要更多的元素来达到相同的累加和,这与寻找最小子序列的目标相悖。
🦆
算法实现中判断`sub_sum > total_sum - sub_sum`为何足以确保找到的子序列长度最短且元素之和最大?
此条件`sub_sum > total_sum - sub_sum`确保了选取的子序列的和是大于数组剩余部分的和。由于数组是降序排序的,我们能保证当前选择的元素是当前可选的最大元素,从而使得所需的元素数量最小化。这时子序列的长度自然是最短的,同时由于是从最大值开始累加的,所以子序列的和也是最大可能的和。
🦆
在题解算法中,如何理解并保证返回的子序列是唯一的解?
在此算法中,返回的子序列可能不是唯一的解,尤其是在数组中存在重复元素的情况下。然而,给定的排序和累加的算法流程确保了在这种特定的处理方法(即先排序后累加)下,找到的第一个满足条件的子序列是唯一确定的。如果数组中的元素唯一或者元素的顺序不被改变,那么返回的子序列将是唯一的。如果存在多种可能的子序列满足条件,那么具体的解可能依赖于如何处理等值的元素,例如是否存在多个相同的最大元素可以选择。

相关问题