• leetcode 155周赛


    链接:https://leetcode-cn.com/contest/weekly-contest-155

    给你个整数数组 arr,其中每个元素都 不相同。
    请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。

    思路:
    1.先排序
    2.找到最小间隙
    3.再遍历一次找到答案
    4.时间复杂度主要是排序 nlogn

    class Solution {
    public:
        vector<vector<int>> minimumAbsDifference(vector<int>& arr) {
            vector<vector<int>> res;
            sort(arr.begin(),arr.end());
            int minx=INT_MAX;
            for(int i=1;i<arr.size();++i){
                minx=min(minx,arr[i]-arr[i-1]);
            }
            for(int i=1;i<arr.size();++i){
                if(minx==arr[i]-arr[i-1]){
                    vector<int> v;
                    v.push_back(arr[i-1]);
                    v.push_back(arr[i]);
                    res.push_back(v);
                }
            }
            return res;
        }
    };
    

    请你帮忙设计一个程序,用来找出第 n 个丑数。
    丑数是可以被 a 或 b 或 c 整除的 正整数。

    思路:
    1.二分答案
    2.每次求mid得丑数数量
    3.容斥原理求数量
    4.三个数得最小公倍数等于前两个得最小公倍数和第三个数得最小公倍数

    class Solution {
    public:
        #define LL long long
        int nthUglyNumber(int n, int a, int b, int c) {
            LL x=1ll*a*b/gcd(a,b);
            LL y=1ll*a*c/gcd(a,c);
            LL z=1ll*b*c/gcd(b,c);
            LL l=1,r=2000000000;
            LL t=1ll*x*c/gcd(x,c);
            while(l<r)
            {
                LL mid = (l+r)>>1;
                int cot = mid/a+mid/b+mid/c-mid/x-mid/y-mid/z+mid/t;
                if(cot>=n)r=mid;
                else l=mid+1;
            }
            return l;
        }
        int gcd(int a,int b)
        {
            return b==0?a:gcd(b,a%b);
        }
    };
    

    给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。
    你可以 任意多次交换 在 pairs 中任意一对索引处的字符。
    返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。

    思路:
    1.并查集
    2.将相互之间有联系的维护成一个集合
    3.用“老大”当作索引将集合内的字符添加进来并排序
    4.然后依次填入

    class Solution {
    public:
        vector<int> p;
        string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {
            int n=s.size();
            p=vector<int>(n+1);
            for(int i=0;i<n;++i)p[i]=i;
            for(auto t:pairs){
                int px=find(t[0]);
                int py=find(t[1]);
                if(px!=py){
                    p[px]=py;
                }
            }
            vector<vector<char>> f(n);
            for(int i=0;i<n;++i){
                f[find(i)].push_back(s[i]);
            }
            for(int i=0;i<n;++i){
                sort(f[i].begin(),f[i].end());
                reverse(f[i].begin(),f[i].end());
            }
            string t;
            for(int i=0;i<n;++i){
                t+=f[find(i)].back();
                f[find(i)].pop_back();
            }
            return t;
        }
        int find(int x)
        {
            if(p[x]!=x)p[x]=find(p[x]);
            return p[x];
        }
    };
    
  • 相关阅读:
    Android的AndroidManifest.xml文件的详解
    Android新建项目手动添加Layout布局
    elasticsearch-搜索-评分(四)
    linux监控命令-磁盘监控
    linux监控命令-pidstat
    linux监控命令-free
    linux监控命令-vmstat
    redis-缓存设计-队列(普通队列、优先级队列、延迟队列)
    redis-缓存设计-信号量设计
    redis-缓存设计-搜索前缀匹配
  • 原文地址:https://www.cnblogs.com/clear-love/p/11568468.html
Copyright © 2020-2023  润新知