【网易编程题】逆序对距离之和【case通过率仅为60%,但我感觉思路应该是对的】

前言:
case通过率仅为60%,我实在找不出问题出在哪里了,但思路是很清晰的。


题目:
在这里插入图片描述


思路:
在归并排序求逆序对算法(参考《剑指offer》面试题51)的基础上,稍加修改,不仅仅用count统计逆序对数量,而且用for循环遍历每一个逆序对,然后求其逆序对距离之和。

数据结构:
因为归并排序之后,元素原来的下标会乱掉,所以用pair<值, 原下标>存储每个元素,即pair<long long,int>。用vector<pair<long long,int>>存储所有元素。


#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int merge_sort(vector<pair<long long, int>> &vec, vector<pair<long long, int>> &new_vec, int begin, int end){
    if (begin >= end){
        return 0;
    }
    if (begin + 1 == end){
        if (vec[begin].first > vec[end].first){
            auto tmp = new_vec[begin];
            new_vec[begin] = new_vec[end];
            new_vec[end] = tmp;
            return abs(new_vec[begin].second-new_vec[end].second);
        }
        return 0;
    }
    
    int mid = begin + (end - begin) / 2;
    int left_sum = merge_sort(new_vec, vec, begin, mid);
    int right_sum = merge_sort(new_vec, vec, mid+1, end);
    
    int p1 = mid;
    int p2 = end;
    int p3 = end;
    int sum = 0;
    while (p1 >= begin && p2 >= mid + 1){
        if (vec[p1].first > vec[p2].first){
            for (int k = p2; k >= mid+1; --k){ // 添加了这个for循环,遍历每一个逆序对
                sum += abs(vec[p1].second-vec[k].second);
            }
            new_vec[p3] = vec[p1];
            --p3;
            --p1;
        }else{
            new_vec[p3] = vec[p2];
            --p3;
            --p2;
        }
    }
    while (p1 >= begin){
        new_vec[p3] = vec[p1];
        --p3;
        --p1;
    }
    while (p2 >= mid + 1){
        new_vec[p3] = vec[p2];
        --p3;
        --p2;
    }
    return sum + left_sum + right_sum;
}

int main(){
    int n;
    cin >> n;
    vector<pair<long long, int>> vec;
    vector<pair<long long, int>> new_vec;
    for (int i = 0; i < n; ++i){
        int t;
        cin >> t;
        vec.push_back(pair<long long, int>(t, i));
        new_vec.push_back(pair<long long, int>(t, i));
    }
    
    int ans = merge_sort(vec, new_vec, 0, vec.size()-1);
    cout << ans;
}
发布了133 篇原创文章 · 获赞 2 · 访问量 4566

猜你喜欢

转载自blog.csdn.net/zxc120389574/article/details/105336912