Leetcode Weekly Contest 103

第一题太简单,贪心一下,如果最大和最小的差不足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};
    }

你可能感兴趣的:(Leetcode Weekly Contest 103)