一个有关二分法的面试题

问题:给定一个有序数组,再给定一个数c,判断数组中是否存在两个数a,b,满足a + b = c。要求时间复杂度$O(n)$,空间复杂度$O(1)$。

解决方法:

利用首尾两个指针,计算首尾的和,如果小于c,就移动首指针+1,否则就移动尾指针-1。当首尾指针相邻时,仍未找满足要求的a和b,就返回false。

Code:

bool check_add(double * data, int n, double x)
{
  double * front = data;
  double * back = data + n - 1;

  while (front - back) {
    double sum = *front + *back;
    if (sum == x)
      return true;
    else if (sum < x)
      front++;
    else
      back--;
  }

  return false;
}

 上一篇
一个有关分解质因数的面试题 一个有关分解质因数的面试题
问题:给定两个字符串s、m,初始长度都为1。定义两种操作: m = s, s = 2s s = s + m 问给定长度L时,最少要经过多次操作1和2,才能让s的长度为L。 解题思路:我们可以发现,无论执行多少个操作1和操作2都可以,
2018-12-04
下一篇 
Five-point stencil Five-point stencil
Five-point stencil 在一维和二维中的形式: 在数值分析中,给定一个一维或二维的网格,某一点的 Five-point stencil(FPS)即为该点加上它邻近的四个点。FPS主要用于求解导数在格点上的有限差分近似。 On
2018-12-04
  目录