给你N个数字,希望有其中找出三个数字出来,其和等于M 问有多少种选择方式 注意所选出来的数字,如果位置编号不一样,就算是值一样,也认为是不同的方式 Format Input 第一行给出N,M 第二行给出N个数字,其值<=1e7 前30%的数据1<=N<=300 前60%的数据1<=N<=5000, 1<=ai<=1e7 后40%的数据1<=N<=1e5,1<=ai<=5000 对于100%的数据,1<=M<=1e9
时间: 2023-06-17 12:06:09 浏览: 47
这道题可以使用双指针来解决。
首先,将给定的 N 个数字从小到大排序。然后,固定一个数,使用双指针在剩下的数字中寻找两个数,使得三个数的和等于 M。
具体来说,枚举第一个数,设它的下标为 i。然后,使用双指针在剩下的数字中寻找两个数,设它们的下标为 j 和 k。初始时,j 指向 i 的下一个位置,k 指向最后一个位置。如果三个数的和等于 M,那么就找到了一种选择方式;如果三个数的和小于 M,那么将 j 向右移动一位;如果三个数的和大于 M,那么将 k 向左移动一位。直到 j 和 k 相遇为止。
注意,为了避免重复计算,当枚举第一个数时,需要跳过与前一个数相同的数字。
时间复杂度为 O(N^2)。代码如下:
相关问题
用js找出数组中和指定数m相差n的所有数字
可以使用以下的 JavaScript 代码来找出数组中和指定数 m 相差 n 的所有数字:
```javascript
function findNumbersWithDifference(arr, m, n) {
const result = [];
// 遍历数组中的每个数字
for (let i = 0; i < arr.length; i++) {
const num = arr[i];
// 检查当前数字与指定数的差值是否为 n 或 -n
if (Math.abs(num - m) === n) {
result.push(num);
}
}
return result;
}
// 测试示例
const numbers = [2, 4, 6, 8, 10];
const targetNumber = 7;
const difference = 2;
const resultArray = findNumbersWithDifference(numbers, targetNumber, difference);
console.log(resultArray);
```
在上述代码中,`findNumbersWithDifference` 函数接收三个参数:数组 `arr`,目标数 `m`,和差值 `n`。函数会遍历数组中的每个数字,检查当前数字与目标数的差值是否等于给定的差值 `n` 或 `-n`,如果是,则将该数字添加到结果数组 `result` 中。最后,返回结果数组。
以上代码在给定的示例中,将返回 `[4, 6]`,因为它们与目标数 7 的差值为 2。你可以根据自己的需要修改输入的数组和参数来测试不同的情况。
c++写一函数,找m至n(n>m)之间的所有各位数字之和等于k的数,并调用这个函数求k=43的所有5位数
以下是一个找出m至n之间各位数字之和等于k的数的函数:
```c++
#include<iostream>
using namespace std;
int digitSum(int n) {
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
return sum;
}
void findNumsWithDigitSum(int m, int n, int k) {
for (int i = m; i <= n; i++) {
if (digitSum(i) == k) {
cout << i << endl;
}
}
}
int main() {
findNumsWithDigitSum(10000, 99999, 43);
return 0;
}
```
在主函数中,我们可以调用 `findNumsWithDigitSum` 函数来找到所有各位数字之和等于43的5位数。该函数接受三个参数:起始数值m、终止数值n和目标数字和k。在该函数内,我们使用了 `digitSum` 函数来计算数值的各位数字之和,然后与目标数字和k进行比较。如果相等,则将该数值输出。