题目link https://leetcode-cn.com/contest/weekly-contest-155/
1.水题 排序+暴力
class Solution { public List<List<Integer>> minimumAbsDifference(int[] arr) { Arrays.sort(arr); int min =Integer.MAX_VALUE; int n = arr.length; int [] abs = new int[n]; for(int i = 0;i<n-1;i++) { int temp = arr[i+1]-arr[i]; min = Math.min(temp,min); abs[i] = temp; } List<List<Integer>> linkedList = new LinkedList<>(); for(int i =0 ;i< n;i++) { if (abs[i]==min) { List<Integer> list = new LinkedList<>(); list.add(arr[i]); list.add(arr[i+1]); linkedList.add(list); } } return linkedList; } }
2.
题意:给出第n个可以被a,b,c整除的数字
思路:容斥原理+二分
什么是容斥原理? 说白了就是在计算的时候先不考虑重叠的情况,先把所有的对象计算出来然后把重复计数的删除。那么回到我们这道题目,首先我们的数值的范围是1到2e9 ,因此使用二分法的话基本上在25此计算之内是可以得出结果的。那么我们下面就是需要判断这个数是不是我们想要的那个第n个可以被a,b,c整除的数字,这里就用到了我们的所说的容斥原理。
class Solution { public static long gcd(long x,long y) { //辗转相除法 return y ==0 ?x:gcd(y, x%y); } public static long lcm(long a,long b){ //最小公倍数=两数的乘积/最大公约(因)数, return a*b/gcd(a,b); } private long comptue(long t, int a, int b, int c) { //用容斥原理计算出一个数字t的丑数个数 long ret = 0; ret += t / a; //被a整除的数 ret += t / b; //被b整除的数 ret += t / c; //被c整除的数 ret -= t / lcm(a, b); //去除即可以被a整除也可以被b整除重复的数 ret -= t / lcm(a, c); //去除即可以被a整除也可以被c整除重复的数 ret -= t / lcm(b, c); //去除即可以被b整除也可以被c整除重复的数 ret += t / lcm(lcm(a, b), c); //在加被多减去的可以被a,b,c整除的数 return ret; } public int nthUglyNumber(int n, int a, int b, int c) { long l = 0; long r = Integer.MAX_VALUE; long ac = gcd(a, c); long ab =gcd(a, b); long bc = gcd(b, c); while (l + 1 < r) { long m = (l + r) / 2; long cnt = comptue(m,a,b,c); //通过计算m/最小公倍数就可以求出 if (cnt < n) { l = m; } else { r = m; } } return (int)r; } }
3.并查集
思路:根据索引对,把可以交换的区域内按照从小到大排列
4.拓扑排序