📌  相关文章
📜  从数组的末尾删除最小元素,使总和至少减少 K |在)(1)

📅  最后修改于: 2023-12-03 15:21:59.099000             🧑  作者: Mango

从数组的末尾删除最小元素,使总和至少减少 K

问题描述

给定一个整数数组 nums 和一个整数 K,从数组的末尾开始,删除至少一个元素,直到删除后的数组中剩余元素之和至少减少 K。请你找到此时最小的可能删除集合并返回其下标集合。题目保证删除后至少存在一个元素。

示例
输入:[4,3,2,1], K = 1
输出:[0]
解释:数组的总和是 10,删除下标为 0 的 4 后,数组变成 [3,2,1],总和为 6,减少了 4,大于等于 K = 1,所以返回 [0]。
解法

先计算整个数组的总和,然后从数组的末尾开始删除元素。如果删了某一个元素之后总和仍大于等于 K,那么就说明删掉这个元素后会有一个大于等于 K 的减少量,就记录下需要删除的下标。

代码实现
def del_min_sum(nums, K):
    total_sum = sum(nums)
    delete_indexes = []
    cur_sum = total_sum
    for i in range(len(nums) - 1, -1, -1):
        cur_sum -= nums[i]
        if total_sum - cur_sum >= K:
            delete_indexes.append(i)
            total_sum -= nums[i]
    return delete_indexes[::-1]
复杂度分析

时间复杂度:$O(n)$。需要遍历整个数组一遍。

空间复杂度:$O(1)$。只需要常数级别的额外空间。