LeetCode刷題總結101 150

2021-09-13 09:36:58 字數 3346 閱讀 5185

思路:

分析到此題並不是簡單的把乙個結點劃分為左右子樹就可以的,因而使用遞迴時必定需要重新定義乙個函式,函式的引數即為需要比較的兩個樹,該樹的特徵即a的左子樹與b的右子樹相同,同理a的右子樹與b的左子樹相同,此時即為true。

需要注意的一點是,分析好邏輯關係,如下:

if(lf==null&&rt==null)

return true;

if((lf==null&&rt!=null)||(rt==null&&lf!=null))

return false;

if(lf->val!=rt->val)

return false;

邏輯不能錯誤,即三個if語句的順序不能顛倒。

該題較為簡單,問題在於怎麼簡化。

常規方法兩層迴圈的情況下,就算剪枝了也達不到很好的效果,因此我們使用一層迴圈來做。

一層迴圈思路如下:

遍歷陣列,記錄min,並定義max=price[i]-min,此時max即為最大差值。

該題最直觀也是最高效的方法即為把收益圖畫出來,可以證明第i個點到第j個點的直接漲幅一定小於等於i到j的斷續漲幅之和,故我們只要每次累積求和兩連續點之間的增幅即可,o(n)複雜度。

思路:

乙個最容易想到的方法就是對字串一次變數,篩選出不是alphanumeric characters的字元並刪去,另外對於大寫字元我們轉換成小寫字元,最後對處理後的字串我們反轉它並與原來的字串去做比較即可。

知識點

isalpha(s[i])、isdigit(s[i])、isupper(s[i])分別判斷該字元是否為字母、數字、大寫字母;

tolower()將字元轉化成小寫字母

string類中的刪除方法:s.erase(pos,n),即從pos處刪除字元s中長為n的子串,並返回修改後的string物件引用。注意,刪除時s.size()的大小也發生變化,需要對下標進行處理才能正常使用。

可以使用異或的解法,關於異或操作有以下性質:

因而我們只需要一次遍歷,設初值為0,累積求異或即可。

此題為單鏈表插入排序的模擬,我們新建乙個單鏈表,為了規範,依舊使用帶頭結點的單鏈表。注意,結點的使用需要重新定義,不能定義臨時結點為外部變數,應設定為區域性變數,當不用時下一次重新初始化簡單的更新會錯誤覆蓋,即指標位址被錯誤更改)。

/**

* definition for singly-linked list.

* struct listnode

* }listnode;

*/class solution

else

// 插在t之後

listnode* cur=new listnode

(p->val)

; cur->next=t->next;

t->next=cur;

// temp->val=p->val; //該種寫法不對,會被錯誤覆蓋

注意一些細節的處理,以及運算元的前後順序

class solution 

for(

int j=

0;j.size()

;j++

) temp=temp*flag;if(

isdigit

(tokens[i][0

]))// 運算元則壓入棧中

stack1.

push

(temp)

;// 操作符則取棧頂的兩個元素

else

stack1.

push

(ans);}

}return stack1.

top();}};

LeetCode 劍指offer刷題10 1

leetcode 劍指offer刷題 劍指 offer 10 i.斐波那契數列 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...

LeetCode刷題總結

123 4567 891011 12 元素交換 swap a 1 a 3 sort排序 sort a.begin a.end 陣列顛倒 reverse a.begin a.end 陣列元素置為0 memset a,0,a.size 陣列取值 a.push back 定義二維陣列 vector vec...