leetcode题解日练--2016.7.12

从零开始用TS开发babylonjs - 本机环境搭建 babylonjs,初始化本地安装,web3d引擎 阅读详情

日练三题,冰冻三尺非一日之寒。

今日题目:1、二叉树每层最右节点;2、实现BST迭代器;3、最小路径和;❤4、超级丑数。

今日摘录:

我们要轻轻的走路、用心的过活;我们要温和的呼吸、柔软的关怀;我们要深刻的思想、广大的慈悲:我们要爱惜一株青草、践地唯恐地痛。这些,都是修行。
——林清玄 《情深,万象皆深》

199. Binary Tree Right Side View | Difficulty: Medium

Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.

For example:
Given the following binary tree,
1 <—
/ \
2 3 <—
\ \
5 4 <—
You should return [1, 3, 4].

题意:从上至下输出从右往左看能看到的那些节点。
思路:
1、BFS
突然想到之前一道类似的题目,用两个队列实现如下,权当练手。

/**
 * Definition for a binary tree node.
 * 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) {
        queue <TreeNode*>  q[2];
        TreeNode *tmp;
        vector<int> res;
        if(!root)   return res;
        int cur=0,next=1;
        q[cur].push(root);
        while(!q[cur].empty()||!q[next].empty())
        {
            tmp = q[cur].front();
            q[cur].pop();
            if(tmp->left) q[next].push(tmp->left);
            if(tmp->right) q[next].push(tmp->right);
            if(q[cur].size()==0)
                {
                    res.push_back(tmp->val);
                    swap(cur,next);
                }
        }
        return res;
    }
};

结果:4ms

其实一个队列就能搞定了,上述代码纯属搞笑。

/**
 * Definition for a binary tree node.
 * 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) {
        queue <TreeNode*> q;
        TreeNode *tmp;
        vector<int> res;
        if(!root)   return res;
        q.push(root);
        while(!q.empty())
        {
            int end = q.size()-1;
            for(int i=0;i<=end;i++)
            {
            tmp = q.front();
            q.pop();
            if(tmp->left)       q.push(tmp->left);
            if(tmp->right)      q.push(tmp->right);
            if(i==end)   res.push_back(tmp->val);
            }
        }
        return res;
    }
};

结果:4ms

2、DFS

/**
 * Definition for a binary tree node.
 * 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>res;
        recursion(res,1,root);
        return res;
    }
    void recursion(vector<int>&res,int level,TreeNode* root)
    {
        if(!root)   return;
        if(res.size()<level)    res.push_back(root->val);
        recursion(res,level+1,root->right);
        recursion(res,level+1,root->left);
    }
};

结果:4ms

173. Binary Search Tree Iterator | Difficulty: Medium

Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.

Calling next() will return the next smallest number in the BST.

Note: next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.

题意:实现一个BST的迭代器,使得能够在O(1)时间O(h)空间内调用是否有下一个最小数和下一个最小数是什么的功能。

思路:如果没有O(h)空间限制,我们完全可以在先中序遍历一次BST存入队列中,然后这个时候就已经排序好了,之后就很好办了。既然不能采用这种方法,那还有什么方法呢?不难想到,中序遍历的迭代实现是怎样呢?先将最左路径的元素存入栈中,然后从底开始访问,每次访问节点如果有右子树就将右子树的最左路加进来。照着这个思路就很好写代码了,我们需要一个将最左路加入到栈中的代码。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class BSTIterator {
public:
    stack<TreeNode*> nodes;
    BSTIterator(TreeNode *root) {
        pushLeftPath(root,nodes);
    }

    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !nodes.empty();
    }

    /** @return the next smallest number */
    int next() {
        TreeNode *tmp = nodes.top();
        nodes.pop();
        if(tmp->right)    pushLeftPath(tmp->right,nodes);
        return tmp->val;
    }
private:
    void pushLeftPath(TreeNode *root,stack<TreeNode*>&nodes)
    {
        while(root)
        {
        nodes.push(root);
        root = root->left;
        }
    }
};

/**
 * Your BSTIterator will be called like this:
 * BSTIterator i = BSTIterator(root);
 * while (i.hasNext()) cout << i.next();
 */

结果:28ms

64. Minimum Path Sum | Difficulty: Medium

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

题意:m×n的方格,每个方格都放了非负整数,找到一条从左上到右下的路径使得和最小。
相似题目:
思路:
1、很明显的DP思路。用了两个额外的向量。

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int res=0;
        if(grid.size()==1)
        {
            for(int i=0;i<grid[0].size();i++)
                res+=grid[0][i];
            return res;
        }
        else if(grid[0].size()==1)
        {
            for(int i=0;i<grid.size();i++)
                res+=grid[i][0];
            return res;
        }
        int m=grid.size();
        int n=grid[0].size();
        vector<int> pre(m,INT_MAX);
        vector<int> cur(m,0);
        for(int i=0;i<n;i++)
        {
            if(i==0)    cur[0] = grid[i][0];
            else    cur[0] = pre[0]+grid[0][i];
            for(int j=1;j<m;j++)
                cur[j] =grid[j][i]+ min(pre[j],cur[j-1]);
            swap(pre,cur);
        }
        return pre[m-1];

    }
};

结果:12ms

上述代码写得太复杂了,每次都是一列一列进行计算,并且空间上还可以优化一下,下面简化一下代码:

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        vector<int> cur(m,grid[0][0]);
        for(int i=1;i<m;i++)
        {
            cur[i]=cur[i-1]+grid[i][0];
        }
        for(int i=1;i<n;i++)
        {
            cur[0] +=grid[0][i];
            for(int j=1;j<m;j++)
                cur[j] =grid[j][i]+min(cur[j-1],cur[j]);
        }
        return cur[m-1];
    }
};

结果:12ms

313. Super Ugly Number | Difficulty: Medium

Write a program to find the nth super ugly number.

Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.

Note:
(1) 1 is a super ugly number for any given primes.
(2) The given numbers in primes are in ascending order.
(3) 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.

题意:找到第n个超级丑数,超级丑数的定义是给了一个数组,超级丑数的所有因数只能是这个数组中的元素。
思路:
primes = [2,7,13,19] ,我们怎么样去找丑数?
首先可以肯定所有丑数肯定是2、7、13、19的倍数中产生,但是这里面是有重复元素的,我们需要做的事情就是将这些所有primes元素倍数的数按照从小到大拍个序
为了方便计数,我们创建一个与primes相同大小的idx数组[0,0,0,0],这个数组的含义是prime出现的次数。我们找第1个数(从0开始计数)的时候是怎么找的?这个时候遍历4个idx的值,代表primes中的元素出现的次数,这个时候全部都没有出现过,所以只需要拿1去与它们相乘然后找出最小的那个因子更新uglies[1] = min(primes[j]*uglies[idx[j]])遍历j。这个时候uglies[1] = 2,此时我们就用了一次2这个因子了,就应该将相应的idx加1,变成idx=[1,0,0,0],在下次遍历j的时候,uglies[idx[i]]就便成了[2,1,1,1]。
感觉好像没说清楚,其实就是[1,1,1,1]然后每个数乘上自己对应的因子,变成[2,7,13,19],挑出最小的作为丑数的下一个元素并且更新,其他均不更新。此时就变成[2,1,1,1],直到找够n个数字循环结束。

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
         vector<int> idx(primes.size(),0);
         vector<int> uglies(n,INT_MAX);
         uglies[0] = 1;
         for(int i=1;i<n;i++)
         {
             for(int j=0;j<primes.size();j++)   uglies[i] = min(uglies[i],uglies[idx[j]]*primes[j]);
             for(int j=0;j<primes.size();j++)   idx[j] +=(uglies[i]==uglies[idx[j]]*primes[j]);
         }
         return uglies[n-1];
    }
};

结果:168ms

Java开发者终极抉择:IntelliJ IDEA vs VS Code —— 4大维度深度对比评测 🔥关注墨瑾轩,带你探索Java的奥秘!🚀🔥超萌技术攻略,轻松晋级编程高手!🚀🔥技术宝库已备好,就等你来挖掘!🚀🔥订阅墨瑾轩,智趣学习不孤单!🚀🔥即刻启航,编程之旅更有趣!🚀在Java开发领域,选择合适的集成开发环境(IDE)对于提高开发效率和代码质量至关重要。和(简称VS Code)是两个广受好评的开发工具,各自拥有独特的特性和庞大的用户群。本篇将从多个维度深入探讨这两款IDE对Java开发者来说的优劣,包括但不限于性能、用户体验、生态系统、调试能力、以及特定Java功能的支持等方面。 阅读详情

相关推荐

ROS2实战:从零部署Cartographer激光SLAM系统

本文详细介绍了在ROS2 Humble环境下,从零开始部署Cartographer激光SLAM系统的完整实战流程。内容涵盖环境准备、Cartographer安装(APT与源码编译两种方式对比)、工作空间与功能包创建、核心启动文件与Lua配置文件编写、系统构建与可视化启动,以及地图保存与实战调参技巧,帮助开发者快速构建稳定可靠的机器人SLAM应用。

weixin_29213655的博客 248

面试题3、求二叉树每一层最右节点值

得到二叉树每一层最右边一个节点值,存到一个数组中得到结果,并给出测试样例、时间复杂度和空间复杂度。 二叉树总节点数:m,层数:h 思路1: 深搜,时间复杂度O(m),空间复杂度O(h). void dfs (TreeNode* root, int level, vector<int> &re) { if(!root) return; if(re....

2880

拆解汽车T-Box:从4G模块到MCU,手把手教你理解车联网的‘黑匣子’

本文深入拆解汽车T-Box,揭示其作为车联网‘黑匣子’的核心架构与工作原理。从4G模块、MCU主控到外设接口,详细解析各组件功能及协同机制,并通过实战案例展示故障诊断与性能优化技巧,帮助读者全面理解T-Box在智能汽车中的关键作用。

weixin_30955617的博客 497

LeetCode C++刷题 61-64题题解

61、旋转链表 题目: 给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。 示例1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL 示例2: 输入: 0-...

cchangcs 738

C#开发者必备:VSPD虚拟串口快速配置指南(附汉化教程)

本文为C#开发者提供了VSPD虚拟串口的快速配置与汉化教程。详细介绍了如何安装、汉化VSPD,并创建稳定的虚拟串口对,重点讲解了如何将其集成到C#开发工作流中,使用SerialPort类进行数据通信测试、协议模拟及故障排查,有效提升硬件通信开发的效率。

weixin_29224529的博客 258

PyTorch GPU版本安装避坑指南:解决RuntimeError: No CUDA GPUs are available报错

本文详细解析了PyTorch GPU版本安装过程中常见的`RuntimeError: No CUDA GPUs are available`报错问题,从硬件驱动检查、CUDA Toolkit与cuDNN安装到PyTorch GPU版本的正确配置,提供了全面的避坑指南和实战验证方法,帮助开发者高效搭建深度学习开发环境。

r2s3t4的博客 298

二叉树获取每层的最右一个节点(二叉树的右视图)

public static void levelPrint(Node head) { System.out.println("LevelPrint"); Node current; Queue<Node> queue = new LinkedList<Node>(); Stack<Node> stack = new Stack<Node&...

赵智任的博客 1765

SAP PCC成本收集器实战:从配置到结算的完整流程解析

本文详细解析了SAP PCC成本收集器从配置到结算的完整流程,特别适用于重复制造行业。通过实战案例和配置要点,帮助用户掌握物料分类账管理、成本中心费用归集及差异分析等核心功能,提升企业生产成本控制效率。

weixin_29251567的博客 896

IoTGateway框架如何让物联网网关开发速度翻倍

在物联网网关开发中,协议适配、数据管道和连接管理往往消耗大量时间。通过将设备模型与通信协议解耦,并采用插件化架构和配置驱动设计,开发者可以复用协议驱动、标准化数据处理流程,从而显著减少重复编码。这种技术方案在多协议接入、快速原型验证和长期运维场景下,能有效提升开发效率,降低运维成本。本文以IoTGateway为例,分析其设计思路与适用边界,帮助团队评估框架的实际价值。

weixin_34269583的博客 716

【Charge】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.01.20\textrm{Created Time: 2026.01.20}Created Time: 2026.01.20 Modified Time: 2026.01.20\textrm{Modified Time: 2026.01.20}Modified Time: 2026.01.20工作流程材料模型[Charge] 电荷分布与折射率变化理论 [Charge] FDTD

u011699626的博客 317

【KingSCADA】如何创建新应用

KingSCADA3.8集成开发环境是基于工程的应用管理模式,实现了对多个应用的集中开发和管理的功能,一个工程可以同时管理多个应用,即在KingSCADA3.8工程设计器中可以同时对多个应用进行开发,应用之间可以实现相互复制、粘贴等功能,大大提高了开发效率。(此处感觉和VS类似)使用KingSCADA3.8开发的系统称为应用,一个完整的应用一般包含以下部分或全部内容:IO设备、IO采集点、图形界面、动画链接、趋势曲线、报警和事件、历史记录、数据库、Web Server等部分。

做有价值的事,积累有价值的笔记! 3109

最小路径和

设dp[i][j]是到达位置(i,j)时的最优解class Solution { public: int minPathSum(vector&lt;vector&lt;int&gt;&gt;&amp; grid) { if(grid.size() == 0) return 0; int row = grid.size...

qq_22080999的博客 286

Android Binder——数据传递载体(二十一)

同一进程间的对象传递都是通过引用来做的,因而本质上就是传递了一个内存地址。而跨进程采用了虚拟内存机制,两个进程都有自己独立的内存地址空间,所以跨进程传递的地址值是无效的。进程间的数据传递是 Binder 机制中的重要一环,Android 系统中担负这一重任的就是 Parcel。Parcel 是一种数据的载体,用于承载希望通过 IBinder 发送的相关信息(包括数据和对象引用)。正是基于 Parcel 这种跨进程传输数据的能力,进程间的 IPC 通信才能更加平滑可靠。

小旭的专栏 576

leetcode题解日练--2016.7.7

今日题目:1、出现一次的数II;2、房子小偷III;3、生成括号。

Just Do IT 1772

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

leetcode题解日练--2016.7.14

今日题目:1、装更多水的容器;❤2、数组中第k大的元素;3、设置矩阵的0。 今日摘录: 走向远方, 从少年到青年, 从青年到老年, 我们从星星走到了夕阳。 ——汪国真 《走向远方》

Just Do IT 1017

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

leetcode题解日练--2016.7.17

今日题目:1、找到顶点元素;2、去除排序数组中的重复元素II;3、H指数 ; 4、H指数II;5、判断一棵二叉树是否合法。

Just Do IT 5425

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

leetcode题解日练--2016.7.16

今日题目:1、顶端迭代器;2、完美平方数;3、根节点到叶节点加法。

Just Do IT 2423

leetcode题解日练--2016.7.11

今日题目:1、每个节点加上next right指针;2、完全平方数;3、旋转矩阵;4、旋转矩阵II。

Just Do IT 1407

leetcode题解日练--2016.7.8

今日题目:1、唯一的BST树数量;2、将排序数组转换为BST;3、查找插入位置;4、组合加法III。 今日摘录:那一天我二十一岁,在我一生的黄金时代,我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云,后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消逝,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。

Just Do IT 1014

leetcode题解日练--2016.7.24

今日题目: 1、划分链表; 2、唯一路径II; 3、电话号码组合。 4、二叉树ZigZag层次遍历

Just Do IT 916

leetcode题解日练--2016.7.21

今日题目:1、三角形;2、超级幂;3、x的n次方。

Just Do IT 786

leetcode题解日练--2016.7.25

今日题目: 1、组合加法IV; 2、最接近的三数字和; 3、查找目标范围。

Just Do IT 1082

leetcode题解日练--2016.7.18

今日题目:1、子集;2、组合加法;3、组合加法II 。 今日摘录: 世上只有一本书就是你,别的书,都是它的注释。 ——顾城 《顾城哲思录》

Just Do IT 794

leetcode题解日练--2016.7.15

今日题目:1、最长递增序列;2、游戏人生;3、判断3个递增子序列。

Just Do IT 977

leetcode题解日练--2016.7.13

今日题目:1、猜数字高低;2、2维矩阵查找II;3、二维矩阵查找;4、旋转图像;5、颜色排序。

Just Do IT 1005

leetcode题解日练--2016.7.9

今日题目:❤1、买卖股票II+有冷却;2、格雷码;3、最大连续子序列和;4、矩形顶点之间的路径数。

Just Do IT 926
上一篇: leetcode题解日练--2016.7.11
下一篇: leetcode题解日练--2016.7.13
steve_99
博客等级 码龄10年 33粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值