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

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-1int r = min(n,m)-1; 
// will iterate on the minimum for efficiency = (total) C (min(right, down)double res = 1;// compute nCrfor(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最少需要多少步?

我的思路

(因为之前没保存,就只贴图片了) 

标答 动态规划

如果word1[0..i-1)+word2[j-1]=word2[0..j),要在i中插入word2[j-1],所以dp[i][j]=dp[i][j-1]+1

Q:为什么是dp[i][j]=dp[i][j-1]+1?

        因为word1[0..i-1)+word2[j-1]=word1[0..i)=word2[0..j),有word2[0..j)之前先有word2[0..j-1)所以知道了word1[0..i-1)如何转换成word2[0..j-1),因此word1[0..i)转换为word2[0..j)就是在word1[0..i-1)上增加了一步操作

 所以当word1[i - 1] != word2[j - 1]时,从三种操作中找出最小的那个

代码 Runtime 23 ms Beats 32.61% Memory7.3 MB Beats 81.80%(ON^2)

class Solution {
public:int minDistance(string word1, string word2) {int m=word1.size(), n=word2.size();int dp[505][505]={0};for(int i=1;i<=m;i++)dp[i][0]=i;//注意初始化的范围for(int i=1;i<=n;i++)dp[0][i]=i;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(word1[i-1]==word2[j-1])dp[i][j]=dp[i-1][j-1];//注意这里的等于号elsedp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1])+1;}}return dp[m][n];}
};

接下来把二维数组改成一维数组,从上面的代码可以看到,只需要dp[i - 1][j - 1]dp[i][j - 1] 和 dp[i - 1][j],所以可以用pre数组来代替dp[i-1]

class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size();vector<int> pre(n + 1, 0), cur(n + 1, 0);for (int j = 1; j <= n; j++) {//因为是dp[i-1]的初始化,所以长度为word2的长度pre[j] = j;}for (int i = 1; i <= m; i++) {cur[0] = i;for (int j = 1; j <= n; j++) {if (word1[i - 1] == word2[j - 1]) {cur[j] = pre[j - 1];} else {cur[j] = min(pre[j - 1], min(cur[j - 1], pre[j])) + 1;}}fill(pre.begin(), pre.end(), 0);swap(pre, cur);}return pre[n];}
};

最后可以直接将pre数组省略成pre

!代码 Runtime 7 ms Beats 90.23% Memory 6.3 MB Beats 97.78%

class Solution {
public:int minDistance(string word1, string word2) {int m = word1.size(), n = word2.size(), pre;vector<int> cur(n + 1, 0);for (int j = 1; j <= n; j++) //初始化cur[j] = j;for (int i = 1; i <= m; i++) {pre = cur[0];cur[0] = i;for (int j = 1; j <= n; j++) {int temp = cur[j];if (word1[i-1] == word2[j-1])cur[j] = pre;else cur[j] = min(pre, min(cur[j - 1], cur[j])) + 1;pre = temp;}}return cur[n];}
};

73. Set Matrix Zeroes

题意:set its entire row and column to 0

我的思路

方案一 创建一个vis用来记录0,之后按照vis来修改,空间是O(mn)【这肯定做得出来】

方案二 设计一个创建一个长为n行的数组a,长为m的数组b;a记录下0在哪几行出现,b记录一下0在哪几列出现,之后修改,空间 Om+n 同时也符合"devise a constant space solution"

代码 Runtime 12 ms Beats 80.19% Memory13.3 MB Beats 74.42%

class Solution {
public:void setZeroes(vector<vector<int>>& ma) {int m=ma.size(),n=ma[0].size();bool a[204]={0};bool b[204]={0};for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(ma[i][j]==0){a[i]=1,b[j]=1;}}}for(int i=0;i<m;i++)for(int j=0;j<n;j++)if(a[i]||b[j]) ma[i][j]=0;return ;}
};

标答 O(1)空间复杂度

先把行全部处理了,之后再把列全部处理了

首先遍历行

代码 Runtime 3 ms Beats 99.86% Memory13.3 MB Beats 45.87%

void setZeroes(vector<vector<int> > &matrix) {int col0 = 1, rows = matrix.size(), cols = matrix[0].size();for (int i = 0; i < rows; i++) {if (matrix[i][0] == 0) col0 = 0;for (int j = 1; j < cols; j++)if (matrix[i][j] == 0)matrix[i][0] = matrix[0][j] = 0;}for (int i = rows - 1; i >= 0; i--) {for (int j = cols - 1; j >= 1; j--)if (matrix[i][0] == 0 || matrix[0][j] == 0)matrix[i][j] = 0;if (col0 == 0) matrix[i][0] = 0;}
}

 

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

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

相关文章

XDR解决方案成为了新的安全趋势

和当今指数倍增长的安全数据相比&#xff0c;安全人才的短缺带来了潜在的风险。几乎所有的公司&#xff0c;无论规模大小&#xff0c;在安全资源能力上都有限&#xff0c;需要过滤各种告警才能将分析量保持在可接受范围。但这样一来&#xff0c;潜在的威胁线索就可能被埋没&…

docker的资源控制管理——Cgroups

目录 一、对CPU使用率的控制 1.1 CPU 资源控制 1.2 cgroups有四大功能 1.3 设置cpu使用率上限 查看周期限制和cpu配额限制 进行cpu压力测试然后修改每个周期的使用cpu的时间&#xff0c;查看cpu使用率 1.4 设置cpu资源占用比&#xff08;设置多个容器时才有效&#xf…

跨境外贸业务,选择动态IP还是静态IP?

在跨境业务中&#xff0c;代理IP是一个关键工具。它们提供了匿名的盾牌&#xff0c;有助于克服网络服务器针对数据提取设置的限制。无论你是需要经营管理跨境电商店铺、社交平台广告投放&#xff0c;还是独立站SEO优化&#xff0c;代理IP都可以让你的业务程度更加丝滑&#xff…

Linux命令 -- vim

Linux命令 -- vim 前言一般模式光标移动复制粘贴内容查找 底线命令行模式 前言 用vim指令进入文件。 刚进入时是命令行模式&#xff0c;也叫一般模式。 按i或者insert进入编辑模式&#xff0c;此时可以编辑文件内容。 按esc可从编辑模式退回到一般模式&#xff0c;输入冒号进…

基于 spring boot 的动漫信息管理系统【源码在文末】

半山腰总是最挤的&#xff0c;你得去山顶看看 大学生嘛&#xff0c;论文写不出&#xff0c;代码搞不懂不要紧&#xff0c;重要的是&#xff0c;从这一刻就开始学习&#xff0c;立刻马上&#xff01; 今天带来的是最新的选题&#xff0c;基于 spring boot 框架的动漫信息管理系…

Linux系统安装Google Chrome

1.进入谷歌浏览器官网 Google Chrome - Download the Fast, Secure Browser from GoogleGet more done with the new Google Chrome. A more simple, secure, and faster web browser than ever, with Google’s smarts built-in. Download now.http://www.google.cn/intl/en_…

Azure如何启用网络观察应用程序

文章目录 基础概念介绍实操 基础概念介绍 Azure中的网络观察应用程序是一种用于监视和诊断Azure网络的工具。它提供了一种集中管理和监控网络流量、连接性和性能的方式。网络观察应用程序能够提供网络流量分析、连接监视、性能监视和故障诊断等功能&#xff0c;用于帮助管理员…

K8S核心组件etcd详解(下)

1 k8s如何使用etcd 在k8s中所有对象的manifest都需要保存到某个地方&#xff0c;这样他们的manifest在api server重启和失败的时候才不会丢失。 只有api server能访问etcd&#xff0c;其它组件只能间接访问etcd的好处是 增强乐观锁系统及验证系统的健壮性 方便后续存储的替换…

使用 BERT 进行文本分类 (01/3)

摄影&#xff1a;Max Chen on Unsplash 一、说明 这是使用 BERT 语言模型的一系列文本分类演示的第一部分。以文本的分类作为例&#xff0c;演示它们的调用过程。 二、什么是伯特&#xff1f; BERT 代表 来自变压器的双向编码器表示。 首先&#xff0c;转换器是一种深度学习模…

SpringBoot 操作Redis、创建Redis文件夹、遍历Redis文件夹

文章目录 前言依赖连接 RedisRedis 配置文件Redis 工具类操作 Redis创建 Redis 文件夹查询数据遍历 Redis 文件夹 前言 Redis 是一种高性能的键值存储数据库&#xff0c;支持网络、可基于内存亦可持久化的日志型&#xff0c;而 Spring Boot 是一个简化了开发过程的 Java 框架。…

【TA 挖坑02】RayMarching SDF 物体黏合

写在前面 由于实习和忙着论文很久没经营博客了&#xff0c;最近以各种方式收集到了一些想实现的效果&#xff0c;其中一个就是卡通云融合、变大变小、聚散收拢的效果如何实现的问题&#xff0c;这就不得不提搁置了很久的RayMarching... 挖坑&#xff01;整理一下有帮助的文章…

AWS WAF实战、优势对比和缺陷解决

文章目录 挑战和目标AWS WAF的优势AWS WAF的不足我是怎么做的?什么是比较好的AWS WAF设计? 笔者为了解决公司Web站点防御性问题&#xff0c;较为深入的研究AWS WAF的相关规则。面对上千万的冲突&#xff0c;笔者不得设计出一种能漂亮处理冲突数据WAF规则。 AWS WAF开发人员在…

微服务08-多级缓存

1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分…

卷积操作后特征图尺寸,感受野,参数量的计算

文章目录 1、输出特征图的尺寸大小2、感受野的计算3、卷积核的参数量 1、输出特征图的尺寸大小 如果包含空洞卷积&#xff0c;即扩张率dilation rate不为1时&#xff1a; 2、感受野的计算 例如&#xff0c;图像经过两个3*3&#xff0c;步长为2的卷积后感受野为&#xff1a; co…

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…

在Gazebo中添加悬浮模型后,利用键盘控制其移动方法

前段时间写了文章&#xff0c;通过修改sdf、urdf模型的方法&#xff0c;在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落&#xff1a;在Gazebo中添加悬浮模型方法 / Gazebo中模型如何不因重力下落&#xff1a;修改sdf、urdf模型_sagima_sdu的博客-CSDN博客 今天讲…

Leetcode32 最长有效括号

给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 代码如下&#xff1a; class Solution {public int longestValidParentheses(String str) {Stack<Integer> s new Stack<>();int res 0;int st…

GrapeCity Documents for Excel, Java Edition Crack

GrapeCity Documents for Excel, Java Edition Crack 增加了对SpreadJS.sjs文件格式的支持&#xff1a; 更快地将大型Microsoft Excel文件转换为.sjs格式。 使用较小的占用空间保存导出的文件。 将Excel/SpreadJS功能导入SpreadJS/从SpreadJS导出。 从.sjs文件中压缩的JSON文件…

JVM——JDK 监控和故障处理工具总结

文章目录 JDK 命令行工具jps:查看所有 Java 进程jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整虚拟机各项参数jmap:生成堆转储快照**jhat**: 分析 heapdump 文件**jstack** :生成虚拟机当前时刻的线程快照 JDK 可视化分析工具JConsole:Java 监视与管理控制台连接…

手撕单链表

目录 链表的概念和结构 单链表的实现 申请新结点 打印 尾插 头插 尾删 头删 ​编辑 查找 在pos位置前插入元素 在pos位置后插入元素 删除pos位置的元素 删除pos位置之后的位置的元素​编辑 完整代码 SListNode.h SListNode.c 链表的概念和结构 链表是一种物理存储…