题目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.拓扑排序

京公网安备 11010502036488号