【问题标题】:Two pointer method [closed]两个指针方法[关闭]
【发布时间】:2012-12-07 10:21:20
【问题描述】:

最近我在一个关于 codeforces 的编程竞赛中遇到了一个问题。问题标签是指使用两个指针的方法可以解决问题。 二指针方法到底是什么?

【问题讨论】:

标签: c algorithm


【解决方案1】:

从我在这些链接中可以看出,“双指针方法”只是指使用两个不同的索引索引到两个不同的数组(它们将数组索引称为指针,这与大多数 C 程序员使用的方式有些不同术语)。

他们在诸如

之类的问题中使用它
if (a[i] + b[j] == X)
  // do something with i and j

其中ij 是指针(在术语“指针”的一般意义上,而不是C 数据类型意义上)。

这并不是什么非常奇特的东西,直到今天我都不知道有人为它创造了一个特定的术语。

当您与大多数 C 程序员交谈时,“双指针方法”之类的术语意味着涉及双重取消引用,例如

x = **p;

这与他们在 codeforces 链接上所说的完全不同。

【讨论】:

【解决方案2】:

Google 报告“双指针方法”有 2350 次点击,但前几页使用该短语来指代各种算法。它很少大写。可能他们指的是在其他讨论、文献等中已经建立的几个备选方案之一,这些备选方案特定于主办比赛的小组。

【讨论】:

    【解决方案3】:

    可能他们的意思是有一个指向指针的指针。

    在 C 中,这通常在您使用需要一个被调用函数来修改调用者拥有的指针。

    一个例子是在二叉树中插入一个树节点的函数:

    void tree_insert(Node **root, int value)
    {
      Node *here = *root;
    
      if(here == NULL)
      {
        if((*root = malloc(sizeof ***root)) != NULL)
          (*root)->value = value;
      }
      else if(value < here->value)
        tree_insert(&root->left, value);
      else if(value > here->value)
        tree_insert(&root->right, value);
    }
    

    通过传递一个指向树根的指针(它本身就是一个指针),函数可以改变它。

    使用它,可以通过以下方式初始化树:

    Node *tree = NULL;
    
    tree_insert(&tree, 42);
    tree_insert(&tree, 4711);
    

    在这个例子中,我们当然也可以使用函数的返回值,但希望你明白。

    【讨论】:

    • 你可能不是指对指针的引用。
    • 原来“reference”这个词被重载了……谁知道呢?
    • @MrLister 我做到了,但当然不是 C++ 意义上的。但这显然令人困惑,所以我将其编辑了。谢谢。
    • 恕我直言,这个例子很糟糕,因为它没有使用指针结构的可能性。重点是使用指向指针的指针可以避免递归,也可以避免if (... NULL)
    【解决方案4】:

    我猜你说的是这样的:

    int **allocation(int n, int m) {
       int **matrix;
       int i;
    
       matrix = (int **) malloc(sizeof(int *) * n);
       for (i = 0; i < n; i++)
         matrix[i] = (int *) malloc(sizeof(int) * m);
    
       return matrix;
    }
    

    【讨论】:

    • 这更像是n + 1指针方法……
    • 什么?我不明白
    • malloc 被调用了多少次? ;v)
    • 嗯,我有编辑。是现在吗?
    猜你喜欢
    • 2021-08-29
    • 2015-10-26
    • 1970-01-01
    • 2021-06-13
    • 2021-07-14
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多