Random Pick with Blacklist

/*
 本算法答案由上岸科技提供。
 上岸科技是一个专致力于高效培养北美留学生拥有实际面试能力的团体。
 我们采用小班化线上,线下教学让学生更快,更好的学习到想要的知识。
 团队主要由一群怀揣情怀于美国高校毕业的一线IT公司工程师构成。
 我们坚信对于求职者算法并不是全部,合理的技巧加上适当的算法培训能够大大的提升求职成功概率也能大大减少刷题的痛苦。
 正如我们的信仰:我们教的是如何上岸而不仅是算法。
 更多信息请关注官网:https://www.shanganonline.com/
*/
class Solution {

    int[] blacklist;
    int length;
    
    public Solution(int N, int[] blacklist) {
        this.blacklist = blacklist;
        this.length = N - this.blacklist.length;
        
        Arrays.sort(blacklist);
        for (int i = 0; i < this.blacklist.length; i++) {
            this.blacklist[i] -= (i+1);
        }
    }
    
    public int pick() {
        int r = (int) Math.floor(Math.random() * length);
        int index = Arrays.binarySearch(blacklist, r);
        if (index < 0) {
            return r - (index + 1);
        } else {
            // here is a bit tricky. we need to select the first boundary that 
            // matches, because the intervals degenerate if B[i+1]=B[i]+1.
            while (index > 0 && blacklist[index - 1] == r)
                index--;
            return r + index;
        }
    }
}

Last updated

Was this helpful?