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.pswp.cn/news/41293.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41293.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41293.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

XDR解決方案成為了新的安全趨勢

和當今指數倍增長的安全數據相比&#xff0c;安全人才的短缺帶來了潛在的風險。幾乎所有的公司&#xff0c;無論規模大小&#xff0c;在安全資源能力上都有限&#xff0c;需要過濾各種告警才能將分析量保持在可接受范圍。但這樣一來&#xff0c;潛在的威脅線索就可能被埋沒&…

LeetCode 0023. 合并 K 個升序鏈表

【LetMeFly】23.合并 K 個升序鏈表 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/merge-k-sorted-lists/ 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合并到一個升序鏈表中&#xff0c;返回合并后的鏈表。 示例 1&#xff1a; 輸入&…

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_…

神經網絡基礎-神經網絡補充概念-50-學習率衰減

概念 學習率衰減&#xff08;Learning Rate Decay&#xff09;是一種優化算法&#xff0c;在訓練深度學習模型時逐漸減小學習率&#xff0c;以便在訓練的后期更加穩定地收斂到最優解。學習率衰減可以幫助在訓練初期更快地靠近最優解&#xff0c;而在接近最優解時減小學習率可以…

給wordpress添加關鍵詞與描述

Wordpress網站的關鍵字及網頁描述關系網站對搜索引擎的友好程度&#xff0c;如果自己手動加顯然太折騰了&#xff0c;那如何讓WordPress博客自動為每篇文章自動關鍵字及網頁描述。每篇文章的內容不同&#xff0c;我們該如何讓wordpress自動添加文章描述和關鍵詞呢&#xff1f;下…

Azure如何啟用網絡觀察應用程序

文章目錄 基礎概念介紹實操 基礎概念介紹 Azure中的網絡觀察應用程序是一種用于監視和診斷Azure網絡的工具。它提供了一種集中管理和監控網絡流量、連接性和性能的方式。網絡觀察應用程序能夠提供網絡流量分析、連接監視、性能監視和故障診斷等功能&#xff0c;用于幫助管理員…

K8S核心組件etcd詳解(下)

1 k8s如何使用etcd 在k8s中所有對象的manifest都需要保存到某個地方&#xff0c;這樣他們的manifest在api server重啟和失敗的時候才不會丟失。 只有api server能訪問etcd&#xff0c;其它組件只能間接訪問etcd的好處是 增強樂觀鎖系統及驗證系統的健壯性 方便后續存儲的替換…

神經網絡基礎-神經網絡補充概念-43-梯度下降法

概念 梯度下降法&#xff08;Gradient Descent&#xff09;是一種優化算法&#xff0c;用于在機器學習和深度學習中最小化&#xff08;或最大化&#xff09;目標函數。它通過迭代地調整模型參數&#xff0c;沿著梯度方向更新參數&#xff0c;以逐步接近目標函數的最優解。梯度…

使用 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開發人員在…

Cocos2d 項目問題記錄

環境搭建 正常運行 Android 端的 Cocos2d 項目&#xff0c;本機至少需要 Android SDK、NDK 環境、Android Studio 項目報錯總結 CMake Error: CMake was unable to find a build program corresponding to "Ninja" 默認創建工程的 gradle.tools 版本為 3.1.0&…

微服務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…