【问题标题】:Getting wrong number of swaps for the algorithm problem为算法问题获取错误的交换次数
【发布时间】:2019-11-25 22:47:42
【问题描述】:

问题

每当乔治约莉莉出去玩时,她都在忙着做作业。乔治想帮助她更快地完成它,但他在他的头上!你能帮助乔治了解莉莉的作业,这样她就可以和他一起出去玩吗?

考虑一个由 n 不同整数组成的数组 arr=[a[0],...,a[n-1]] 。 George 可以任意交换数组的任意两个元素。如果0 < i < n 中的|a[i]-a[i-1]| > 0 之和最小,则数组是美丽的。

给定数组arr,确定并返回为使数组美观而应执行的最小交换次数。

例如,arr = [7,15,12,3]。一个最小数组是[3, 7, 12, 15]。为此,George 执行了以下交换:

Swap      Result
          [7, 15, 12, 3]
3 7       [3, 15, 12, 7]
7 15      [3, 7, 12, 15]

需要2 交换才能使阵列美观。在可能的漂亮数组的选择中,这是最小的。

输入格式

第一行包含一个整数n,元素个数 在arr。第二行包含n  空格分隔的整数 arr[i].

约束

0 < n < 100001 0 < arr[i] < 2000000001

输出格式

返回使数组美观所需的最小交换次数。

示例输入

4 2 5 3 1

样本输出

2

我的努力

我计算了将arr 元素与其按升序和降序排序的版本进行比较的交换次数。但由于某种原因,我得到了错误的结果。

代码

int findSwaps(vector<int>& arr, const vector<int>& sortedArr, std::map<int, int> arrIndexMap) {
    int swaps = 0;
    int size = arr.size();

    for (int i = 0; i < size; i++) {
        if (arr[i] != sortedArr[i]) {
            swaps++;

            int j = arrIndexMap[sortedArr[i]];
            arrIndexMap[arr[i]] = j;
            arrIndexMap[arr[j]] = i;

            arr[j] = arr[i];
            arr[i] = sortedArr[i];
        }
    }

    return swaps;
}

int main() {
    int n;
    cin >> n;
    std::vector<int> arr(n);

    for (int i = 0; i < n; i++) {
        int value;
        cin >> value;
        arr.push_back(value);
    }

    std::map<int, int> arrIndexMap;
    for (int i = 0; i < n; i++) {
        arrIndexMap[arr[i]] = i;
    }

    std::vector<int> sortedArr = arr;
    std::sort(sortedArr.begin(), sortedArr.end());

    std::vector<int> descSortedArr = arr;
    std::sort(descSortedArr.begin(), descSortedArr.end(), std::greater<>());

    int swaps1 = findSwaps(arr, sortedArr, arrIndexMap);
    int swaps2 = findSwaps(arr, descSortedArr, arrIndexMap);
    cout << std::min(swaps1, swaps2);

    return 0;
}

输入

5
3 4 2 5 1

预期输出

2

实际输出

5

【问题讨论】:

    标签: c++ arrays algorithm sorting


    【解决方案1】:

    您的算法实际上是正确的。但是,有 2 个C++ 问题会导致意外行为:

    1。 您在此处使用等于0n 元素初始化arr 向量:

    std::vector<int> arr(n);  
    

    然后在循环中添加n 其他元素。

    但是根据问题陈述,您的arr 中必须只有n 元素。所以,默认创建一个空向量:

    std::vector<int> arr; 
    

    2。 另一个问题是您通过引用传递了您的arr,这就是为什么您第二次将它传递给findSwaps(...),它已经是您第一次调用的修改版本:

    因此,您应该按值传递它,以免影响初始的arr

    int findSwaps(vector<int> arr, const vector<int>& sortedArr, std::map<int, int> arrIndexMap)
    

    经过这 2 次更改后,我在 Hackerrank 上尝试了您的代码,并且它通过了所有测试。

    【讨论】:

    • 或者保留原来的std::vector&lt;int&gt; arr(n);并做for(int&amp; v : arr) { cin &gt;&gt; v; }
    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 2020-11-19
    • 2023-02-23
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多