【384】Shuffle an Array(2019年3月12日)

Shuffle a set of numbers without duplicates.

实现一个类,里面有两个 api,structure 如下:

 class Solution {
public:
Solution(vector<int> nums) {
} /** Resets the array to its original configuration and return it. */
vector<int> reset() {
} /** Returns a random shuffling of the array. */
vector<int> shuffle() {
}
};

题解:我们 shuffle 的时候,对于每一个元素 res[i], 都随机出一个 res[j],交换这两个元素就可以了。

 class Solution {
public:
Solution(vector<int> nums) {
this->nums = nums;
} /** Resets the array to its original configuration and return it. */
vector<int> reset() {
return nums;
} /** Returns a random shuffling of the array. */
vector<int> shuffle() {
const int n = nums.size();
vector<int> res(nums);
for (int i = ; i < n; ++i) {
int j = rand() % n;
swap(res[i], res[j]);
}
return res;
}
vector<int> nums;
}; /**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* vector<int> param_1 = obj.reset();
* vector<int> param_2 = obj.shuffle();
*/

【470】Implement Rand10() Using Rand7() (2018年11月15日,新学的算法)(2019年1月23日,算法群复习)

给了一个现成的api rand7(),这个接口能产生 [1,7] 区间的随机数。根据这个api,写一个 rand10() 的算法生成 [1, 10] 区间随机数。

题解:这个题《程序员代码面试指南》上讲了这题。我粗浅的描述一下产生过程:

(1)rand7() 等概率的产生 1,2, 3, 4, 5, 6,7.

(2)rand7()-1 等概率的产生 [0, 6]

(3)(rand7() - 1) * 7 等概率的产生 0, 7, 14, 21, 28, 35, 42

(4)(rand7() - 1) * 7 + (rand7() - 1)等概率的产生 [0, 48] 这49个数字

(5)如果步骤4的结果大于等于40,那么就重复步骤4,直到产生的数小于40.

(6)把步骤5的结果mod 10再加1,就会等概率的随机生成[1, 10].

总之,公式是 (randX() - 1) * X + (randX() - 1)。

 // The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7 class Solution {
public:
int rand10() {
int num = ;
do {
num = (rand7()-) * + (rand7()-);
} while(num >= );
return num % + ;
}
};

本题还有两个follow-up:

  1. What is the expected value for the number of calls to rand7() function?

  2. Could you minimize the number of calls to rand7()?

 《程序员代码面试指南》后面的进阶算法还没看,chp 9, P391

【478】Generate Random Point in a Circle

【497】Random Point in Non-overlapping Rectangles

【519】Random Flip Matrix

【528】Random Pick with Weight (2018年12月31日,昨天算法群 mock 原题)

mock相关链接:https://www.cnblogs.com/zhangwanying/p/10199941.html  (第一场-第四题)

Given an array w of positive integers, where w[i] describes the weight of index i, write a function pickIndex which randomly picks an index in proportion to its weight.

Note:

  1. 1 <= w.length <= 10000
  2. 1 <= w[i] <= 10^5
  3. pickIndex will be called at most 10000 times.
Example 1:
Input:
["Solution","pickIndex"]
[[[1]],[]]
Output: [null,0] Example 2:
Input:
["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
[[[1,3]],[],[],[],[],[]]
Output: [null,0,1,1,1,0]

题解:把 weight 数组求前缀和,然后随机出一个在区间 [0, tot) 中的随机数,然后在前缀和数组中二分判断index。

 class Solution {
public:
Solution(vector<int> w) {
const int n = w.size();
vector<int> summ2(n+, );
for (int i = ; i <= n; ++i) {
summ2[i] = w[i-] + summ2[i-];
}
summ = summ2;
} int pickIndex() {
int tot = summ.back();
int r = (rand() % tot) + ;
auto iter = lower_bound(summ.begin(), summ.end(), r);
int ret = distance(summ.begin(), iter) - ;
return ret;
}
vector<int> summ;
}; /**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(w);
* int param_1 = obj.pickIndex();
*/

【710】Random Pick with Blacklist

【LeetCode】随机化算法 random(共6题)的更多相关文章

  1. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

  2. 【LeetCode】树(共94题)

    [94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 ...

  3. 【LeetCode】BFS(共43题)

    [101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...

  4. 【LeetCode】Recursion(共11题)

    链接:https://leetcode.com/tag/recursion/ 247 Strobogrammatic Number II (2019年2月22日,谷歌tag) 给了一个 n,给出长度为 ...

  5. Leetcode 简略题解 - 共567题

    Leetcode 简略题解 - 共567题     写在开头:我作为一个老实人,一向非常反感骗赞.收智商税两种行为.前几天看到不止两三位用户说自己辛苦写了干货,结果收藏数是点赞数的三倍有余,感觉自己的 ...

  6. 【LeetCode】哈希表 hash_table(共88题)

    [1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target ...

  7. 【LeetCode】回溯法 backtracking(共39题)

    [10]Regular Expression Matching [17]Letter Combinations of a Phone Number [22]Generate Parentheses ( ...

  8. PKU 2531 Network Saboteur(dfs+剪枝||随机化算法)

    题目大意:原题链接 给定n个节点,任意两个节点之间有权值,把这n个节点分成A,B两个集合,使得A集合中的每一节点与B集合中的每一节点两两结合(即有|A|*|B|种结合方式)权值之和最大. 标记:A集合 ...

  9. 【LeetCode算法】LeetCode初级算法——字符串

      在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...

随机推荐

  1. Linux 系统参数优化

    修改系统所有进程可打开的文件数量 sysctl -w fs.file-max=2097152sysctl -w fs.nr_open=2097152 > vi /etc/sysctl.conff ...

  2. 阿里云如何打破Oracle迁移上云的壁垒

    2018第九届中国数据库技术大会,阿里云数据库产品专家萧少聪带来以阿里云如何打破Oracle迁移上云的壁垒为题的演讲.Oracle是指“数据库管理系统”,面对Oracle迁移上云的壁垒,阿里云如何能够 ...

  3. OC + RAC (四) combineLatest和merg

    -(void)_test4{ ///RAC combineLatest和merge // combineLatest只有当两个信号都发送了 订阅者才能收到信息 结果一次收到 结果是数组 // merg ...

  4. 如何在Web页面里面使用高拍仪扫描上传图像

    问题: 在网页上,客户端访问的时候,可以扫描图象(通过扫描仪),并放到网页上,上传到服务器,如何实现?就是提供扫描仪的驱动程序,并使用扫描仪来扫描图象 ,有没有此类的ActiveX控件 回复: 目前大 ...

  5. stack2链栈

    #include<iostream> using namespace std; template <class Object> class Stack{ private: st ...

  6. 给数据库用户授权(对象多为系统表,如dba可以查看的表)

    我们知道,创建一个新用户时,网上各种的帖子包括书籍中经常用到一个grant connect,resource to user;,这样才能用这个用户登录数据库,那么这条语句的真正作用是什么呢? 首先,g ...

  7. Jenkins报错:该Jenkins实例似乎已离线

    解决方法: 1.保留此离线页面,重新开启一个浏览器tab标签页 2.输入输入网址http://localhost:8080/pluginManager/advanced 3.进入该页面最底下,找到[升 ...

  8. div拖拽的问题

    今天看到一篇写的很好的文章,摘抄如下: 思路 父盒子相对定位,子元素,也就是被拖拽的元素绝对定位 当鼠标在子元素中按下时,绑定鼠标移动事件,根据鼠标位置改变元素位置 设置鼠标当前位置(offsetX, ...

  9. web服务器、WSGI跟Flask(等框架)之间的关系

    之前对 Nginx,WSGI(或者 uWSGI,uwsgi),Flask(或者 Django),这几者的关系一存存在疑惑.通过查阅了些资料,总算把它们的关系理清了. 总括来说,客户端从发送一个 HTT ...

  10. HDU 5952 Counting Cliques(dfs)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...