wordpress网站怎么百度的到做外贸需要网站
wordpress网站怎么百度的到,做外贸需要网站,百度秒收录的网站,梅州市住房和城乡建设局官网网站目录 2386. 找出数组的第 K 大和
题目描述#xff1a;
实现代码与解析#xff1a;
优先级队列#xff08;小顶堆#xff09;
原理思路#xff1a; 2386. 找出数组的第 K 大和
题目描述#xff1a; 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子…目录 2386. 找出数组的第 K 大和
题目描述
实现代码与解析
优先级队列小顶堆
原理思路 2386. 找出数组的第 K 大和
题目描述 给你一个整数数组 nums 和一个 正 整数 k 。你可以选择数组的任一 子序列 并且对其全部元素求和。
数组的 第 k 大和 定义为可以获得的第 k 个 最大 子序列和子序列和允许出现重复
返回数组的 第 k 大和 。
子序列是一个可以由其他数组删除某些或不删除元素排生而来的数组且派生过程不改变剩余元素的顺序。
注意空子序列的和视作 0 。
示例 1
输入nums [2,4,-2], k 5
输出2
解释所有可能获得的子序列和列出如下按递减顺序排列
- 6、4、4、2、2、0、0、-2
数组的第 5 大和是 2 。示例 2
输入nums [1,-2,3,4,-10,12], k 16
输出10
解释数组的第 16 大和是 10 。提示
n nums.length1 n 105-109 nums[i] 1091 k min(2000, 2n)
实现代码与解析
优先级队列小顶堆
class Solution {public long kSum(int[] nums, int k) {long sum 0; // 计算正数和int n nums.length; // 所有正数求和负数取反重新赋值for (int i 0; i n; i) {if (nums[i] 0) sum nums[i];else nums[i] -nums[i];}// 排序Arrays.sort(nums);// 优先级队列小顶堆 // int[] long long[0]是当前该子序列总和long[1]是其下一个小添加的数PriorityQueuelong[] pq new PriorityQueue((a, b) - (Long.compare(a[0], b[0])));// 先从空数组开始pq.add(new long[]{0, 0}); // 总和 下一个数// 遍历while (--k 0) {long[] t pq.peek();pq.poll();long cur t[0];long next t[1];// 如果下一个需要添加或替换的数的位置是n那么跳过if (next n) continue;// 添加下一个数加入到堆中更新总和和下一个位置pq.offer(new long[]{cur nums[(int)next], next 1});// 替换最后一个数更新总和和下一个位置if (next ! 0) {pq.offer(new long[]{cur - nums[(int)next - 1] nums[(int)next], next 1});}}// 当前堆顶就是最小值sum减去return sum - pq.peek()[0];}
}
原理思路 所有正数相加一定是最大子序列的和所以想要找到次最大和就要去掉序列中最小的正数或者加上数组中最大的负数。 所以我们将数组中的数进行转换将负数转换为正数然后排序利用最小堆遍历k次找出最小和子序列然后减去被减去的如果之前是正数说明是去除了序列中的数如果是之前是负数那么就是在该序列中加上了负数。 子序列的寻找步骤可以举一个例子[1,2,3] [] [1] 对上一层用1进行添加由于上一层没有数所以不能替换 [1, 2] [2] 对上一层用2进行添加或者替换最后一个数 [1, 2, 3] [1, 3] [2, 3] [3] 对上一层用3进行添加或者替换最后一个数
这里我们想要找到第k大那么sum就要减去第k小的值利用小顶堆然后由于顺序改变了里面用long[] 记录long[0]为该子序列总和long[1]为该序列下一个要添加的数的位置。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/89806.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!