day12--排序-查找-比较

 数组中的逆序对数

 

归并排序:

时间复杂度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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_54809548/article/details/131053620