LeetCode高频算法刷题记录8

news/2024/7/7 11:43:35 标签: leetcode, 算法, c++, 数据结构, 面试

文章目录

  • 1. 零钱兑换【中等】
    • 1.1 题目描述
    • 1.2 解题思路
    • 1.3 代码实现
  • 2. 最小栈【最小栈】
    • 2.1 题目描述
    • 2.2 解题思路
    • 2.3 代码实现
  • 3. 最长有效括号【困难】
    • 3.1 题目描述
    • 3.2 解题思路
    • 3.3 代码实现
  • 4. 从前序与中序遍历序列构造二叉树【中等】
    • 4.1 题目描述
    • 4.2 解题思路
    • 4.3 代码实现
  • 5. 子集【中等】
    • 5.1 题目描述
    • 5.2 解题思路
    • 5.3 代码实现

1. 零钱兑换【中等】

题目链接:https://leetcode.cn/problems/coin-change/
参考题解:https://leetcode.cn/problems/coin-change/solution/322-ling-qian-dui-huan-by-leetcode-solution/

1.1 题目描述

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例1:

输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1

示例2:

输入:coins = [2], amount = 3
输出:-1

示例3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 2^31 - 1
  • 0 <= amount <= 10^4

1.2 解题思路

1.3 代码实现

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> ans(amount + 1, amount + 1);
        int len = coins.size();
        ans[0] = 0;
        for(int i = 1; i <= amount; i++) {
            for(int j = 0; j < len; j++) {
                if(coins[j] <= i)
                    ans[i] = min(ans[i], ans[i - coins[j]] + 1);
            }
        }
        return ans[amount] > amount ? -1 : ans[amount];
    }
};

2. 最小栈【最小栈】

题目链接:https://leetcode.cn/problems/min-stack/
参考题解:https://leetcode.cn/problems/min-stack/solution/zui-xiao-zhan-by-leetcode-solution/

2.1 题目描述

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例1:

输入:
[“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.

提示:

  • -2^31 <= val <= 2^31 - 1
  • pop、top 和 getMin 操作总是在 非空栈 上调用
  • push, pop, top, and getMin最多被调用 3 * 10^4 次

2.2 解题思路

2.3 代码实现

class MinStack {
public:
    stack<int> stk;
    stack<int> auxStk;
    MinStack() {
        auxStk.push(INT_MAX);
    }
    
    void push(int val) {
        stk.push(val);
        auxStk.push(min(auxStk.top(), val));
    }
    
    void pop() {
        stk.pop();
        auxStk.pop();
    }
    
    int top() {
        return stk.top();
    }
    
    int getMin() {
        return auxStk.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */

3. 最长有效括号【困难】

题目链接:https://leetcode.cn/problems/longest-valid-parentheses/
参考题解:https://leetcode.cn/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/

3.1 题目描述

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例1:

输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”

示例2:

输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”

示例3:

输入:s = “”
输出:0

提示:

  • 0 <= s.length <= 3 * 10^4
  • s[i] 为 ‘(’ 或 ‘)’

3.2 解题思路

3.3 代码实现

class Solution {
public:
    int longestValidParentheses(string s) {
        stack<int> stk;
        stk.push(-1);
        int ans = 0;
        int len = s.length();
        for(int i = 0; i < len; i++) {
            if(s[i] == '(') {
                stk.push(i);
            }
            else {
                stk.pop();
                if(!stk.empty()) {
                    ans = max(ans, i - stk.top());
                }
                else
                    stk.push(i);
            }
        }
        return ans;
    }
};

4. 从前序与中序遍历序列构造二叉树【中等】

题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
参考题解:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solution/cong-qian-xu-yu-zhong-xu-bian-li-xu-lie-gou-zao-9/

4.1 题目描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例1:
在这里插入图片描述

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

4.2 解题思路

4.3 代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    unordered_map<int, int> find_root;
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int pre_start, int pre_end, int in_start, int in_end) {
        if(pre_start > pre_end)
            return nullptr;
        int pre_root = pre_start;
        int in_root = find_root[preorder[pre_root]];
        int left_tree_len = in_root - in_start;
        TreeNode* root = new TreeNode(inorder[in_root]);
        root->left = buildTree(preorder, inorder, pre_root + 1, pre_root + left_tree_len, in_start, in_root - 1);
        root->right = buildTree(preorder, inorder, pre_root + left_tree_len + 1, pre_end, in_root + 1, in_end);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        for(int i = 0; i < inorder.size(); i++)
            find_root[inorder[i]] = i;
        return buildTree(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
    }
};

5. 子集【中等】

题目链接:https://leetcode.cn/problems/subsets/
参考题解:https://leetcode.cn/problems/subsets/solution/zi-ji-by-leetcode-solution/

5.1 题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例1:

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

5.2 解题思路

5.3 代码实现

class Solution {
public:
    vector<int> sub;
    vector<vector<int>> ans;
    void chooseNum(vector<int>& nums, int current) {
        if(current == nums.size()) {
            ans.push_back(sub);
            return;
        }
        chooseNum(nums, current + 1);
        sub.push_back(nums[current]);
        chooseNum(nums, current + 1);
        sub.pop_back();
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        chooseNum(nums, 0);
        return ans;
    }
};

http://www.niftyadmin.cn/n/349372.html

相关文章

【牛客刷题专栏】0x29:JZ31 栈的压入、弹出序列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录 前言问…

物联网时代,从智能咖啡机到车联网都可能被黑!

"伴随5G明年即将正式商转&#xff0c;物联网(IoT)时代特有的“万物皆联网”景况也近在咫尺&#xff0c;届时x连网对象数量将呈现猛爆增长。物联网技术的前期采用者&#xff0c;除了加速物联网基础建设与创新技术应用导入之外&#xff0c;也面临更广泛的安全管理风险与更严…

uni-app之使用App.vue全局文件的教学

在 UniApp 中&#xff0c;App.vue 是整个应用的入口文件&#xff0c;它可以作为一个全局文件&#xff0c;在其中定义的数据、方法和生命周期钩子可以在整个应用中使用。这篇文章将向您介绍如何使用 App.vue 文件来实现全局信息的共享和管理。 步骤&#xff1a; 创建 App.vue 文…

《WEB安全漏洞30讲》(第5讲)任意文件上传漏洞

1.任意文件上传漏洞原理 文件上传漏洞,指攻击者利用程序缺陷绕过系统对文件的验证与处理策略将恶意程序上传到服务器并获得执行服务器端命令的能力。 这个漏洞其实非常简单,就是攻击者给服务器上传了恶意的木马程序,然后利用此木马程序执行操作系统命令,从而获得服务器权…

大数据课程-学习二十周总结

4.2.10.hive表中的数据导出 将hive表中的数据导出到其他任意目录&#xff0c;例如linux本地磁盘&#xff0c;例如hdfs&#xff0c;例如mysql等等 4.2.10.1.insert导出 1&#xff09;将查询的结果导出到本地 insert overwrite local directory ‘/export/data/exporthive’ sel…

初识编程过程

和电脑对话 电脑是什么? 一堆电子原器件的集合, 怎么和它交流, 使用鼠标、键盘点击显示器上的内容。 那么这些内容是如何显示&#xff0c;又是如何工作的&#xff0c;他们怎么知道鼠标点某个位置时要如何响应&#xff0c;响应的内容又是怎么呈现出来。 这些都是和电脑正常对…

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Kinp、管理 GitHub 通知、WebXR

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;杏花乌龙拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

vector的介绍

vector的介绍&#xff1a;(vector翻译是向量&#xff0c;但是表示的是顺序表) vector是表示可以改变大小的数组的序列容器。 就像数组一样&#xff0c;vector对其元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素&#xf…