链接:https://leetcode-cn.com/contest/weekly-contest-155 给你个整数数组 arr,其中每个元素都 不相同。 请你找到所有具有最小绝对差的元素对,并且按升序的顺序返回。 思路: 1.先排序 2.找到最
链接: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]; } };