zoukankan      html  css  js  c++  java
  • 【算法题目】数组中的逆序对

      题目来源:《剑指offer》面试题36

      题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这两个数组中的逆序对的总数。例如数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4)。

      下面把《剑指offer》的分析贴上来:

      

                                    

                                                                                           

      代码:

    int CountInversionPair(vector<int>& nums) {
        if (nums.size() <= 1) return 0;
    
        int count = 0;
        CountInversionPair(nums, 0, nums.size() - 1, count);
        return  count;
    }
    
    void CountInversionPair(vector<int> &nums, int start_pos, int end_pos,
                            int &count) {
        if (start_pos >= end_pos)
            return;
    
        int mid = start_pos + (end_pos - start_pos) / 2;
        CountInversionPair(nums, start_pos, mid, count);
        CountInversionPair(nums, mid + 1, end_pos, count);
        Merge(nums, start_pos, mid, end_pos, count);
    }
    
    void Merge(vector<int>& nums, int start_pos, int mid,  int end_pos, int &count) {
        if (start_pos == end_pos)
            return;
    
        vector<int> temp_nums(end_pos - start_pos + 1);
    
        int left_index = mid;
        int right_index = end_pos;
        int original_index = end_pos - start_pos;
    
        while (left_index >= start_pos && right_index > mid) {
            if (nums[left_index] > nums[right_index]) {
                count += right_index - mid;
                temp_nums[original_index--] = nums[left_index--];
            } else {
                temp_nums[original_index--] = nums[right_index--];
    
            }
        }
        
        for (; left_index >= start_pos; left_index--)
            temp_nums[original_index--] = nums[left_index];
    
        for (; right_index > mid; right_index--)
            temp_nums[original_index--] = nums[right_index];
    
        for (int i = start_pos, j = 0; i <= end_pos; i++) {
            nums[i] = temp_nums[j++]; 
        }
    
    }
  • 相关阅读:
    Java学习笔记-Lambda表达式
    Java学习笔记-枚举类
    Java学习笔记-枚举类
    Java学习笔记-包装类
    js 递归 汉诺塔的例子
    js 用 hasOwnProperty() 判定属性是来自该对象成员,还是原型链
    正则,js函数math()提取混乱字符串中多个字符串内容
    封装好的cookie的三个常用函数 cookie的添加、删除、提取操作函数
    解决ie6下png背景不能透明bug
    ie6下标签定义的高失效,显示的高不受设定的height值影响
  • 原文地址:https://www.cnblogs.com/vincently/p/4823154.html
Copyright © 2011-2022 走看看