做題,實(shí)際寫(xiě)出例子,然后分析可能遇到的情況,慢慢的,思路就會(huì)出來(lái)了。
線性表
33. Search in Rotated Sorted Array
這道題,不同于二分查找法在于,不能確定,中點(diǎn)一定是大于左端點(diǎn)的。所以,在進(jìn)行二分查找時(shí),需要多一步,即,先判斷中點(diǎn)是否大于左端點(diǎn)。
如果中點(diǎn)大于左端,再去比較三個(gè)點(diǎn),才可以按照二分邊界賦值。
如果中點(diǎn)小于左端,再去比較三個(gè)點(diǎn),再按照二分邊界賦值。
15. 3Sum
參考2SUM/3SUM/4SUM問(wèn)題
解決方法就是最外層遍歷一遍,等于選出一個(gè)數(shù),
之后的數(shù)組中轉(zhuǎn)化為找和為target-nums[i]的2SUM問(wèn)題。
16. 3Sum closest
所以我們需要定義一個(gè)變量diff用來(lái)記錄差的絕對(duì)值,然后我們還是要先將數(shù)組排個(gè)序,然后開(kāi)始遍歷數(shù)組,思路跟那道三數(shù)之和很相似,都是先確定一個(gè)數(shù),然后用兩個(gè)指針left和right來(lái)滑動(dòng)尋找另外兩個(gè)數(shù),每確定兩個(gè)數(shù),我們求出此三數(shù)之和,然后算和給定值的差的絕對(duì)值存在newDiff中,然后和diff比較并更新diff和結(jié)果closest即可,
31、next_permutation
參考[算法]——全排列(Permutation)以及next_permutation
其中,舉出例子,然后一點(diǎn)點(diǎn)的去試,然后根據(jù)試出的步驟,寫(xiě)代碼即可。
[6、5、4、8、7、5、1]
- 1,1和5替換,沒(méi)有效果,那么1和7替換也沒(méi)有效果,再往前,比1大的都沒(méi)有效果。
- 2,從上面也能看出,5替換的話,一直到8,也沒(méi)有效果。
- 3,4替換8有效果,但是為了找到最小的下一個(gè)全排列,所以,應(yīng)該讓4和后面的8-5中,最小的替換。
- 4、替換完事之后,發(fā)現(xiàn)變成了6558741,最后四位是降序的,不滿足條件。6551478才滿足條件,于是可以將后面的反轉(zhuǎn)。
- 5、一開(kāi)始就是降序的話,那么直接反轉(zhuǎn)即可。
但是如果一個(gè)一個(gè)比較的話比較麻煩,可以看出,我們是從后面找起,找到不是降序的子數(shù)列為止。有一個(gè)方法,從后向前查找第一個(gè)相鄰元素對(duì)(i,j),并且滿足A[i] < A[j]。易知,此時(shí)從j到end必然是降序??梢杂梅醋C法證明。于是編程時(shí),可以用這個(gè),直接從第三步走起。
60、Permutation Sequence
36、有效數(shù)獨(dú)
48. Rotate Image
在原地修改,是可以利用tmp等變量來(lái)進(jìn)行修改的。
73. Set Matrix Zeroes
- 1、最原始的,是用O(m*n)的時(shí)間復(fù)雜度,再建立一個(gè)新的矩陣,一個(gè)數(shù)一個(gè)數(shù)的讀,一行一行的掃進(jìn)去,遇到0 ,就把新的矩陣改行設(shè)置為0 。再一列一列的掃
- 2、將時(shí)間降到O(m+n),可以用兩個(gè)數(shù)組,一個(gè)m維數(shù)組記錄哪一行有0 ,一個(gè)n維數(shù)組記錄哪一列有0。(in方法判斷)最后更新
- 3、但是要求空間復(fù)雜度為O(1),不能用額外的空間。所以想到,用第一行,第一列存儲(chǔ)。
- 4、但是,第一行第一列的數(shù)值也要保證不能變(除非改行有0)。按照下面的邏輯。
主要是更新順序
- 先掃描第一行第一列,如果有0,則將各自的flag設(shè)置為true(最后再更新。)
- 然后掃描除去第一行第一列的整個(gè)數(shù)組,如果有0,則將對(duì)應(yīng)的第一行和第一列的數(shù)字賦0
- 再次遍歷除去第一行第一列的整個(gè)數(shù)組,如果對(duì)應(yīng)的第一行和第一列的數(shù)字有一個(gè)為0,則將當(dāng)前值賦0
- 最后根據(jù)第一行第一列的flag來(lái)更新第一行第一列
136. Single Number
每次一個(gè)元素進(jìn)行異或,0和5異或返回5.....
86. Partition List
單鏈表
61. Rotate List
- k是可以大于n的,所以需要對(duì)n取余數(shù)
- 倒著往回?cái)?shù),快慢指針,快的先走k步,然后慢的再走
字符串
125、有效回文
一般情況下做法:建立兩個(gè)指針,左右相比較
對(duì)于不是字母的字符串,用list[l].isalnum()來(lái)判斷真假,while循環(huán)跳過(guò)去就行
特殊情況,字符串是[]空。
幾乎所有的題,都要考慮這個(gè)情況,對(duì)于字符串是空,對(duì)于鏈表一類(lèi)的可能只有一個(gè)node??傊?,考慮極端情況是對(duì)的。
5. Longest Palindromic Substring
參考 Longest palindromic substring 最長(zhǎng)回文子串
棧
20、有效括號(hào)
問(wèn)題的思路分析,即能夠通過(guò)在字符間插入特定數(shù)目的豎線,使得整個(gè)字符串各個(gè)局部都對(duì)稱(chēng)。由這句話,局部對(duì)稱(chēng)來(lái)引入棧,
考慮到棧中可以通過(guò)一進(jìn)一出,兩進(jìn)兩出的類(lèi)似對(duì)稱(chēng)。所以,可以用棧來(lái)解決此問(wèn)題。
代碼思路:
step1:初始化棧,并入棧輸入串的第一個(gè)字符;
step2: 從輸入串的第二個(gè)字符到最后一個(gè)字符,依次與棧頂元素對(duì)比,棧不為空且棧頂元素與字符匹配則出棧,否則入棧該字符;
Step3: 操作完最后一個(gè)字符后,如果棧為空(即有進(jìn)必有出,各個(gè)局部均對(duì)稱(chēng)),則輸入合法;
另外,可以用list的append和pop方法來(lái)近似的構(gòu)造出一個(gè)棧的數(shù)據(jù)結(jié)構(gòu)。
若出現(xiàn)右邊的括號(hào)類(lèi)型,那么為了valid,上一個(gè)壓入棧中的一定是這個(gè)括號(hào)的左邊類(lèi)型。
即,如果出現(xiàn)了“)”,那么棧最上面的一定是“(”才行??梢杂纱诉M(jìn)行判斷。
32、最大有效括號(hào)的長(zhǎng)度longest parenthses
此算法, 用“(”的索引來(lái)進(jìn)行壓棧,入棧操作。是因?yàn)椋枰?jì)算合法括號(hào)字符的長(zhǎng)度,用數(shù)字運(yùn)算比較方便。
這個(gè)和有效括號(hào)有些不同,這個(gè)
- 1、原則1,就是,棧中只會(huì)存放左邊括號(hào)的符號(hào)“(”位置索引。這是利用了括號(hào)有效的必要條件的特性,下面會(huì)把這些情況都解釋一下。
- 2、這里的棧存放的不再是“(”,而是此符號(hào)的位置索引了。(當(dāng)然也可以用兩個(gè)棧,一個(gè)存放“(”,一個(gè)存放位置索引。沒(méi)必要而已。)
接下來(lái)是代碼思路:
參考longest parenthses
每次來(lái)了‘(’之后,無(wú)條件壓棧。
用“)”進(jìn)行消除,有這幾種情況需要考慮。
首先就是“))()”這樣的,即,碰到頭兩個(gè)右括號(hào)時(shí),棧為空,那么一定不是合法的了,可以跳過(guò)。
然后就是“((())()”,此時(shí)碰到了第一個(gè)“)”時(shí),消掉最上面的左括號(hào),然后接下來(lái)是第二個(gè)“)”,可以再次消掉棧最上面的左括號(hào),然后碰到“(” ,直接入棧,然后繼續(xù)碰到“)”,再次消掉。
直到“)”用完為止或者棧為空為止。下面依次解釋這兩種情況。
1、“)”用完了。棧內(nèi)還有剩余的‘(’。如上例:
此時(shí)棧里還剩一個(gè)“(”沒(méi)有消掉,而“)”已經(jīng)沒(méi)有了。那么此時(shí)這個(gè)有效括號(hào)的長(zhǎng)度就是當(dāng)前“)”的索引減去棧頂“(”的索引值。對(duì)應(yīng)到例子上就是,6-0=6。
然后再與前面已有的合法長(zhǎng)度進(jìn)行比較。maxLength = Math.max(i - (int)stack.peek() , maxLength)2、')'沒(méi)用完,??樟?br> 此時(shí)需要引入一個(gè)新的變量start,用于表示新的合法括號(hào)字符串的起點(diǎn)。
例如:對(duì)于這種情況:())()(),可以正確的得出最大值為4。
start初始為-1,之后每次碰到‘)’且棧為空的時(shí)候更新為當(dāng)前‘)’的index。
比如上例中, start就為第二個(gè)“)”的index,表示新的合法字符串起點(diǎn)為3.3、一直循環(huán)就是了。
此算法, 用“(”的索引來(lái)進(jìn)行壓棧,入棧操作。是因?yàn)?,需要?jì)算合法括號(hào)字符的長(zhǎng)度,用數(shù)字運(yùn)算比較方便。
樹(shù)
144、二叉樹(shù)前序遍歷
注意,樹(shù)中的node并不是一個(gè)int類(lèi)型的數(shù)字。這個(gè)node具有屬性的。分別是node.val,node.left 和 node.right。分別代表著這個(gè)node的值,左子節(jié)點(diǎn)和右子節(jié)點(diǎn)。
所以,壓入棧中的,也是node,而不是node.val。
此題要求不能用遞歸的方法前序遍歷二叉樹(shù)。
想到前序遍歷的路徑,一直讀入最左邊的葉節(jié)點(diǎn),然后退回父節(jié)點(diǎn)接著讀父節(jié)點(diǎn)的右子節(jié)點(diǎn)(注意此時(shí)父節(jié)點(diǎn)已經(jīng)被讀取過(guò)了),和棧有些相似。于是想到用棧來(lái)解決問(wèn)題。
(最好畫(huà)個(gè)圖,來(lái)分析循環(huán)的步驟。)
題中已經(jīng)給出,節(jié)點(diǎn)具有的三個(gè)屬性。
root作為根節(jié)點(diǎn)
令棧為空
- 1、讀入節(jié)點(diǎn)1,如果1有左子節(jié)點(diǎn),就繼續(xù)遍歷入棧,一直入棧到底(此時(shí),棧里壓入一個(gè)元素,list就append一個(gè)元素。)
- 2、彈棧,彈出一個(gè)元素,就檢測(cè)該元素是否有右子節(jié)點(diǎn)。即root.right是否為空。若不為空,就遍歷壓入棧中。
- 彈出5,沒(méi)有左右子節(jié)點(diǎn),繼續(xù)彈棧,1彈出后,有右子節(jié)點(diǎn),于是按照上面步驟壓入棧中。
- 4、一直循環(huán)到,節(jié)點(diǎn)為空,棧為空為止。
list_num= []
stack = []
while root or stack:
if root:
list_num.appent(root)
stack.append(root)
root = root.left
else:
stack.pop()
root = root.right
return list_num
逐層返回二叉樹(shù)
參考# Binary Tree Level Order Traversal 二叉樹(shù)層序遍歷
層序遍歷二叉樹(shù)是典型的廣度優(yōu)先搜索BFS的應(yīng)用,但是這里稍微復(fù)雜一點(diǎn)的是,我們要把各個(gè)層的數(shù)分開(kāi),存到一個(gè)二維向量里面,大體思路還是基本相同的,建立一個(gè)queue,然后先把根節(jié)點(diǎn)放進(jìn)去,這時(shí)候找根節(jié)點(diǎn)的左右兩個(gè)子節(jié)點(diǎn),這時(shí)候去掉根節(jié)點(diǎn),此時(shí)queue里的元素就是下一層的所有節(jié)點(diǎn),用一個(gè)for循環(huán)遍歷它們,然后存到一個(gè)一維向量里,遍歷完之后再把這個(gè)一維向量存到二維向量里,以此類(lèi)推,可以完成層序遍歷。代碼如下:
第二版本:
形,不同之處在于一行是從左到右遍歷,下一行是從右往左遍歷,交叉往返的之字形的層序遍歷。根據(jù)其特點(diǎn)我們用到棧的后進(jìn)先出的特點(diǎn),這道題我們維護(hù)兩個(gè)棧,相鄰兩行分別存到兩個(gè)棧中,進(jìn)棧的順序也不相同,一個(gè)棧是先進(jìn)左子結(jié)點(diǎn)然后右子節(jié)點(diǎn),另一個(gè)棧是先進(jìn)右子節(jié)點(diǎn)然后左子結(jié)點(diǎn),這樣出棧的順序就是我們想要的之字形了,代碼如下:
101 對(duì)稱(chēng)樹(shù)
class Solution:
# @param root, a tree node
# @return a boolean
def isSymmetric(self, root):
# a new recursive function to check if two tree are symetric
def isMirror(root1,root2):
# they all could be Null to be symetric
if not root1 and not root2:
return True
# if they are not Null, they must carry the same value
elif (root1 and root2) and root1.val==root2.val:
# recursively call itself
return isMirror(root1.left,root2.right) and isMirror(root1.right, root2.left)
else:
return False
if not root:
return True
return isMirror(root.left, root.right)
114. Flatten Binary Tree to Linked List
參考 Flatten Binary Tree to Linked List 將二叉樹(shù)展開(kāi)成鏈表
這道題要求把二叉樹(shù)展開(kāi)成鏈表,根據(jù)展開(kāi)后形成的鏈表的順序分析出是使用先序遍歷,那么只要是數(shù)的遍歷就有遞歸和非遞歸的兩種方法來(lái)求解,這里我們也用兩種方法來(lái)求解。首先來(lái)看遞歸版本的,思路是先利用DFS的思路找到最左子節(jié)點(diǎn),然后回到其父節(jié)點(diǎn),把其父節(jié)點(diǎn)和右子節(jié)點(diǎn)斷開(kāi),將原左子結(jié)點(diǎn)連上父節(jié)點(diǎn)的右子節(jié)點(diǎn)上,然后再把原右子節(jié)點(diǎn)連到新右子節(jié)點(diǎn)的右子節(jié)點(diǎn)上,然后再回到上一父節(jié)點(diǎn)做相同操作。代碼如下:
112 path sum
遞歸:1 終止條件 2 每次都要變化的
- 首先,如果輸入的是一個(gè)空節(jié)點(diǎn),則直接返回false,如果如果輸入的只有一個(gè)根節(jié)點(diǎn),則比較當(dāng)前根節(jié)點(diǎn)的值和參數(shù)sum值是否相同,若相同,返回true,否則false。 這個(gè)條件也是遞歸的終止條件。
- 下面我們就要開(kāi)始遞歸了,由于函數(shù)的返回值是Ture/False,我們可以同時(shí)兩個(gè)方向一起遞歸,中間用或||連接,只要有一個(gè)是True,整個(gè)結(jié)果就是True。
- 遞歸左右節(jié)點(diǎn)時(shí),這時(shí)候的sum值應(yīng)該是原sum值減去當(dāng)前節(jié)點(diǎn)的值。代碼如下:
129. Sum Root to Leaf Numbers
···
class Solution {
public:
int sumNumbers(TreeNode *root) {
return sumNumbersDFS(root, 0);
}
int sumNumbersDFS(TreeNode *root, int sum) {
if (!root) return 0;
sum = sum * 10 + root->val;
if (!root->left && !root->right) return sum;
return sumNumbersDFS(root->left, sum) + sumNumbersDFS(root->right, sum);
}
};
···
105、利用前序遍歷和中序遍歷構(gòu)建二叉樹(shù)
參考idiot-maker
實(shí)際上,就是利用這兩個(gè)遍歷的特性,確定遍歷的邊界。

要解決這道題目,就要分別利用preorder和inorder遍歷的兩個(gè)性質(zhì)。preoder的第一個(gè)元素確定為根節(jié)點(diǎn),然后再在inorder里,它左側(cè)的就是左子樹(shù)的全部節(jié)點(diǎn),右側(cè)的就是右子樹(shù)的全部節(jié)點(diǎn)。然后再對(duì)左子樹(shù)這些節(jié)點(diǎn),遞歸調(diào)用上面的方法。
比如
- preorder,7是根節(jié)點(diǎn)
- inorder,7左邊的是左子樹(shù)全部節(jié)點(diǎn),長(zhǎng)度為4,7右邊的是右子樹(shù)全部節(jié)點(diǎn),長(zhǎng)度為3.
- preorder,7后邊4個(gè)數(shù),全是左子樹(shù)的val。第5個(gè)數(shù)開(kāi)始,全是右子樹(shù)的val??捎纱舜_定,左子樹(shù)的根節(jié)點(diǎn)是10,右子樹(shù)的根節(jié)點(diǎn)是2
- inorder,左子樹(shù)的根節(jié)點(diǎn)10,左邊的都是左子樹(shù)的左子樹(shù)長(zhǎng)度為1,右邊的都是左子樹(shù)的右子樹(shù)長(zhǎng)度為2。
- preorder,10后邊1個(gè)數(shù),全是左子樹(shù)的val。第2個(gè)數(shù)開(kāi)始,全是右子樹(shù)的val??捎纱舜_定,左子樹(shù)的根節(jié)點(diǎn)是4,右子樹(shù)的根節(jié)點(diǎn)是3.
就這樣遞歸下去。
對(duì)應(yīng)成代碼,就是
def buildTree(self, preorder, inorder):
if not preorder or not inorder:#遞歸的終止條件,當(dāng)此樹(shù)的遍歷列表為空時(shí),說(shuō)明為葉節(jié)點(diǎn)。
return None
rootValue = preorder[0]#確定根節(jié)點(diǎn)的值
root = TreeNode(rootValue)#用TreeNode構(gòu)造根節(jié)點(diǎn)
inorderIndex = inorder.index(rootValue)#確定根節(jié)點(diǎn)在中序遍歷中的index
#root的左子樹(shù)的長(zhǎng)度,就是根節(jié)點(diǎn)在inorder中左邊的部分的長(zhǎng)度,
#那么可以知道,樹(shù)的左子樹(shù)的前序遍歷就是preorder列表中[1:inorderIndex+1]的部分
#左子樹(shù)的中序遍歷就是inorder中的[:inorderIndex]部分。
root.left = buildTree(preorder[1:inorderIndex+1], inorder[:inorderIndex])
root.right = buildTree(preorder[inorderIndex+1:], inorder[inorderIndex+1:])
return root
98、Validate Binary Search Tree驗(yàn)證二分查找樹(shù)是有效的
參考Validate Binary Search Tree
用遞歸的話,時(shí)間復(fù)雜度是O(n2)。
需要注意的是,左子樹(shù)的所有節(jié)點(diǎn)都要比根節(jié)點(diǎn)小,而非只是其左孩子比其小,右子樹(shù)同樣。這是很容易出錯(cuò)的一點(diǎn)是,很多人往往只考慮了每個(gè)根節(jié)點(diǎn)比其左孩子大比其右孩子小。如下面非二分查找樹(shù),如果只比較節(jié)點(diǎn)和其左右孩子的關(guān)系大小,它是滿足的。

通過(guò)這個(gè)思路進(jìn)行判斷。
二分查找樹(shù)的中序遍歷結(jié)果是一個(gè)遞增序列。
所以,可以先對(duì)二分查找樹(shù)進(jìn)行中序遍歷(遞歸),再判斷此序列是不是一個(gè)遞增序列。
108、 Convert Sorted Array to Binary Search Tree
參考 Convert Sorted Array to Binary Search Tree
1、二叉搜索樹(shù)的特性:始終滿足左<根<右
2、一個(gè)二叉搜索樹(shù)的中序遍歷就是一個(gè)遞增序列。
于是,反過(guò)來(lái),我們可以認(rèn)為,根節(jié)點(diǎn)就是有序列表的中間點(diǎn),從中間點(diǎn)分開(kāi)為左右兩個(gè)有序數(shù)組,在分別找出其中間點(diǎn)作為原中間點(diǎn)的左右兩個(gè)子節(jié)點(diǎn)。遞歸進(jìn)行下去就行。(這也是二分查找法的核心思想)
代碼也與二分查找的代碼類(lèi)似。遞歸
111、Minimum Depth of Binary Tree
參考 Minimum Depth of Binary Tree
也是遞歸,關(guān)于minipath長(zhǎng)度怎么疊加,
可以采用,在遞歸函數(shù)中,當(dāng)當(dāng)前節(jié)點(diǎn)是葉節(jié)點(diǎn)時(shí),返回0.
如果當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn),那么就返回min(left_path(),right_path()) +1。即當(dāng)前子節(jié)點(diǎn)下面路徑的最小值再加1。
那么得到的效果就是,從上往下,每次下沉,都會(huì)加1。一直加到 最終葉節(jié)點(diǎn),得到 minipath為0。然后再一次返回到根節(jié)點(diǎn),得到路徑長(zhǎng)度。
對(duì)參考的程序的解讀。
1、如果左右子節(jié)點(diǎn)都為空,那么就返回1。(因?yàn)榇藭r(shí)只有一層節(jié)點(diǎn),路徑也只能是1)
2、如果,左子節(jié)點(diǎn)為空,那么就返回右子節(jié)點(diǎn)的遞歸+1。
左子節(jié)點(diǎn)為空,說(shuō)明右子節(jié)點(diǎn)不為空。要是畫(huà)出圖來(lái),那么此路徑就會(huì)經(jīng)過(guò)父節(jié)點(diǎn)必須向右子節(jié)點(diǎn)過(guò)去。此時(shí)的路徑長(zhǎng)度就是返回右子節(jié)點(diǎn)的遞歸調(diào)用加1了。
注意!并不是說(shuō),左子節(jié)點(diǎn)為空,那么父節(jié)點(diǎn)就不往下走了,最短路徑就已經(jīng)求得了,而是說(shuō),左子節(jié)點(diǎn)為空,那么父節(jié)點(diǎn),也得往下走,一直走到葉節(jié)點(diǎn)為止。3、如果,右子節(jié)點(diǎn)為空,那么就返回左子節(jié)點(diǎn)的遞歸+1。
4、如果是其余情況(都不為空),就返回左右子節(jié)點(diǎn) 二者遞歸調(diào)用的最小值。
排序
88. Merge Sorted Array
這里需要注意的是,num1和nums2都是數(shù)組,每次從nums2中挑出一個(gè)元素插入nums1中,都是需要改變數(shù)組的index的。
如果單純得考慮從小到大地將兩個(gè)數(shù)組進(jìn)行合并的話,每次在num1中插入一個(gè)數(shù)的話,需要將后面的元素都向后移動(dòng)一位,這樣,整個(gè)處理過(guò)程的時(shí)間復(fù)雜度為O(m*n)。
題目已經(jīng)給出,nums1可以認(rèn)為長(zhǎng)度是m+n。那么就可以先把nums2中的最大值和nums中的最大值進(jìn)行比較,放到nums1中的最后一位(index=m+n-1)。
然后比較得到次最大值,將次最大值放在m+n-2位置,依次類(lèi)推,這樣在將元素放置到合適位置的時(shí)候,就不需要移動(dòng)元素,這個(gè)方法的時(shí)間復(fù)雜度為O(m+n)。
每次循環(huán)中,如果nums2的元素被插入到了最大值中,那么n=n-1。下次可以用nums2[n-1]來(lái)對(duì)nums2中的次最大值進(jìn)行索引。
21. Merge Two Sorted Lists
鏈表有序合并也是數(shù)據(jù)結(jié)構(gòu)里邊的經(jīng)典題目了。
- 1、分別掃描兩個(gè)鏈表,比較兩個(gè)節(jié)點(diǎn)的大小值,把較小的節(jié)點(diǎn)值尾插到結(jié)果鏈表屁股后邊,
- 2、然后再次掃描兩個(gè)鏈表,直到其中某一個(gè)鏈表或者兩條鏈表同時(shí)結(jié)束。
- 3、如果是某條鏈表提前結(jié)束則應(yīng)將另一條鏈表的其余節(jié)點(diǎn)都接到結(jié)果鏈表上。
75、sort colors
定義red指針指向開(kāi)頭位置,blue指針指向末尾位置
從頭開(kāi)始遍歷原數(shù)組,如果遇到0,則交換該值和red指針指向的值,并將red指針后移一位。若遇到2,則交換該值和blue指針指向的值,并將blue指針前移一位。若遇到1,則繼續(xù)遍歷。