Leetcode Top 100 Liked Questions(序号53~74)

news2024/11/14 13:37:47

53. Maximum Subarray 

题意:一个数组,找到和最大的子串

我的思路

我记得好像On的动态规划来做的?但是想不起来了,先死做,用O(n^2)前缀和——TLE超时

那就只能想想dp怎么做了

假设dp[i]表示的是以 i 为右端点的最大的子串,dp[0]是自己;

i=1时,如果dp[0]小于0,dp[1]=nums[1],否则dp[1]=dp[0]+nums[1]

i=2时,如果dp[1]小于0,dp[2]=nums[2],否则dp[2]=dp[2-1]+nums[2]

所以状态转移方程为:如果dp[i - 1]小于0,dp[ i ]=nums[ i ],否则dp[ i ]=dp[i -1]+nums[ i ]

On解决,同时dp换成nums还能更省空间

代码 Runtime 87 ms Beats 78.76% Memory67.9 MB Beats 8.86%

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        int maxx=nums[0];
        for(int i=1;i<n;i++){
            if(nums[i-1]>0) nums[i]=nums[i]+nums[i-1];
            maxx=max(maxx,nums[i]);
        }
        return maxx;
    }
};

如果想跟快的话,取消同步 Runtime 50 ms Beats 99.91% Memory 67.7 MB Beats 81.53%

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);    cout.tie(NULL);
        int n=nums.size();
        int maxx=nums[0];
        for(int i=1;i<n;i++){
            if(nums[i-1]>0) nums[i]=nums[i]+nums[i-1];
            maxx=max(maxx,nums[i]);
        }
        return maxx;
    }
};

标答补充 分治

看看分治的代码

分成左右中三个部分,左边部分是左边最大的子串和,右边部分得到右边最大字串和;

左边部分是所有包含了m-1位置的字符串的最大子串和 lmax,右边部分是包含了m+1位置的字符串的最大字串和 rmax,返回max(lmax. rmax ),ml+mr+nums[m]两者之中大的那一个

代码 Runtime110 ms Beats 65.10% Memory 67.9 MB Beats 8.86%

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        return maxSubArray(nums, 0, nums.size() - 1);
    }
private:
    int maxSubArray(vector<int>& nums, int l, int r) {
        if (l > r) return INT_MIN;
        int m = l + (r - l) / 2, ml = 0, mr = 0;
        int lmax = maxSubArray(nums, l, m - 1);
        int rmax = maxSubArray(nums, m + 1, r);
        for (int i = m - 1, sum = 0; i >= l; i--) {
            sum += nums[i];
            ml = max(sum, ml);
        }
        for (int i = m + 1, sum = 0; i <= r; i++) {
            sum += nums[i];
            mr = max(sum, mr);
        }
        return max(max(lmax, rmax), ml + mr + nums[m]);
    }
};

54. Spiral Matrix

题意:

我的思路

死做

代码 Runtime 0 ms Beats 100% Memory6.9 MB Beats 61.55%

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int dy[]={1, 0,-1,0};
        int dx[]={0, 1, 0,-1};
        bool vis[19][19]={0};
        int m=matrix.size(),n=matrix[0].size();
        int nowx=0,nowy=0,mod=0;
        int nx=0,ny=0;
        vector<int> ans;
        for(int i=0;i<m*n;i++){//首先循环一开始的新来的一定是可以的
            nowx=nx,nowy=ny;
            vis[nowx][nowy]=1;
            ans.push_back(matrix[nowx][nowy]);
            if(i+1==m*n)break;
            nx=nowx+dx[mod];ny=nowy+dy[mod];
            while(nx<0||nx>=m||ny<0||ny>=n||vis[nx][ny]==1){
                mod=(mod+1)%4;nx=nowx+dx[mod];ny=nowy+dy[mod];
            }
        }
        return ans;
    }
};

55. Jump Game

题意:问能不能从索引0到索引n-1

我的思路

既然是问能不能到到终点,用贪心或者动态规划都可以,上次用了动态规划,这次就贪心吧

注意:记得 if(nums[0]==0&&n!=1)return 0;要特判

代码 Runtime 43 ms Beats 93.40% Memory48.3 MB Beats 74.51%

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int n=nums.size();
        if(nums[0]==0&&n!=1)return 0;
        for(int i=1;i<n-1;i++){
            nums[i]=max(nums[i]+i,nums[i-1]);
            if(nums[i]==i)return 0;
        }
        return 1;
    }
};

56. Merge Intervals

题意:返回重叠部分

我的思路

应该是要维护两端端点的,好像是-1 +1什么的?

做着做着发现这个interval还有start==end,这个-1和+1怎么做??

点的话就找一个bool数组特判吧

代码 Runtime19 ms Beats 99.65% Memory19.2 MB Beats 31.70%

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& in) {
        int vis[10004]={0};int n=in.size();int maxx=0;
        bool fl[10004]={0};//判点
        vector<vector<int>> ans;
        for(int i=0;i<n;i++){
            int st=in[i][0],en=in[i][1];
            maxx=max(maxx,en);
            if(st==en)fl[st]=1;
            else vis[st]++,vis[en]--;
        }
        int st=0,en=0,sum=0;
        int mod=1;//mod1是找正数,找到正数了切换mod-1找负数
        for(int i=0;i<=maxx;i++){
            sum=sum+vis[i];
            if(mod==1&&sum>0){st=i;mod=-mod;}
            else if(mod==-1&&sum==0){
                en=i;mod=-mod;
                ans.push_back({st,en});
            }
            else if(fl[i]&&mod==1){
                ans.push_back({i,i});
            }
        }
        return ans;
    }
};

标答 排序

标答的时间复杂度为O(n+logn)

首先将interval排序,应该是按照覆盖的起点排序,起点从小到大排序

遍历每个覆盖域,首先是第一个覆盖区域,初始化start和end;之后不断地找大的end,直到目前最大的end小于新来的start,这时把起点和重点放到答案列表中,更新起点和终点

代码 Runtime 23 ms Beats 98.10% Memory19 MB Beats 71.5%

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans;
        int n=intervals.size();
        sort(intervals.begin(),intervals.end());
        int start=intervals[0][0];
        int end=intervals[0][1];
        for(int i=1;i<n;i++){
            if(end<intervals[i][0]){
                ans.push_back({start,end});
                start=intervals[i][0];
                end=intervals[i][1];
            }
            else{
                end=max(intervals[i][1],end);
            }
        }
        ans.push_back({start,end});
        return ans;
    }
};

62. Unique Paths

题意:机器人只能向下或者向右走,要从grid[0][0]走到grid[m-1][n-1]

我的思路

好像是组合数?按按计算器看看能不能推出来,没推出来

好像递归也是能够做出来的?不过走楼梯是一维的c[i+1]+c[i+2]得到的?

那么假设c是方案数,就先按照下面这个图建立一个二维数组做?

【看标答,这种方法居然是dp】

代码 Runtime 0 ms Beats 100% Memory6 MB Beats 87.9%

class Solution {
public:
    int uniquePaths(int m, int n) {
        int st[104][104]={0};st[m-1][n-1]=1;
        for(int i=m-1;i>=0;i--)
            for(int j=n-1;j>=0;j--)
                st[i][j]+=(st[i+1][j]+st[i][j+1]);
        return st[0][0];
    }
};

标答 组合数

在这个图上,一共要走m+n-2步,其中有m-1步是向下的,n-1步是向右的,这可以转换成m-1个向下n-1个向右的排序(图源知乎)

代码 Runtime 0 ms Beats 100.00% Memory 6 MB Beats 87.9%

class Solution {
public:
    int uniquePaths(int m, int n) {
        int N = n+m-2; // total steps = n-1 + m-1
        int r = min(n,m)-1; 
// will iterate on the minimum for efficiency = (total) C (min(right, down)
        double res = 1;// compute nCr
        for(int i=1; i<=r; ++i, N--)
            res = res*(N)/i;
        return (int)res;
    }
};

64. Minimum Path Sum

题意:二维地图,只能向下或者向右走,找到所有路径上的最小的值。

我的思路

这个肯定是dp吧;还是相同的道理,但是要注意边缘处理

dp[i][j]=num[i][j]+min(dp[i+1][j],dp[i][j+1])

代码 Runtime 6 ms Beats 88.72% Memory 9.7 MB Beats 89.19%

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

70. Climbing Stairs

题意:爬楼梯,只能走1或2步,问到终点要走多少步

我的思路

n=1,c=1;n=2,c=2;n=3,c=3;c[i]=c[i-1]+c[i-2]

代码 Runtime 0 ms Beats 100% Memory 5.9 MB Beats 94.85%

class Solution {
public:
    int climbStairs(int n) {
        if(n<3) return n;
        int a=1,b=2,c=0;
        for(int i=3;i<=n;i++){
            c=a+b;a=b;b=c;
        }
        return c;
    }
};

72. Edit Distance

题意:三个操作:插入一个字母,删除一个字母,替换一个字母;问从字符串1变成字符串2最少需要多少步?

我的思路

应该是用动态规划

假设

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/888488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在医疗行业数字孪生能做些什么?

数字孪生技术随着发展正在多行业遍地开花&#xff0c;在之前的文章中也为大家介绍过数字孪生的行业应用&#xff0c;今天带大家一起探讨一下数字孪生在医疗行业的表现。其实数字孪生在医疗行业已有很多应用案例&#xff0c;从医疗诊断到手术模拟&#xff0c;再到药物研发&#…

android内存分析工具记录,请利用好最后2个神器

相机见证了java内存暴增和native持续增长的问题&#xff0c;因此这里记录一下使用的工具情况&#xff0c;方便后续继续使用 一、java 内存 如果是java层的内存可以直接借助leakCanary工具&#xff0c;配置也很简单&#xff0c;直接在build.gradle中添加依赖即可&#xff1a; …

Java语言怎么输出有颜色的字符串呢?

在Java中&#xff0c;我们应该如何输出有颜色的文字字符串呢&#xff1f; 目录 一、使用方法 二、举例说明 三、常见的颜色及其对应的ANSI转义序列 一、使用方法 在Java中&#xff0c;可以使用ANSI转义序列来改变输出文本的颜色。 二、举例说明 &#xff08;1&#xff…

【mysql报错解决】MySql.Data.MySqlClient.MySqlException (0x80004005)或1366

场景&#xff1a;c#使用mysql数据库执行数据库迁移&#xff0c;使用了新增inserter的语句&#xff0c;然后报错 报错如下&#xff1a; 1.MySql.Data.MySqlClient.MySqlException (0x80004005): Incorrect string value: ‘\xE6\x9B\xB4\xE6\x94\xB9…’ for column ‘Migratio…

LVS 负载均衡集群

集群 集群&#xff08;Cluster&#xff09;是一组相互连接的计算机或服务器&#xff0c;它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作&#xff0c;提高计算能力、可用性、性能和可伸缩性&#xff0c;适用于大量高并发的场景。 集群…

安科瑞变电所运维平台在电力系统中应用分析

摘要&#xff1a;现代居民生活、工作对电力资源的需求量相对较多&#xff0c;给我国的电力产业带来了良好的发展机遇与挑战。探索电力系统基本构成&#xff0c; 将变电运维安全管理以及相应的设备维护工作系统性开展&#xff0c;能够根据项目实践工作要求&#xff0c;将满足要求…

【讨论】视频监控集中存储方案如何做?

视频监控集中存储是指将多个视频监控摄像头所捕捉到的视频信号集中存储于一个中央设备&#xff0c;这个中央设备可以是服务器、网络存储设备或其他专用设备。通过集中存储&#xff0c;可以避免因为存储设备分散而导致的管理不便和难以有效地管理和检索视频数据&#xff0c;同时…

iTOP-RK3568开发板ubuntu环境下安装Eclipse

eclipse 是使用 Java 语言开发的&#xff0c;一个 Java 应用程序&#xff0c;这意味着 eclipse 只能运行在 Java虚拟机上。倘若没有安装 JDK&#xff08;Java Development Kit&#xff09;&#xff0c;即使在 ubuntu 上安装了 eclipse&#xff0c;也不能运行&#xff0c;所以要…

软文发布问题解答:高效宣传与推广指南

以下是一秒推小编针对软文发布的20个常见问题及回答&#xff1a; 1. 什么是软文&#xff1f; 答&#xff1a;软文是指用文学手法、写作技巧撰写的宣传文章&#xff0c;以实现对特定受众的陈述、说明和推销。 2. 发布软文的目的是什么&#xff1f; 答&#xff1a;发布软文的目…

奥威BI数据可视化工具:360度呈现数据,告别枯燥表格

随着企业数据量的不断增加&#xff0c;如何有效地进行数据分析与决策变得越来越重要。奥威BI数据可视化工具作为一款强大的数据分析工具&#xff0c;在帮助企业深入挖掘数据价值方面具有显著优势。 奥威BI数据可视化工具是一款基于数据仓库技术的数据分析工具&#xff0c;具有…

RTT(RT-Thread)ADC设备(RTT保姆级介绍)

目录 ADC设备 前言 ADC相关参数说明 访问ADC设备 配置ADC设备 ADC实例 硬件设计 软件设计 ADC设备 前言 ADC(Analog-to-Digital Converter) 指模数转换器。是指将连续变化的模拟信号转换为离散的数字信号的器件。 对于ADC的详细介绍和在STM32中的裸机应用可参考以下…

C语言暑假刷题冲刺篇——day2

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…

基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 2.1 OFDM原理 2.2 64QAM调制 2.3 载波同步 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................…

图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

首先找到明星数据 可以看到有一个sheet1,是,记录了所有的关系的数据 然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据 然后这个是构建的CQL语句 首先我们先去启动服务 neo4j console 然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节点的属性

RTT(RT-Thread)IIC设备

目录 IIC设备 IIC介绍 电气连接 IIC总线时序 IIC协议 读协议 写协议 访问I2C总线设备 查找 I2C 总线设备 I2C数据读写&#xff08;数据传输&#xff09; 配置IIC步骤 IIC设备 IIC介绍 I2C&#xff08;Inter Integrated Circuit&#xff09;总线是 PHILIPS 公司开发…

【vue3】对axios进行封装,方便更改路由并且可以改成局域网ip访问(附代码)

对axios封装是在main.js里面进行封装&#xff0c;因为main.js是一个vue项目的入口 步骤&#xff1a; 在1处创建一个axios实例为http&#xff0c;baseURL是基础地址&#xff08;根据自己的需求写&#xff09;&#xff0c;写了这个在vue界面调用后端接口时只用在post请求处写路由…

【Git】(三)回退版本

1、git reset命令 1.1 回退至上一个版本 git reset --hard HEAD^ 1.2 将本地的状态回退到和远程的一样 git reset --hard origin/master 注意&#xff1a;谨慎使用 –-hard 参数&#xff0c;它会删除回退点之前的所有信息。HEAD 说明&#xff1a;HEAD 表示当前版本HEAD^ 上…

深入探究Linux黑客渗透测试:方法、工具与防御

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 引言 随着信息技术的迅…

【idea工具报错】程序包sun.misc不存在 的问题如何解决

【idea工具报错】程序包sun.misc不存在 的问题如何解决 idea工具出现下面这个报错 &#xff1a; java: 程序包sun.misc不存在 赤裸裸的报错&#xff0c;但是idea在编译代码 build的时候就报上面这个错误。 先说我的解决办法吧&#xff1a; 上面第3步这里全部改成jdk1.8的配置…

数据血缘深度透析

学习数据血缘也好几个月了&#xff0c;网上的资料也看了很多&#xff0c;有了一些自己的理解&#xff0c;所以归纳一下&#xff0c;分享 出来&#xff0c;欢迎批评指正&#xff01; 数据血缘是什么&#xff1f; 我觉得刚开始学习数据血缘肯定会有这样一个问题。比较官方、比较…