zoukankan      html  css  js  c++  java
  • 第二周 Leetcode 493. Reverse Pairs(HARD)

    leetcode 493

    跟经典的逆序对问题没有什么区别, 首先考虑对数组前半部和后半部求逆序对数,若能保证两段数组都有序,则显然可以在线性时间内求出对数。

    所以我们采用归并排序的方法,一方面让数组有序,另一方面计算子数组的逆序对数。

    代码实现有些细节要注意,在比较时需要把Int转换为longlongint 不然会出错。

    class Solution {
    public:
        int reversePairs(vector<int>& nums) {
           int ans=0;
     if(nums.size()<2)return ans;  
     if(nums.size()==2) 
     {
     if ((long long)nums[0]>(long long )nums[1]*2)ans=1;
     if((long long)nums[0]<(long long)nums[1]){int t=nums[0];nums[0]=nums[1];nums[1]=t;}
     return ans;
     }
     vector<int>left,right;
     int i;
     for(i=0;i<nums.size()/2;i++)
     	left.push_back(nums[i]);
     for(;i<nums.size();i++)
     	 right.push_back(nums[i]);
     ans+=reversePairs(left);ans+=reversePairs(right);
     int j=0,tot=0;
     i=0;
     while(i<left.size()&&j<right.size()) 
     	{
     	 if((long long)left[i]>(long long)right[j]*2){i++;ans+=right.size()-j;}
     	      else j++;
    	}  
     i=j=0;
     while(i<left.size()&&j<right.size()) 
     	{
     	 if(left[i]>right[j])nums[tot++]=left[i++];
     	 	else nums[tot++]=right[j++];
    	} 
     while(i<left.size())
     	nums[tot++]=left[i++];
     while(j<right.size())
     	nums[tot++]=right[j++];
     return ans;
            
        }
    };
    

      

  • 相关阅读:
    顺序栈用C语言实现
    对队列的操作和算法
    对链表的操作与算法
    对动态数组的操作与算法
    链表
    冒泡排序
    指针之动态分配内存
    字符串匹配KMP算法
    DS二叉树--层次遍历
    DS图--最小生成树
  • 原文地址:https://www.cnblogs.com/heisenberg-/p/6499067.html
Copyright © 2011-2022 走看看