leetcode习题练习

Posted 且听真言

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode习题练习相关的知识,希望对你有一定的参考价值。

leetcode 20. 有效的括号

给定一个只包括 '(',')','','','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

        1.左括号必须用相同类型的右括号闭合。
        2.左括号必须以正确的顺序闭合。
        3.每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]"
输出:true
示例 3:

输入:s = "(]"
输出:false

提示:

1 <= s.length <= 104
s 仅由括号 '()[]' 组成

class Solution 
    public boolean isValid(String s) 
       int n = s.length();
       if (n % 2 == 1) 
           return false;
       
       Map<Character, Character> map = new HashMap<Character, Character>();
       map.put(')', '(');
       map.put(']', '[');
       map.put('', '');
       Deque<Character> stack = new LinkedList<Character>();
       for (int i = 0; i < n; i++) 
           char ch = s.charAt(i);
           if (map.containsKey(ch)) 
               if (stack.isEmpty() || stack.peek() != map.get(ch)) 
                 return false;
               
               stack.pop();
            else 
               stack.push(ch);
           
       
       return stack.isEmpty();
    



232. 用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:

你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
 
 

示例 1:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
 

提示:

1 <= x <= 9
最多调用 100 次 push、pop、peek 和 empty
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
 

进阶:

你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。

class MyQueue 
    Deque<Integer> inPutStack;
    Deque<Integer> outPutStack;

    public MyQueue() 
        inPutStack = new ArrayDeque<Integer>();
        outPutStack = new ArrayDeque<Integer>();
    
    
    public void push(int x) 
        inPutStack.push(x);
    
    
    public int pop() 
        if (outPutStack.isEmpty()) 
            inToOut();
        
        return outPutStack.pop();
    
    
    public int peek() 
        if (outPutStack.isEmpty()) 
            inToOut();
        
        return outPutStack.peek();
    
    
    public boolean empty() 
        return inPutStack.isEmpty() && outPutStack.isEmpty();
    

    private void inToOut() 
        while(!inPutStack.isEmpty()) 
            outPutStack.push(inPutStack.pop());
        
    

225. 用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
 

注意:

你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
 

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

1 <= x <= 9
最多调用100 次 push、pop、top 和 empty
每次调用 pop 和 top 都保证栈不为空

class MyStack 
    Queue<Integer> queueOne;
    Queue<Integer> queueTwo;

    public MyStack() 
        queueOne = new LinkedList<Integer>();
        queueTwo = new LinkedList<Integer>();
    
    
    public void push(int x) 
        queueTwo.offer(x);
        while(!queueOne.isEmpty()) 
            queueTwo.offer(queueOne.poll());
        
        Queue<Integer> temp = queueOne;
        queueOne = queueTwo;
        queueTwo = temp;
    
    
    public int pop() 
        return queueOne.poll();
    
    
    public int top() 
        return queueOne.peek();
    
    
    public boolean empty() 
        return queueOne.isEmpty();
    



703. 数据流中的第 K 大元素

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
 

示例:

输入:
["KthLargest", "add", "add", "add", "add", "add"]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
输出:
[null, 4, 5, 5, 8, 8]

解释:
KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
kthLargest.add(3);   // return 4
kthLargest.add(5);   // return 5
kthLargest.add(10);  // return 5
kthLargest.add(9);   // return 8
kthLargest.add(4);   // return 8

提示:
1 <= k <= 104
0 <= nums.length <= 104
-104 <= nums[i] <= 104
-104 <= val <= 104
最多调用 add 方法 104 次
题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素
 

class KthLargest 
    PriorityQueue<Integer> pq;
    int k;

    public KthLargest(int k, int[] nums) 
        this.k = k;
        pq = new PriorityQueue<Integer>();
        for (int x : nums) 
            add(x);
        
    
    
    public int add(int val) 
        pq.offer(val);
        if (pq.size() > k) 
            pq.poll();
        
        return pq.peek();
    

以上是关于leetcode习题练习的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode练习题Longest Common Prefix

Leetcode练习题 7. Reverse Integer

leetcode习题练习-每日更新

LeetCode刷题 --动态规划练习题 --300 最长上升子序列

算法零基础学习关于二维数组的一些基础练习题 | leetcode1672158283248题解

算法零基础学习关于二维数组的一些基础练习题 | leetcode1672158283248题解