数组中的逆序对数
归并排序:
时间复杂度O(nlogn)每趟归并O(n),需要logn趟;
每一趟需要一个辅助数组暂时保存两个有序子表归并的结果,该趟排序完释放空间。因此,空间复杂度O(n)。
#include <vector>
class Solution {
public:
const int mod=1000000007;
vector<int> temp;
int InversePairs(vector<int> data) {
int n=data.size();
temp=vector<int>(n);
return merge_sort(data, 0, n-1);
}
int merge_sort(vector<int> &data, int l, int r){//归并排序
if(l>=r) return 0;
int mid=(l+r)/2;
int i=l,k=0,j=mid+1;
int ans=merge_sort(data,l,mid)+merge_sort(data,mid+1,r);
while(i<=mid && j<=r){
if(data[i]<=data[j]) temp[k++]=data[i++];
else{
temp[k++]=data[j++];
ans+=mid-i+1;
ans%=mod;
}
}
while(i<=mid) temp[k++]=data[i++];
while(j<=r) temp[k++]=data[j++];
for(int i=l,j=0;i<=r;i++,j++)data[i]=temp[j];//将temp复制回data
return ans%mod;
}
};
旋转数组的最小数字
二分
#include <endian.h>
#include <ios>
#include <vector>
class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray) {
int n=rotateArray.size();
int l=0, r=n-1, mid;
while (l<=r) {
mid=(l+r)/2;
if(rotateArray[mid]>rotateArray[r])l=mid+1;
else if(rotateArray[mid]<rotateArray[r])r=mid;
else r--;
}
return rotateArray[l];
}
};
比较版本号
字符串+双指针
如果两个版本号的前面几位数字相同,但长度不同,那么位数较短的版本号将被认为小于位数较长的版本号。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
int compare(string version1, string version2) {
// 转化成数字一位一位的比较
int i=0, j=0, numi=0, numj=0;
while(i<version1.size() || j<version2.size()){
while(i<version1.size()&&version1[i]!='.'){
numi=numi*10+(version1[i]-'0');i++;
}
while(j<version2.size()&&version2[j]!='.'){
numj=numj*10+(version2[j]-'0');j++;
}
if(numi!=numj) return numi>numj?1:-1;
i++, j++, numi=0, numj=0;
}
return 0;
}
};