<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 0155. 最小棧 # 題目地址(155. 最小棧) <https://leetcode-cn.com/problems/min-stack/> # 題目描述 ``` <pre class="calibre18">``` 設計一個支持 push ,pop ,top 操作,并能在常數時間內檢索到最小元素的棧。 push(x) —— 將元素 x 推入棧中。 pop() —— 刪除棧頂的元素。 top() —— 獲取棧頂元素。 getMin() —— 檢索棧中的最小元素。 示例: 輸入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]] 輸出: [null,null,null,null,-3,null,0,-2] 解釋: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2. 提示: pop、top 和 getMin 操作總是在 非空棧 上調用。 ``` ``` ## 前置知識 - [棧](https://github.com/azl397985856/leetcode/blob/master/thinkings/basic-data-structure.md)## 公司 - amazon - bloomberg - google - snapchat - uber - zenefits ## 兩個棧 ## 公司 - 阿里 - 騰訊 - 百度 - 字節 ### 思路 我們使用兩個棧: - 一個棧存放全部的元素,push,pop都是正常操作這個正常棧。 - 另一個存放最小棧。 每次push,如果比最小棧的棧頂還小,我們就push進最小棧,否則不操作 - 每次pop的時候,我們都判斷其是否和最小棧棧頂元素相同,如果相同,那么我們pop掉最小棧的棧頂元素即可 ### 關鍵點 - 往minstack中 push的判斷條件。 應該是stack為空或者x小于等于minstack棧頂元素 ### 代碼 - 語言支持:JS,C++,Java,Python JavaScript Code: ``` <pre class="calibre18">``` <span class="hljs-title">/** * initialize your data structure here. */</span> <span class="hljs-keyword">var</span> MinStack = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">this</span>.stack = [] <span class="hljs-keyword">this</span>.minStack = [] }; <span class="hljs-title">/** * @param {number} x * @return {void} */</span> MinStack.prototype.push = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>) </span>{ <span class="hljs-keyword">this</span>.stack.push(x) <span class="hljs-keyword">if</span> (<span class="hljs-keyword">this</span>.minStack.length == <span class="hljs-params">0</span> || x <= <span class="hljs-keyword">this</span>.minStack[<span class="hljs-keyword">this</span>.minStack.length - <span class="hljs-params">1</span>]) { <span class="hljs-keyword">this</span>.minStack.push(x) } }; <span class="hljs-title">/** * @return {void} */</span> MinStack.prototype.pop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">const</span> x = <span class="hljs-keyword">this</span>.stack.pop() <span class="hljs-keyword">if</span> (x !== <span class="hljs-keyword">void</span> <span class="hljs-params">0</span> && x === <span class="hljs-keyword">this</span>.minStack[<span class="hljs-keyword">this</span>.minStack.length - <span class="hljs-params">1</span>]) { <span class="hljs-keyword">this</span>.minStack.pop() } }; <span class="hljs-title">/** * @return {number} */</span> MinStack.prototype.top = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.stack[<span class="hljs-keyword">this</span>.stack.length - <span class="hljs-params">1</span>] }; <span class="hljs-title">/** * @return {number} */</span> MinStack.prototype.min = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.minStack[<span class="hljs-keyword">this</span>.minStack.length - <span class="hljs-params">1</span>] }; <span class="hljs-title">/** * Your MinStack object will be instantiated and called as such: * var obj = new MinStack() * obj.push(x) * obj.pop() * var param_3 = obj.top() * var param_4 = obj.min() */</span> ``` ``` C++ Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">class</span> MinStack { <span class="hljs-params">stack</span><<span class="hljs-keyword">int</span>> data; <span class="hljs-params">stack</span><<span class="hljs-keyword">int</span>> helper; <span class="hljs-keyword">public</span>: <span class="hljs-title">/** initialize your data structure here. */</span> MinStack() { } <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">push</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{ data.push(x); <span class="hljs-keyword">if</span>(helper.empty() || helper.top() >= x) { helper.push(x); } } <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">pop</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">int</span> top = data.top(); data.pop(); <span class="hljs-keyword">if</span>(top == helper.top()) { helper.pop(); } } <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">top</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">return</span> data.top(); } <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">getMin</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">return</span> helper.top(); } }; <span class="hljs-title">/** * Your MinStack object will be instantiated and called as such: * MinStack* obj = new MinStack(); * obj->push(x); * obj->pop(); * int param_3 = obj->top(); * int param_4 = obj->getMin(); */</span> ``` ``` Java Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MinStack</span> </span>{ <span class="hljs-title">// 數據棧</span> <span class="hljs-keyword">private</span> Stack<Integer> data; <span class="hljs-title">// 輔助棧</span> <span class="hljs-keyword">private</span> Stack<Integer> helper; <span class="hljs-title">/** * initialize your data structure here. */</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">MinStack</span><span class="hljs-params">()</span> </span>{ data = <span class="hljs-keyword">new</span> Stack<>(); helper = <span class="hljs-keyword">new</span> Stack<>(); } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">push</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{ <span class="hljs-title">// 輔助棧在必要的時候才增加</span> data.add(x); <span class="hljs-keyword">if</span> (helper.isEmpty() || helper.peek() >= x) { helper.add(x); } } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">pop</span><span class="hljs-params">()</span> </span>{ <span class="hljs-title">// 關鍵 3:data 一定得 pop()</span> <span class="hljs-keyword">if</span> (!data.isEmpty()) { <span class="hljs-title">// 注意:聲明成 int 類型,這里完成了自動拆箱,從 Integer 轉成了 int,</span> <span class="hljs-title">// 因此下面的比較可以使用 "==" 運算符</span> <span class="hljs-keyword">int</span> top = data.pop(); <span class="hljs-keyword">if</span>(top == helper.peek()){ helper.pop(); } } } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">top</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">if</span>(!data.isEmpty()){ <span class="hljs-keyword">return</span> data.peek(); } } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getMin</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">if</span>(!helper.isEmpty()){ <span class="hljs-keyword">return</span> helper.peek(); } } } ``` ``` Python3 Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MinStack</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span> <span class="hljs-string">""" initialize your data structure here. """</span> self.stack = [] self.minstack = [] <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">push</span><span class="hljs-params">(self, x: int)</span> -> <span class="hljs-keyword">None</span>:</span> self.stack.append(x) <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.minstack <span class="hljs-keyword">or</span> x <= self.minstack[<span class="hljs-params">-1</span>]: self.minstack.append(x) <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">pop</span><span class="hljs-params">(self)</span> -> <span class="hljs-keyword">None</span>:</span> tmp = self.stack.pop() <span class="hljs-keyword">if</span> tmp == self.minstack[<span class="hljs-params">-1</span>]: self.minstack.pop() <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">top</span><span class="hljs-params">(self)</span> -> int:</span> <span class="hljs-keyword">return</span> self.stack[<span class="hljs-params">-1</span>] <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">min</span><span class="hljs-params">(self)</span> -> int:</span> <span class="hljs-keyword">return</span> self.minstack[<span class="hljs-params">-1</span>] <span class="hljs-title"># Your MinStack object will be instantiated and called as such:</span> <span class="hljs-title"># obj = MinStack()</span> <span class="hljs-title"># obj.push(x)</span> <span class="hljs-title"># obj.pop()</span> <span class="hljs-title"># param_3 = obj.top()</span> <span class="hljs-title"># param_4 = obj.min()</span> ``` ``` **復雜度分析** - 時間復雜度:O(1) - 空間復雜度:O(1) ## 一個棧 ### 思路 符合直覺的方法是,每次對棧進行修改操作(push和pop)的時候更新最小值。 然后getMin只需要返回我們計算的最小值即可, top也是直接返回棧頂元素即可。 這種做法每次修改棧都需要更新最小值,因此時間復雜度是O(n). ![](https://img.kancloud.cn/55/26/5526b3eb9039ee54be1f1a9c4c96c34b_474x340.jpg) 是否有更高效的算法呢?答案是有的。 我們每次入棧的時候,保存的不再是真正的數字,而是它與當前最小值的差(當前元素沒有入棧的時候的最小值)。 這樣我們pop和top的時候拿到棧頂元素再加上**上一個**最小值即可。 另外我們在push和pop的時候去更新min,這樣getMin的時候就簡單了,直接返回min。 > 注意上面加粗的“上一個”,不是“當前的最小值” 經過上面的分析,問題的關鍵轉化為“如何求得上一個最小值”,解決這個的關鍵點在于利用min。 pop或者top的時候: - 如果棧頂元素小于0,說明棧頂是當前最小的元素,它出棧會對min造成影響,我們需要去更新min。 上一個最小的是“min - 棧頂元素”,我們需要將上一個最小值更新為當前的最小值 > 因為棧頂元素入棧的時候的通過 `棧頂元素 = 真實值 - 上一個最小的元素` 得到的, 而真實值 = min, 因此可以得出`上一個最小的元素 = 真實值 -棧頂元素` - 如果棧頂元素大于0,說明它對最小值`沒有影響`,上一個最小值就是上上個最小值。 ![](https://img.kancloud.cn/b5/04/b504c643616bad12a304d29af69d6179_702x721.jpg)![](https://img.kancloud.cn/47/d6/47d677c8caacba569088093b2bab7a11_641x400.jpg) ### 關鍵點 - 最小棧存儲的不應該是真實值,而是真實值和min的差值 - top的時候涉及到對數據的還原,這里千萬注意是**上一個**最小值 ### 代碼 - 語言支持:JS,C++,Java,Python Javascript Code: ``` <pre class="calibre18">``` <span class="hljs-title">/* * @lc app=leetcode id=155 lang=javascript * * [155] Min Stack */</span> <span class="hljs-title">/** * initialize your data structure here. */</span> <span class="hljs-keyword">var</span> MinStack = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">this</span>.stack = []; <span class="hljs-keyword">this</span>.minV = <span class="hljs-params">Number</span>.MAX_VALUE; }; <span class="hljs-title">/** * @param {number} x * @return {void} */</span> MinStack.prototype.push = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x</span>) </span>{ <span class="hljs-title">// update 'min'</span> <span class="hljs-keyword">const</span> minV = <span class="hljs-keyword">this</span>.minV; <span class="hljs-keyword">if</span> (x < <span class="hljs-keyword">this</span>.minV) { <span class="hljs-keyword">this</span>.minV = x; } <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.stack.push(x - minV); }; <span class="hljs-title">/** * @return {void} */</span> MinStack.prototype.pop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">const</span> item = <span class="hljs-keyword">this</span>.stack.pop(); <span class="hljs-keyword">const</span> minV = <span class="hljs-keyword">this</span>.minV; <span class="hljs-keyword">if</span> (item < <span class="hljs-params">0</span>) { <span class="hljs-keyword">this</span>.minV = minV - item; <span class="hljs-keyword">return</span> minV; } <span class="hljs-keyword">return</span> item + minV; }; <span class="hljs-title">/** * @return {number} */</span> MinStack.prototype.top = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">const</span> item = <span class="hljs-keyword">this</span>.stack[<span class="hljs-keyword">this</span>.stack.length - <span class="hljs-params">1</span>]; <span class="hljs-keyword">const</span> minV = <span class="hljs-keyword">this</span>.minV; <span class="hljs-keyword">if</span> (item < <span class="hljs-params">0</span>) { <span class="hljs-keyword">return</span> minV; } <span class="hljs-keyword">return</span> item + minV; }; <span class="hljs-title">/** * @return {number} */</span> MinStack.prototype.min = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.minV; }; <span class="hljs-title">/** * Your MinStack object will be instantiated and called as such: * var obj = new MinStack() * obj.push(x) * obj.pop() * var param_3 = obj.top() * var param_4 = obj.min() */</span> ``` ``` C++ Code: ``` <pre class="calibre18">``` <span class="hljs-keyword">class</span> MinStack { <span class="hljs-params">stack</span><<span class="hljs-keyword">long</span>> data; <span class="hljs-keyword">long</span> min = INT_MAX; <span class="hljs-keyword">public</span>: <span class="hljs-title">/** initialize your data structure here. */</span> MinStack() { } <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">push</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{ data.push(x - min); <span class="hljs-keyword">if</span>(x < min) { min = x; } } <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">pop</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">long</span> top = data.top(); data.pop(); <span class="hljs-title">// 更新最小值</span> <span class="hljs-keyword">if</span>(top < <span class="hljs-params">0</span>) { min -= top; } } <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">top</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">long</span> top = data.top(); <span class="hljs-title">// 最小值為 min</span> <span class="hljs-keyword">if</span> (top < <span class="hljs-params">0</span>) { <span class="hljs-keyword">return</span> min; } <span class="hljs-keyword">else</span>{ <span class="hljs-keyword">return</span> min+top; } } <span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">getMin</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">return</span> min; } }; <span class="hljs-title">/** * Your MinStack object will be instantiated and called as such: * MinStack* obj = new MinStack(); * obj->push(x); * obj->pop(); * int param_3 = obj->top(); * int param_4 = obj->getMin(); */</span> ``` ``` Java Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MinStack</span> </span>{ <span class="hljs-keyword">long</span> min; Stack<Long> stack; <span class="hljs-title">/** initialize your data structure here. */</span> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">MinStack</span><span class="hljs-params">()</span> </span>{ stack = <span class="hljs-keyword">new</span> Stack<>(); } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">push</span><span class="hljs-params">(<span class="hljs-keyword">int</span> x)</span> </span>{ <span class="hljs-keyword">if</span> (stack.isEmpty()) { stack.push(<span class="hljs-params">0L</span>); min = x; } <span class="hljs-keyword">else</span> { stack.push(x - min); <span class="hljs-keyword">if</span> (x < min) min = x; } } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">pop</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">long</span> p = stack.pop(); <span class="hljs-keyword">if</span> (p < <span class="hljs-params">0</span>) { <span class="hljs-title">// if (p < 0), the popped value is the min</span> <span class="hljs-title">// Recall p is added by this statement: stack.push(x - min);</span> <span class="hljs-title">// So, p = x - old_min</span> <span class="hljs-title">// old_min = x - p</span> <span class="hljs-title">// again, if (p < 0), x is the min so:</span> <span class="hljs-title">// old_min = min - p</span> min = min - p; } } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">top</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">long</span> p = stack.peek(); <span class="hljs-keyword">if</span> (p < <span class="hljs-params">0</span>) { <span class="hljs-keyword">return</span> (<span class="hljs-keyword">int</span>) min; } <span class="hljs-keyword">else</span> { <span class="hljs-title">// p = x - min</span> <span class="hljs-title">// x = p + min</span> <span class="hljs-keyword">return</span> (<span class="hljs-keyword">int</span>) (p + min); } } <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getMin</span><span class="hljs-params">()</span> </span>{ <span class="hljs-keyword">return</span> (<span class="hljs-keyword">int</span>) min; } } ``` ``` Python Code: ``` <pre class="calibre18">``` <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MinStack</span>:</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span> <span class="hljs-string">""" initialize your data structure here. """</span> self.minV = float(<span class="hljs-string">'inf'</span>) self.stack = [] <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">push</span><span class="hljs-params">(self, x: int)</span> -> <span class="hljs-keyword">None</span>:</span> self.stack.append(x - self.minV) <span class="hljs-keyword">if</span> x < self.minV: self.minV = x <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">pop</span><span class="hljs-params">(self)</span> -> <span class="hljs-keyword">None</span>:</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.stack: <span class="hljs-keyword">return</span> tmp = self.stack.pop() <span class="hljs-keyword">if</span> tmp < <span class="hljs-params">0</span>: self.minV -= tmp <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">top</span><span class="hljs-params">(self)</span> -> int:</span> <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> self.stack: <span class="hljs-keyword">return</span> tmp = self.stack[<span class="hljs-params">-1</span>] <span class="hljs-keyword">if</span> tmp < <span class="hljs-params">0</span>: <span class="hljs-keyword">return</span> self.minV <span class="hljs-keyword">else</span>: <span class="hljs-keyword">return</span> self.minV + tmp <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">min</span><span class="hljs-params">(self)</span> -> int:</span> <span class="hljs-keyword">return</span> self.minV <span class="hljs-title"># Your MinStack object will be instantiated and called as such:</span> <span class="hljs-title"># obj = MinStack()</span> <span class="hljs-title"># obj.push(x)</span> <span class="hljs-title"># obj.pop()</span> <span class="hljs-title"># param_3 = obj.top()</span> <span class="hljs-title"># param_4 = obj.min()</span> ``` ``` **復雜度分析** - 時間復雜度:O(1) - 空間復雜度:O(1) 更多題解可以訪問我的LeetCode題解倉庫:<https://github.com/azl397985856/leetcode> 。 目前已經37K star啦。 關注公眾號力扣加加,努力用清晰直白的語言還原解題思路,并且有大量圖解,手把手教你識別套路,高效刷題。 ![](https://img.kancloud.cn/cf/0f/cf0fc0dd21e94b443dd8bca6cc15b34b_900x500.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看