leetcode2386 找出数组第K大 题解

本文介绍了如何使用排序和动态规划结合优先队列解决LeetCode题目,计算给定数组中正负整数选择若干个元素求和,找到第k大的和的方法。作者通过实例和代码展示了如何将问题转化为求解所有可能和的序列,并利用优先队列保证取值顺序。

最近沉迷 leetcode,写写题解ψ(`∇´)ψ

题面描述

原来的题面

大致意思是给你一个包含正负整数的数组 a a a,然后你可以在里面选若干个数加到一起得到一个和(这个和的值可能会有重复,可以不取),现在问你在所有的可能中,第 k k k 大的和是多少。

元素最多 1 0 5 10 ^ 5 105 个, k k k 最大是 2000 2000 2000

题解

排序

这个不用多说,为了后面好搞。

一个小问题

在一堆正整数里面,选择若干个元素求和,在所有的和中,第 k 小的和是多少。

可以借助优先队列进行动态规划, ( s u m , i ) (sum, i) (sum,i) 表示选择的最后一个元素下标是 i i i,并且选择的元素之和是 s u m sum sum,那么借助 ( s u m , i ) (sum, i) (sum,i) 我们可以得到 ( s u m + a i + 1 , i + 1 ) ( s u m + a i + 1 − a i , i + 1 ) (sum + a_{i+1}, i + 1)(sum + a_{i + 1} - a_i, i + 1) (sum+ai+1,i+1)(sum+ai+1ai

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值