zoukankan      html  css  js  c++  java
  • 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];
        }
    };
    
  • 相关阅读:
    rest webapi 返回数据
    下载指定路径的文件到本地服务器
    NPOI excel文件解析
    (Demo分享)利用JavaScript(JS)实现一个九宫格拖拽功能
    关于DOM的理解
    (Demo分享)利用JavaScript(JS)做一个可输入分钟的倒计时钟功能
    关于闭包函数和递归函数的详细理解
    纯CSS制作加<div>制作动画版哆啦A梦
    冒泡排序
    Python常用模块及正则表达式知识点,你需要了解的全在这了
  • 原文地址:https://www.cnblogs.com/clear-love/p/11568468.html
Copyright © 2011-2022 走看看