筆試面試題總結之單鏈表(Linked List) - 台部落

文章推薦指數: 80 %
投票人數:10人

題目中一般涉及到的鏈表均爲單鏈表,因此總結的大部分操作也是以單鏈表爲主。

此總結爲刷完LeetCode中標籤爲Linked List的題之後寫的,所以涉及的操作和 ... 請輸入正確的登錄賬號或密碼 註冊 忘記密碼 首頁 leetcode刷題筆記 正文 筆試面試題總結之單鏈表(LinkedList) 原創 日影月痕 2018-09-0403:24 引言 一鏈表的基本操作 單鏈表結點結構 構造鏈表 打印鏈表 清空鏈表 二LeetCode上關於linkedlist題解 說明 刪除相關操作 反轉相關操作 排序相關操作 環相關操作 其他相關操作 總結 引言 鏈表是最常用且最簡單的一種數據結構,而且由於依賴指針進行操作,所以在筆試面試題中大量出現,一方面考察對於單鏈表的各項操作,另一方面也考察對於指針操作的熟練程度。

題目中一般涉及到的鏈表均爲單鏈表,因此總結的大部分操作也是以單鏈表爲主。

此總結爲刷完LeetCode中標籤爲LinkedList的題之後寫的,所以涉及的操作和題目均與LeetCode有關,歡迎訪問我的LeetCode題解交流學習。

一、鏈表的基本操作 鏈表的基本操作包括新建結點、構造鏈表、刪除結點、打印鏈表、清空鏈表等一系列操作,但這裏只討論筆試題中需要用到的部分操作,列出的下述操作均爲提交鏈表相關題目之前自己在IDE中測試時需要用到的。

單鏈表結點結構 單鏈表中的數據用結點來表示,每個結點的構成:元素(數據元素的映象)+指針(指示後繼元素存儲位置),元素就是存儲數據的存儲單元,指針就是連接每個結點的地址數據。

結點結構如下: structListNode { intval; ListNode*next; ListNode(intx):val(x),next(NULL){} }; 第5行是一個含有初值的構造函數,用來給新建結點賦值並將其指針域置空。

構造鏈表 鏈表的構造有兩種方法:頭插法和尾插法,頭插法構造的鏈表跟數據輸入順序相反,尾插法構造的鏈表保留了輸入順序。

構造方法如下: ListNode*CreateListFromHead(ListNode*head,intval)//頭插法構造鏈表 { ListNode*node=newListNode(val); node->next=head; head=node; returnhead; } ListNode*CreateListFromTail(ListNode*head,intval)//尾插法構造鏈表 { ListNode*curr=head; ListNode*node=newListNode(val); if(head==NULL) head=node; else { while(curr->next)//curr指向尾結點 curr=curr->next; currPtr->next=node; } returnhead; } 我們用到的鏈表均不包含頭結點(即head指針直接指向鏈表的第一個結點)。

打印鏈表 打印鏈表操作用來檢查鏈表的構造以及顯示在各種操作中鏈表的變化,如下所示: voidPrintList(ListNode*head)//打印鏈表 { if(!head) return; ListNode*curr=head; while(curr->next!=NULL) { cout<val<"; curr=curr->next; } cout<val<”連接。

清空鏈表 在做題過程中,需要輸入多組測試數據,因此需要對上次鏈表進行清空操作,如下所示: ListNode*freeList(ListNode*head)//清空鏈表 { ListNode*curr=NULL; while(head) { curr=head->next; deletehead; head=curr; } returnhead; } 清空鏈表操作刪除所有結點並釋放結點空間,返回空指針。

二、LeetCode上關於linkedlist題解 衆所周知,LeetCode是找工作前必刷的題庫,因此接下來針對LeetCode上跟鏈表相關的題目對鏈表操作進行描述。

前期刷題時不必直接手寫代碼,可以自行在本地IDE編譯測試,因此這裏提供一個大部分題目都要用到的代碼模板,基本上包括了上面所有的鏈表基本操作。

#include #include #include #include #include usingnamespacestd; /*鏈表結點*/ structListNode { intval; ListNode*next; ListNode(intx):val(x),next(NULL){} }; /*打印鏈表*/ voidPrintList(ListNode*head) { if(!head) return; ListNode*currPtr=head; while(currPtr->next!=NULL) { cout<val<"; currPtr=currPtr->next; } cout<val<next=head; head=node; returnhead; } /*構造鏈表(尾插法)*/ ListNode*CreateList(ListNode*head,intval) { ListNode*currPtr=head; ListNode*node=newListNode(val); if(head==NULL) head=node; else { while(currPtr->next) currPtr=currPtr->next; currPtr->next=node; } returnhead; } /*清空鏈表*/ ListNode*freeList(ListNode*head) { ListNode*currPtr=NULL; while(head) { currPtr=head->next; deletehead; head=currPtr; } returnhead; } intmain() { streambuf*readbuf=cin.rdbuf(); streambuf*writebuf=cout.rdbuf(); ifstreamfin; ofstreamfout; fin.open("data.in"); fout.open("data.out"); cin.rdbuf(fin.rdbuf()); cout.rdbuf(fout.rdbuf()); clock_tstartTime,endTime; ListNode*head=NULL; intn;//鏈表長度 intval;//結點值 while(cin>>n)//多組測試數據 { for(inti=0;i>val; head=CreateList(head,val); } cout<2->3->4andyouaregiventhethirdnodewithvalue3,thelinkedlistshouldbecome1->2->4aftercallingyourfunction. 分析題解: 這就是一個簡單的刪除給定結點的題。

AC代碼(Runtime:19ms): voiddeleteNode(ListNode*node){ if(node==NULL||node->next==NULL) return; node->val=node->next->val; node->next=node->next->next; } 203.RemoveLinkedListElements 題目描述: Removeallelementsfromalinkedlistofintegersthathavevalueval. Example Given:1–>2–>6–>3–>4–>5–>6,val=6 Return:1–>2–>3–>4–>5 分析題解: 刪除值等於給定val的結點,遍歷刪除即可,但要注意頭結點和尾結點的刪除以及結點空間的合理釋放。

鑑於比較簡單,就不放代碼了,到這裏這裏這裏查看代碼哈。

83.RemoveDuplicatesfromSortedList 題目描述: Givenasortedlinkedlist,deleteallduplicatessuchthateachelementappearonlyonce. Forexample, Given1->1->2,return1->2. Given1->1->2->3->3,return1->2->3. 分析題解: 對於重複結點,刪除多餘的保留一個。

用兩個指針一前一後來遍歷,若值相等,則把前指針指向後指針的next就可以了。

AC代碼(Runtime:13ms): ListNode*deleteDuplicates(ListNode*head){ if(!head) returnhead; ListNode*currPtr=head->next; ListNode*prevPtr=head; while(currPtr) { if(currPtr->val==prevPtr->val) prevPtr->next=currPtr->next; else prevPtr=currPtr; currPtr=currPtr->next; } returnhead; } 82.RemoveDuplicatesfromSortedListII 題目描述: Givenasortedlinkedlist,deleteallnodesthathaveduplicatenumbers,leavingonlydistinctnumbersfromtheoriginallist. Forexample, Given1->2->3->3->4->4->5,return1->2->5. Given1->1->1->2->3,return2->3. 分析題解: 用head->next->val值作爲標誌來刪除所有val值相同的結點,可以保證刪除所有的相同的結點,AC代碼(Runtime:6ms): ListNode*deleteDuplicates(ListNode*head){ if(!head||!head->next) returnhead; ListNodedummy(0); ListNode*prev=&dummy; dummy.next=head; intval=head->next->val;//val值用來表示當前掃描節點的下一結點值 while(head) { if(head->val==val) { while(head&&head->val==val)//如果存在相同結點,則一直掃描到下一val值結點 head=head->next; prev->next=head; if(head&&head->next)// val=head->next->val; else break; } else { prev=head; head=head->next; //val=head->next?head->next->val:0; if(head->next) val=head->next->val; else break; } } returndummy.next; } 19.RemoveNthNodeFromEndofList 題目描述: Givenalinkedlist,removethenthnodefromtheendoflistandreturnitshead. Forexample, Givenlinkedlist:1->2->3->4->5,andn=2. Afterremovingthesecondnodefromtheend,thelinkedlistbecomes1->2->3->5. Note: Givennwillalwaysbevalid. Trytodothisinonepass. 分析題解: 刪除倒數第N個結點,N保證合法,但題目要求“inonepass”即一次掃描完成,可以使用兩個指針,一前一後,前指針先掃描N步,然後兩個指針一起走,當前指針走到尾結點,則後指針走到要刪除結點的前一結點。

AC代碼(Runtime:6ms): ListNode*removeNthFromEnd(ListNode*head,intn){ ListNode*front=head,*rear=head; while(n--)front=front->next; if(!front)returnhead->next; while(front->next) { rear=rear->next; front=front->next; } rear->next=rear->next?rear->next->next:NULL;//deletethatnode returnhead; } 反轉相關操作 206.ReverseLinkedList 題目描述: Reverseasinglylinkedlist. 分析題解: 反轉鏈表,這算是鏈表的基本操作,是面試官很喜歡考的基礎,有迭代和遞歸兩種方式。

AC代碼(Runtime:6ms(遞歸)/9ms(迭代)): ListNode*reverseList(ListNode*head)//迭代 { ListNode*p=NULL,*q; while(head) { q=head->next; head->next=p; p=head; head=q; } returnp; } ListNode*reverseList(ListNode*head)//遞歸 { if(head==NULL||head->next==NULL) returnhead; ListNode*h=reverseList(head->next); head->next->next=head; head->next=NULL; returnh; } 92.ReverseLinkedListII 題目描述: Reversealinkedlistfrompositionmton.Doitin-placeandinone-pass. Forexample: Given1->2->3->4->5->NULL,m=2andn=4, return1->4->3->2->5->NULL. Note: Givenm,nsatisfythefollowingcondition: 1≤m≤n≤lengthoflist. 分析題解: 反轉序號m、n之間的鏈表,核心還是反轉鏈表,只是需要先走到m結點。

AC代碼(Runtime:3ms): ListNode*reverseBetween(ListNode*head,intm,intn){ ListNodedummy(0); ListNode*pre=&dummy; pre->next=head; for(inti=1;inext; ListNode*move,*curr=pre->next; for(intj=0;jnext; curr->next=move->next; move->next=pre->next; pre->next=move; } returndummy.next; } 61.RotateList 題目描述: Givenalist,rotatethelisttotherightbykplaces,wherekisnon-negative. Forexample: Given1->2->3->4->5->NULLandk=2, return4->5->1->2->3->NULL. 分析題解: 題目要求從頭開始,翻轉接下來的K個結點。

用front/rear兩個指針,先讓front向前掃描K個結點,然後兩個指針一起掃描直到front到鏈表末尾此時rear指針即爲新鏈表的尾結點,rear->next爲新鏈表的頭結點。

題中K值可能非常大,所以不能直接用,必須先得到鏈表長度len,K=K%len,不然會超時。

AC代碼(Runtime:15ms): ListNode*rotateRight(ListNode*head,intk){ if(!head||!head->next) returnhead; intlength=1; ListNode*curr=head; while(curr=curr->next)//獲取鏈表長度 ++length; k=k%length; ListNode*front=head; ListNode*rear=head; while(front&&k--)//前指針先行k步 front=front->next; if(!front)//走到鏈表尾說明k等於鏈表長,返回原鏈表 returnhead; while(front->next)//前後指針一起走直到前指針走到尾 { rear=rear->next; front=front->next; } front->next=head;//轉接兩部分 head=rear->next; rear->next=NULL; returnhead; } 24.SwapNodesinPairs 題目描述: Givenalinkedlist,swapeverytwoadjacentnodesandreturnitshead. Forexample, Given1->2->3->4,youshouldreturnthelistas2->1->4->3. Youralgorithmshoulduseonlyconstantspace.Youmaynotmodifythevaluesinthelist,onlynodesitselfcanbechanged. 分析題解: 題目要求交換相鄰的兩個結點,不能改變結點的值,而且不能用太多額外空間。

我的選擇是把相鄰的結點反轉,再拼接到新鏈表上。

AC代碼(Runtime:3ms): ListNode*swapNode(ListNode*head)//p->q改成q->p { if(head->next) { head->next->next=head; head=head->next; head->next->next=NULL; } returnhead; } ListNode*swapPairs(ListNode*head){ if(!head||!head->next) returnhead; ListNode*currPtr=head; ListNode*temp=NULL; head=NULL; ListNodedummy(0); ListNode*tail=&dummy; while(currPtr&&currPtr->next) { temp=currPtr; currPtr=currPtr->next->next; temp->next->next=NULL; if(!head) { head=swapNode(temp); tail=head->next; } else { tail->next=swapNode(temp); tail=temp->next?temp->next:temp; } } if(currPtr) tail->next=currPtr; returnhead; } 25.ReverseNodesink-Group 題目描述: Givenalinkedlist,reversethenodesofalinkedlistkatatimeandreturnitsmodifiedlist. kisapositiveintegerandislessthanorequaltothelengthofthelinkedlist.Ifthenumberofnodesisnotamultipleofkthenleft-outnodesintheendshouldremainasitis. Youmaynotalterthevaluesinthenodes,onlynodesitselfmaybechanged. Onlyconstantmemoryisallowed. Forexample, Giventhislinkedlist:1->2->3->4->5 Fork=2,youshouldreturn:2->1->4->3->5 Fork=3,youshouldreturn:3->2->1->4->5 分析題解: 其實這就是一個帶前驅結點的反轉鏈表題,核心就是反轉鏈表,注意處理最後不滿K的結點就好了。

AC代碼(Runtime:28ms): ListNode*reverseKGroup(ListNode*head,intk){ if(!head||!head->next) returnhead; ListNodedummy(0); ListNode*prev=&dummy; dummy.next=head; ListNode*curr=prev; intlength=0; while(curr=curr->next)//getlengthoflist ++length; while(length>=k) { curr=prev->next; for(inti=1;inext; curr->next=temp->next; temp->next=prev->next; prev->next=temp; } prev=curr; length-=k; } returndummy.next; } 排序相關操作 86.PartitionList 題目描述: Givenalinkedlistandavaluex,partitionitsuchthatallnodeslessthanxcomebeforenodesgreaterthanorequaltox. Youshouldpreservetheoriginalrelativeorderofthenodesineachofthetwopartitions. Forexample, Given1->4->3->2->5->2andx=3, return1->2->2->4->3->5. 分析題解: 題目要求把把鏈表根據val值重新構造成前面小於x後面>=x的形式,我的選擇是掃描鏈表,分別將將值小於X和大於等於X的結點連成兩個鏈表,最後再將兩個鏈表拼接成一個鏈表。

AC代碼(Runtime:6ms): ListNode*partition(ListNode*head,intx){ ListNodeleft(0),right(0); ListNode*lptr=&left,*rptr=&right; while(head){ ListNode*&ref=head->valnext=head; ref=ref->next; head=head->next; } lptr->next=right.next;//重新拼接 rptr->next=NULL; returnleft.next; } 143.ReorderList 題目描述: GivenasinglylinkedlistL:L0?L1?…?Ln-1?Ln, reorderitto:L0?Ln?L1?Ln-1?L2?Ln-2?… Youmustdothisin-placewithoutalteringthenodes’values. Forexample, Given{1,2,3,4},reorderitto{1,4,2,3}. 分析題解: 根據題目要求,找到中間結點,反轉後半部分,再交叉插入構造新鏈表即可。

AC代碼(Runtime:66ms): ListNode*ReverseList(ListNode*head)/*反轉鏈表*/ { ListNode*p=head; ListNode*q=p->next; head->next=NULL; while(q) { p=q; q=q->next; p->next=head; head=p; } returnhead; } ListNode*MergeList(ListNode*left,ListNode*right)/*交叉合併兩個排好序鏈表*/ { ListNode*head=left; left=left->next; ListNode*tail=head; boolleftNode=false; while(left||right) { ListNode*&temp=leftNode?left:right; tail->next=temp; tail=temp; temp=temp->next; leftNode=leftNode?false:true; } returnhead; } /*ReorderList*/ voidreorderList(ListNode*head) { if(!head||!head->next) return; //快慢指針找到鏈表中間結點中間結點的下一結點爲新鏈表的尾結點 ListNode*low=head; ListNode*fast=head; while(fast->next&&fast->next->next) { fast=fast->next->next; low=low->next; } fast=low->next; low->next=NULL; fast=ReverseList(fast);//翻轉右半部分 head=MergeList(head,fast);//依次合併 } 148.SortList 題目描述: SortalinkedlistinO(nlogn)timeusingconstantspacecomplexity. 分析題解: 題目要求O(nlogn)的時間複雜度,備選排序算法爲快速排序、堆排序和歸併排序,快排最差會達到O(n^2),所以排除,堆排序顯然不適用單鏈表的結構,歸併排序纔是符合要求的排序算法,對於空間複雜度,因爲結構爲鏈表,所以用指針即可,不用像數組那樣單獨開闢空間,所以此題選用歸併排序。

AC代碼(Runtime:49ms): ListNode*mergeList(ListNode*left,ListNode*right) { ListNodetemp(0); ListNode*tail=&temp; while(left&&right)//進行歸併操作直至其中一個鏈表爲空 { ListNode*&temp=left->val<=right->val?left:right;//帶等號保證序列的穩定性 tail->next=temp; temp=temp->next; tail=tail->next; } if(left)tail->next=left; if(right)tail->next=right; returntemp.next; } ListNode*sortList(ListNode*head) { if(head==NULL||head->next==NULL) returnhead; ListNode*low=head;//快慢指針找到鏈表中點 ListNode*fast=head; while(fast->next&&fast->next->next) { low=low->next; fast=fast->next->next; } fast=low->next;//鏈表拆成兩半 low->next=NULL; ListNode*left=sortList(head);//左右鏈表分別排序 ListNode*right=sortList(fast); returnmergeList(left,right);//合併 } 23.MergekSortedLists 題目描述: Mergeksortedlinkedlistsandreturnitasonesortedlist.Analyzeanddescribeitscomplexity. 分析題解: 依次merge兩個鏈表,遞歸調用直至所有鏈表有序。

AC代碼(Runtime:276ms): ListNode*mergeTwoLists(ListNode*head1,ListNode*head2) { ListNodedummy(0); ListNode*newhead=&dummy; while(head1&&head2) { ListNode*&temp=head1->val<=head2->val?head1:head2; newhead->next=temp; newhead=temp; temp=temp->next; } if(head1) newhead->next=head1; if(head2) newhead->next=head2; returndummy.next; } ListNode*mergeKLists(vector&lists){ ListNode*head=NULL; if(lists.size()==0)returnNULL; if(lists.size()==1) returnlists.at(0); else { head=lists.back(); lists.pop_back(); ListNode*head2=mergeKLists(lists); head=mergeTwoLists(head,head2); } returnhead; } 環相關操作 142.LinkedListCycleII 題目描述: Givenalinkedlist,returnthenodewherethecyclebegins.Ifthereisnocycle,returnnull. Note:Donotmodifythelinkedlist. Followup: Canyousolveitwithoutusingextraspace? 分析題解: 題目要求找出鏈表環開始的結點,首先用快慢指針判斷是否有環,然後當快慢指針重合時,另快指針指向頭結點,兩個指針同步掃描,再次相遇的結點即爲所求結點。

AC代碼(Runtime:9ms): /*判斷鏈表是否有環*/ boolhasCycle(ListNode*head){ if(!head||!head->next) returnfalse; ListNode*fast=head; ListNode*low=head; while(fast->next&&fast->next->next) { fast=fast->next->next; low=low->next; if(fast==low) returntrue; } returnfalse; } /*尋找鏈表產生環的結點*/ ListNode*detectCycle(ListNode*head) { if(!hasCycle(head)) returnNULL; ListNode*fast=head->next->next; ListNode*low=head->next; while(fast!=low) { fast=fast->next->next; low=low->next; } fast=head; while(fast!=low) { fast=fast->next; low=low->next; } returnfast; } 138.CopyListwithRandomPointer 題目描述: Alinkedlistisgivensuchthateachnodecontainsanadditionalrandompointerwhichcouldpointtoanynodeinthelistornull. Returnadeepcopyofthelist. 分析題解: 在原鏈表的每個節點之後插入一個新的節點,這樣原節點與新節點的對應關係就已經明確了,因此不需要用hash_map保存,但是需要第三次循環將整個鏈表拆分成兩個。

這種方法的時間複雜度是O(n),空間複雜度是O(1),網上還有用哈希表的方法自行查找。

AC代碼(Runtime:79ms): RandomListNode*copyRandomList(RandomListNode*head){ /*newList表示新鏈表curr代表原鏈表當前結點newNode代表當前結點後的新結點*/ RandomListNode*newList,*curr,*newNode; if(!head) returnNULL; /*step1:在鏈表中每個節點後插入新結點*/ for(curr=head;curr!=NULL;curr=curr->next->next) { newNode=newRandomListNode(curr->label); newNode->next=curr->next; curr->next=newNode; } /*step2:根據原結點的random指針給新結點的random指針賦值*/ for(curr=head;curr!=NULL;curr=curr->next->next) curr->next->random=curr->random?curr->random->next:NULL; /*step3:將鏈表拆分*/ newList=head->next; for(curr=head;curr!=NULL;curr=curr->next) { RandomListNode*tail=curr->next; curr->next=tail->next; if(tail->next) tail->next=tail->next->next; } returnnewList; } 其他相關操作 445.AddTwoNumbersII 題目描述: Youaregiventwonon-emptylinkedlistsrepresentingtwonon-negativeintegers.Themostsignificantdigitcomesfirstandeachoftheirnodescontainasingledigit.Addthetwonumbersandreturnitasalinkedlist. Youmayassumethetwonumbersdonotcontainanyleadingzero,exceptthenumber0itself. Followup: Whatifyoucannotmodifytheinputlists?Inotherwords,reversingthelistsisnotallowed. 分析題解: 用鏈表表示的數字相加,逆置鏈表可以完成,不過要認真考慮進位和新加結點的問題。

AC代碼(Runtime:46ms): ListNode*addTwoNumbers(ListNode*l1,ListNode*l2){ if(l1==NULL) returnl2; if(l2==NULL) returnl1; //l1l2反轉 l1=reverseList(l1); l2=reverseList(l2); intflag=0;//進位 intsum=0; ListNode*newList=NULL; ListNode*currPtrNew=newListNode(0); newList=currPtrNew; ListNode*newNode; while(l1!=NULL||l2!=NULL) { inta=l1==NULL?0:l1->val; intb=l2==NULL?0:l2->val; sum=a+b+flag; flag=sum/10; newNode=newListNode(sum%10); currPtrNew->next=newNode; currPtrNew=newNode; l1=l1==NULL?NULL:l1->next; l2=l2==NULL?NULL:l2->next; } if(flag==1) { newNode=newListNode(flag); currPtrNew->next=newNode; } returnreverseList(newList->next); } ListNode*reverseList(ListNode*&l) { if(l->next==NULL) returnl; ListNode*p,*q; p=l; q=p->next; p->next=NULL; while(q!=NULL) { p=q; q=q->next; p->next=l; l=p; } returnl; } 328.OddEvenLinkedList 題目描述: Givenasinglylinkedlist,groupalloddnodestogetherfollowedbytheevennodes.Pleasenoteherewearetalkingaboutthenodenumberandnotthevalueinthenodes. Youshouldtrytodoitinplace.TheprogramshouldruninO(1)spacecomplexityandO(nodes)timecomplexity. Example: Given1->2->3->4->5->NULL, return1->3->5->2->4->NULL. 分析題解: 題目要求將奇序號的結點全部提到前面。

邏輯挺簡單,直接貼AC代碼(Runtime:16ms): ListNode*oddEvenList(ListNode*head){ if(head==NULL||head->next==NULL) returnhead; ListNode*currPtr=head->next,*prevPtr=head;//遍歷結點、前一結點(從head->next開始) ListNode*oddNode,*oddListTail=head;//odd尾結點 inti=2;//序號 while(currPtr!=NULL) { if(i%2==1) { oddNode=currPtr; prevPtr->next=currPtr->next; currPtr=currPtr->next; oddNode->next=oddListTail->next; oddListTail->next=oddNode; oddListTail=oddNode; } else { prevPtr=currPtr; currPtr=currPtr->next; } ++i; } returnhead; } 總結 這些題解都是個人思考個人實現的,很顯然有很多並不是最優的解法,甚至有的時間複雜度過高,大家有什麼意見建議歡迎留言提出,希望能對你有所幫助。

所有分析和代碼在這裏這裏這裏。

發表評論 登录 所有評論 還沒有人評論,想成為第一個評論的人麼?請在上方評論欄輸入並且點擊發布. 相關文章 LeetCode算法練習——動態規劃提高(四) LeetCode139.單詞拆分 給定一個非空字符串s和一個包含非空單詞列表的字典wordDict,判定 s是否可以被空格拆分爲一個或多個在字典中出現的單詞。

示例1: 輸入:s="leetcode",wordDi alpaca_ll 2020-07-0520:41:20 LeetCode算法練習——動態規劃提高(五) LeetCode309.最佳買賣股票時機含冷凍期 給定一個整數數組,其中第i個元素代表了第i天的股票價格。

​設計一個算法計算出最大利潤。

在滿足以下約束條件下,你可以儘可能地完成更多的交易(多次買賣一支股票):    你不能同 alpaca_ll 2020-07-0520:41:19 [LeetCode]139.單詞拆分 題目 給定一個非空字符串s和一個包含非空單詞列表的字典wordDict,判定s是否可以被空格拆分爲一個或多個在字典中出現的單詞。

說明: 拆分時可以重複使用字典中的單詞。

你可以假設字典中沒有重複的單詞。

示例1: zaker123 2020-07-0218:18:36 [LeetCode]16.最接近的三數之和 題目 給定一個包括n個整數的數組nums和一個目標值target。

找出nums中的三個整數,使得它們的和與target最接近。

返回這三個數的和。

假定每組輸入只存在唯一答案。

示例: 輸入:nums=[-1, zaker123 2020-07-0218:18:25 [LeetCode]65.有效數字 題目 驗證給定的字符串是否可以解釋爲十進制數字。

例如: "0"=>true "0.1"=>true "abc"=>false "1a"=>false "2e10"=>true "-90e3"=> zaker123 2020-07-0218:18:25 [LeetCode]41.缺失的第一個正數 題目 給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。

示例1: 輸入:[1,2,0] 輸出:3 示例2: 輸入:[3,4,-1,1] 輸出:2 示例3: 輸入:[7,8,9,11,12] 輸出: zaker123 2020-07-0218:18:25 [LeetCode]110.平衡二叉樹 題目 給定一個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義爲: 一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過1。

示例1: 給定二叉樹[3,9,20,null,null,15,7] zaker123 2020-07-0218:18:24 [LeetCode]209.長度最小的子數組 題目 給定一個含有n個正整數的數組和一個正整數s,找出該數組中滿足其和≥s的長度最小的連續子數組,並返回其長度。

如果不存在符合條件的連續子數組,返回0。

示例: 輸入:s=7,nums=[2,3,1,2, zaker123 2020-07-0218:18:24 [LeetCode]104.二叉樹的最大深度 題目 給定一個二叉樹,找出其最大深度。

二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。

說明:葉子節點是指沒有子節點的節點。

示例: 給定二叉樹[3,9,20,null,null,15,7], 3 / zaker123 2020-07-0218:18:23 [LeetCode]215.數組中的第K個最大元素 題目 在未排序的數組中找到第k個最大的元素。

請注意,你需要找的是數組排序後的第k個最大的元素,而不是第k個不同的元素。

示例1: 輸入:[3,2,1,5,6,4]和k=2 輸出:5 示例2: 輸入: zaker123 2020-07-0218:18:22 Leetcode島嶼問題彙總-圖的遍歷 Leetcode島嶼問題彙總-圖的遍歷 leetcode中的島嶼問題,本質上是圖的遍歷問題,所以我們需要先了解什麼事圖的遍歷,以及一般的遍歷方法。

圖的遍歷 圖的遍歷,屬於數據結構中的內容。

指的是從圖中的任一頂點出發,對圖中的所有頂點訪問 StephenYYYou 2020-07-0209:30:33 Leetcode鏈表問題 目錄 Leetcode鏈表問題 鏈表翻轉問題 Q1_25.K個一組翻轉鏈表 Q2_24.兩兩交換鏈表中的節點 鏈表合併問題 Q3_21.合併兩個有序鏈表 Leetcode鏈表問題 對刷到的鏈表問題進行一下彙總。

(持續更新) 鏈表翻 StephenYYYou 2020-07-0209:30:31 回溯+剪枝 目錄   回溯+剪枝 概念 例題 練習 回溯+剪枝 概念 回溯算法也叫試探法,它是一種系統地搜索問題的解的方法。

用回溯算法解決問題的一般步驟: 1、針對所給問題,定義問題的解空間,它至少包含問題的一個(最優)解。

2、確定易於搜索的 StephenYYYou 2020-07-0209:30:31 整理一下LinkedHashMap的用法 前情提要 在Leetcode上遇到這樣一道題: 146.LRU緩存機制 運用你所掌握的數據結構,設計和實現一個  LRU(最近最少使用)緩存機制。

它應該支持以下操作:獲取數據 get 和寫入數據 put 。

獲取數據 get( StephenYYYou 2020-07-0209:30:31 最長迴文子串題解 最長迴文子串 給定一個字符串s,找到s中最長的迴文子串。

你可以假設s的最大長度爲1000。

輸入:babad輸出bab 分析: 第一思路是暴力,O(n3)肯定是不行的。

這裏要採用同樣是動態規劃的中心拓展思想: whypdd 2020-06-3004:04:05 日 日影月痕 24小時熱門文章 最新文章 細化算法:Hilditch算法(HilditchThinningAlgorithm)及其MATLAB實現 服務器開發之簡單的TCP回射服務器(一):服務器程序 筆試面試題總結之單鏈表(LinkedList) git使用 Ubuntu安裝libevent(libevent-2.0.21-stable)及各種出錯的解決方案 最新評論文章 馬英九反駁朱立倫:“九二共識”有共識 怎樣提高性愛氛圍?4個小技巧助你一臂之力 簡單的動作就能提高性能力每天做這姿勢性能力更強大 加籟kiss266小阿梨專營巨乳大奶妹E-G奶淫蕩爆乳敏感火辣妹可奶炮足交口暴肛交大奶妹Telegram:av8526官網www.ppp8669.com Valid7498XPDFDumpsForGreatExamPreparation



請為這篇文章評分?