代碼隨想錄算法訓練營第二天| 977.有序數(shù)組的平方 ,209.長度最小的子數(shù)組 ,59.螺旋矩陣II

LeetCode977

想到了兩種解法

(1)排序后平方,過于簡單,不在此贅述

(2)雙指針法:根據(jù)題意,平方后最大的數(shù)一定在數(shù)組的兩端

故slowIndex初始下標為0,fastIndex初始下標為nums.size() - 1。比較兩指針對應數(shù)據(jù)的平方大小,

取較大的值,存入res末端。同時更新較大值對應的Index

程序:

class?Solution?{

public:

????vector<int>?sortedSquares(vector<int>&?nums)?{

????????vector<int>?res(nums.size(),0);

????????int?k?=?nums.size()?-?1;

????????int?slowIndex?=?0;

????????int?fastIndex?=?nums.size()?-?1;

????????while(slowIndex?<=?fastIndex){

????????????if(nums[slowIndex]?*?nums[slowIndex]?<?nums[fastIndex]?*?nums[fastIndex]){

????????????????res[k--]?=?nums[fastIndex]?*?nums[fastIndex];

????????????????fastIndex--;

????????????}

????????????else{

????????????????res[k--]?=?nums[slowIndex]?*?nums[slowIndex];

????????????????slowIndex++;

????????????}

????????}

????????return?res;

????}

};


LeetCode209

思路:滑動窗口法

個人理解滑動窗口與雙指針法大同小異,都使用兩個指針不斷更新區(qū)域,查找滿足條件的區(qū)域。

解法如下:

另slowIndex = 0;fastIndex = 0;

首先更新fastIndex,使得slowIndex-fastIndex區(qū)間內(nèi)的值求和大于等于tar,滿足上述條件時計算區(qū)域長度,

同時將slowIndex前移,更新sum值,并將區(qū)域長度與其他滿足條件的長度作對比,取最小的區(qū)間長度返回

程序:

class?Solution?{

public:

????int?minSubArrayLen(int?target,?vector<int>&?nums)?{

????????int?sum?=?0;

????????int?slowIndex?=?0;

????????int?len?=?0;

????????int?res?=?INT32_MAX;

????????for(int?fastIndex?=?0;?fastIndex?<?nums.size();?fastIndex++){

????????????sum?+=?nums[fastIndex];

????????????while(sum?>=?target){

????????????????len?=?fastIndex?-?slowIndex?+?1;

????????????????sum?-=?nums[slowIndex++];

????????????????res?=?res?<?len???res?:?len;

????????????}

????????}

????????return?res?==?INT32_MAX???0?:?res;

????}

};


LeetCode59

思路:注意每次填充的區(qū)間固定,與循環(huán)不變量類似。

不同的n會有不同的圈數(shù),定義loop = n / 2,當n為奇數(shù),需要單獨填充中心點。定義每次填充區(qū)間為行/列首填充,

尾不填充,即[ ),先填充外圈,再填充內(nèi)圈。

程序:

class?Solution?{

public:

????vector<vector<int>>?generateMatrix(int?n)?{

????????vector<vector<int>>?result(n,vector<int>(n,0));

????????int?loop?=?n?/?2;

????????int?startx,?starty?=?0;

????????int?count?=?1;

????????int?offset?=?1;

????????int?i,j;

????????int?mid?=?n?/?2;

????????while(loop--){

????????????i?=?startx;

????????????j?=?starty;

????????????for(;j?<?n?-?offset;?j++)

????????????????result[startx][j]?=?count++;

????????????for(;i?<?n?-?offset;?i++)

????????????????result[i][j]?=?count++;

????????????for(;j?>?starty;?j--)

????????????????result[i][j]?=?count++;

????????????for(;i?>?startx;?i--)

????????????????result[i][j]?=?count++;

????????????startx++;

????????????starty++;

????????????offset++;

????????}

????????if(n?%?2)???result[mid][mid]?=?count;

????????return?result;

????}

};


總結(jié):螺旋矩陣較為復雜,但是只需遵守循環(huán)不變量就可解決,注意內(nèi)圈循環(huán)時的起始終止位置需做變化,可模擬內(nèi)圈循環(huán)過程便于理解。其余難度適中,學習時間3h

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容