Skip to content

Commit e12068c

Browse files
author
luzhipeng
committed
2 parents 0161bea + 0a2067a commit e12068c

File tree

4 files changed

+91
-0
lines changed

4 files changed

+91
-0
lines changed

daily/2019-07-19.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# 毎日一题 - 洗牌算法
2+
3+
## 信息卡片
4+
5+
* 时间:2019-07-19
6+
* 题目链接:暂无
7+
* tag:`Array` `Probability`
8+
9+
## 题目描述
10+
11+
```
12+
假设我们有一个n个元素的数组,要求你实现一个函数,该函数会随机地返回n个元素的排列,要求所有排列出现的概率是一样的。即每一个排列出现的概率都是1/n!.
13+
```
14+
## 参考答案
15+
思路如下
16+
17+
像洗牌一样,从数组中随机取出一个,放入另一个全新的数组中,但这会涉及到数组删除操作.
18+
在这个基础上转换一下思路把从数组中取出的元素放入原数组中,第一次随机删除时,把它与原数组的倒数第一个交换,第2次在剩下的元素中随机删除时,把它与原数组的倒数第2个交换,第n-1次(最后一次不用换)时便完成了洗牌 时间复杂度为O(n)
19+
20+
```js
21+
function shuffle(list) {
22+
for (let i = list.length - 1; i >= 1; i--) {
23+
const random = (Math.random() * (i + 1)) >> 0;
24+
const temp = list[i];
25+
list[i] = list[random];
26+
list[random] = temp;
27+
}
28+
}
29+
```
30+
注: 概率证明, 任意一个元素放在倒数第一个位置的概率为1/n,放到倒数第2个的概率为 [(n-1)/n ]* [1/(n-1)] = 1/n,放在倒数第k个位置的概率是[(n-1)/n] * [(n-2)/(n-1)] *...* [(n-k+1)/(n-k+2)] *[1/(n-k+1)] = 1/n, 因此每一个元素放在任意位置的概率都为1/n,所有的排列出现的概率则为 1/n * 1/(n-1) *..* 1 = 1/n!
31+
32+
注:在交换时,之所以第一次与第n个交换不与第一个交换,是因为与第n个交换代码更简洁
33+
34+
## 优秀解答
35+
36+
>暂缺

daily/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,8 @@ tag::`Array` `Two Pointers`
120120

121121
时间: 2019-07-18
122122

123+
### [洗牌算法](./2019-07-19.md)
124+
125+
tag::`Array` `Probability`
126+
127+
时间: 2019-07-19

problems/94.binary-tree-inorder-traversal.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ mid是一个具体的节点,left和right`递归求出即可`
5353

5454
## 代码
5555

56+
* 语言支持:JS,C++
57+
58+
JavaScript Code:
59+
5660
```js
5761
/*
5862
* @lc app=leetcode id=94 lang=javascript
@@ -130,4 +134,32 @@ var inorderTraversal = function(root) {
130134
};
131135

132136
```
137+
C++ Code:
138+
139+
```c++
140+
/**
141+
* Definition for a binary tree node.
142+
* struct TreeNode {
143+
* int val;
144+
* TreeNode *left;
145+
* TreeNode *right;
146+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
147+
* };
148+
*/
149+
class Solution {
150+
public:
151+
vector<int> inorderTraversal(TreeNode* root) {
152+
vector<TreeNode*> s;
153+
vector<int> v;
154+
while (root != NULL || !s.empty()) {
155+
for (; root != NULL; root = root->left)
156+
s.push_back(root);
157+
v.push_back(s.back()->val);
158+
root = s.back()->right;
159+
s.pop_back();
160+
}
161+
return v;
162+
}
163+
};
164+
```
133165
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* @lc app=leetcode id=771 lang=javascript
3+
*
4+
* [460] LFU Cache
5+
*/
6+
/**
7+
* @param {string} J
8+
* @param {string} S
9+
* @return {number}
10+
* @description 思路:正则把石头里的宝石replace掉,长度相减,就是结果
11+
*/
12+
var numJewelsInStones = function(J, S) {
13+
let newS = S
14+
for (let i = 0; i < J.length; i++) {
15+
newS = newS.replace(new RegExp(J[i], 'g'), '')
16+
}
17+
return S.length - newS.length
18+
}

0 commit comments

Comments
 (0)