给定一组N个整数和一个y,确定N中是否存在两个元素的绝对差等于y

佐伊卜·阿斯兰

我碰到了这个问题,我一直坚持下去。它说,

给定一组N个整数和一个y,确定N中是否存在两个绝对差等于y的元素,并打印这些数字。该算法应花费O(n lg n)时间。证明为什么算法要在O(n lg n)时间内运行。例如,假设N = 3,7,2,1,4,10 y = 1,则N中有三对元素的绝对差为1 Pair 1 = | 3-2 | = | -1 | = 1对2 = | 3 -4 | = | -1 | = 1对3 = | 2 -1 | = 1

我按如下方式在C ++中尝试了此方法,但它不能处理所有边界情况,例如上述示例中的y = 8,它不会打印任何内容,但是应该打印(2,10)。

vector<int> printPairs(vector<int> N1, vector<int> N2, int y){
    int a = 0, b = 0;
    vector<int> result;
    while (a < N1.size() && b < N2.size()){
        if (N1[a] < N2[b]){
            result.push_back(N1[a]);
            if (abs(N1[a] - N2[b]) == y)
                cout << "(" << N1[a] << "," << N2[b] << ")" << endl;
            a++;
        }
        else {
            result.push_back(N2[b]);
            if (abs(N1[a] - N2[b]) == y)
                cout << "(" << N1[a] << "," << N2[b] << ")" << endl;
            b++;
        }
    }
    while (a < N1.size())
        result.push_back(N1[a++]);
    while (b < N2.size()){
        result.push_back(N2[b++]);
    }
    return result;
}
vector <int> getPairs(vector<int> N, int y){
    if (N.size() == 1)
        return N;
    vector <int> firstHalf = getPairs(vector<int>(N.begin(), N.begin() + N.size() / 2), y);
    vector <int> secondHalf = getPairs(vector<int>(N.begin() + ceil(N.size() / 2), N.end()), y);
    return printPairs(firstHalf, secondHalf, y);
}
萨沙

使用std :: set容器。

std :: set :: find()的时间复杂度为O(logN)。

调用N次find()会花费O(NlogN)。

代码示例:

#include <iostream>
#include <set>

int main() {
  std::set<int> values = {3, 7, 2, 1, 4, 10};
  int y = 1;
  for (int elem : values) {
    if (values.find(elem + y) != values.end()) {
      std::cout << elem << " " << elem + y << std::endl;
    }
  }
  return 0;
}

输出:

1 2
2 3
3 4

另一个算法:

  1. 排序元素(NlogN)

  2. 对于每个元素,请使用二进制搜索(每个搜索查询的logN)。

例子:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
  std::vector<int> values = {3, 7, 2, 1, 4, 10};
  int y = 1;
  std::sort(values.begin(), values.end());
  for (int i = 0; i + 1 < values.size(); ++i) {
    if (std::binary_search(
          values.begin() + i + 1, values.end(), values[i] + y)) {
      std::cout << values[i] << " " << values[i] + y << std::endl;
    }
  }
  return 0;
}

输出:

1 2
2 3
3 4

或者您可以通过使用两个指针的想法将步骤2简化为O(N):

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
  std::vector<int> values = {3, 7, 2, 1, 4, 10};
  int y = 1;
  std::sort(values.begin(), values.end());
  int l = 0, r = 0;
  for (int i = 0; i + 2 < 2 * values.size(); ++i) {
    if (r + 1 < values.size() &&
        values[r] - values[l] <= y) {
      ++r;
    } else {
      ++l;
    }
    if (values[l] + y == values[r]) {
      std::cout << values[l] << " " << values[r] << std::endl;
    }
  }
  return 0;
}

总复杂度将相同(但是算法会快一点):O(NlogN)+ O(N)= O(NlogN)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

给定一个长度为N的整数排序列表,确定元素x是否在列表中

来自分类Dev

给定一个DateTimeZone和两个Instant,确定LocalTime是否介于两个Instant之间

来自分类Dev

给定一个DateTimeZone和两个Instant,确定LocalTime是否介于两个Instant之间

来自分类Dev

给定两个未排序的数组 A 和 B ,通过只对数组中的一个进行排序,找到总和(或差)等于给定 k 的一对元素

来自分类Dev

确定在几个条件下整数数组中是否存在一个总和等于给定目标值的子集

来自分类Dev

MySQL确定结果数组的第一个元素是否等于给定值

来自分类Dev

用一个y轴和两个x轴绘制两组数据

来自分类Dev

一组两个文件中具有序列的 N 个相同连续字符的比较

来自分类Dev

给定m个长度为n的位串,找到是否存在一组恰好k个位串,以使得在每个位置只有1个位串具有一个设置位

来自分类Dev

是否可以在两个背景图像之间插入链接[一个是一组打开的门]

来自分类Dev

查找两个列表x和y之间的配对的所有组合,以使y中的所有元素与x中的一个正好配对

来自分类Dev

给定一个包含n个元素的列表,是否需要使用堆以在O(K)中插入和删除后找到最大的k个元素?

来自分类Dev

如何使 If ... And 语句在 Excel 中工作以查看变量是否等于一组数字中的任何一个

来自分类Dev

确定拆分两个TextFrames是否会拆分InDesign中的一个段落

来自分类Dev

在同一组件中映射和渲染两个不同的数组-React

来自分类Dev

AngularJS:以n个元素为一组重复

来自分类Dev

如何测试一个值是否与一组值中的一个匹配?

来自分类Dev

给定一个已排序的数组和一个参数k,找到两个大于或等于k的数字之和

来自分类Dev

检查php中两个或多个数组中是否存在一个值

来自分类Dev

如何检查一个类是否完全符合给定的一组特征?

来自分类Dev

如何在CSS中的每个第n个元素之后选择一组元素?

来自分类Dev

从给定类型的一组键中,相应地设置这些键的两个实例会导致错误类型

来自分类Dev

查找一组n个元素的k个独特元素子集的唯一组成

来自分类Dev

检查一个值是否存在于两个或多个数组中

来自分类Dev

给定一个列表,我如何构造一个新列表,以使新列表的每个元素都是旧列表中每两个数字的和?

来自分类Dev

两个方法参数或一个新类..(X和Y线)

来自分类Dev

具有两个x系列和一个y系列的Excel散点图

来自分类Dev

确定一个字符串是否存在于以另一个数组中的另一组字符串开头的数组中

来自分类Dev

是否检测到两个元素中的任意一个之外的点击?

Related 相关文章

  1. 1

    给定一个长度为N的整数排序列表,确定元素x是否在列表中

  2. 2

    给定一个DateTimeZone和两个Instant,确定LocalTime是否介于两个Instant之间

  3. 3

    给定一个DateTimeZone和两个Instant,确定LocalTime是否介于两个Instant之间

  4. 4

    给定两个未排序的数组 A 和 B ,通过只对数组中的一个进行排序,找到总和(或差)等于给定 k 的一对元素

  5. 5

    确定在几个条件下整数数组中是否存在一个总和等于给定目标值的子集

  6. 6

    MySQL确定结果数组的第一个元素是否等于给定值

  7. 7

    用一个y轴和两个x轴绘制两组数据

  8. 8

    一组两个文件中具有序列的 N 个相同连续字符的比较

  9. 9

    给定m个长度为n的位串,找到是否存在一组恰好k个位串,以使得在每个位置只有1个位串具有一个设置位

  10. 10

    是否可以在两个背景图像之间插入链接[一个是一组打开的门]

  11. 11

    查找两个列表x和y之间的配对的所有组合,以使y中的所有元素与x中的一个正好配对

  12. 12

    给定一个包含n个元素的列表,是否需要使用堆以在O(K)中插入和删除后找到最大的k个元素?

  13. 13

    如何使 If ... And 语句在 Excel 中工作以查看变量是否等于一组数字中的任何一个

  14. 14

    确定拆分两个TextFrames是否会拆分InDesign中的一个段落

  15. 15

    在同一组件中映射和渲染两个不同的数组-React

  16. 16

    AngularJS:以n个元素为一组重复

  17. 17

    如何测试一个值是否与一组值中的一个匹配?

  18. 18

    给定一个已排序的数组和一个参数k,找到两个大于或等于k的数字之和

  19. 19

    检查php中两个或多个数组中是否存在一个值

  20. 20

    如何检查一个类是否完全符合给定的一组特征?

  21. 21

    如何在CSS中的每个第n个元素之后选择一组元素?

  22. 22

    从给定类型的一组键中,相应地设置这些键的两个实例会导致错误类型

  23. 23

    查找一组n个元素的k个独特元素子集的唯一组成

  24. 24

    检查一个值是否存在于两个或多个数组中

  25. 25

    给定一个列表,我如何构造一个新列表,以使新列表的每个元素都是旧列表中每两个数字的和?

  26. 26

    两个方法参数或一个新类..(X和Y线)

  27. 27

    具有两个x系列和一个y系列的Excel散点图

  28. 28

    确定一个字符串是否存在于以另一个数组中的另一组字符串开头的数组中

  29. 29

    是否检测到两个元素中的任意一个之外的点击?

热门标签

归档