65.数组中的逆序对 (难点在知道归并排序)
关于代码中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)开始的
带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。