第一题太简单,贪心一下,如果最大和最小的差不足2*K,就直接取0.否则就直接取MAX-MIN-2K
第二题,是第一题的进化版,
910. Smallest Range II
https://leetcode.com/problems/smallest-range-ii/
只能取-K,+K。2种情况。
我就用了暴力解法。把原数组 直接映射成新数组。
新数组包含了原数组每一位VAL-K,和VAL+K
下面我们就需要一个窗口,使得这个窗口包含原数组所有的INDEX。
所以我们在构建新数组的时候,我们既要存它新的值,还要存它的原下标。
然后找出所有的窗口取最小值即可。
public int smallestRangeII(int[] A, int K) {
int l = A.length;
List newL = new ArrayList<>();
int idx = 0;
for(int i : A){
newL.add(new int[]{i-K,idx});
newL.add(new int[]{i+K,idx++});
}
Collections.sort(newL,(m,n)->{return m[0]-n[0];});
int i = 0, j = 0;
int[] map = new int[l];
l = newL.size();
int cnt = 0;
int min = Integer.MAX_VALUE;
while(i < l){
if(cnt!=l/2){
if(map[newL.get(i++)[1]]++==0){
cnt++;
}
}else{
min = Math.min(newL.get(i-1)[0]-newL.get(j)[0],min);
if(--map[newL.get(j++)[1]]==0) cnt--;
}
}
return min;
}
911. Online Election
https://leetcode.com/problems/online-election/description/
这道题,第一眼要找前一个时间点。一下就想到TREEMAP 的FLOORKEY 这个函数。
随后思考,因为每一个时间点,一旦存下是不会被Q方法所更新。所以我们只要在构造函数的时候,把这个TREEMAP构建出来就好了。
下一步思考如何构建这个节点。
我们要维护,每一次投票的时候,谁是最领先的,同票的情况,时间晚的领先。根据这个原则,我们就构建一个TREESET。来保存这个信息。最后我要把领先的那个人给找出来,存进上面说的TREEMAP即可。
TreeMap t = new TreeMap<>();
public TopVotedCandidate(int[] persons, int[] times) {
int l = times.length;
Map m = new HashMap<>();
TreeSet t2 = new TreeSet<>((a,b)->{
if(a[0]==b[0]) return b[1]-a[1];
return b[0]-a[0];
});//votes,time,i
for(int i = 0; i < l; i++){
int[] cur = m.getOrDefault(persons[i],new int[]{1,times[i],persons[i]});
t2.remove(cur);
cur[0]++;
cur[1] = times[i];
t2.add(cur);
m.put(persons[i],cur);
t.put(times[i],t2.first()[2]);
}
}
public int q(int k) {
return t.floorEntry(k).getValue();
}
909. Snakes and Ladders
https://leetcode.com/problems/snakes-and-ladders/description/
这道题第一步要写的应该是,坐标相互转换,从题目给定义的那个整数,转换到矩阵的具体坐标的一个函数。
有了这个函数。我们就可以很轻松的运用BFS来求最短路径了。每一个STEP,把当前能到的点算出一步之内走到的新点把所有能到的点都存下来。然后有没有终点。如果没有进入下一个STEP。
int n;
public int snakesAndLadders(int[][] board) {
n = board.length;
boolean[] seen = new boolean[n*n];
Queue q = new LinkedList<>();
q.offer(0);
seen[0] = true;
int step = 0;
while(!q.isEmpty()){
int qsize = q.size();
while(qsize > 0){
int cur = q.poll();
for(int i = 1; i < 7; i++){
int newc = cur+i;
if(newc>=(n)*(n)) break;
int[] po = decal(newc);
if(board[po[0]][po[1]] != -1){
newc = board[po[0]][po[1]]-1;
}
if(newc == n*n -1 ) return step+1;
if(!seen[newc]){
seen[newc] = true;
q.offer(newc);
}
}
qsize--;
}
step++;
}
return -1;
}
private int[] decal(int i){
int nx = i%n;
int ny = i/n;
if(ny%2==1){
nx = n-1-nx;
}
return new int[]{n-1-ny,nx};
}