前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >程序员进阶之算法练习(三十三)LeetCode专场

程序员进阶之算法练习(三十三)LeetCode专场

原创
作者头像
落影
发布于 2018-08-18 11:15:59
发布于 2018-08-18 11:15:59
48200
代码可运行
举报
文章被收录于专栏:落影的专栏落影的专栏
运行总次数:0
代码可运行

前言

BAT常见的算法面试题解析:

程序员算法基础——动态规划

程序员算法基础——贪心算法

工作闲暇也会有在线分享,算法基础教程----腾讯课堂地址

今天继续LeetCode专场练习。

正文

1、Binary Tree Right Side View

题目链接:https://leetcode.com/problems/binary-tree-right-side-view/

题目大意:给出一颗二叉树,找出每个深度最右边的节点。

题目解析:

右边优先的深度遍历,保证每次是最右边;

遍历的时候加入深度这一个变量,判断当前深度是否存在节点即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> ret;
        if (root) {
            dfs(root, ret, 0);
        }
        return ret;
    }
    
    void dfs(TreeNode* root, vector<int> &ret, int dep) {
        if (ret.size() <= dep) {
            ret.push_back(root->val);
        }
        if (root->right) {
            dfs(root->right, ret, dep + 1);
        }
        if (root->left) {
            dfs(root->left, ret, dep + 1);
        }
    }
};
2、Valid Parentheses

题目链接

题目大意:

给出一个字符串,只包含'(', ')', '{', '}', '' and '' 六类字符;

问给出的字符串是否满足:

1、所有括号都是匹配的;(左右括号数量一致)

2、匹配的括号是合法的;(没有交错)

Example 1:

Input: "()"

Output: true

Example 2:

Input: "()[]{}"

Output: true

Example 3:

Input: "(]"

Output: false

Example 4:

Input: "()"

Output: false

Example 5:

Input: "{[]}"

Output: true

题目解析:

根据题目的要求,可以用栈来实现,从左到右遍历字符串:

1、遇到一个字符,先看栈是否为空,如果为空则直接入栈;如果栈不为空,则看当前字符是左括号还是右括号;

2、如果是左括号,直接入栈;

3、如果是右括号,则看栈顶元素是否为左括号,并且匹配;

4、最后看栈是否为空。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
   bool isValid(string s) {
       stack<char> stk;
       for (int i = 0; i < s.length(); ++i) {
           int c = s[i];
           if (stk.size() == 0) {
               stk.push(c);
           }
           else {
               if (c == '[' || c == '{' || c == '(') {
                   stk.push(c);
               }
               else {
                   char top = stk.top();
                   stk.pop();
                   if ((c == ']' && top != '[') || (c == '}' && top != '{') || (c == ')' && top != '(')) {
                       return false;
                   }
               }
           }
       }
       return stk.size() == 0;
   }
}leetcode;
3、Letter Combinations of a Phone Number

题目链接

题目大意:

输入一个字符串,仅包含2-9的数字;

数字代表的是键盘上的输入,如图

问对于这个输入,可能有哪些字符串。

Example:

Input: "23"

Output: "ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf".

题目解析:

对于每个数字,代表3或者4个字母;

于是可以用搜索的思想解决问题,枚举每一种可能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    
    void dfs(string &digits, int i, string &tmp, vector<string> &ret) {
        if (i >= digits.length()) {
            ret.push_back(tmp);
            return;
        }
        else {
            int nums[10] =
            {
                0,
                0, 3, 3,
                3, 3, 3,
                4, 3, 4,
            };
            
            int index = digits[i] - '0';
            int start = 0;
            for (int i = 2; i < index; ++i) {
                start += nums[i];
            }
            int end = start + nums[index];
            for (int j = start; j < end; ++j) {
                tmp.push_back('a' + j);
                dfs(digits, i + 1, tmp, ret);
                tmp.pop_back();
            }
        }
    }
    
    vector<string> letterCombinations(string digits) {
        vector<string> ret;
        string tmp;
        if (digits.length()) {
            dfs(digits, 0, tmp, ret);
        }
        return ret;
    }
}leetcode;

小trick,如果输入的是空串,那么返回的是空值;

4、Shortest Palindrome

题目链接

题目大意:

给出一个字符串s,在s的左边添加字符串,使得s变成一个回文串;

要求s的字符串长度尽可能短,返回最后的s串。

题目解析:

对于字符串s中的每个位置x,判断以strx为中心,形成回文串的长度有多长;

如果位置能覆盖到最左边,那么右边剩下的字符串翻转后贴在最左边,就能得到回文串。

难点:如果回文串是偶数如何处理?(此时没有中心字符)

在每个字符的右边插入'#',abcd=>a#b#c#d。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    string shortestPalindrome(string s) {
        vector<char> str(s.length() * 2 + 5);
        vector<int> p(str.size());
        str[0] = '@';
        int i, j;
        for(i = 0, j = 1; s[i]; i++){
            str[j++] = '#';
            str[j++] = s[i];
        }
        str[j++] = '#';
        int n = j;
        manachar(str, p, n);
        int ans = 0, pos = 0;
        for(i = 1; i < n; i++) { // @#a#b#a#a#
            if (p[i] == i) { // 能覆盖到最左边
                pos = i;
                ans = p[i] - 1; // 回文串长度
            }
        }
        string add = string(s.begin() + ans, s.end());
        reverse(add.begin(), add.end());
        return  add + s;
    }
    
    void manachar(vector<char> &str, vector<int> &p, int n){
        int id = 0, mx = 0;
        for(int i = 1; i < n; i++){
            if(mx > i) p[i] = min(p[2 * id - i], mx - i);
            else p[i] = 1;
            while(str[i + p[i]] == str[i - p[i]]) p[i]++;
            if(p[i] + i > mx) mx = p[i] + i, id = i;
        }
    }
}leetcode;

优化:

用manachar算法找出每个位置的回文串长度,时间和空间都能优化到O(N)。

5、Dungeon Game

题目链接

题目大意:

n*m的网格,每个网格有一个数字,要从左上角到右下角(只能向右或者向左);

起始点是左上角,并且初始状态有个体力值,每次经过网格时体力值会发生该网格上数字的变化:

如果是数字是x,那么体力值Hnew = Hold + x;

问最少需要多少体力值,才能保证从左上角到右下角,体力值不小于1;

题目解析:

题目的意思可以理解为:求左上到右下的路径数字和最大;

这是一个经典的动态规划,注意点1:如果和是正整数,那么体力值为1即可。

但是,一个hard题目是否这么简单呢?

这种做法忽略了一种情况:题目要求保证路径上,体力值一直不小于1。

即使求出来的路径和是正整数,路上仍旧可能出现负数的情况。

对题目进行思考,发现体力值符合线性特征:

如果体力值H可行,那么体力值H+1必然也可以。

于是改用二分,对每个二分的体力值我们判断其是否通过。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        int left = 1, right = inf, ans = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (canPass(dungeon, mid)) {
                ans = mid;
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        return ans;
    }

canPass的思路就是:在n*m的网格中,遍历所有能到达的点,看是否能到达右下角;

时间复杂度是O(N * M * logK) K为数字最大值,N、M为行列数量。

思考:

这里,其实还是可以用动态规划来解决,核心就是:逆序。

假设到达右下角的体力值是1,在此基础上从右下往左上dp,保持状态转移过程中体力值不小于1即可。

总结

这些都是面试常见的题目,尤其是第一个,是电面的常见问题。

面试过程中,遇到这类算法题有两大难点:

1、如果想到合适的解法;

2、把解法用合适的代码表达出来;

这两个点都只能通过多练去解决,一定是要掌握算法题的核心思路,这样才能在遇到类似题目时游刃有余。

已经到8月中旬,越来越不好招人,这时候找工作一定要慎重。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试题: Docker的优缺点
由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。
用户1263954
2019/07/04
10K1
跟我一起学docker(一)--认识
最近开始自学docker,决定把自己的学习进度分享给大家,每天一篇希望能帮助docker的初学者。大家积极留言哦,输出决定输入!预计20次完成docker的讲解。 1.什么是docker Docker
IT架构圈
2018/05/31
5940
1.docker概述及其历史
一. 为什么会出现docker? 不用说, 肯定是时代进步的产物. 那么, 他为什么能火🔥? 一定是解决了痛点问题. docker也不是一下子就火起来了, 他的火也是有一个过程的, 我们先来看看为什么
用户7798898
2021/09/23
1.5K1
1.docker概述及其历史
Docker 是怎么实现的?前端怎么用 Docker 做部署?
不同的代码需要不同的环境,比如 JS 代码的构建需要 node 环境,Java 代码 需要 JVM 环境,一般我们会把它们隔离开来单独部署。
神说要有光zxg
2022/11/11
1.8K0
Docker 是怎么实现的?前端怎么用 Docker 做部署?
10.2.为什么需要Docker?
估计大家也可能听过Docker这项技术(在论坛上、招聘技能上、交流群上等等),要是不了解Docker,都不好意思在网上冲浪的时候吹牛逼了。
itjim
2020/01/21
7530
10.2.为什么需要Docker?
微服务为什要用docke?什么是docker,什么是容器与镜像
微服务为什么一定要用docker?今天通过一篇文章为大家分享docker入门详解,欢迎大家一起阅读!
艾编程
2020/06/10
2.3K0
微服务为什要用docke?什么是docker,什么是容器与镜像
docker的常用命令以使用
docker引擎的基础是linux容器技术。与虚拟机的相似,但又不同。docker是一种轻量级的虚拟化方式,docker容器的启动和停止可以在秒级实现,速度比虚拟机快的很多,相比起来对宿主机资源的使用也很少,一台主机可以同时运行上千个docker容器。
93年的老男孩
2019/12/18
3750
docker学习笔记
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。简言之,docker就是用go开发的一种轻量级虚拟化容器。
程序员同行者
2018/07/24
5990
docker学习笔记
Docker的基本使用——常用docker命令
​ 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
不愿意做鱼的小鲸鱼
2022/09/26
6510
Docker的基本使用——常用docker命令
Docker简介、常用命令与实践(一)
Docker的思想来自于集装箱。 集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。那么我就不需要专门运送水果的船和专门运送化学品的船了。只要这些货物在集装箱里封装的好好的,那我就可以用一艘大船把他们都运走。 可是这个箱子为什么这么神奇呢?无非就是两个字:标准。
唐成勇
2019/05/26
5920
docker 简介与安装
虚拟机(virtual machine)就是带环境安装的一种解决方案。 它可以在一种操作系统里面运行另一种操作系统,比如在Windows10系统里面运行Linux系统CentOS7。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。这类虚拟机完美的运行了另一套系统,能够使应用程序,操作系统和硬件三者之间的逻辑不变。
cheese
2023/10/25
6840
docker 简介与安装
Docker入门(一):简介
平常我们使用的Vmware虚拟化的目标都是一台完整的计算机,拥有底层的物理硬件、操作系统和应用程序执行的完整环境。为了让虚拟机中的程序实现像在真实物理机器上运行“近似”的效果,背后的HyperVisor做了大量的工作,付出了“沉重”的代价。
传说之下的花儿
2023/09/29
4950
Docker入门(一):简介
为什么要使用Docker?
  假定您在开发一个谷粒商城,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。此外,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销。   请问?您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
别团等shy哥发育
2023/02/25
5380
为什么要使用Docker?
了解【Docker】从这里开始
软件开发最大的难题之一就是环境配置的问题。现在用户环境纷乱复杂,并且由于开源社区的进一步推广和许多开源项目不停地迭代更新,项目可能会有越来越多的依赖以及越来越难管理的依赖版本,如何保证编写的程序能不只是在“我的电脑上能运行”(It works on my machine)成了一个复杂麻烦的事情。
我没有三颗心脏
2019/05/30
6820
docker学习系列9 Docker的技术原理介绍
Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统,可以将App变成一种 标准化的、可移植的、自管理的组件,并脱离服务器硬件在任何主流系统中开发、调试和运行。 简单的说就是,在 Linux 系统上迅速创建一个容器(类似虚拟机)并在容器上部署和运行应用程序,并通过配置文件 可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开 发环境分开,互不影响,这是 docker 最普遍的一个玩法。
mafeifan
2018/09/10
5940
分布式部署:第三章:Docker、MySQL、tomcat、Nginx、Redis部署
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
Java廖志伟
2022/09/28
1.2K0
分布式部署:第三章:Docker、MySQL、tomcat、Nginx、Redis部署
大数据分析:Docker虚拟化解析
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验 .Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
成都加米谷大数据
2021/02/04
3460
大数据分析:Docker虚拟化解析
Docker Vs. 虚拟机
在计算机技术中,虚拟化(Virtualization)是一种资源管理技术。它是将计算机的各种实体资源,如:服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用更好的方式来利用这些资源。
鲁大猿
2024/01/25
3120
Docker Vs. 虚拟机
【趣学程序】Docker之简介安装
一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验。Docker为什么会出现?因为他对于上述问题给出了一个标准的解决方案。
趣学程序-shaofeer
2019/12/16
5760
【趣学程序】Docker之简介安装
Docker 入门
虚拟化技术是一种计算机资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的,不可切割的障碍。使用户可以比原本的组态更好的方式,来应用这些资源。
RendaZhang
2020/12/16
7440
相关推荐
面试题: Docker的优缺点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验