给定n 个不同数的数组 S 和正整数 i,i<n^(1/2),求 S 中最大的i个数,并且按照从大到小的次序输出.有下述算法: 算法 A:调用i次找最大算法 Findmax,每次从 S 中删除一个最大的数。算法 B:对 S 排序,并输出 S 中最大的i个数. (1) 分析 A,B 两个算法在最坏情况下的时间复杂度 (2)试设计一个最坏情况下时间复杂度的阶更低的算法,要求给出伪码
时间: 2023-04-05 11:00:22 浏览: 462
(1) A算法的最坏情况下时间复杂度为O(n*i),B算法的最坏情况下时间复杂度为O(n*logn)。
(2) 可以使用堆排序来实现,最坏情况下时间复杂度为O(n*logi)。具体伪码如下:
1. 建立一个大小为i的小根堆,将S中前i个数插入堆中。
2. 遍历S中剩余的数,对于每个数,如果它比堆顶元素大,则将堆顶元素弹出,将该数插入堆中。
3. 遍历完S后,堆中的元素即为S中最大的i个数,按照从大到小的次序输出即可。
相关问题
c++代码快速实现:给定长度为n的正整数序列a和正整数s,求是否存在正整数k使得sigma i=1 n (ai mod k)=s n<=100,ai<=10^9 1s内实现
在 C++ 中,你可以使用前缀和(Prefix Sum)的思想以及线性扫描的方式来解决这个问题。以下是简单的步骤和代码实现:
1. 定义一个 `vector<int>` 或数组 `dp`,其大小为 `n+1`,用于存储每个位置之前所有元素对 `k` 取模后的累加和。`dp[0] = 0` 表示空累加。
2. 遍历输入序列 `a`,对于每个元素 `ai`,更新 `dp[i] = dp[i - 1] + ai % k`。这相当于计算当前索引处的元素对所有可能的 `k` 的贡献。
3. 对于目标值 `s`,检查是否存在某个 `dp[j]` 等于 `s`,其中 `0 <= j <= n`。如果找到,则返回 `j`;否则,说明不存在满足条件的 `k`。
以下是 C++ 代码片段:
```cpp
#include <vector>
using namespace std;
int findK(vector<int>& a, int s) {
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i) {
dp[i] = dp[i - 1] + a[i -1; // 如果没有找到,返回 -1 或者抛异常
}
int main() {
vector<int> a = {1, 2, 3, 4, 5};
int s = 10;
int k = findK(a, s); // k 就是所需的整数
// ... 其他处理和输出
return 0;
}
```
给定一组正整数数组M,找出M数组中N项和为给定数S。如果有多对N项数字的和都等于 S,则输出N个数的乘积最小的哪一项,没有则返回空;
这道题可以用双指针来解决。先将M数组排序,然后使用双指针i和j,i指向M数组的第一项,j指向M数组的最后一项。如果i和j指向的两个数的和大于S,则将j向左移动一位;如果i和j指向的两个数的和小于S,则将i向右移动一位;如果i和j指向的两个数的和等于S,则找到了一组解。
为了找到乘积最小的那一组解,我们可以使用一个变量minProduct来记录当前乘积最小的一组解。每当找到一组和为S的解时,我们就计算它们的乘积并与minProduct比较,如果小于minProduct则更新minProduct。最后返回minProduct即可。
以下是JavaScript的实现代码:
```
function findMinProduct(M, S, N) {
M.sort((a, b) => a - b); // 排序
let i = 0, j = M.length - 1, minProduct = Infinity;
while (i < j) {
if (M[i] + M[j] === S) {
if (N === 2) {
minProduct = Math.min(minProduct, M[i] * M[j]);
i++;
j--;
} else {
// 递归查找剩余的N-2个数
let subMinProduct = findMinProduct(M.slice(i + 1, j), S - M[i] - M[j], N - 2);
if (subMinProduct !== Infinity) {
minProduct = Math.min(minProduct, M[i] * M[j] * subMinProduct);
}
i++;
}
} else if (M[i] + M[j] < S) {
i++;
} else {
j--;
}
}
return minProduct === Infinity ? null : minProduct;
}
```
其中,M是正整数数组,S是目标和,N是要求的项数。如果找到了一组解,则返回它们的乘积;否则返回null。
阅读全文