LeetCode初级算法之设计
Shuffle an Array
Question:
打乱一个没有重复元素的数组。
示例:
// 以数字集合 1, 2 和 3 初始化数组。
int[] nums = {1,2,3};
Solution solution = new Solution(nums);
// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
solution.shuffle();
// 重设数组到它的初始状态[1,2,3]。
solution.reset();
// 随机返回数组[1,2,3]打乱后的结果。
solution.shuffle();
Solution:
class Solution {
public:
Solution(vector<int>& nums): ori(nums){
}
/** Resets the array to its original configuration and return it. */
vector<int> reset() {
return ori;
}
/** Returns a random shuffling of the array. */
vector<int> shuffle() {
vector<int> res = ori;
for (int i = 0; i < res.size(); i++) {
int t = i + rand() % (res.size() - i);
swap(res[i], res[t]);
}
return res;
}
private:
vector<int> ori;
};
主要的难点在于洗牌(shuffle)函数,具体的实现思路是这样,遍历数组,每遍历到一个元素就让它和包括它的后面的元素随机交换,这样遍历一遍,保证的是每两个元素都有相同的概率进行交换,而在一次遍历的过程中可能发生n次这样的交换,所以包括了所有的洗牌情况,且每种情况概率相同,满足题目要求。
最小栈
Question:
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) – 将元素 x 推入栈中。
pop() – 删除栈顶的元素。
top() – 获取栈顶元素。
getMin() – 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
Solution:
非常羞愧的说我连栈怎么用都不知道了( 感觉上网学习学习:
c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO)
使用该容器时需要包含#include头文件;
定义stack对象的示例代码如下:
stack < int > s1;
stack < string >s2;
stack的基本操作有:
1.入栈:如s.push(x);
2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。
3.访问栈顶:如s.top();
4.判断栈空:如s.empty().当栈空时返回true。
5.访问栈中的元素个数,如s.size()
具体这道题的话,我的思路是入栈出栈就正常操作,但是要另外设置一个栈来存储最小值,如果有新的值比栈顶的值还小的话,就入栈,这样我们能够得到的最小栈的结构将是目前前n小的元素,如果出栈的元素等于最小栈栈顶的元素,则最小栈栈顶的元素应该出栈,接下来栈顶的元素就是剩余的栈中的最小元素:
Class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
min.push(INT_MAX);
}
void push(int x) {
mystack.push(x);
if(x <= min.top())
min.push(x);
}
void pop() {
if(mystack.top() == min.top())
min.pop();
mystack.pop();
}
int top() {
return mystack.top();
}
int getMin() {
return min.top();
}
private:
stack <int> mystack;
stack <int> min;
};