给定一组数和目标数k,问哪几个数之和大于等于k且最小

博客提及类似点外卖满减问题的题目,但内容待续。点外卖满减问题在信息技术领域可关联算法优化等方面。

类似题目:点外卖满减问题

to be continued

在C++中,有多种方法可以实现根据给定组返回组中第k大元素的算法,以下是几种常见的实现方式: ### 方法一:使用快速选择算法 快速选择算法是基于快速排序的思想,用于查找组中第k小(或第k大)的元素。以下是实现代码: ```cpp #include <iostream> #include <vector> // 交换两个元素的函 void swap(int& a, int& b) { int temp = a; a = b; b = temp; } // 分区函 int partition(std::vector<int>& arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; ++j) { if (arr[j] >= pivot) { ++i; swap(arr[i], arr[j]); } } swap(arr[i + 1], arr[right]); return i + 1; } // 快速选择函 int quickSelect(std::vector<int>& arr, int left, int right, int k) { if (left == right) return arr[left]; int pivotIndex = partition(arr, left, right); int rank = pivotIndex - left + 1; if (k == rank) { return arr[pivotIndex]; } else if (k < rank) { return quickSelect(arr, left, pivotIndex - 1, k); } else { return quickSelect(arr, pivotIndex + 1, right, k - rank); } } // 查找第k大元素的函 int findKthLargest(std::vector<int>& arr, int k) { int n = arr.size(); return quickSelect(arr, 0, n - 1, k); } ``` ### 方法二:使用最小堆(优先队列) 维护一个长度为k的最小堆,堆顶是这个堆中的最小的元素。对组的每一个元素进行遍历,如果堆元素小于k或者当前遍历的元素大于堆顶元素,就让当前元素入堆,然后再弹出一个最小的元素。这样就能保证这个堆中保存的是组中最大的前k个元素,堆顶就是组中第k大元素。以下是实现代码: ```cpp #include <iostream> #include <vector> #include <queue> // 查找第k大元素的函 int findKthLargest(std::vector<int>& nums, int k) { std::priority_queue<int, std::vector<int>, std::greater<int>> tmp; // 小顶堆 for (int i = 0; i < k; ++i) { tmp.push(nums[i]); } for (int i = k; i < nums.size(); ++i) { if (nums[i] > tmp.top()) { tmp.pop(); tmp.push(nums[i]); } } return tmp.top(); } ``` ### 方法三:使用排序 调用标准库的排序函,排序后返回指定值。以下是实现代码: ```cpp #include <iostream> #include <vector> #include <algorithm> // 查找第k大元素的函 int findKthLargest(std::vector<int>& nums, int k) { std::sort(nums.begin(), nums.end()); return nums[nums.size() - k]; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值