关于代码中mid-i+1的解释:
[剑指offer 51] 数组中的逆序对
代码:
class Solution { public: int merge(vector<int> &nums,int l,int r) { if(l>=r) return 0; //只有一个元素 int mid=(l+r)>>1; //二分 int res=merge(nums,l,mid)+merge(nums,mid+1,r); //计算左右两个区间中的逆序对 int i=l,j=mid+1; //定义两个指针 vector<int> temp; while(i<=mid&&j<=r) //归并 { if(nums[i]<nums[j]) temp.push_back(nums[i++]); else { temp.push_back(nums[j++]); //后面的元素小于前面的元素 res+=mid-i+1; } } //无论是i或者是j,元素都比之前的数组要大,所以不可能存在新的逆序,把数组填好就可以了 while(i<=mid) temp.push_back(nums[i++]); while(j<=r) temp.push_back(nums[j++]);
// 将排好序的临时数组的元素复制回原数组 i=l; for(auto x:temp) nums[i++]=x; return res; } int inversePairs(vector<int>& nums) { return merge(nums,0,nums.size()-1); } }; 作者:季科 链接:https://www.acwing.com/solution/acwing/content/2085/
不清楚代码里面为什么还要i =l(是L不是1)
i=l; for(auto x:temp) nums[i++]=x;
这里可以替换成
for (int k = 0; k < temp.size(); k++) nums[l + k] = temp[k]; return res;
注意nums的左边界不是从0开始的,而是从l(L)开始的