LeetCode高频算法刷题记录8

2023-11-03

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;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode高频算法刷题记录8 的相关文章

随机推荐

  • Qt--深度图伪彩色渲染

    项目源码地址 Windows Linux安装包 之前写了一个小程序 对深度图做伪彩色渲染 便于可视化 也可以打开ppm的彩色图片 界面大概长这样
  • C练习实例11-15题打卡

    目录 题目11 思路 代码 结果 题目12 思路 代码 结果 题目13 思路 代码 结果 题目14 思路 代码 结果 题目15 思路 代码 结果 题目11 古典问题 兔子生崽 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三
  • Android列表小部件(Widget)开发详解

    好久没博客更新了 本篇文章来学习一下如何实现一个Android列表小部件 效果可以参看下图 这个页面如果是在App内部实现 相信只要有一点Android基础的童鞋都能很轻松写出来 但是如果放到Widget中可能就不是那么简单了 因为Widg
  • c++ curl +openssl 编译包,以求支持HTTPS传输

    在window平台下 自己DIY编译OpenSSL Libcurl 来支持HTTPS传输协议 1 缘起 原来就了解些libcurl 一直没有机会在项目实际使用libcurl 恰好最近一个云存储的项目 服务器使用openstack 恰好我负责
  • 中国近五年的计算机专业就业率,未来五年,我国最有发展前途的工科专业,毕业好就业,发展前途好...

    还有几天时间高考成绩就要公布了 等到成绩公布之后 同学们就要着手准备填报志愿的事情 填报志愿也是一件非常重要的事情 影响着我们未来的就业前途与发展方向 因此在填报志愿之前一定要做足功课 对各个院校与专业的录取分数线 未来的就业前途都要进行详
  • POJ--1458:Common Subsequence (DP求最长公共子序列)

    1 题目源地址 http poj org problem id 1458 2 基本题意 给出两个序列 求出最长子序列的长度并输出 经典的动态规划求解 求最长公共子序列的经典DP解法代价为O mn 其中m和n分别为两个字符串的长度 具体实现如
  • jq命令安装与使用

    目录 一 简介 二 下载及安装 1 Linux 安装 2 Windows 安装 3 测试安装结果 三 jq用法 1 基本语法 2 常见用法 1 格式化 JSON 2 获取属性 3 属性不存在情况处理 4 数组遍历 截取 展开 5 管道 逗号
  • 详解微服务架构

    见 https www cnblogs com skabyy p 11396571 html
  • to_hdf提示:ImportError: Missing optional dependency ‘tables‘. Use pip or conda to install tables.

    使用to hdf保存文件 提示 ImportError Missing optional dependency tables Use pip or conda to install tables stack overflow回答 I ran
  • QQ如何设置使用代理服务器?

    很多人可能会问了 QQ上可以设置代理服务器吗 答案是可以的 今天就为大家详细介绍一下 如何在QQ上设置代理服务器的 1 双击QQ图标 打开QQ登录界面 我们就可以看到界面右上角有一个 设置 按钮 QQ如何设置使用代理服务器1 2 点击 设置
  • SVM支持向量机原算法与对偶算法举例

    1 原算法与对偶算法 对于支持向量机而言 对偶算法是借助拉格朗日对偶性从原算法 Primal Problem 推出的 两者完全等价 只是求解了不同的条件极值 下面是硬间隔支持向量机的原算法和对偶算法 2 例子 假设数据集D为 下面会通过原算
  • 机器学习算法1_线性回归

    通俗描述 线性回归模型是利用线性函数对一个或多个自变量和因变量 y y y 之间关系进行拟合的模型 公式推导 数据输入 给定数据集 D
  • 两个数组的交集---leetcode 340题

    解法1 哈希结构 class Solution public vector
  • 提高网站访问速度的34个方法

    1 减少HTTP请求数量 Minimize HTTP Requests tag content 80 的用户响应时间被花费在前端 而这其中的绝大多数时间是用于下载页面中的图片 样式表 脚本以及Flash这些组件 减少这些组件的数量就可以减少
  • jQuery的ajax方法里的success方法第一次不执行,第二次才执行的问题

    最近写了一个form表单提交功能 用jQuery的ajax方法实现 第一次提交时 success里的方法并没有执行 第二次提交就行了 当然后端是能正常执行的 只是前端有问题 解决办法如下 btnSubmit click function v
  • 安装Unity的Vuforia v3.0插件

    转载请注明出处 原文链接 http blog csdn net julong2011 第一步 安装插件 下载 浏览Unity插件下载页面下载开发平台相关的插件包 然后按照下面的说明进行之后的操作 Windows系统下的安装 推荐的Andro
  • 分布式数据库、NoSql 与 zookeeper

    分布式数据库 数据高可用 分布式数据库系统通常使用较小的计算机系统 每台计算机可单独放在一个地方 每台计算机中都可能有DBMS的一份完整拷贝副本 或者部分拷贝副本 并具有自己局部的数据库 位于不同地点的许多计算机通过网络互相连接 共同组成一
  • linux基础版美化,Linux_教你美化ubuntu系统,现在比较流行的个人版linux( - phpStudy...

    教你美化ubuntu系统 现在比较流行的个人版linux 适合初学者使用 有suse redhat 红旗linux red flag 5 0 Magic linux支持一下国产哦 ubuntu fedora core 其中ubuntu近来最
  • 摸鱼系列之idea摸鱼插件推荐

    前言 作为一枚程序员 上班时候正撸着代码呢 撸不出代码了 没灵感了 看需求念头不通达了 脑瓜里蹦不出一丁点火花了 这时候怎么办 程序在运行 还要好几分钟 等待时间里 白白浪费了 玩手机又会被抓到 这时候怎么办 不用怕 我们自带的IDEA很强
  • LeetCode高频算法刷题记录8

    文章目录 1 零钱兑换 中等 1 1 题目描述 1 2 解题思路 1 3 代码实现 2 最小栈 最小栈 2 1 题目描述 2 2 解题思路 2 3 代码实现 3 最长有效括号 困难 3 1 题目描述 3 2 解题思路 3 3 代码实现 4