【问题标题】:Function to return count of duplicate numbers in sorted array返回排序数组中重复数字的计数的函数
【发布时间】:2013-06-18 11:43:34
【问题描述】:

我想返回排序数组中重复值的个数。

例如:a = { 1, 1, 2, 3, 4, 4 },fratelli(n) 应该返回 2。(它们是 1, 1 和 4, 4)

我尝试使用递归方法,但它不起作用。它总是给我 4 个。

我在问是否有人可以帮助我更好地理解这种编程方法。非常感谢!

功能:

    #include <iostream>
    using namespace std;

    int fratelli(int a[], int l, int r)
    {
        if (l == r) return 0;
        else 
        {
            int c = (l+r) / 2;
            int n = fratelli(a, l, c) + fratelli(a, c+1, r);
            if (a[l] == a[l+1]) n++;
            return n;
        }

    }


    int main()
    {
        const int _N = 11;
        int array[_N] = { 1, 1, 2, 3, 5, 5, 7, 8, 8, 11, 12 };

        cout << "\n" << fratelli(array, 0, _N-1);


        return 0;
    } 

【问题讨论】:

  • 如果你有一个 = {1,1,1} 它应该返回 2 还是 1?
  • 不要使用_N 作为变量名。以下划线和大写字母开头的名称保留用于实现。
  • 您确定要使用递归吗?如果我理解正确的话,递归会使问题变得更加困难。
  • @gkovacs90 是的,因为它是一个练习 :) 没有具体说明这种行为......让我们考虑更简单的方法,所以它应该返回 2(考虑 Infested 评论)

标签: c++ algorithm recursion divide-and-conquer


【解决方案1】:

你在这一行有一个错误:

if (a[l] == a[l+1]) n++;

支票应该在索引c而不是l。除此之外,您的代码对我来说似乎没问题。

【讨论】:

  • 它将如何改变它?所以不是从左边检查,而是从右边检查。
  • @Infested no 这会检查拆分处的两个元素是否相等,以便 OP 不会错过两个分区上的一对拆分。
  • 有效!你能给我解释一下吗?
  • 更好,可能最终会多计
  • @tuttoscorre 列表中相邻相等数字的数量等于(右分区中的数字)+(左分区中的数字)+(如果两个中心元素相同,则为 1)。跨度>
猜你喜欢
  • 2016-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2021-11-24
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多