LeetCode初级算法之设计

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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值