From 08c62f6cbb70c1104b8d5b888aa179fba39d0948 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Mon, 30 Nov 2020 22:37:42 +0800 Subject: [PATCH 01/51] =?UTF-8?q?=E6=80=BB=E8=A7=88mindNote?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QuickLook/Preview.jpg" | Bin 0 -> 357758 bytes .../contents.xml" | Bin 0 -> 99741 bytes .../style.mindnodestyle/contents.xml" | Bin 0 -> 2192 bytes .../style.mindnodestyle/metadata.plist" | Bin 0 -> 152 bytes .../viewState.plist" | Bin 0 -> 182 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 "Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/QuickLook/Preview.jpg" create mode 100644 "Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/contents.xml" create mode 100644 "Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/style.mindnodestyle/contents.xml" create mode 100644 "Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/style.mindnodestyle/metadata.plist" create mode 100644 "Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/viewState.plist" diff --git "a/Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/QuickLook/Preview.jpg" "b/Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/QuickLook/Preview.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..5490195a77a935fabeba76c7d6b47835660d5f0a GIT binary patch literal 357758 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 literal 0 HcmV?d00001 diff --git "a/Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/contents.xml" "b/Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/contents.xml" new file mode 100644 index 0000000000000000000000000000000000000000..c13b1a54b329ddd5463ed1085e736f8c3dfaa305 GIT binary patch literal 99741 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 literal 0 HcmV?d00001 diff --git "a/Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/viewState.plist" "b/Week_01/\346\225\260\346\215\256\347\273\223\346\236\204\344\270\216\347\256\227\346\263\225.mindnode/viewState.plist" new file mode 100644 index 0000000000000000000000000000000000000000..31c778039da8cf607cc5108ad843f0becb0a0b76 GIT binary patch literal 182 zcmYc)$jK}&F)+By$i&RT$`&smSe#sxpOfR9npcuq6p){pR}x*GnU|7Z?pBnTn;Kb_ zpPw6?oS2guFQ8d%Y-FToY-DL>VP Date: Sat, 5 Dec 2020 22:42:49 +0800 Subject: [PATCH 02/51] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、改写Deque 2、算法题提交 --- Week_01/DequeDemo.java | 17 ++++ Week_01/Week01 | Bin 0 -> 50224 bytes Week_01/Week01.c | 218 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 Week_01/DequeDemo.java create mode 100755 Week_01/Week01 create mode 100644 Week_01/Week01.c diff --git a/Week_01/DequeDemo.java b/Week_01/DequeDemo.java new file mode 100644 index 00000000..9b46a30f --- /dev/null +++ b/Week_01/DequeDemo.java @@ -0,0 +1,17 @@ + +public static void main(String[] args) { + Deque deque = new LinkedList(); + deque.addLast("a"); + deque.addLast("b"); + deque.addLast("c"); + System.out.println(deque); + + String str = deque.peek(); + System.out.println(str); + System.out.println(deque); + while (deque.size() > 0) { + System.out.println(deque.removeFirst()); + } + System.out.println(deque); +} + diff --git a/Week_01/Week01 b/Week_01/Week01 new file mode 100755 index 0000000000000000000000000000000000000000..b4941e9ac3e953fdf749dcc4abc43426df180fd8 GIT binary patch literal 50224 zcmeI5U2Igx6~|`{rWi15QX?fw8r(K+X%c}Uv;`c}b;?aH0)q=|)DNNQdUwGq)*tK# z!L*i84VABMS2cZUsQTcis-F^3tEfV0WgyC01QjPr6;xU3R&txWs@twAt8p8Y?f=Zo z-CbYcxlwh-nw>dk&YU^(n=_ZE5x4&Hw+}udL}-N&q6xJP^~cRZTo4`T3GooBjVfhd z&-2z-t;2^%yS#*!i}#es&t@zjFI*9m3;UGcU7$R1+-EoV!2pd5sa_voQ}_*Lvo|P`b^!c z-}eLi4(_-1?$h*zm=5d{GLo3VfL zL*JjqLhF)>#%Rx>Lf(s+*LjIGe#y}T$lh8 zU;<2l2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5 zU;<2l2`~XBzyz286JP>NfC(@GCcp%k!2gOs)OP-Ck1wIhF!o)xGgfi(3$_z2xz@tC7jmq*@v%7({>}?9wOy-X$9w0- zpPpz57e3vfaoZ=xuZ5iU2{*a`tCG{EY#nQD9gXHi(`w$}u2MQeec85J!LzrqC(ckH%Z zhliUs8y{>x3w59>{lybFY(@ryJG^jAJ?`Lwr;fI<`>8R9@_QK@OgTr zh2dsB9KmqeI09hDs+4~MS}=GQBUoz_8l4N8k3ReHv4v3hyYzqz2jf_G%BRpZAd1#J z5q7QlZfhZ2IEcPF=XmctGQf1b?)HiB`Ay2sQww{*g2ai=yDKl6uIH@0Xo8zpHuL2l zsa()A?zq;S#uPQ@*Jl@y28Gt&;Qg5GZahsJa34UnBE7HK&O5gAyDNA?M&~%~?SN6y zy19k|$=}3zO?w-$gk#OP`591{!8j;9M7|1RvrszLt6o2yuiN^ta@}IPaJ}oz+IjXJ zyY9^*Gwykw`Yaush_#3fBfp)QOK$Jnd;f+G=n#lTR|ywV6eSYW?Ohx%hwS*9?z%~* z*DG2jZBX^s;^`%c3U{4eQLJ4d5g$zL{3Mh z?xD(d>MqtkdTKyPi)xz`?fA7S&c6IJwX6Ckz~5hl63=#nuseIG>!TXfQ%}2--o&(>d2=bVwhSyd* zyLyDEc5YX{JJj#z)bCF9yBohk94LHj7dkyhs+|F7+X5nmIX3GrlyIHup5`tPzETUw9aneISK^$ol!r$T*NV;$a?w&|Cvq^9M$ zFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)Aj zFaajO1egF5U;<2l2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0v{#< z=Kp73W7>ApK5E*{rrmDZ4^!wI3lm@hOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l z2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e)C0!)AjFaajO1egF5U;<2l z2`~XBzyz286JP>NfC(^x{}%!qJ}F+Hy=;g`DYLm){G^NzoRlZ>u}ngIDI+E$iP3Zd zBl&*WpBhRep(6XNo-vpl%qDX*1?ueTfS2R3RGRc{&=1Da>ESp@50aD|jE{_x)S)GK zA!#$DkxXhRcN~%`At{>0DmgeHlV_6gd@d;mk}(S7*}+(9NIW-^&Swt|CB^<+GMf{9 zeKdLBP_8GFiH(XxMx>hHW`&qKg`e3|LNxW63G%S`erScboW;O&4g*Q?;&3jOOLmE0 zheXrh@ag2<{75<#hbk++7doBHWRv3em@=Cu>wv*8Lu#`40}LvsvE(-KdT6_NBlMJ* zg=+E)mbpBNpVC>1LhAhek%szJ*xdB1G3YAwtm5F2d+Uc58Wq zlH2gB($JA_=GQt}?Dh~!2pN +#include +#include + +// 打印int数组 +void PrintIntArray(int *a, int size); +// 加一测试 +void TestPlusOne(); +//删除排序数组中的重复项测试 +void testRemoveDuplicates(); +//旋转数组测试 +void testRotate(); + +int main(int argc, const char *argv[]) { + //testPlusOne(); + //testRemoveDuplicates(); + //testRotate(); + return 0; +} + +/* 加一 */ +int* plusOne(int* digits, int digitsSize, int* returnSize) { + for (int i = digitsSize - 1; i >= 0; i--) { + if (digits[i] < 9) { + digits[i]++; + *returnSize = digitsSize; + return digits; + } + digits[i] = 0; + } + *returnSize = digitsSize + 1; + int *newDigits = (int *)malloc(sizeof(int) * (*returnSize)); + memset(newDigits, 0, (*returnSize) * sizeof(int)); + newDigits[0] = 1; + return newDigits; +} + +void testPlusOne() { + int a[] = {0, 0}; + int digitsSize = sizeof(a) / sizeof(int); + int returnSize = 0; + int *result = plusOne(a, digitsSize, &returnSize); + PrintIntArray(result, returnSize); +} + +/* 26、删除排序数组中的重复项 */ +int removeDuplicates(int* nums, int numsSize){ + if (numsSize <= 1) return numsSize; + int i = 0; + for (int j = 1; j < numsSize; j++) { + if (nums[j] != nums[i]) { + i++; + nums[i] = nums[j]; + } + } + return i + 1; +} + +void testRemoveDuplicates() { + int a[] = {0, 0, 1, 2, 2, 2, 4, 6, 6, 9}; + int size = sizeof(a) / sizeof(int); + int result = removeDuplicates(a, size); + printf("resultSize = %d\n", result); + PrintIntArray(a, result); +} + +/* 189. 旋转数组 */ + +//暴力求解 +void rotate01(int* nums, int numsSize, int k) { + k %= numsSize; + int temp, prev; + for (int i = 0; i < k; i++) { + prev = nums[numsSize - 1]; + for (int j = 0; j < numsSize; j++) { + temp = prev; + prev = nums[j]; + nums[j] = temp; + } + } +} + +//使用环状替换 +void rotate02(int* nums, int numsSize, int k) { + k %= numsSize; + int count = 0; + for (int start = 0; count < numsSize; start++) { + int current = start; + int prev = nums[start]; + do { + int next = (current + k) % numsSize; + int temp = nums[next]; + nums[next] = prev; + prev = temp; + current = next; + count++; + } while (start != current); + } +} + +//三次翻转(推荐,思路清晰,代码简洁) +void reverse(int *nums, int start, int end); + +void rotate03(int* nums, int numsSize, int k) { + k %= numsSize; + reverse(nums, 0, numsSize - 1); + reverse(nums, 0, k - 1); + reverse(nums, k, numsSize - 1); +} + +void reverse(int *nums, int start, int end) { + while (start < end) { + int temp = nums[start]; + nums[start] = nums[end]; + nums[end] = temp; + start++; + end--; + } +} + +void testRotate() { + int a[] = {0, 1, 2, 3, 4, 5, 6, 7}; + int size = sizeof(a) / sizeof(int); + //rotate01(a, size, 3); + //rotate02(a, size, 3); + rotate03(a, size, 3); + PrintIntArray(a, size); +} + +/* 合并两个有序链表 */ +struct ListNode { + int val; + struct ListNode *next; +}; + +struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { + if (!l1) return l2; + if (!l2) return l1; + if (l1->val < l2->val) { + l1->next = mergeTwoLists(l1->next, l2); + return l1; + } else { + l2->next = mergeTwoLists(l1, l2->next); + return l2; + } +} + +/* 88、合并两个有序数组 */ +void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { + int p = m + n - 1, p1 = m - 1, p2 = n - 1; + while (p2 >= 0) { + if (p1 >= 0) { + nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--]; + } else { + nums1[p--] = nums2[p2--]; + } + } +} + +/* 1、两数之和 */ +//暴力 +int* twoSum(int* nums, int numsSize, int target, int* returnSize){ + for (int i = 0; i < numsSize; i++) { + for (int j = i + 1; j < numsSize; j++) { + if (nums[i] + nums[j] == target) { + int *result = (int *)malloc(sizeof(int) * 2); + result[0] = i; + result[1] = j; + *returnSize = 2; + return result; + } + } + } + *returnSize = 0; + return NULL; +} +//哈希表 + +/* 283、移动零 */ +void moveZeroes(int* nums, int numsSize) { + int j = 0; + for (int i = 0; i < numsSize; i++) { + if (nums[i]) { + int temp = nums[i]; + nums[i] = nums[j]; + nums[j] = temp; + j++; + } + } +} + +/* 70、爬楼梯 */ +int climbStairs(int n) { + int p = 0, q = 0, r = 1; + for (int i = 1; i <= n; i++) { + p = q; + q = r; + r = p + q; + } + return r; +} + +/* 工具方法 */ + +// 打印int数组 +void PrintIntArray(int *a, int size) { + printf("["); + for (int i = 0; i < size; i++) { + printf("%d", a[i]); + if (i != size - 1) { + printf(", "); + } + } + printf("]\n"); +} + + From 3e168b4f50bc15a7f7ed9bd8559b11a38f0f6ad3 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 6 Dec 2020 16:08:07 +0800 Subject: [PATCH 03/51] MyCircularDeque --- Week_01/DequeDemo.java | 31 ++++++---- Week_01/MyCircularDeque | Bin 0 -> 50216 bytes Week_01/MyCircularDeque.c | 125 ++++++++++++++++++++++++++++++++++++++ Week_01/Week01.c | 25 ++++++++ 4 files changed, 168 insertions(+), 13 deletions(-) create mode 100755 Week_01/MyCircularDeque create mode 100644 Week_01/MyCircularDeque.c diff --git a/Week_01/DequeDemo.java b/Week_01/DequeDemo.java index 9b46a30f..0178a823 100644 --- a/Week_01/DequeDemo.java +++ b/Week_01/DequeDemo.java @@ -1,17 +1,22 @@ -public static void main(String[] args) { - Deque deque = new LinkedList(); - deque.addLast("a"); - deque.addLast("b"); - deque.addLast("c"); - System.out.println(deque); - - String str = deque.peek(); - System.out.println(str); - System.out.println(deque); - while (deque.size() > 0) { - System.out.println(deque.removeFirst()); +public class DequeDemo { + public static void main(String[] args) { + System.out.println("Hello, world!"); + Deque deque = new LinkedList(); + deque.addLast("a"); + deque.addLast("b"); + deque.addLast("c"); + System.out.println(deque); + + String str = deque.peek(); + System.out.println(str); + System.out.println(deque); + while (deque.size() > 0) { + System.out.println(deque.removeFirst()); + } + System.out.println(deque); } - System.out.println(deque); } + + diff --git a/Week_01/MyCircularDeque b/Week_01/MyCircularDeque new file mode 100755 index 0000000000000000000000000000000000000000..3f1e5b6c8832db5652380d50980748a1901e72c1 GIT binary patch literal 50216 zcmeI5e{38_6~|}oG+fhD&M5_jA03KIweE z?%g?dMUatO;_WJx`v)SG_=7+Aqg9275GoZy^xT#tAO)O)M1cOVM5xw~N~aJJtC$?` z&CJ?&=j-1^;ycRR%zHEM&704>+5g7*-MjDH{(ulhvk;<*Y75olcL?!>h*M99k5IL! z+V((KkNFMr=wa5@7Nb^dD6yZbG|{$?na7XSPLcMBTAk1`g(AYrGi<GC9X3 zUA;d``)kwlS!V9*Wm9~k`GT9yp41cS{Y`0qoqC+*>QdvI25h^SJ(bR;>~wZ)Qp&aG z@l)-O&zuX(^*+>y`sH&yN7c5wyN-3)2M<3ys7^PbxP|9f-*Ucj<+I|Pv+a|URmb|C z{vtG2mV~m`l3@PqFDx8aKvl&RYN?&Ai;HAg5~>N~3ioW=nWUYcnHZVO*tvrHp8j?! zbLqc24!T=4`DfdyWFZ+&-W=b~SruQnPnN6wZCI)v?~~8Uw)=V?e#q?Z4ewT|Zl5G` z*`qH5bLSeC-4uB{3nd|V?FhB&dm=eb@*Zj}Y9nOGe0Y3(QHT#x`{K(&gz8?9ej zcwwr&6>O3;+hN-z;BD@KY?jHTTZ+())w3KINOTYu7uF*#Vzl2*(+YR{L|%N zn#P_rVo&gs$dxl zo_W(-dgj)Q6#Pe{9XEc?ueAK)%~+@Cm`^W97!>snl zukcj9hOtx1vZ6j;tCIEl0Y7@i>(@(Ca;o!`v2*4}*?ylDi9Pk<4ezYG&x(-Q3g1}0 zrq*&p>nfk2Kf2#4!%fO^y4@FpKT#Ib)K%_Z=DxhDv0dSLwG$=sE%;t|#qvvhHG`#p zS1Oz~#3A_QHrBKeN-5n#(!BXraBryigjBp4L`m_$zj)5P`9|<&ILw!5-h4f{tQGU- zUxF+DQO@SgKL=kV%AR?R?SdKEU-paF{Gny*Y^P1e=S8qvZsBy`nSThF4rS@wtL?Sv zxBk6p5BKlq_-nH24=~zQpHAp(=O>lJE98WvHj-$Qv_gp${%QIMTnkb%h?^|>J&|Vm zEbu2%3Z8kL?(sge96LK9EhJ_6Q5qt8=2h>KpgC-KVb-1{i^UZdWaJDDwXwx;fn zyH3)j&NeabBvVpTNTxHglTSb9$f2a`c0M9nQ{w)(I6-+q0L90ta;a|leJa0q=e@|P z--2_W-@Qi3vPD{xpr6Ld9)3Uo1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l z00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck)1V8`;KmY_l00ck) z1V8`;KmY{ZR|3cN|Mxzk+l+4C*PyUC2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?x zfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=900@8p2!H?xfB*=9 z00@8p2!H?xfB*>mpAp#cDKW@f-jPVnWKwp%P#m#G(%F>biX*OA5P2H0$6UwZeuVlH z$xLQ)l%*Dua&9_X7$Zp-wzxwy+Y{rqGwqBP3ywYRB-zb<6JqZGPwRFbEjr@cO-;OB z)6BuNJ6g;nU8U|xrn6$r5L*wrPO{*Le6N`9b}|lie`fSJ1@T9t&&i%FjEft_Ar9x3 z(JYo-a+J+GZb5v<$cyhAqUn%3nJtL#8GXroLHvZ~Eahp=p<*T@eq@*vxx$RN%$5bw zEY25sNE%#H2Cvc352k2n_7we;POXmz#!)Bfig#%I{4|fx&`+6vN{?}me@fq^eJ#7W z1!EvLoX8F22HKYl-Yb`3>TQn*v2&JCk<1Wc)Jc3z$=jveLcdDhEoC8col4%L<>3w` z)1PUO_VIm6eniV9El+7Vq3wMww|`a5|Dl#=wfqY$FKPc*wS4|7YW_dN`P% +#include +#include + +typedef struct { + int *arr; + int head; + int tail; + int size; +} MyCircularDeque; + +bool myCircularDequeIsFull(MyCircularDeque* obj); +bool myCircularDequeIsEmpty(MyCircularDeque* obj); + +/** Initialize your data structure here. Set the size of the deque to be k. */ + +MyCircularDeque* myCircularDequeCreate(int k) { + MyCircularDeque *obj = (MyCircularDeque *)malloc(sizeof(MyCircularDeque)); + obj->head = 0; + obj->tail = 0; + obj->size = k + 1; + obj->arr = (int *)malloc(sizeof(int) * (k + 1)); + return obj; +} + +/** Adds an item at the front of Deque. Return true if the operation is successful. */ +bool myCircularDequeInsertFront(MyCircularDeque* obj, int value) { + if (myCircularDequeIsFull(obj)) return false; + int pos = (obj->head + obj->size - 1) % obj->size; + obj->arr[pos] = value; + obj->head = pos; + return true; +} + +/** Adds an item at the rear of Deque. Return true if the operation is successful. */ +bool myCircularDequeInsertLast(MyCircularDeque* obj, int value) { + if (myCircularDequeIsFull(obj)) return false; + obj->arr[obj->tail] = value; + obj->tail = (obj->tail + 1) % obj->size; + return true; +} + +/** Deletes an item from the front of Deque. Return true if the operation is successful. */ +bool myCircularDequeDeleteFront(MyCircularDeque* obj) { + if (myCircularDequeIsEmpty(obj)) return false; + obj->head = (obj->head + 1) % obj->size; + return true; +} + +/** Deletes an item from the rear of Deque. Return true if the operation is successful. */ +bool myCircularDequeDeleteLast(MyCircularDeque* obj) { + if (myCircularDequeIsEmpty(obj)) return false; + obj->tail = (obj->size + obj->tail - 1) % obj->size; + return true; +} + +/** Get the front item from the deque. */ +int myCircularDequeGetFront(MyCircularDeque* obj) { + if (myCircularDequeIsEmpty(obj)) return -1; + return obj->arr[obj->head]; +} + +/** Get the last item from the deque. */ +int myCircularDequeGetRear(MyCircularDeque* obj) { + if (myCircularDequeIsEmpty(obj)) return -1; + int pos = (obj->tail - 1 + obj->size) % obj->size; + return obj->arr[pos]; +} + +/** Checks whether the circular deque is empty or not. */ +bool myCircularDequeIsEmpty(MyCircularDeque* obj) { + return (obj->head == obj->tail) ? true : false; +} + +/** Checks whether the circular deque is full or not. */ +bool myCircularDequeIsFull(MyCircularDeque* obj) { + return ((obj->head - 1 + obj->size) % obj->size == obj->tail) ? true : false; +} + +int myCircularDequeLength(MyCircularDeque* obj) { + if (obj->tail > obj->head) { + return obj->tail - obj->head; + } else { + return obj->tail - obj->head + obj->size; + } +} + +void myCircularDequeFree(MyCircularDeque* obj) { + free(obj->arr); + free(obj); + return; +} + +void PrintDeque(MyCircularDeque *obj); + +int main(int argc, const char *argv[]) { + MyCircularDeque *obj = myCircularDequeCreate(5); + myCircularDequeInsertFront(obj, 10); + myCircularDequeInsertFront(obj, 20); + myCircularDequeInsertFront(obj, 30); + myCircularDequeInsertLast(obj, 0); + myCircularDequeInsertLast(obj, 1); + myCircularDequeDeleteLast(obj); + int front = myCircularDequeGetFront(obj); + int rear = myCircularDequeGetRear(obj); + printf("front=%d, rear=%d\n", front, rear); + PrintDeque(obj); + return 0; +} + +// 打印 +void PrintDeque(MyCircularDeque *obj) { + printf("head=%d, tail=%d, size=%d\n", obj->head, obj->tail, obj->size); + printf("arr=["); + int length = myCircularDequeLength(obj); + int max = obj->head + length; + for (int i = obj->head; i < max; i++) { + printf("%d", obj->arr[i % obj->size]); + if (i != max - 1) { + printf(", "); + } + } + printf("]\n"); +} \ No newline at end of file diff --git a/Week_01/Week01.c b/Week_01/Week01.c index 8942201d..6ae9a9af 100644 --- a/Week_01/Week01.c +++ b/Week_01/Week01.c @@ -201,6 +201,31 @@ int climbStairs(int n) { return r; } +/* 42、接雨水 */ +int trap(int* height, int heightSize){ + int left = 0, right = heightSize - 1; + int ans = 0; + int left_max = 0, right_max = 0; + while (left < right) { + if (height[left] < height[right]) { + if (height[left] >= left_max) { + left_max = height[left]; + } else { + ans += (left_max - height[left]); + } + left++; + } else { + if (height[right] >= right_max) { + right_max = height[right]; + } else { + ans += (right_max - height[right]); + } + right--; + } + } + return ans; +} + /* 工具方法 */ // 打印int数组 From 82f12ace005211da413c474b0f023459bdfbca43 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 6 Dec 2020 16:38:00 +0800 Subject: [PATCH 04/51] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E5=BF=83=E5=BE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Week_01/README.md b/Week_01/README.md index 50de3041..186c4c15 100644 --- a/Week_01/README.md +++ b/Week_01/README.md @@ -1 +1,13 @@ -学习笔记 \ No newline at end of file +## 学习笔记 + +#### 学习感想 + +原本我觉得学习算法是一个比较枯燥乏味的事情,因为本身的基础不是很好,对数据结构学习不多,平时自己学习很难坚持,但是和大家一起刷题后感觉每解答出一道题还是挺有成就感的,尤其是当自己辛苦编码调试通过后的那一刻,感觉很畅快和欣慰。而且,当看到别人的算法清晰,代码简单的时候,心里莫名的崇拜,奈何没什么文化,只能感叹一声“NB”。哈哈,原来做题也能这么有意思。希望自己能和大家一起学习,坚持这十周让自己有所突破和进步。 + +#### 根据超哥的介绍自己也稍微总结了下刷题的步骤: + +- 想:思考怎么做,不要过于强求,没有思路不用纠结,直接看题解; +- 写:看过题解后,编写代码,可以选择多种实现方式,成功通过后,分析时间复杂度和空间复杂度; +- 看:看看国外网站讨论比较多的大神是如何解答的,学习优秀的思想和算法; +- 练:选择自己觉的比较好的算法,进行多次练习(五毒神掌),最好达到看到类似的题,马上能想到并正确写出代码; +- 记:在完成以上内容后,可以将思路和代码整理,写成题解(选做:根据时间情况而定)。 From 2f3d3e4993c9726fbd338ddc455f445afbbae07b Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 6 Dec 2020 17:07:08 +0800 Subject: [PATCH 05/51] =?UTF-8?q?=E7=8E=AF=E5=BD=A2=E9=93=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/Week01.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Week_01/Week01.c b/Week_01/Week01.c index 6ae9a9af..1fce7fe1 100644 --- a/Week_01/Week01.c +++ b/Week_01/Week01.c @@ -2,6 +2,7 @@ #include #include #include +#include // 打印int数组 void PrintIntArray(int *a, int size); @@ -226,6 +227,19 @@ int trap(int* height, int heightSize){ return ans; } +/* 141、环形链表 */ +//快慢指针 +bool hasCycle(struct ListNode *head) { + struct ListNode *fast = head; + struct ListNode *slow = head; + while (fast && fast->next) { + fast = fast->next->next; + slow = slow->next; + if (fast == slow) return true; + } + return false; +} + /* 工具方法 */ // 打印int数组 From b9a4a61b19256b689603db0a576ad3149e22a260 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 6 Dec 2020 22:16:47 +0800 Subject: [PATCH 06/51] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E6=84=9F=E6=83=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/Week_01/README.md b/Week_01/README.md index 186c4c15..a2871294 100644 --- a/Week_01/README.md +++ b/Week_01/README.md @@ -11,3 +11,41 @@ - 看:看看国外网站讨论比较多的大神是如何解答的,学习优秀的思想和算法; - 练:选择自己觉的比较好的算法,进行多次练习(五毒神掌),最好达到看到类似的题,马上能想到并正确写出代码; - 记:在完成以上内容后,可以将思路和代码整理,写成题解(选做:根据时间情况而定)。 + +#### 基本数据结构 + +- 数组(顺序结构) + - 可以快速的查找元素,随机访问,时间复杂度O(1) + - 插入删除需要搬移数据,时间复杂度O(n) + - 无需为逻辑关系而增加额外的存储空间。 + +- 链表 + - 不支持随机访问,时间复杂度O(n) + - 插入和删除便捷,时间复杂度O(1) + - 比数组占用更多的存储空间。 + - 单链表,next + - 双向链表,prev和next + - 循环链表,尾结点指向头结点 + - 静态链表,数组描述的链表 + +- 栈 + - 先进后出 + - 入栈出栈时间复杂度O(1) + - 应用:浏览器前进后退、括号匹配、表达式计算 + +- 队列 + - 先进先出 + - 入队出队时间复杂度O(1) + - 应用:LRU Cache、操作有限资源 + - 双边队列:入口出口都可以入队出队(可作为栈和队列使用) + - 优先级队列:根据优先级出队 + +#### 进阶数据结构 + +- 跳表 + - 有序链表 + - 插入删除搜索时间复杂度O(logn) + - 空间复杂度O(n),典型的空间换时间 + - 增加索引,维护成本高 + - 应用:Redis、LevelDB + From a46547dcd7d0b0f8c39ff1a273db328d935ce2db Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 6 Dec 2020 22:29:42 +0800 Subject: [PATCH 07/51] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Week_01/README.md b/Week_01/README.md index a2871294..c9c2071c 100644 --- a/Week_01/README.md +++ b/Week_01/README.md @@ -39,6 +39,9 @@ - 应用:LRU Cache、操作有限资源 - 双边队列:入口出口都可以入队出队(可作为栈和队列使用) - 优先级队列:根据优先级出队 + - 循环队列:头尾相连,空出一个位置不用 + - 队空条件(front==rear) + - 队满条件(rear+1)%size==front #### 进阶数据结构 From 0533a2c8119d085e2c2e6cf2befe5c3c1cfea3b0 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 6 Dec 2020 22:42:30 +0800 Subject: [PATCH 08/51] =?UTF-8?q?=E9=80=92=E5=BD=92=E5=92=8C=E8=BF=AD?= =?UTF-8?q?=E4=BB=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_01/README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Week_01/README.md b/Week_01/README.md index c9c2071c..682047b9 100644 --- a/Week_01/README.md +++ b/Week_01/README.md @@ -52,3 +52,18 @@ - 增加索引,维护成本高 - 应用:Redis、LevelDB +#### 迭代和递归 + +斐波那契数列是个典型的例子。 + +- 递归 + - 必须有递归终止条件 + - 直接或间接调用自己 + - 选择结构,使程序更简洁易懂 + - 但是大量递归建立函数的副本,耗费大量空间时间 + +- 迭代 + - 循环结构 + - 不需要反复调用 + - 不需要占用额外内存 + From b97cec04a1b992d132ba83c23ad63d4050f614a6 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 13 Dec 2020 20:38:20 +0800 Subject: [PATCH 09/51] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E7=AC=94=E8=AE=B0?= =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/README.md | 138 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/Week_02/README.md b/Week_02/README.md index 50de3041..e123fc83 100644 --- a/Week_02/README.md +++ b/Week_02/README.md @@ -1 +1,137 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 学习感想 + +这是学习的第二周了,第一周学习的内容以前自学过,感觉没那么吃力,第二周的课程看到题目后就觉得没那么简单,不过看完老师的视频觉得没有自己想象的那么难,感觉以前都是被这些名字给吓到了。 + +这周学完对基本的数据结构也算有了一定的了解,希望在以后的学习上能将这些知识理解并收为己用,解决自身学习和工作中的问题。 + +## 哈希表(散列表)Hash Table + +- 根据关键码值(Key Value)直接访问的数据结构 +- 加快查找速度,数组的一种扩展 + + +#### 散列函数 +哈希表的映射函数叫做散列函数。散列函数生成的值要尽可能的随机和均匀分布。 + +- 散列函数计算得到的散列值是一个非负整数; +- 如果 key1 = key2,那 hash(key1) == hash(key2); +- 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。 + +#### 散列冲突 + +装载因子:散列表的装载因子 = 填入表中的元素个数 / 散列表的长度,装载因子越大说明空闲位置越少,冲突越多,散列表的性能会下降。 + +##### 解决冲突的办法 + +- 开放寻址法 + - 适合数据量小,装载因子小的场景 + - 二次探测,双重散列 + +- 链表法 + - 基于链表的散列冲突处理方法比较适合存储大对象、大数据量的散列表 + - 比起开放寻址法,它更加灵活,支持更多的优化策略,比如用红黑树代替链表 + +## 树 Tree + +- 高度(从下往上,从0开始) +- 深度(从上往下,从0开始) +- 层(和深度差不多,从1开始) +- 数的高度(根节点的高度) +- 根节点(没有父节点) +- 叶子节点(没有子节点) + +### 二叉树 + +- 只有两个节点,左子节点,右子节点 +- 满二叉树 + - 叶子节点都在最底层, + - 除了叶子节点,所有节点都有两个子节点 +- 完全二叉树 + - 叶子节点都在最底下两层 + - 最后一层叶子节点都靠左排列 + - 其他层节点个数都达到最大 + +#### 二叉树的遍历 + +- 前序遍历是指 + - 对于树中的任意节点来说,先打印这个节点, + - 然后再打印它的左子树, + - 最后打印它的右子树。 +- 中序遍历是指 + - 对于树中的任意节点来说,先打印它的左子树, + - 然后再打印它本身, + - 最后打印它的右子树。 +- 后序遍历是指 + - 对于树中的任意节点来说,先打印它的左子树, + - 然后再打印它的右子树, + - 最后打印这个节点本身。 + + +``` +前序遍历的递推公式: +preOrder(r) = print r->preOrder(r->left)->preOrder(r->right) + +中序遍历的递推公式: +inOrder(r) = inOrder(r->left)->print r->inOrder(r->right) + +后序遍历的递推公式: +postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r + +``` + + +### 二叉查找树 + +- 左子树中每个节点的值都小于此节点的值 +- 右子树中每个节点的值都大于此节点的值 +- 左右子树也分别为二叉查找树 + +#### 二叉查找树基本操作 + +- 查询 +- 插入 +- 删除 +- 快速找到最大和最小节点 + +## 堆 Heap + +- 大顶堆或大根堆(根节点最大) +- 小顶堆或小根堆(根节点最小) + +### 二叉堆 + +- 堆是一颗完全二叉树。 +- 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 + +#### 二叉堆实现细节 +- 一般是数组实现 +- 假设根节点为0 + - 索引为i的左子节点 2*i+1 + - 索引为i的右子节点 2*i+2 + - 索引为i的父节点 floor((i-1)/2) + +#### 二叉堆基本操作 + +- 插入(HeapifyUp) + - 插入堆尾部 + - 依次向上调整结构,到根即可 + - O(logN) +- 删除(HeapifyDown) + - 将堆尾元素替换到顶部(替换被删除元素) + - 一次从根部向下调整,到底即可 + +## 图 Graph + +- Graph(V, E) +- V - vertex: 点 + - 度 入度和出度 + - 点与点之间:连通与否 +- E - edge: 边 + - 有向和无向(单行线) + - 权重(边长) + + + + From dc0c5f66405ed861c52c661b54330924484fa575 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 13 Dec 2020 22:52:54 +0800 Subject: [PATCH 10/51] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/AddDigits.swift | 44 ++++++++ Week_02/BinaryTree.swift | 120 ++++++++++++++++++++ Week_02/FizzBuzz.swift | 66 +++++++++++ Week_02/GroupAnagrams.swift | 28 +++++ Week_02/Intersect.swift | 41 +++++++ Week_02/LemonnadeChange.swift | 31 ++++++ Week_02/MaxArea.swift | 32 ++++++ Week_02/NAryTree.swift | 135 +++++++++++++++++++++++ Week_02/RemoveOutermostParentheses.swift | 22 ++++ Week_02/SlidingWindowMaximum.swift | 80 ++++++++++++++ Week_02/TopKFrequent.swift | 23 ++++ Week_02/Trap.swift | 34 ++++++ Week_02/TwoSum.swift | 34 ++++++ Week_02/UglyNumber.swift | 28 +++++ Week_02/ValidAnagram.swift | 75 +++++++++++++ 15 files changed, 793 insertions(+) create mode 100644 Week_02/AddDigits.swift create mode 100644 Week_02/BinaryTree.swift create mode 100644 Week_02/FizzBuzz.swift create mode 100644 Week_02/GroupAnagrams.swift create mode 100644 Week_02/Intersect.swift create mode 100644 Week_02/LemonnadeChange.swift create mode 100644 Week_02/MaxArea.swift create mode 100644 Week_02/NAryTree.swift create mode 100644 Week_02/RemoveOutermostParentheses.swift create mode 100644 Week_02/SlidingWindowMaximum.swift create mode 100644 Week_02/TopKFrequent.swift create mode 100644 Week_02/Trap.swift create mode 100644 Week_02/TwoSum.swift create mode 100644 Week_02/UglyNumber.swift create mode 100644 Week_02/ValidAnagram.swift diff --git a/Week_02/AddDigits.swift b/Week_02/AddDigits.swift new file mode 100644 index 00000000..8fc5afdc --- /dev/null +++ b/Week_02/AddDigits.swift @@ -0,0 +1,44 @@ +// +// AddDigits.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/11. +// + +import Foundation + +class AddDigits { + /// 各位相加 + /* + 思考 + x*100 + y*10 + z = x*99 + y*9 + x+y+z + */ + + func addDigits(_ num: Int) -> Int { + return (num - 1) % 9 + 1 + } + + func addDigits01(_ num: Int) -> Int { + if num % 9 == 0 { + return num == 0 ? num : 9 + } else { + return num % 9 + } + } + + /// 递归 + func addDigits02(_ num: Int) -> Int { + if num < 10 { + return num + } else { + var sum = 0 + var temp = num + while temp != 0 { + sum += temp % 10; + temp /= 10; + } + return addDigits(sum) + } + } + +} diff --git a/Week_02/BinaryTree.swift b/Week_02/BinaryTree.swift new file mode 100644 index 00000000..68447097 --- /dev/null +++ b/Week_02/BinaryTree.swift @@ -0,0 +1,120 @@ +// +// BinaryTree.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/12. +// + +import Foundation + +class BinaryTree { + + /* 中序遍历 */ + + /// 递归 + func inorderTraversal(_ root: TreeNode?) -> [Int] { + guard let root = root else { + return [] + } + var res: [Int] = [] + res += inorderTraversal(root.left) + res.append(root.val) + res += inorderTraversal(root.right) + return res + } + + + /// 迭代 + func inorderTraversal01(_ root: TreeNode?) -> [Int] { + var stack: [TreeNode] = [] + var result: [Int] = [] + var node: TreeNode? = root + while node != nil || !stack.isEmpty { + while node != nil { + stack.append(node!) + node = node!.left + } + node = stack.popLast() + result.append(node!.val) + node = node?.right + } + return result + } + + /// Morris 算法 + func inorderTraversal02(_ root: TreeNode?) -> [Int] { + var current, predecessor: TreeNode? + var res: [Int] = [] + current = root + while current != nil { + // 如果没有左孩子,则直接访问右孩子 + if current!.left == nil { + res.append(current!.val) + current = current!.right + } else { + // predecessor 节点就是当前 root 节点向左走一步,然后一直向右走至无法走为止 + predecessor = current!.left + while predecessor!.right != nil && predecessor!.right !== current { + predecessor = predecessor!.right + } + + // 让 predecessor 的右指针指向 root,继续遍历左子树 + if predecessor!.right === current { + predecessor!.right = nil + res.append(current!.val) + current = current!.right + } + // 说明左子树已经访问完了,我们需要断开链接 + else { + predecessor!.right = current + current = current!.left + } + } + } + return res + } + + /* 前序遍历 */ + + /// 递归 + func preorderTraversal(_ root: TreeNode?) -> [Int] { + guard let root = root else { + return [] + } + var res: [Int] = [] + res.append(root.val) + res += preorderTraversal(root.left) + res += preorderTraversal(root.right) + return res + } + +} + +public class TreeNode { + public var val: Int + public var left: TreeNode? + public var right: TreeNode? + + public init() { + self.val = 0; + self.left = nil; + self.right = nil; + } + + public init(_ val: Int) { + self.val = val; + self.left = nil; + self.right = nil; + } + + public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) { + self.val = val + self.left = left + self.right = right + } + + + + +} + diff --git a/Week_02/FizzBuzz.swift b/Week_02/FizzBuzz.swift new file mode 100644 index 00000000..70170832 --- /dev/null +++ b/Week_02/FizzBuzz.swift @@ -0,0 +1,66 @@ +// +// FizzBuzz.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/10. +// + +import Foundation + +class FizzBuzz { + + func fizzBuzz(_ n: Int) -> [String] { + var res = [String]() + let dic = [3: "Fizz", 5: "Buzz"] + for i in 1...n { + var string = "" + for key in dic.keys.sorted(by: <) { + if i % key == 0 { + string.append(dic[key]!) + } + } + if string == "" { + string.append(String(i)) + } + res.append(string) + } + return res + } + + func fizzBuzz01(_ n: Int) -> [String] { + var res = [String]() + for i in 1...n { + var string = "" + if i % 3 == 0 { + string.append("Fizz") + } + if i % 5 == 0 { + string.append("Buzz") + } + if string == "" { + string.append(String(i)) + } + res.append(string) + } + return res + } + + func fizzBuzz02(_ n: Int) -> [String] { + var res = [String]() + for i in 1...n { + var string = "" + if i % 3 == 0 && i % 5 == 0 { + string.append("FizzBuzz") + } else if i % 3 == 0 { + string.append("Fizz") + } else if i % 5 == 0 { + string.append("Buzz") + } + if string == "" { + string.append(String(i)) + } + res.append(string) + } + return res + } +} diff --git a/Week_02/GroupAnagrams.swift b/Week_02/GroupAnagrams.swift new file mode 100644 index 00000000..e6953e30 --- /dev/null +++ b/Week_02/GroupAnagrams.swift @@ -0,0 +1,28 @@ +// +// GroupAnagrams.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/12. +// + +import Foundation + +class GroupAnagrams { + + func groupAnagrams(_ strs: [String]) -> [[String]] { + var hashMap = [String: [String]]() + for str in strs { + let key = String(str.sorted()) + if hashMap[key] == nil { + hashMap[key] = [] + } + hashMap[key]!.append(str) + } + return Array(hashMap.values) + } + + func test(_ strs: [String]) { + let result = groupAnagrams(strs) + print(result) + } +} diff --git a/Week_02/Intersect.swift b/Week_02/Intersect.swift new file mode 100644 index 00000000..ff50a5f5 --- /dev/null +++ b/Week_02/Intersect.swift @@ -0,0 +1,41 @@ +// +// Intersect.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/7. +// + +import Foundation + +class Intersect { + /// 350 两个数组的交集 II + func intersect(_ nums1: [Int], _ nums2: [Int]) -> [Int] { + guard nums1.count <= nums2.count else { + return intersect(nums2, nums1) + } + var hs = [Int: Int](), res = [Int]() + for num in nums1 { + if let record = hs[num] { + hs[num] = record + 1 + } else { + hs[num] = 1 + } + } + for num in nums2 { + if let record = hs[num] { + if record > 0 { + res.append(num) + hs[num] = record - 1 + } + } + } + return res + } + + func test() { + let nums1 = [1,2,2,1] + let nums2 = [2,2] + let result = intersect(nums1, nums2) + print(result) + } +} diff --git a/Week_02/LemonnadeChange.swift b/Week_02/LemonnadeChange.swift new file mode 100644 index 00000000..fbd95f14 --- /dev/null +++ b/Week_02/LemonnadeChange.swift @@ -0,0 +1,31 @@ +// +// LemonnadeChange.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/10. +// + +import Foundation + +class LemonnadeChange { + /// 柠檬水找零(贪心算法) + func lemonadeChange(_ bills: [Int]) -> Bool { + var five = 0, ten = 0 + for b in bills { + if b == 5 { + five += 1 + } else if b == 10 { + five -= 1; ten += 1 + } else if ten > 0 { + five -= 1; ten -= 1 + } else { + five -= 3 + } + //每次找零结束后判断5元数量若小于0,找零失败 + if five < 0 { + return false + } + } + return true + } +} diff --git a/Week_02/MaxArea.swift b/Week_02/MaxArea.swift new file mode 100644 index 00000000..eba3b237 --- /dev/null +++ b/Week_02/MaxArea.swift @@ -0,0 +1,32 @@ +// +// MaxArea.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/10. +// + +import Foundation + +/* + 左右指针夹逼办法 + 1、初始左右指针最大宽度 + 2、小值向内移动 + 3、求面积和原来的面积比较,大的赋值 + */ + +class MaxArea { + /// 最大区域 + func maxArea(_ height: [Int]) -> Int { + var left = 0, right = height.count - 1, res = 0 + while left < right { + let area = min(height[left], height[right]) * (right - left) + if height[left] < height[right] { + left += 1 + } else { + right -= 1 + } + res = max(res, area) + } + return res + } +} diff --git a/Week_02/NAryTree.swift b/Week_02/NAryTree.swift new file mode 100644 index 00000000..24a28028 --- /dev/null +++ b/Week_02/NAryTree.swift @@ -0,0 +1,135 @@ +// +// N_aryTree.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/13. +// + +import Foundation + +class NAryTree { + /* 前序遍历 */ + /// 递归 + func preorder(_ root: Node?) -> [Int] { + guard let root = root else { + return [] + } + var res = [Int]() + res.append(root.val) + for node in root.children { + res += preorder(node) + } + return res + } + + /// 迭代 + func preorder01(_ root: Node?) -> [Int] { + guard let root = root else { + return [] + } + var stack = [Node]() + stack.append(root) + var res = [Int]() + while !stack.isEmpty { + let node = stack.popLast() + res.append(node!.val) + if node!.children.isEmpty { + continue + } + for child in node!.children.reversed() { + stack.append(child) + } + } + return res + } + + /* 后序遍历 */ + /// 递归 + func postorder(_ root: Node?) -> [Int] { + guard let root = root else { + return [] + } + var res = [Int]() + for node in root.children { + res += postorder(node) + } + res.append(root.val) + return res + } + + /// 迭代 + func postorder01(_ root: Node?) -> [Int] { + guard let root = root else { + return [] + } + var arr = [Node]() + arr.append(root) + var res = [Int]() + while !arr.isEmpty { + let node = arr.popLast() + res.insert(node!.val, at: 0) + if node!.children.isEmpty { + continue + } + for child in node!.children { + arr.append(child) + } + } + return res + } + + /* 层序遍历 */ + /// 递归 dfs + func levelOrder(_ root: Node?) -> [[Int]] { + var res = [[Int]]() + func dfs(_ root: Node?, _ depth: Int) { + guard let root = root else { + return + } + if res.count <= depth { + res.append([]) + } + res[depth].append(root.val) + for ch in root.children { + dfs(ch, depth + 1) + } + } + dfs(root, 0) + return res + } + + /// 迭代 bfs + func levelOrder01(_ root: Node?) -> [[Int]] { + var res = [[Int]]() + guard let root = root else { + return res + } + var queue = [Node]() + queue.insert(root, at: 0) + while !queue.isEmpty { + var level = [Int]() + for _ in 0.. String { + var count = 0 + var res = "" + for c in S { + if c == ")" { count -= 1 } + if count >= 1 { res.append(c) } + if c == "(" { count += 1 } + } + return res + } +} diff --git a/Week_02/SlidingWindowMaximum.swift b/Week_02/SlidingWindowMaximum.swift new file mode 100644 index 00000000..7729faeb --- /dev/null +++ b/Week_02/SlidingWindowMaximum.swift @@ -0,0 +1,80 @@ +// +// SlidingWindowMaximum.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/8. +// + +import Foundation + +class SlidingWindowMaximum { + /// 滑动窗口最大值 + func maxSlidingWindow(_ nums: [Int], _ k: Int) -> [Int] { + guard k > 0 && nums.count > 0 else { + return [] + } + var queue = [Int]() + var res = [Int]() + //没成窗前k个数 + for i in 0.. [Int] { + guard k > 0 && nums.count > 0 else { + return [] + } + var queue = [Int]() + var res = [Int]() + var j = 1 - k + for i in 0.. 0 && queue.first! == nums[j - 1] { + queue.removeFirst() + } + while !queue.isEmpty && queue.last! < nums[i] { + queue.removeLast() + } + queue.append(nums[i]) + if j >= 0 { + res.append(queue.first!) + } + j += 1 + } + return res + } + */ + + func test() { + let nums = [1, -2, 3, -4, 5, 6, 7, 8, 2] + let k = 3 + let result = maxSlidingWindow(nums, k) + print(result) + } +} + + diff --git a/Week_02/TopKFrequent.swift b/Week_02/TopKFrequent.swift new file mode 100644 index 00000000..6ca51331 --- /dev/null +++ b/Week_02/TopKFrequent.swift @@ -0,0 +1,23 @@ +// +// TopKFrequent.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/13. +// + +import Foundation + +class TopKFrequent { + func topKFrequent(_ nums: [Int], _ k: Int) -> [Int] { + var dic = [Int: Int]() + for i in nums { + dic[i] = (dic[i] ?? 0) + 1 + } + let a = dic.sorted(by: {$0.1 < $1.1}) + var res = [Int](repeating: 0, count: k) + for j in 0.. Int { + var left = 0, right = height.count - 1 + var leftMax = 0, rightMax = 0, res = 0 + while left < right { + if height[left] < height[right] { + if height[left] < leftMax { + res += leftMax - height[left] + } else { + leftMax = height[left] + } + left += 1 + } else { + if height[right] < rightMax { + res += rightMax - height[right] + } else { + rightMax = height[right] + } + right -= 1 + } + } + return res + } +} diff --git a/Week_02/TwoSum.swift b/Week_02/TwoSum.swift new file mode 100644 index 00000000..03635e04 --- /dev/null +++ b/Week_02/TwoSum.swift @@ -0,0 +1,34 @@ +// +// TwoSum.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/7. +// + +import Foundation + +class TwoSum { + /// 1 两数之和 + func twoSum(_ nums: [Int], _ target: Int) -> [Int] { + var dict = [Int: Int]() + for i in 0 ..< nums.count { + //如果存在返回 + if let index = dict[target - nums[i]] { + return [index, i] + } + //如果不存在,记录值 + dict[nums[i]] = i + } + return [] + } + + func test() { + let nums = [2,7,11,15] + let target = 9 + let result = twoSum(nums, target) + print(result) + } + +} + + diff --git a/Week_02/UglyNumber.swift b/Week_02/UglyNumber.swift new file mode 100644 index 00000000..6ec954fc --- /dev/null +++ b/Week_02/UglyNumber.swift @@ -0,0 +1,28 @@ +// +// UglyNumber.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/13. +// + +import Foundation + +/* + 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。 + 可以用2|3|5相乘得到的数字叫做丑数 + */ + +class UglyNumber { + func nthUglyNumber(_ n: Int) -> Int { + var dp = [Int](repeating: 1, count: n) + var a = 0, b = 0, c = 0 + for i in 1.. Bool { + guard s.count == t.count else { + return false + } + if s.sorted() == t.sorted() { + return true + } else { + return false + } + } + + // 数组方式 + func isAnagram01(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + var arr = [Int](repeating: 0, count: 26) + for c in s { + let i = numFromCharacter(c) - numFromCharacter("a") + arr[i] += 1 + } + for c in t { + let i = numFromCharacter(c) - numFromCharacter("a") + arr[i] -= 1 + if arr[i] < 0 { + return false + } + } + return true + } + + func numFromCharacter(_ char: Character) -> Int { + let str = String(char) + var number: Int = 0 + for code in str.unicodeScalars { + number = Int(code.value) + } + return number + } + + //字典方式 + func isAnagram02(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + var hashMap = [Character: Int]() + for c in s { + if hashMap[c] == nil { + hashMap[c] = 0 + } + hashMap[c]! += 1 + } + for c in t { + if hashMap[c] == nil { + return false + } + hashMap[c]! -= 1 + if hashMap[c]! < 0 { + return false + } + } + return true + } +} From 781363ac5b3aec17337c4c26293eea52bfd1249f Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 13 Dec 2020 23:05:25 +0800 Subject: [PATCH 11/51] =?UTF-8?q?=E6=80=BB=E7=BB=93=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_02/README.md b/Week_02/README.md index e123fc83..27af93ea 100644 --- a/Week_02/README.md +++ b/Week_02/README.md @@ -37,7 +37,7 @@ - 高度(从下往上,从0开始) - 深度(从上往下,从0开始) -- 层(和深度差不多,从1开始) +- 层(从上往下,从1开始) - 数的高度(根节点的高度) - 根节点(没有父节点) - 叶子节点(没有子节点) From 774936a64ade1db3c460bfbcb2a359c225e3a854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Mon, 14 Dec 2020 16:56:25 +0800 Subject: [PATCH 12/51] =?UTF-8?q?=E6=9C=80=E9=AB=98=E9=A2=91k=E4=B8=AA?= =?UTF-8?q?=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改排序方式 --- Week_02/TopKFrequent.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_02/TopKFrequent.swift b/Week_02/TopKFrequent.swift index 6ca51331..79d87c7e 100644 --- a/Week_02/TopKFrequent.swift +++ b/Week_02/TopKFrequent.swift @@ -13,7 +13,7 @@ class TopKFrequent { for i in nums { dic[i] = (dic[i] ?? 0) + 1 } - let a = dic.sorted(by: {$0.1 < $1.1}) + let a = dic.sorted { $0.1 > $1.1 } var res = [Int](repeating: 0, count: k) for j in 0.. Date: Mon, 14 Dec 2020 22:27:48 +0800 Subject: [PATCH 13/51] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E9=81=8D?= =?UTF-8?q?=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 增加其他遍历方式 --- Week_02/BinaryTree.swift | 137 ++++++++++++++++++++++++++++++++++----- 1 file changed, 119 insertions(+), 18 deletions(-) diff --git a/Week_02/BinaryTree.swift b/Week_02/BinaryTree.swift index 68447097..0ee81bf2 100644 --- a/Week_02/BinaryTree.swift +++ b/Week_02/BinaryTree.swift @@ -16,33 +16,74 @@ class BinaryTree { guard let root = root else { return [] } - var res: [Int] = [] - res += inorderTraversal(root.left) + var res = [Int]() + res.append(contentsOf: inorderTraversal(root.left)) res.append(root.val) - res += inorderTraversal(root.right) + res.append(contentsOf: inorderTraversal(root.right)) return res } - /// 迭代 - func inorderTraversal01(_ root: TreeNode?) -> [Int] { - var stack: [TreeNode] = [] - var result: [Int] = [] - var node: TreeNode? = root + func inorderTraversal10(_ root: TreeNode?) -> [Int] { + var stack = [TreeNode]() + var res = [Int]() + var node = root while node != nil || !stack.isEmpty { while node != nil { + //如果有左节点,一直向左 stack.append(node!) node = node!.left } + //结果 node = stack.popLast() - result.append(node!.val) + res.append(node!.val) + //右边节点 node = node?.right } - return result + return res + } + /// 迭代 + func preorderTraversal11(_ root: TreeNode?) -> [Int] { + var stack = [TreeNode]() + var res = [Int]() + var node = root + while node != nil || !stack.isEmpty { + if node != nil { + //如果有左节点,一直向左 + stack.append(node!) + node = node!.left + } else { + //结果 + node = stack.popLast() + res.append(node!.val) + //右边节点 + node = node?.right + } + } + return res + } + /// 迭代 + func preorderTraversal12(_ root: TreeNode?) -> [Int] { + var res = [Int]() + guard let root = root else { + return res + } + var stack = [root] + while !stack.isEmpty { + let node = stack.popLast() + res.append(node!.val) + if node!.right != nil { + stack.append(node!.right!) + } + if node!.left != nil { + stack.append(node!.left!) + } + } + return res } /// Morris 算法 - func inorderTraversal02(_ root: TreeNode?) -> [Int] { + func inorderTraversal20(_ root: TreeNode?) -> [Int] { var current, predecessor: TreeNode? var res: [Int] = [] current = root @@ -57,7 +98,6 @@ class BinaryTree { while predecessor!.right != nil && predecessor!.right !== current { predecessor = predecessor!.right } - // 让 predecessor 的右指针指向 root,继续遍历左子树 if predecessor!.right === current { predecessor!.right = nil @@ -83,8 +123,73 @@ class BinaryTree { } var res: [Int] = [] res.append(root.val) - res += preorderTraversal(root.left) - res += preorderTraversal(root.right) + res.append(contentsOf: preorderTraversal(root.left)) + res.append(contentsOf: preorderTraversal(root.right)) + return res + } + + /// 迭代 + func preorderTraversal10(_ root: TreeNode?) -> [Int] { + var stack = [TreeNode]() + var res = [Int]() + var node = root + while node != nil || !stack.isEmpty { + while node != nil { + //节点加入 + res.append(node!.val) + //有左一直向左 + stack.append(node!) + node = node!.left + } + node = stack.popLast() + //右边节点 + node = node?.right + } + return res + } + + /* 后序遍历 */ + + /// 递归 + func postorderTraversal(_ root: TreeNode?) -> [Int] { + guard let root = root else { + return [] + } + var res = [Int]() + res.append(contentsOf: postorderTraversal(root.left)) + res.append(contentsOf: postorderTraversal(root.right)) + res.append(root.val) + return res + } + + /// 迭代 + func postorderTraversal10(_ root: TreeNode?) -> [Int] { + var stack = [TreeNode]() + var res = [Int]() + var node = root + var prev: TreeNode? = nil + while node != nil || !stack.isEmpty { + //一路向左 + while node != nil { + stack.append(node!) + node = node!.left + } + node = stack.popLast() + //右子节点等于nil,没有右子节点 + //右子节点等于prev,遍历完右子节点回到根节点 + if node?.right == nil || node?.right === prev { + //值加入结果并设置为上次遍历值 + res.append(node!.val) + prev = node + //node设置为空,循环继续从栈内取值 + node = nil + } else { + //右子节点不为空,节点加入栈 + stack.append(node!) + //向右走 + node = node!.right + } + } return res } @@ -112,9 +217,5 @@ public class TreeNode { self.left = left self.right = right } - - - - } From 5e0b3202e8e9a84bd2697ca1e621692833acae8e Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Mon, 14 Dec 2020 22:34:20 +0800 Subject: [PATCH 14/51] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=89=8D=E5=BA=8F?= =?UTF-8?q?=E9=81=8D=E5=8E=86=E5=92=8C=E4=B8=AD=E5=BA=8F=E9=81=8D=E5=8E=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/BinaryTree.swift | 43 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/Week_02/BinaryTree.swift b/Week_02/BinaryTree.swift index 0ee81bf2..e661def5 100644 --- a/Week_02/BinaryTree.swift +++ b/Week_02/BinaryTree.swift @@ -43,7 +43,7 @@ class BinaryTree { return res } /// 迭代 - func preorderTraversal11(_ root: TreeNode?) -> [Int] { + func inorderTraversal11(_ root: TreeNode?) -> [Int] { var stack = [TreeNode]() var res = [Int]() var node = root @@ -62,25 +62,6 @@ class BinaryTree { } return res } - /// 迭代 - func preorderTraversal12(_ root: TreeNode?) -> [Int] { - var res = [Int]() - guard let root = root else { - return res - } - var stack = [root] - while !stack.isEmpty { - let node = stack.popLast() - res.append(node!.val) - if node!.right != nil { - stack.append(node!.right!) - } - if node!.left != nil { - stack.append(node!.left!) - } - } - return res - } /// Morris 算法 func inorderTraversal20(_ root: TreeNode?) -> [Int] { @@ -148,6 +129,26 @@ class BinaryTree { return res } + /// 迭代 + func preorderTraversal11(_ root: TreeNode?) -> [Int] { + var res = [Int]() + guard let root = root else { + return res + } + var stack = [root] + while !stack.isEmpty { + let node = stack.popLast() + res.append(node!.val) + if node!.right != nil { + stack.append(node!.right!) + } + if node!.left != nil { + stack.append(node!.left!) + } + } + return res + } + /* 后序遍历 */ /// 递归 @@ -163,7 +164,7 @@ class BinaryTree { } /// 迭代 - func postorderTraversal10(_ root: TreeNode?) -> [Int] { + func postorderTraversal01(_ root: TreeNode?) -> [Int] { var stack = [TreeNode]() var res = [Int]() var node = root From 3641b6ab5650e4859fcbf59ad13bb77b7bf7f0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Tue, 15 Dec 2020 15:06:13 +0800 Subject: [PATCH 15/51] =?UTF-8?q?=E4=BA=8C=E5=8F=89=E6=A0=91=E4=B8=AD?= =?UTF-8?q?=E5=BA=8F=E9=81=8D=E5=8E=86=E7=9A=84Morris=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_02/BinaryTree.swift | 54 +++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/Week_02/BinaryTree.swift b/Week_02/BinaryTree.swift index e661def5..a3603467 100644 --- a/Week_02/BinaryTree.swift +++ b/Week_02/BinaryTree.swift @@ -9,7 +9,7 @@ import Foundation class BinaryTree { - /* 中序遍历 */ + // MARK: 中序遍历 /// 递归 func inorderTraversal(_ root: TreeNode?) -> [Int] { @@ -63,39 +63,45 @@ class BinaryTree { return res } - /// Morris 算法 + /* + Morris 算法 + 1.current如果没有有左子节点,直接加入结果,current向右走一步 + 2.predecessor节点就是当前current节点向左走一步,然后一直向右走至无法走为止 + 3.predecessor处于最右,若不等于current,将predecessor右子节点指向current + 4.predecessor等于current说明遍历完左子树,断开链接,current向右走一步 + */ func inorderTraversal20(_ root: TreeNode?) -> [Int] { - var current, predecessor: TreeNode? - var res: [Int] = [] - current = root + var res = [Int]() + var current = root + var predecessor: TreeNode? = nil while current != nil { - // 如果没有左孩子,则直接访问右孩子 + // 如果没有左子节点,则直接访问右子节点 if current!.left == nil { res.append(current!.val) current = current!.right + continue + } + //predecessor 节点就是当前 root 节点向左走一步 然后一直向右走至无法走为止 + predecessor = current!.left + while predecessor!.right != nil && predecessor!.right !== current { + predecessor = predecessor!.right + } + + if predecessor!.right === current { + // 说明左子树已经访问完了,我们需要断开链接 + predecessor!.right = nil + res.append(current!.val) + current = current!.right } else { - // predecessor 节点就是当前 root 节点向左走一步,然后一直向右走至无法走为止 - predecessor = current!.left - while predecessor!.right != nil && predecessor!.right !== current { - predecessor = predecessor!.right - } // 让 predecessor 的右指针指向 root,继续遍历左子树 - if predecessor!.right === current { - predecessor!.right = nil - res.append(current!.val) - current = current!.right - } - // 说明左子树已经访问完了,我们需要断开链接 - else { - predecessor!.right = current - current = current!.left - } + predecessor!.right = current + current = current!.left } } return res } - /* 前序遍历 */ + // MARK: 前序遍历 /// 递归 func preorderTraversal(_ root: TreeNode?) -> [Int] { @@ -149,7 +155,7 @@ class BinaryTree { return res } - /* 后序遍历 */ + // MARK: 后序遍历 /// 递归 func postorderTraversal(_ root: TreeNode?) -> [Int] { @@ -196,6 +202,8 @@ class BinaryTree { } +// MARK: - + public class TreeNode { public var val: Int public var left: TreeNode? From 57a58c2251c4e53e79fd40fd89ae15adc283353a Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 20 Dec 2020 21:41:23 +0800 Subject: [PATCH 16/51] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E5=91=A8=E6=80=BB?= =?UTF-8?q?=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/README.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/Week_03/README.md b/Week_03/README.md index 50de3041..90d7506c 100644 --- a/Week_03/README.md +++ b/Week_03/README.md @@ -1 +1,67 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 总结 + +第三周的学习有些不太好,递归逻辑老是梳理不对,搞不懂分治和回溯咋回事,好难!!! + +## 递归 +#### 一、什么是递归? +1. 递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。 +2. 方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。 +3. 基本上,所有的递归问题都可以用递推公式来表示,比如 +f(n) = f(n-1) + 1; +f(n) = f(n-1) + f(n-2); +f(n)=n*f(n-1); + +#### 二、为什么使用递归?递归的优缺点? +1. 优点:代码的表达力很强,写起来简洁。 +2. 缺点:空间复杂度高、有堆栈溢出风险、存在重复计算、过多的函数调用会耗时较多等问题。 + + +#### 三、什么样的问题可以用递归解决呢? +1. 问题的解可以分解为几个子问题的解。何为子问题?就是数据规模更小的问题。 +2. 问题与子问题,除了数据规模不同,求解思路完全一样 +3. 存在递归终止条件 + + +#### 四、如何实现递归? + +##### 递归的代码模板 +1. 递归终止条件 +2. 处理当前层 +3. 下探到下一层 +4. 清理当前层 + +##### 递归思维要点 + +1. 抵制人肉递归 +2. 找最近重复性 +3. 数学归纳法思维 + + +#### 五、递归常见问题及解决方案 +1. 警惕堆栈溢出:可以声明一个全局变量来控制递归的深度,从而避免堆栈溢出。 +2. 警惕重复计算:通过某种数据结构来保存已经求解过的值,从而避免重复计算。 + + +#### 六、如何将递归改写为非递归代码? +笼统的讲,所有的递归代码都可以改写为迭代循环的非递归写法。如何做?抽象出递推公式、初始值和边界条件,然后用迭代循环实现。 + +## 分治(分而治之) + +分治是一种处理问题的思想,多适合用递归来实现。 + +* 分解:将原问题分解成一系列子问题; +* 解决:递归地求解各个子问题,若子问题足够小,则直接求解; +* 合并:将子问题的结果合并成原问题。 + +分治算法能解决的问题,一般需要满足下面这几个条件: + +* 原问题与分解成的小问题具有相同的模式; +* 原问题分解成的子问题可以独立求解,子问题之间没有相关性; +* 具有分解终止条件,也就是说,当问题足够小时,可以直接求解; +* 可以将子问题合并成原问题,而这个合并操作的复杂度不能太高,否则就起不到减小算法总体复杂度的效果了。 + +## 回溯 + +回溯算法的思想非常简单,大部分情况下,都是用来解决广义的搜索问题,也就是,从一组可能的解中,选择出一个满足要求的解。回溯算法非常适合用递归来实现,在实现的过程中,剪枝操作是提高回溯效率的一种技巧。利用剪枝,我们并不需要穷举搜索所有的情况,从而提高搜索效率。 \ No newline at end of file From f77cdc809c156d69fac5e82a65d1ccd7bdfaac09 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 20 Dec 2020 22:38:48 +0800 Subject: [PATCH 17/51] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/BuildTree.swift | 35 +++++++++ Week_03/Codec.swift | 40 ++++++++++ Week_03/Combinations.swift | 36 +++++++++ Week_03/GenerateParenthesis.swift | 32 ++++++++ Week_03/InvertTree.swift | 47 +++++++++++ Week_03/IsValidBST.swift | 96 +++++++++++++++++++++++ Week_03/LowestCommonAncestor.swift | 29 +++++++ Week_03/MaxDepth.swift | 15 ++++ Week_03/MinDepth.swift | 41 ++++++++++ Week_03/MyCircularDeque.swift | 121 +++++++++++++++++++++++++++++ Week_03/Permutations.swift | 54 +++++++++++++ Week_03/PermuteUnique.swift | 35 +++++++++ Week_03/Pow.swift | 21 +++++ Week_03/ReversePrint.swift | 86 ++++++++++++++++++++ Week_03/Tree.swift | 43 ++++++++++ 15 files changed, 731 insertions(+) create mode 100644 Week_03/BuildTree.swift create mode 100644 Week_03/Codec.swift create mode 100644 Week_03/Combinations.swift create mode 100644 Week_03/GenerateParenthesis.swift create mode 100644 Week_03/InvertTree.swift create mode 100644 Week_03/IsValidBST.swift create mode 100644 Week_03/LowestCommonAncestor.swift create mode 100644 Week_03/MaxDepth.swift create mode 100644 Week_03/MinDepth.swift create mode 100644 Week_03/MyCircularDeque.swift create mode 100644 Week_03/Permutations.swift create mode 100644 Week_03/PermuteUnique.swift create mode 100644 Week_03/Pow.swift create mode 100644 Week_03/ReversePrint.swift create mode 100644 Week_03/Tree.swift diff --git a/Week_03/BuildTree.swift b/Week_03/BuildTree.swift new file mode 100644 index 00000000..6c7770d9 --- /dev/null +++ b/Week_03/BuildTree.swift @@ -0,0 +1,35 @@ +// +// BuildTree.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/19. +// + +import Foundation + +class BuildTree { + //根据前序遍历和中序遍历构造二叉树 + func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? { + guard preorder.count == inorder.count else { + return nil + } + var inDict = [Int: Int]() + for (index, value) in inorder.enumerated() { + inDict[value] = index + } + return myBuildTree(preorder, inDict, 0, preorder.count - 1, 0, inorder.count - 1) + } + + func myBuildTree(_ preorder: [Int], _ inDict: [Int: Int], _ preLeft: Int, _ preRight: Int, _ inLeft: Int, _ inRight: Int) -> TreeNode? { + guard preLeft <= preRight && inLeft <= inRight else { + return nil + } + let rootVal = preorder[preLeft] + let rootIndex = inDict[rootVal] + let node = TreeNode(rootVal) + node.left = myBuildTree(preorder, inDict, preLeft + 1, rootIndex! - inLeft + preLeft, inLeft, rootIndex! - 1) + node.right = myBuildTree(preorder, inDict, rootIndex! - inLeft + preLeft + 1, preRight, rootIndex! + 1, inRight) + return node + } + +} diff --git a/Week_03/Codec.swift b/Week_03/Codec.swift new file mode 100644 index 00000000..68508c11 --- /dev/null +++ b/Week_03/Codec.swift @@ -0,0 +1,40 @@ +// +// Codec.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/20. +// + +import Foundation + +/// 序列化和反序列化一个二叉树 + +class Codec { + + func serialize(_ root: TreeNode?) -> String { + var res = "" + guard let root = root else { + return res + "nil," + } + res += "\(root.val)," + res += serialize(root.left) + res += serialize(root.right) + return res + } + + func deserialize(_ data: String) -> TreeNode? { + var array = data.split(separator: ",") + return deserializeHelper(&array) + } + func deserializeHelper(_ data: inout [Substring]) -> TreeNode? { + if data.first == "nil" { + data.removeFirst() + return nil + } + let node = TreeNode(Int(String(data.first!))!) + data.removeFirst() + node.left = deserializeHelper(&data) + node.right = deserializeHelper(&data) + return node + } +} diff --git a/Week_03/Combinations.swift b/Week_03/Combinations.swift new file mode 100644 index 00000000..87bd3b5b --- /dev/null +++ b/Week_03/Combinations.swift @@ -0,0 +1,36 @@ +// +// Combinations.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/19. +// + +import Foundation + +class Combinations { + + var temp = [Int]() + var ans = [[Int]]() + func combine(_ n: Int, _ k: Int) -> [[Int]] { + dfs(1, n, k) + return ans + } + func dfs(_ cur: Int, _ n: Int, _ k: Int) { + // 剪枝:temp 长度加上区间 [cur, n] 的长度小于 k,不可能构造出长度为 k 的 temp + if temp.count + (n - cur + 1) < k { + return + } + //记录合法答案 + if temp.count == k { + ans.append(Array(temp)) + return + } + // 考虑选择当前位置 + temp.append(cur) + dfs(cur + 1, n, k) + temp.removeLast() + // 考虑不选择当前位置 + dfs(cur + 1, n, k) + } + +} diff --git a/Week_03/GenerateParenthesis.swift b/Week_03/GenerateParenthesis.swift new file mode 100644 index 00000000..de1b98e6 --- /dev/null +++ b/Week_03/GenerateParenthesis.swift @@ -0,0 +1,32 @@ +// +// GenerateParenthesis.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/15. +// + +import Foundation + +class GenerateParenthesis { + + func generateParenthesis(_ n: Int) -> [String] { + var res = [String]() + generate(0, 0, n, "", &res) + return res + } + + func generate(_ left: Int, _ right: Int, _ n: Int, _ s: String, _ res: inout [String]) { + if left == n && right == n { + res.append(s) + return + } + if left < n { + generate(left + 1, right, n, s + "(", &res) + } + if left > right { + generate(left, right + 1, n, s + ")", &res) + } + } + + +} diff --git a/Week_03/InvertTree.swift b/Week_03/InvertTree.swift new file mode 100644 index 00000000..7d72ed38 --- /dev/null +++ b/Week_03/InvertTree.swift @@ -0,0 +1,47 @@ +// +// InvertTree.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/18. +// + +import Foundation + +class InvertTree { + + /* + * 时间复杂度:O(n),n为树的节点数。 + * 空间复杂度:O(n),n为递归栈深度。 + */ + func invertTree(_ root: TreeNode?) -> TreeNode? { + guard let root = root else { + return nil + } + //交换左右节点的值 drill down + (root.left, root.right) = (invertTree(root.right), invertTree(root.left)) + return root + } + + /* + * 时间复杂度:O(n),n为树的节点数。 + * 空间复杂度:O(n),n为栈深度。 + */ + func invertTree10(_ root: TreeNode?) -> TreeNode? { + guard let root = root else { + return nil + } + var stack = [root] + while !stack.isEmpty { + let node = stack.popLast() + (node!.left, node!.right) = (node!.right, node!.left) + if let left = node?.left { + stack.append(left) + } + if let right = node?.right { + stack.append(right) + } + } + return root + } + +} diff --git a/Week_03/IsValidBST.swift b/Week_03/IsValidBST.swift new file mode 100644 index 00000000..7c7c335d --- /dev/null +++ b/Week_03/IsValidBST.swift @@ -0,0 +1,96 @@ +// +// IsValidBST.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/18. +// + +import Foundation + +class IsValidBST { + + /* + 递归 + 时间复杂度:O(n) + 空间复杂度:O(n) + */ + + func isValidBST(_ root: TreeNode?) -> Bool { + return helper(root, Int.min, Int.max) + } + func helper(_ root: TreeNode?, _ min: Int, _ max: Int) -> Bool { + guard let root = root else { + return true + } + if root.val >= max || root.val <= min { + return false + } + let leftResult = helper(root.left, min, root.val) + let rightResult = helper(root.right, root.val, max) + return leftResult && rightResult + } + + /* + 中序遍历 + 时间复杂度:O(n) + 空间复杂度:O(n) + */ + func isValidBST10(_ root: TreeNode?) -> Bool { + var stack = [TreeNode]() + var node = root + var last = Int.min + while node != nil || !stack.isEmpty { + while node != nil { + stack.append(node!) + node = node!.left + } + node = stack.popLast() + if node!.val <= last { + return false + } + last = node!.val + node = node!.right + } + return true + } + + //中序遍历递归 + func isValidBST11(_ root: TreeNode?) -> Bool { + //内嵌函数 + func inorder(_ root: TreeNode?) -> Bool { + guard let root = root else { + return true + } + if inorder(root.left) { + if root.val <= last { + return false + } + last = root.val + return inorder(root.right) + } + return false + } + var last = Int.min + return inorder(root) + } + + //中序遍历递归 + func isValidBST12(_ root: TreeNode?) -> Bool { + var last = Int.min + return inorder(root, &last) + } + func inorder(_ root: TreeNode?, _ last: inout Int) -> Bool { + guard let root = root else { + return true + } + if inorder(root.left, &last) { + if root.val <= last { + return false + } + last = root.val + return inorder(root.right, &last) + } + return false + } + +} diff --git a/Week_03/LowestCommonAncestor.swift b/Week_03/LowestCommonAncestor.swift new file mode 100644 index 00000000..3ff80e9e --- /dev/null +++ b/Week_03/LowestCommonAncestor.swift @@ -0,0 +1,29 @@ +// +// LowestCommonAncestor.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/17. +// + +import Foundation + +class LowestCommonAncestor { + + /* + 时间复杂度:O(n),其中n为树的节点总数。 + 空间复杂度:O(n),其中n为树的节点总数。 + */ + + func lowestCommonAncestor(_ root: TreeNode?, _ p: TreeNode?, _ q: TreeNode?) -> TreeNode? { + //如果root为空直接就是空,如果root等于p或者q,直接就是最近公共祖先 + if root == nil || root === p || root === q { return root } + //递归 + let left = lowestCommonAncestor(root!.left, p, q) + let right = lowestCommonAncestor(root!.right, p, q) + //根据情况处理返回值 + if left == nil { return right } + if right == nil { return left } + return root + } + +} diff --git a/Week_03/MaxDepth.swift b/Week_03/MaxDepth.swift new file mode 100644 index 00000000..0c06aa5c --- /dev/null +++ b/Week_03/MaxDepth.swift @@ -0,0 +1,15 @@ +// +// MaxDepth.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/18. +// + +import Foundation + +class MaxDepth { + func maxDepth(_ root: TreeNode?) -> Int { + guard let root = root else { return 0 } + return max(maxDepth(root.left), maxDepth(root.right)) + 1 + } +} diff --git a/Week_03/MinDepth.swift b/Week_03/MinDepth.swift new file mode 100644 index 00000000..e1bc4e13 --- /dev/null +++ b/Week_03/MinDepth.swift @@ -0,0 +1,41 @@ +// +// MinDepth.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/19. +// + +import Foundation + +class MinDepth { + + func minDepth(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + if root.left == nil && root.right == nil { + return 1 + } + var minD = Int.max + if root.left != nil { + minD = min(minDepth(root.left), minD) + } + if root.right != nil { + minD = min(minDepth(root.right), minD) + } + return minD + 1 + } + + func minDepth10(_ root: TreeNode?) -> Int { + guard let root = root else { + return 0 + } + let left = minDepth(root.left) + let right = minDepth(root.right) + if left == 0 || right == 0 { + return left + right + 1 + } + return min(left, right) + 1 + } + +} diff --git a/Week_03/MyCircularDeque.swift b/Week_03/MyCircularDeque.swift new file mode 100644 index 00000000..655847e8 --- /dev/null +++ b/Week_03/MyCircularDeque.swift @@ -0,0 +1,121 @@ +// +// MyCircularDeque.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/18. +// + +import Foundation + +class MyCircularDeque { + var head: Int + var tail: Int + let size: Int + var array: [Int] + /** Initialize your data structure here. Set the size of the deque to be k. */ + init(_ k: Int) { + head = 0 + tail = 0 + size = k + 1 + array = [Int](repeating: 0, count: k + 1) + } + + /** Adds an item at the front of Deque. Return true if the operation is successful. */ + func insertFront(_ value: Int) -> Bool { + if isFull() { + return false + } + head = (head - 1 + size) % size + array[head] = value + return true + } + + /** Adds an item at the rear of Deque. Return true if the operation is successful. */ + func insertLast(_ value: Int) -> Bool { + if isFull() { + return false + } + array[tail] = value + tail = (tail + 1) % size + return true + } + + /** Deletes an item from the front of Deque. Return true if the operation is successful. */ + func deleteFront() -> Bool { + if isEmpty() { + return false + } + head = (head + 1) % size + return true + } + + /** Deletes an item from the rear of Deque. Return true if the operation is successful. */ + func deleteLast() -> Bool { + if isEmpty() { + return false + } + tail = (tail - 1 + size) % size + return true + } + + /** Get the front item from the deque. */ + func getFront() -> Int { + if isEmpty() { + return -1 + } + return array[head] + } + + /** Get the last item from the deque. */ + func getRear() -> Int { + if isEmpty() { + return -1 + } + let pos = (tail - 1 + size) % size + return array[pos] + } + + /** Checks whether the circular deque is empty or not. */ + func isEmpty() -> Bool { + return head == tail + } + + /** Checks whether the circular deque is full or not. */ + func isFull() -> Bool { + return head == ((tail + 1) % size) + } + +} + +/** + * Your MyCircularDeque object will be instantiated and called as such: + * let obj = MyCircularDeque(k) + * let ret_1: Bool = obj.insertFront(value) + * let ret_2: Bool = obj.insertLast(value) + * let ret_3: Bool = obj.deleteFront() + * let ret_4: Bool = obj.deleteLast() + * let ret_5: Int = obj.getFront() + * let ret_6: Int = obj.getRear() + * let ret_7: Bool = obj.isEmpty() + * let ret_8: Bool = obj.isFull() + */ + +extension MyCircularDeque { + class func test() { + let deque = MyCircularDeque(5) + print(deque.getRear()) + print(deque.getFront()) + print(deque.insertLast(1)) + print(deque.insertFront(4)) + print(deque.insertLast(2)) + print(deque.insertLast(3)) + print(deque.insertLast(5)) + print(deque.insertLast(6)) + print(deque.head, deque.tail, deque.size) + print(deque.array) + print(deque.isFull()) + print(deque.isEmpty()) + print(deque.getRear()) + print(deque.getFront()) + } +} diff --git a/Week_03/Permutations.swift b/Week_03/Permutations.swift new file mode 100644 index 00000000..09a571a1 --- /dev/null +++ b/Week_03/Permutations.swift @@ -0,0 +1,54 @@ +// +// Permutations.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/19. +// + +import Foundation + +class Permutations { + + func permute(_ nums: [Int]) -> [[Int]] { + func backtrack(_ n: Int, _ first: Int) { + if first == n { + res.append(Array(output)) + } + for i in first.. [[Int]] { + func backtrack() { + if temp.count == nums.count { + res.append(Array(temp)) + return + } + for i in 0.. [[Int]] { + func backstrack(_ index: Int) { + if temp.count == numsSorted.count { + res.append(Array(temp)) + return + } + for i in 0.. 0 && numsSorted[i] == numsSorted[i - 1] && !visited[i - 1]) { + continue + } + temp.append(numsSorted[i]) + visited[i] = true + backstrack(index + 1) + visited[i] = false + temp.remove(at: index) + } + } + var res = [[Int]]() + var temp = [Int]() + let numsSorted = nums.sorted() + var visited = [Bool](repeating: false, count: nums.count) + backstrack(0) + return res + } +} diff --git a/Week_03/Pow.swift b/Week_03/Pow.swift new file mode 100644 index 00000000..b38ba4e8 --- /dev/null +++ b/Week_03/Pow.swift @@ -0,0 +1,21 @@ +// +// Pow.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/20. +// + +import Foundation + +class Pow { + func myPow(_ x: Double, _ n: Int) -> Double { + return n > 0 ? myPowHelper(x, n) : 1 / myPowHelper(x, -n) + } + func myPowHelper(_ x: Double, _ n: Int) -> Double { + if x == 1.0 || n == 0 { return 1.0 } + if x == 0.0 { return 0.0 } + if n == 1 { return x } + let y = myPowHelper(x, n / 2); + return n % 2 == 0 ? y * y : y * y * x; + } +} diff --git a/Week_03/ReversePrint.swift b/Week_03/ReversePrint.swift new file mode 100644 index 00000000..a6c06f98 --- /dev/null +++ b/Week_03/ReversePrint.swift @@ -0,0 +1,86 @@ +// +// ReversePrint.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/17. +// + +import Foundation + +class ReversePrint { + // MARK: 递归 + + /* + - 时间复杂度:O(n),其中 n 为链表节点的个数。链表的遍历中每个节点会被访问一次且只会被访问一次。 + - 空间复杂度:O(n)。空间复杂度取决于递归的栈深度,而栈深度为一条链的情况下会达到 O(n) 的级别。 + */ + func reversePrint(_ head: ListNode?) -> [Int] { + var res = [Int]() + reverse(head, &res) + return res + } + func reverse(_ head: ListNode?, _ res: inout [Int]) { + if head == nil { + return + } + reverse(head!.next, &res) + res.append(head!.val) + } + + // MARK: 栈 + + /* + - 时间复杂度:O(n),其中 n 为链表节点的个数。链表的遍历中每个节点会被访问二次,入栈一次出栈一次。 + - 空间复杂度:O(n)。空间复杂度取决于栈深度,而栈深度会达到 O(n) 的级别。 + */ + func reversePrint10(_ head: ListNode?) -> [Int] { + var res = [Int]() + var stack = [ListNode]() + var node = head + while node != nil { + stack.append(node!) + node = node!.next + } + while !stack.isEmpty { + res.append(stack.popLast()!.val) + } + return res + } + + // MARK: 先遍历后翻转 + + /* + - 时间复杂度:O(n),其中 n 为链表节点的个数。链表的遍历中每个节点,翻转为n/2。 + - 空间复杂度:O(1)。不使用额外的栈空间,翻转是原地操作。 + */ + func reversePrint20(_ head: ListNode?) -> [Int] { + var res = [Int]() + var node = head + while node != nil { + res.append(node!.val) + node = node!.next + } + reverseArray(&res) + return res + } + + func reverseArray(_ array: inout [Int]) { + var left = 0, right = array.count - 1 + while left < right { + array[left] = array[left] ^ array[right] + array[right] = array[left] ^ array[right] + array[left] = array[left] ^ array[right] + left += 1 + right -= 1 + } + } +} + +public class ListNode { + public var val: Int + public var next: ListNode? + public init(_ val: Int) { + self.val = val + self.next = nil + } +} diff --git a/Week_03/Tree.swift b/Week_03/Tree.swift new file mode 100644 index 00000000..02991f48 --- /dev/null +++ b/Week_03/Tree.swift @@ -0,0 +1,43 @@ +// +// Tree.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/17. +// + +import Foundation + +// MARK: - 二叉树 +public class TreeNode { + public var val: Int + public var left: TreeNode? + public var right: TreeNode? + + public init() { + self.val = 0; + self.left = nil; + self.right = nil; + } + + public init(_ val: Int) { + self.val = val; + self.left = nil; + self.right = nil; + } + + public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) { + self.val = val + self.left = left + self.right = right + } +} + +// MARK: - N叉树 +public class Node { + public var val: Int + public var children: [Node] + public init(_ val: Int) { + self.val = val + self.children = [] + } +} From 66c198ed05bb5525b3f3d5ba06147bd5d5a12cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Mon, 21 Dec 2020 11:03:04 +0800 Subject: [PATCH 18/51] =?UTF-8?q?=E9=80=92=E5=BD=92=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E6=B7=BB=E5=8A=A0=E8=8B=B1=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Week_03/README.md b/Week_03/README.md index 90d7506c..f632ee9a 100644 --- a/Week_03/README.md +++ b/Week_03/README.md @@ -27,10 +27,11 @@ f(n)=n*f(n-1); #### 四、如何实现递归? ##### 递归的代码模板 -1. 递归终止条件 -2. 处理当前层 -3. 下探到下一层 -4. 清理当前层 +1. 递归终止条件 recursion terminator +2. 处理当前层 process logic in current level +3. 下探到下一层 drill down +4. 清理当前层 reverse the current level status needed + ##### 递归思维要点 From 013ccc8b71d979b4fe1531a8b71db06db7fcf687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Mon, 21 Dec 2020 11:28:01 +0800 Subject: [PATCH 19/51] =?UTF-8?q?=E5=88=86=E6=B2=BB=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_03/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Week_03/README.md b/Week_03/README.md index f632ee9a..d246ad7a 100644 --- a/Week_03/README.md +++ b/Week_03/README.md @@ -4,6 +4,8 @@ 第三周的学习有些不太好,递归逻辑老是梳理不对,搞不懂分治和回溯咋回事,好难!!! +刷题代码好难懂啊!!! + ## 递归 #### 一、什么是递归? 1. 递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。 @@ -30,7 +32,7 @@ f(n)=n*f(n-1); 1. 递归终止条件 recursion terminator 2. 处理当前层 process logic in current level 3. 下探到下一层 drill down -4. 清理当前层 reverse the current level status needed +4. 清理当前层 reverse the current level status if needed ##### 递归思维要点 @@ -50,6 +52,13 @@ f(n)=n*f(n-1); ## 分治(分而治之) +##### 分治的代码模板 +1. 递归终止条件 recursion terminator +2. 准备数据拆分问题 prepare data +3. 递归处理子问题 conquer subproblems +4. 合并子结果 process and generate the final result +5. 清理当前层 reverse the current level status + 分治是一种处理问题的思想,多适合用递归来实现。 * 分解:将原问题分解成一系列子问题; From 03f884e2e5ea84557490486b212a183d89c9ab75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Wed, 23 Dec 2020 11:21:01 +0800 Subject: [PATCH 20/51] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 子集 众数 键盘数字的字母组合 N皇后 --- Week_03/LetterOfPhoneNumber.swift | 34 +++++++++++++++++ Week_03/MajorityElement.swift | 53 ++++++++++++++++++++++++++ Week_03/NQueens.swift | 57 ++++++++++++++++++++++++++++ Week_03/Subset.swift | 62 +++++++++++++++++++++++++++++++ 4 files changed, 206 insertions(+) create mode 100644 Week_03/LetterOfPhoneNumber.swift create mode 100644 Week_03/MajorityElement.swift create mode 100644 Week_03/NQueens.swift create mode 100644 Week_03/Subset.swift diff --git a/Week_03/LetterOfPhoneNumber.swift b/Week_03/LetterOfPhoneNumber.swift new file mode 100644 index 00000000..74d867a0 --- /dev/null +++ b/Week_03/LetterOfPhoneNumber.swift @@ -0,0 +1,34 @@ +// +// LetterOfPhoneNumber.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/22. +// + +import Foundation + +class LetterOfPhoneNumber { + /* 电话号码的字母组合 */ + func letterCombinations(_ digits: String) -> [String] { + guard digits.count > 0 else { + return [] + } + var res = [String]() + var temp = "" + let dic: [Character: String] = ["2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz"] + func backtrack(_ index: Int) { + if index == digits.count { + res.append(String(temp)) + return + } + let str = dic[digits[digits.index(digits.startIndex, offsetBy: index)]] + for c in str! { + temp.append(String(c)) + backtrack(index + 1) + temp.removeLast() + } + } + backtrack(0) + return res + } +} diff --git a/Week_03/MajorityElement.swift b/Week_03/MajorityElement.swift new file mode 100644 index 00000000..675faa84 --- /dev/null +++ b/Week_03/MajorityElement.swift @@ -0,0 +1,53 @@ +// +// MajorityElement.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/22. +// + +import Foundation + +class MajorityElement { + /* + 遍历存到字典里面,如果一个数出现的次数大于n/2,这个数就是众数 + */ + func majorityElement(_ nums: [Int]) -> Int { + var hashMap = [Int: Int]() + for (_, value) in nums.enumerated() { + hashMap[value] = (hashMap[value] ?? 0) + 1 + if hashMap[value]! > nums.count / 2 { + return value + } + } + return -1 + } + + /* + 排序,后n/2处的数就是众数 + */ + func majorityElement10(_ nums: [Int]) -> Int { + let a = nums.sorted() + let halfIndex = nums.count / 2 + return a[halfIndex] + } + + /* + 摩尔投票法: + 先假设第一个数过半数并设cnt=1; + 遍历后面的数如果相同则cnt+1,不同则减一, + 当cnt为0时则更换新的数字为候选数 + (成立前提:有出现次数大于n/2的数存在) + */ + func majorityElement20(_ nums: [Int]) -> Int { + var count = 0, res = 0 + for (_, value) in nums.enumerated() { + if count == 0 { + res = value + count += 1 + } else { + res == value ? (count += 1) : (count -= 1) + } + } + return res + } +} diff --git a/Week_03/NQueens.swift b/Week_03/NQueens.swift new file mode 100644 index 00000000..5f8e43da --- /dev/null +++ b/Week_03/NQueens.swift @@ -0,0 +1,57 @@ +// +// NQueens.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/23. +// + +import Foundation + +class NQueens { + + func solveNQueens(_ n: Int) -> [[String]] { + var res = [[String]]() + var queens = [Int](repeating: -1, count: n) + var cols = Set(), dia1 = Set(), dia2 = Set() + func backtrack(_ row: Int) { + if row == n { + res.append(generateQueensToString(queens, n)) + return + } + for i in 0.. [String] { + var queensStrings = [String]() + for i in 0.. [[Int]] { + var res = [[Int]]() + var temp = [Int]() + func backtrack(_ start: Int) { + res.append(Array(temp)) + for i in start.. [[Int]] { + var res = [[Int]]() + let n = nums.count + let p = 1 << n + for i in 0..

> j) & 1 == 1 { + temp.append(nums[j]) + } + } + res.append(temp) + } + return res + } + + func subsets20(_ nums: [Int]) -> [[Int]] { + var res = [[Int]]() + var temp = [Int]() + func backtrack(_ cur: Int) { + if cur == nums.count { + res.append(Array(temp)) + return + } + temp.append(nums[cur]) + backtrack(cur + 1) + temp.removeLast() + backtrack(cur + 1) + } + backtrack(0) + return res + } + +} From ac6e06fed56c79a442d072ebda49bb89b338d598 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 27 Dec 2020 22:06:24 +0800 Subject: [PATCH 21/51] =?UTF-8?q?=E7=AC=AC=E5=9B=9B=E5=91=A8=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_04/AssignCookies.swift | 24 +++++ Week_04/FindMinInRotatedSortedArray.swift | 58 +++++++++++ Week_04/JumpGame.swift | 32 ++++++ Week_04/JumpGameII.swift | 50 ++++++++++ Week_04/LemonnadeChange.swift | 34 +++++++ Week_04/MaxProfit.swift | 19 ++++ Week_04/Minesweeper.swift | 114 ++++++++++++++++++++++ Week_04/NumberOfIsland.swift | 38 ++++++++ Week_04/RobotSim.swift | 39 ++++++++ Week_04/Search2DMatrix.swift | 32 ++++++ Week_04/SearchInRotatedSortedArray.swift | 47 +++++++++ Week_04/WordLadder.swift | 110 +++++++++++++++++++++ Week_04/WordLadderII.swift | 103 +++++++++++++++++++ 13 files changed, 700 insertions(+) create mode 100644 Week_04/AssignCookies.swift create mode 100644 Week_04/FindMinInRotatedSortedArray.swift create mode 100644 Week_04/JumpGame.swift create mode 100644 Week_04/JumpGameII.swift create mode 100644 Week_04/LemonnadeChange.swift create mode 100644 Week_04/MaxProfit.swift create mode 100644 Week_04/Minesweeper.swift create mode 100644 Week_04/NumberOfIsland.swift create mode 100644 Week_04/RobotSim.swift create mode 100644 Week_04/Search2DMatrix.swift create mode 100644 Week_04/SearchInRotatedSortedArray.swift create mode 100644 Week_04/WordLadder.swift create mode 100644 Week_04/WordLadderII.swift diff --git a/Week_04/AssignCookies.swift b/Week_04/AssignCookies.swift new file mode 100644 index 00000000..e62610ef --- /dev/null +++ b/Week_04/AssignCookies.swift @@ -0,0 +1,24 @@ +// +// AssignCookies.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/24. +// + +import Foundation + +class AssignCookies { + //455. 分发饼干 + func findContentChildren(_ g: [Int], _ s: [Int]) -> Int { + let gSorted = g.sorted() // 孩子胃口排序 + let sSorted = s.sorted() // 饼干排序 + var res = 0, sIndex = 0 // 最终结果和饼干的下标 + while sIndex < s.count && res < g.count { + if sSorted[sIndex] >= gSorted[res] { + res += 1 // 如果饼干满足孩子,结果加一 + } + sIndex += 1 // 无论饼干是否满足,结果都加一 + } + return res + } +} diff --git a/Week_04/FindMinInRotatedSortedArray.swift b/Week_04/FindMinInRotatedSortedArray.swift new file mode 100644 index 00000000..d7e32e38 --- /dev/null +++ b/Week_04/FindMinInRotatedSortedArray.swift @@ -0,0 +1,58 @@ +// +// FindMinInRotatedSortedArray.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/26. +// + +import Foundation + +class FindMinInRotatedSortedArray { + func findMin(_ nums: [Int]) -> Int { + let n = nums.count + if n == 1 { + return nums[0] + } + var minValue = Int.max + var left = 0, right = nums.count - 1 + while left <= right { + let mid = (left + right) / 2 + if nums[left] <= nums[mid] { + //左未旋转 + minValue = min(nums[left], minValue) + left = mid + 1 + } else { + //右未旋转 + minValue = min(nums[mid], minValue) + right = mid - 1 + } + } + return minValue + } + + func findMin10(_ nums: [Int]) -> Int { + let n = nums.count + var left = 0, right = n - 1 + if nums[right] >= nums[0] { + //未旋转 + return nums[0] + } + while left <= right { + let mid = (left + right) / 2 + if nums[mid] > nums[mid + 1] { + return nums[mid + 1] + } + if nums[mid - 1] > nums[mid] { + return nums[mid] + } + if nums[left] < nums[mid] { + //左未旋转 + left = mid + 1 + } else { + //右未旋转 + right = mid - 1 + } + } + return -1 + } +} diff --git a/Week_04/JumpGame.swift b/Week_04/JumpGame.swift new file mode 100644 index 00000000..18e8366b --- /dev/null +++ b/Week_04/JumpGame.swift @@ -0,0 +1,32 @@ +// +// JumpGame.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/26. +// + +import Foundation + +class JumpGame { + + func canJump(_ nums: [Int]) -> Bool { + var reach = 0 + for i in 0.. reach { + return false + } + reach = max(reach, i + nums[i]) + } + return true + } + + func canJump10(_ nums: [Int]) -> Bool { + var last = 0 + for (i, v) in nums.enumerated().reversed() { + if i + v >= last { + last = i + } + } + return last == 0 + } +} diff --git a/Week_04/JumpGameII.swift b/Week_04/JumpGameII.swift new file mode 100644 index 00000000..5c0f4a21 --- /dev/null +++ b/Week_04/JumpGameII.swift @@ -0,0 +1,50 @@ +// +// JumpGameII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/27. +// + +import Foundation + +class JumpGameII { + + /* 超时 从后往前贪心 */ + func jump(_ nums: [Int]) -> Int { + if nums.count <= 1 { + return 0 + } + var position = nums.count - 1 + var step = 0 + while position > 0 { + for i in 0..= position { + step += 1 + position = i + break + } + } + } + return step + } + + /* 从前往后贪心 */ + func jump10(_ nums: [Int]) -> Int { + if nums.count <= 1 { + return 0 + } + var maxIndex = 0, step = 0, end = 0 + for i in 0.. Bool { + guard bills.count > 0, bills.first == 5 else { + return false + } + var five = 0, ten = 0 + for b in bills { + if b == 5 { + five += 1 + } else if b == 10 { + five -= 1; ten += 1 + } else if ten > 0 { + five -= 1; ten -= 1 + } else { + five -= 3 + } + //每次找零结束后判断5元数量若小于0,找零失败 + if five < 0 { + return false + } + } + return true + } +} diff --git a/Week_04/MaxProfit.swift b/Week_04/MaxProfit.swift new file mode 100644 index 00000000..6181ea1c --- /dev/null +++ b/Week_04/MaxProfit.swift @@ -0,0 +1,19 @@ +// +// MaxProfit.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/23. +// + +import Foundation + +class MaxProfit { + //贪心算法: 第二天与前一天的差值大于零,加入答案,既是最大收益 + func maxProfit(_ prices: [Int]) -> Int { + var ans = 0 + for i in 1.. [[Character]] { + let x = click[0], y = click[1] + var res = board + if res[x][y] == "M" { + //点到地雷 + res[x][y] = "X" + } else { + dfs(&res, x, y) + } + return res + } + + func dfs(_ board: inout [[Character]], _ x: Int, _ y: Int) { + var count = 0 + for i in 0..<8 { + //查看周边有多少个地雷 + let tx = x + dx[i], ty = y + dy[i] + if tx < 0 || tx >= board.count || ty < 0 || ty >= board.first!.count { + continue + } + count += (board[tx][ty] == "M" ? 1 : 0) + } + if count > 0 { + //有地雷 将地雷数量标记 + board[x][y] = Character("\(count)") + } else { + //无地雷 递归处理 + board[x][y] = "B" + for i in 0..<8 { + let tx = x + dx[i], ty = y + dy[i] + if tx < 0 || tx >= board.count || ty < 0 || ty >= board.first!.count || board[tx][ty] != "E" { + continue + } + dfs(&board, tx, ty) + } + } + } + + + // 广度优先 + func updateBoard10(_ board: [[Character]], _ click: [Int]) -> [[Character]] { + let x = click[0], y = click[1] + var res = board + if res[x][y] == "M" { + res[x][y] = "X" + } else { + bfs(&res, x, y) + } + return res + } + + func bfs(_ board: inout [[Character]], _ x: Int, _ y: Int) { + var queue = [[x, y]] + let row = board.count, col = board.first!.count + var visited = [[Bool]](repeating: [Bool](repeating: false, count: col), count: row) + while !queue.isEmpty { + let pos = queue.removeFirst() + let x = pos[0], y = pos[1] + var count = 0 + for i in 0..<8 { + let tx = x + dx[i], ty = y + dy[i] + if tx < 0 || tx >= row || ty < 0 || ty >= col { + continue + } + count += (board[tx][ty] == "M" ? 1 : 0) + } + if count > 0 { + board[x][y] = Character("\(count)") + continue + } + board[x][y] = "B" + for i in 0..<8 { + let tx = x + dx[i], ty = y + dy[i] + if tx < 0 || tx >= row || ty < 0 || ty >= col || board[tx][ty] != "E" || visited[tx][ty] { + continue + } + queue.append([tx, ty]) + visited[tx][ty] = true + } + } + } + + func test() { + let board: [[Character]] = [["E","M","E","E","E"],["E","E","E","M","E"],["M","E","E","E","E"],["E","E","M","E","E"]] + let click = [3, 4] + let res = updateBoard(board, click) + for i in res { + print(i) + } + } +} diff --git a/Week_04/NumberOfIsland.swift b/Week_04/NumberOfIsland.swift new file mode 100644 index 00000000..0dfe52dd --- /dev/null +++ b/Week_04/NumberOfIsland.swift @@ -0,0 +1,38 @@ +// +// NumberOfIsland.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/25. +// + +import Foundation + +class NumberOfIsland { + func numIslands(_ grid: [[Character]]) -> Int { + guard grid.count > 0, grid.first != nil, grid.first!.count > 0 else { + return 0 + } + func dfs(_ row: Int, _ col: Int) { + guard row >= 0, row < rowCount, col >= 0, col < colCount, temp[row][col] == "1" else { + return + } + temp[row][col] = "0" + dfs(row + 1, col) + dfs(row - 1, col) + dfs(row, col + 1) + dfs(row, col - 1) + } + var res = 0, temp = grid + let rowCount = grid.count, colCount = grid.first!.count + for row in 0.. Int { + var res = 0, x = 0, y = 0, d = 0 // 0北, 1东, 2南, 3西 + let dx = [0, 1, 0, -1], dy = [1, 0, -1, 0] + var obstacleSet = Set() + for ob in obstacles { + obstacleSet.insert(Location(x: ob[0], y: ob[1])) + } + for c in commands { + if c == -2 { + d = d == 0 ? 3 : d - 1 + } else if c == -1 { + d = d == 3 ? 0 : d + 1 + } else { + var step = c + while step > 0 && !obstacleSet.contains(Location(x:x + dx[d], y: y + dy[d])) { + x += dx[d] + y += dy[d] + step -= 1 + } + res = max(x * x + y * y, res) + } + } + return res + } +} diff --git a/Week_04/Search2DMatrix.swift b/Week_04/Search2DMatrix.swift new file mode 100644 index 00000000..eb245dbc --- /dev/null +++ b/Week_04/Search2DMatrix.swift @@ -0,0 +1,32 @@ +// +// Search2DMatrix.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/26. +// + +import Foundation + +class Search2DMatrix { + func searchMatrix(_ matrix: [[Int]], _ target: Int) -> Bool { + let m = matrix.count + guard m > 0 else { + return false + } + let n = matrix[0].count + var l = 0, r = m * n - 1 + while l <= r { + let mid = (l + r) / 2 + let midValue = matrix[mid / n][mid % n] + if midValue == target { + return true + } + if midValue > target { + r = mid - 1 + } else { + l = mid + 1 + } + } + return false + } +} diff --git a/Week_04/SearchInRotatedSortedArray.swift b/Week_04/SearchInRotatedSortedArray.swift new file mode 100644 index 00000000..cdad3733 --- /dev/null +++ b/Week_04/SearchInRotatedSortedArray.swift @@ -0,0 +1,47 @@ +// +// SearchInRotatedSortedArray.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/26. +// + +import Foundation + +class SearchInRotatedSortedArray { + func search(_ nums: [Int], _ target: Int) -> Int { + let n = nums.count + guard n > 0 else { + return -1 + } + if n == 1 { + return target == nums[0] ? 0 : -1 + } + var l = 0, r = n - 1 + while l <= r { + let mid = (l + r) / 2 + if nums[mid] == target { + return mid + } + if nums[l] <= nums[mid] { + //左边有序 + if nums[l] <= target && nums[mid] > target { + //在左边 + r = mid - 1 + } else { + //在右边 + l = mid + 1 + } + } else { + //右边有序 + if nums[r] >= target && nums[mid] < target { + //在右边 + l = mid + 1 + } else { + //在左边 + r = mid - 1 + } + } + } + return -1 + } +} diff --git a/Week_04/WordLadder.swift b/Week_04/WordLadder.swift new file mode 100644 index 00000000..e5aa3242 --- /dev/null +++ b/Week_04/WordLadder.swift @@ -0,0 +1,110 @@ +// +// WordLadder.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/26. +// + +import Foundation + +class WordLadder { + + //单向bfs + func ladderLength(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> Int { + var wordSet = Set(wordList) + guard wordSet.contains(endWord) else { + return 0 + } + wordSet.remove(beginWord) + var queue = [beginWord] + var visited: Set = [beginWord] + + var res = 1 + while !queue.isEmpty { + let size = queue.count + for _ in 0.., _ visited: inout Set) -> Bool { + var tempArr = Array(curWord) + for i in 0.. Int { + let wordSet = Set(wordList) + guard wordSet.contains(endWord) else { + return 0 + } + var beginVisited: Set = [beginWord] + var endVisited: Set = [endWord] + var visited = Set() + + var res = 1 + while !beginVisited.isEmpty && !endVisited.isEmpty { + if beginVisited.count > endVisited.count { + swap(&beginVisited, &endVisited) + } + var nextLevelVisited = Set() + for word in beginVisited { + if changeWordEveryOneLetter10(word, endVisited, &visited, wordSet, &nextLevelVisited) { + return res + 1 + } + } + beginVisited = nextLevelVisited + res += 1 + } + return 0 + } + + func changeWordEveryOneLetter10(_ word: String, _ endVisited: Set, _ visited: inout Set, _ wordSet: Set, _ nextLevelVisited: inout Set) -> Bool { + var wordArr = Array(word) + for i in 0.. [[String]] { + //将所有单词加入到wordId表中 + var id = 0 + for word in wordList { + if wordId[word] == nil { + wordId[word] = id + idWord.append(word) + id += 1 + } + } + //如果结束词不在单词列表 则无解 + if wordId[endWord] == nil { + return [] + } + //开始单词也加入到表格 + if wordId[beginWord] == nil { + wordId[beginWord] = id + idWord.append(beginWord) + id += 1 + } + //初始化边数组 + edges = [[Int]](repeating: [], count: idWord.count) + for i in 0.. Bool { + var diff = 0 + for i in 0..= 2 { + break + } + } + return diff == 1 + } + + func test() { + let b = "hit" + let e = "cog" + let wordList = ["hot","dot","dog","lot","log","cog"] + print(findLadders(b, e, wordList)) + } +} From cd3e4773c6a27f822db0cbcaab255ecd7ec44599 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 27 Dec 2020 22:53:29 +0800 Subject: [PATCH 22/51] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_04/README.md | 135 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 134 insertions(+), 1 deletion(-) diff --git a/Week_04/README.md b/Week_04/README.md index 50de3041..a28f9b2f 100644 --- a/Week_04/README.md +++ b/Week_04/README.md @@ -1 +1,134 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 总结 + +这周的题目好难啊,尤其是单词接龙,看题解都有些搞不懂,对广度优先搜索和深度优先搜索还是要多联系,有些懵懵懂懂。 + +## 广度优先搜索和深度优先搜索 + +这两种搜索算法都是基于图的,大部分搜索场景都可以抽象成图。 + +### 广度优先搜索BFS + +- 地毯式的层层推进搜索策略,从最近的开发一层层的往外扩散。 +- 适合用来求最短路径。 + +##### 二叉树的搜索代码模板如下 + +``` java +// Java +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} + +public List> levelOrder(TreeNode root) { + List> allResults = new ArrayList<>(); + if (root == null) { + return allResults; + } + Queue nodes = new LinkedList<>(); + nodes.add(root); + while (!nodes.isEmpty()) { + int size = nodes.size(); + List results = new ArrayList<>(); + for (int i = 0; i < size; i++) { + TreeNode node = nodes.poll(); + results.add(node.val); + if (node.left != null) { + nodes.add(node.left); + } + if (node.right != null) { + nodes.add(node.right); + } + } + allResults.add(results); + } + return allResults; +} + +``` + +- 时间复杂度:O(E),E表示边的个数 +- 空间复杂度:O(E),E表示边的个数 + +## 深度优先搜索DFS + +是回溯思想的体现。 + +``` java +//Java +public List> levelOrder(TreeNode root) { + List> allResults = new ArrayList<>(); + if(root==null){ + return allResults; + } + travel(root,0,allResults); + return allResults; +} + + +private void travel(TreeNode root,int level,List> results){ + if(results.size()==level){ + results.add(new ArrayList<>()); + } + results.get(level).add(root.val); + if(root.left!=null){ + travel(root.left,level+1,results); + } + if(root.right!=null){ + travel(root.right,level+1,results); + } +} + +``` + +- 时间复杂度:O(E),E表示边的个数 +- 空间复杂度:O(V),V表示顶点的个数 + +## 贪心算法 + +总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 + +## 二分查找 + +条件: + +- 数组存储 +- 有序数据 +- 数据量太小不适合(没必要) +- 数据量太大也不适合(依赖于数组数据结构) +- 时间复杂度:O(logn) + +代码模板如下: + +``` java +// Java +public int binarySearch(int[] array, int target) { + int left = 0, right = array.length - 1, mid; + while (left <= right) { + //直接使用 (right+left) / 2 有溢出风险 + mid = (right - left) / 2 + left; + + if (array[mid] == target) { + return mid; + } else if (array[mid] > target) { + right = mid - 1; + } else { + left = mid + 1; + } + } + + return -1; +} +``` + +#### 扩展 + +在搜索旋转排序数组题目中,部分数据旋转,可以用mid值和left或者right值进行比较判断哪一边是有序的。 + From 346bdb7194550233ec3f11f3964bc3939d635563 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 10 Jan 2021 22:16:20 +0800 Subject: [PATCH 23/51] =?UTF-8?q?Week06=E4=BB=A3=E7=A0=81=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_06/CoinChange.swift | 28 +++++ Week_06/CoinChangeII.swift | 54 +++++++++ Week_06/DecodeWays.swift | 32 ++++++ Week_06/EditDistance.swift | 40 +++++++ Week_06/Fibonacci.swift | 150 +++++++++++++++++++++++++ Week_06/FourSum.swift | 69 ++++++++++++ Week_06/HouseRobber.swift | 55 +++++++++ Week_06/HouseRobberII.swift | 32 ++++++ Week_06/JumpGame.swift | 63 +++++++++++ Week_06/JumpGameII.swift | 63 +++++++++++ Week_06/LongestCommonSubsequence.swift | 33 ++++++ Week_06/MaxSquare.swift | 34 ++++++ Week_06/MaxSubarray.swift | 24 ++++ Week_06/MinPathSum.swift | 52 +++++++++ Week_06/PerfectSquare.swift | 33 ++++++ Week_06/StockIII.swift | 23 ++++ Week_06/Triangle.swift | 55 +++++++++ Week_06/UniquePaths.swift | 53 +++++++++ Week_06/UniquePathsII.swift | 58 ++++++++++ 19 files changed, 951 insertions(+) create mode 100644 Week_06/CoinChange.swift create mode 100644 Week_06/CoinChangeII.swift create mode 100644 Week_06/DecodeWays.swift create mode 100644 Week_06/EditDistance.swift create mode 100644 Week_06/Fibonacci.swift create mode 100644 Week_06/FourSum.swift create mode 100644 Week_06/HouseRobber.swift create mode 100644 Week_06/HouseRobberII.swift create mode 100644 Week_06/JumpGame.swift create mode 100644 Week_06/JumpGameII.swift create mode 100644 Week_06/LongestCommonSubsequence.swift create mode 100644 Week_06/MaxSquare.swift create mode 100644 Week_06/MaxSubarray.swift create mode 100644 Week_06/MinPathSum.swift create mode 100644 Week_06/PerfectSquare.swift create mode 100644 Week_06/StockIII.swift create mode 100644 Week_06/Triangle.swift create mode 100644 Week_06/UniquePaths.swift create mode 100644 Week_06/UniquePathsII.swift diff --git a/Week_06/CoinChange.swift b/Week_06/CoinChange.swift new file mode 100644 index 00000000..3b734f5a --- /dev/null +++ b/Week_06/CoinChange.swift @@ -0,0 +1,28 @@ +// +// CoinChange.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/5. +// + +import Foundation + +class CoinChange { + //零钱兑换 + func coinChange(_ coins: [Int], _ amount: Int) -> Int { + guard amount > 0 else { + return 0 + } + var dp = [Int](repeating:amount + 1, count: amount + 1) + dp[0] = 0 + for i in 1...amount { + for coin in coins { + if coin <= i { + dp[i] = min(dp[i], dp[i - coin] + 1) + } + } + } + return dp[amount] > amount ? -1 : dp[amount] + } + +} diff --git a/Week_06/CoinChangeII.swift b/Week_06/CoinChangeII.swift new file mode 100644 index 00000000..4928f626 --- /dev/null +++ b/Week_06/CoinChangeII.swift @@ -0,0 +1,54 @@ +// +// CoinChangeII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/7. +// + +import Foundation + +class CoinChangeII { + + //组合数 + func change(_ amount: Int, _ coins: [Int]) -> Int { + if amount == 0 { + return 1 + } + if coins.count == 0 { + return 0 + } + var dp = [Int](repeating: 0, count: amount + 1) + dp[0] = 1 + for coin in coins { + if coin > amount { + continue + } + for i in coin.. Int { + if amount == 0 { + return 1 + } + if coins.count == 0 { + return 0 + } + var dp = [Int](repeating: 0, count: amount + 1) + dp[0] = 1 + + for i in 0.. Int { +// if s.count <= 0 { +// return 0 +// } +// let s = Array(s) +// if s[0] == "0" { +// return 0 +// } +// let n = s.count +// var dp = [Int](repeating: 1, count: n + 1) +// dp[0] = 1 +// dp[1] = s[0] == "0" ? 0 : 1 +// for i in 1.. Int { + let m = word1.count, n = word2.count + if m * n == 0 { + return m + n + } + let word1 = Array(word1), word2 = Array(word2) + var dp = [[Int]](repeating: [Int](repeating: 0, count: n + 1), count: m + 1) + for i in 0.. 1. + + 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 + + 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 + */ + + //动态规划 + func fib(_ n: Int) -> Int { + var a = 0, b = 1, sum = 0 + for _ in 0.. Int { + if n < 2 { + return n + } + var p = 0, q = 1, r = p + q + for _ in 2.. 1 + + 给你 n ,请计算 F(n) 。 + + 提示:0 <= n <= 30 + */ + + //动态规划 + func fib200(_ n: Int) -> Int { + var a = 0, b = 1, sum = 0 + for _ in 0.. Int { + if n < 2 { + return n + } + var p = 0, q = 1, r = p + q + for _ in 2.. Int { + let q = [[1, 1], [1, 0]] + let r = myPow(q, n) + return r[0][0] + } + + func myPow(_ a: [[Int]], _ n: Int) -> [[Int]] { + var ret = [[1, 0], [0, 1]] + while n > 0 { + if n & 1 == 1 { + ret = myMultiply(ret, a) + } + } + return ret + } + + func myMultiply(_ a: [[Int]], _ b: [[Int]]) -> [[Int]] { + var c = [[Int]](repeating: [Int](repeating: 0, count: 2), count: 2); + for i in 0..<2 { + for j in 0..<2 { + c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j]; + } + } + return c; + } + + //通项公式 + func dib220(_ n: Int) -> Int { + let sqrt5 = sqrt(5.0) + let temp = pow((1.0 + sqrt5) / 2.0, Double(n)) - pow((1.0 - sqrt5) / 2.0, Double(n)) + let res = temp / sqrt5 + return Int(res) + } + + //有限个枚举处理 + func dib230(_ n: Int) -> Int { + let fibs = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040] + return fibs[n] + } + + //递归(带缓存) + var resCache = [Int: Int]() + func fib240(_ n: Int) -> Int { + if n < 2 { + return n + } + if resCache[n] != nil { + return resCache[n]! + } + return fib240(n - 1) + fib240(n - 2) + } + +} diff --git a/Week_06/FourSum.swift b/Week_06/FourSum.swift new file mode 100644 index 00000000..382f442d --- /dev/null +++ b/Week_06/FourSum.swift @@ -0,0 +1,69 @@ +// +// FourSum.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/1. +// + +import Foundation + +class FourSum { + /*四数之和*/ + func fourSum(_ nums: [Int], _ target: Int) -> [[Int]] { + guard nums.count >= 4 else { + return [] + } + var res = [[Int]]() + let nums = nums.sorted() + let n = nums.count + for i in 0.. 0 && nums[i] == nums[i - 1] { + continue + } + if nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target{ + break + } + if nums[i] + nums[n - 1] + nums[n - 2] + nums[n - 3] < target { + continue + } + for j in i + 1.. i + 1 && nums[j] == nums[j - 1] { + continue + } + if nums[i] + nums[i + 1] + nums[i + 2] + nums[j] > target{ + break + } + if nums[i] + nums[n - 1] + nums[n - 2] + nums[j] < target { + continue + } + var left = j + 1, right = n - 1 + while left < right { + let sum = nums[i] + nums[j] + nums[left] + nums[right] + if sum == target { + res.append([nums[i], nums[j], nums[left], nums[right]]) + leftAddOne(&left, right, nums) + rightSubOne(left, &right, nums) + } else if sum < target { + leftAddOne(&left, right, nums) + } else { + rightSubOne(left, &right, nums) + } + } + } + } + return res + } + + func leftAddOne(_ left: inout Int, _ right: Int, _ nums: [Int]) { + while left < right && nums[left] == nums[left + 1] { + left += 1 + } + left += 1 + } + func rightSubOne(_ left: Int, _ right: inout Int, _ nums: [Int]) { + while left < right && nums[right] == nums[right - 1] { + right -= 1 + } + right -= 1 + } +} diff --git a/Week_06/HouseRobber.swift b/Week_06/HouseRobber.swift new file mode 100644 index 00000000..dda22f22 --- /dev/null +++ b/Week_06/HouseRobber.swift @@ -0,0 +1,55 @@ +// +// HouseRobber.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/6. +// + +import Foundation + +class HouseRobber { + func rob(_ nums: [Int]) -> Int { + let n = nums.count + if n == 0 { + return 0 + } + if n == 1 { + return nums[0] + } + var dp = [Int](repeating: 0, count: n) + dp[0] = nums[0] + dp[1] = max(nums[0], nums[1]) + for i in 2.. Int { + let n = nums.count + if n == 0 { + return 0 + } + if n == 1 { + return nums[0] + } + var pre = nums[0], cur = max(nums[0], nums[1]) + for i in 2.. Int { + var pre = 0, cur = 0, temp: Int + for i in 0.. Int { + let n = nums.count + if n == 0 { + return 0 + } + if n == 1 { + return nums[0] + } + let nums1 = Array(nums[1.. Int { + var pre = 0, cur = 0, temp = 0 + for i in 0.. Bool { + var reach = 0 + for i in 0.. reach { + return false + } + reach = max(reach, i + nums[i]) + } + return true + } + + //贪心, 从后往前,维护终点 + func canJump10(_ nums: [Int]) -> Bool { + var last = 0 + for (i, v) in nums.enumerated().reversed() { + if i + v >= last { + last = i + } + } + return last == 0 + } + func canJump20(_ nums: [Int]) -> Bool { + var position = 0 + var i = nums.count - 1 + while i >= 0 { + if i + nums[i] >= position { + position = i + } + i -= 1 + } + return position == 0 + } + + //动态规划(超时) + func canJump30(_ nums: [Int]) -> Bool { + let n = nums.count + var dp = [Bool](repeating: false, count: n) + dp[0] = true + for i in 0..= i { + dp[i] = true + break + } + } + } + return dp[n - 1] + } + +} diff --git a/Week_06/JumpGameII.swift b/Week_06/JumpGameII.swift new file mode 100644 index 00000000..297886b4 --- /dev/null +++ b/Week_06/JumpGameII.swift @@ -0,0 +1,63 @@ +// +// JumpGameII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/27. +// + +import Foundation + +class JumpGameII { + + /* 超时 从后往前贪心 */ + func jump(_ nums: [Int]) -> Int { + if nums.count <= 1 { + return 0 + } + var position = nums.count - 1 + var step = 0 + while position > 0 { + for i in 0..= position { + step += 1 + position = i + break + } + } + } + return step + } + + /* 从前往后贪心 */ + func jump10(_ nums: [Int]) -> Int { + if nums.count <= 1 { + return 0 + } + var maxIndex = 0, step = 0, end = 0 + for i in 0.. Int { + let n = nums.count + var dp = [Int](repeating: n + 1, count: n) + dp[0] = 0 + for i in 1..= i { + dp[i] = min(dp[i], dp[j] + 1) + } + } + } + return dp[n - 1] + } + +} diff --git a/Week_06/LongestCommonSubsequence.swift b/Week_06/LongestCommonSubsequence.swift new file mode 100644 index 00000000..2e993815 --- /dev/null +++ b/Week_06/LongestCommonSubsequence.swift @@ -0,0 +1,33 @@ +// +// LongestCommonSubsequence.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/1. +// + +import Foundation + +class LongestCommonSubsequence { + //最长公共子序列 + func longestCommonSubsequence(_ text1: String, _ text2: String) -> Int { + guard text1.count > 0, text2.count > 0 else { + return 0 + } + let n1 = text1.count, n2 = text2.count + var dp = [[Int]](repeating: [Int](repeating: 0, count: n2 + 1), count: n1 + 1) + let charArr1 = Array(text1), charArr2 = Array(text2) + for i in 1.. Int { + if matrix.count <= 0 || matrix[0].count <= 0 { + return 0 + } + let m = matrix.count, n = matrix[0].count + var dp = [[Int]](repeating: [Int](repeating: 0, count: n), count: m) + var maxSide = 0 + for i in 0.. Int { + guard nums.count > 0 else { + return 0 + } + var pre = 0, ans = nums[0] + for i in nums { + pre = max(pre + i, i) + ans = max(pre, ans) + } + return ans + } +} diff --git a/Week_06/MinPathSum.swift b/Week_06/MinPathSum.swift new file mode 100644 index 00000000..4ab77c3b --- /dev/null +++ b/Week_06/MinPathSum.swift @@ -0,0 +1,52 @@ +// +// MinPathSum.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/3. +// + +import Foundation + +class MinPathSum { + //最小路径和 + func minPathSum(_ grid: [[Int]]) -> Int { + guard grid.count > 0 else { + return 0 + } + let m = grid.count, n = grid[0].count + var dp = grid + for i in 1.. Int { + guard grid.count > 0, grid.first!.count > 0 else { + return 0 + } + let m = grid.count, n = grid.first!.count + var dp = grid + for i in 0.. Int { + guard n > 0 else { + return 0 + } + var dp = [Int](repeating: n + 1, count: n + 1) + dp[0] = 0 + for i in 1...n { + dp[i] = i + var j = 1 + while i >= j * j { + dp[i] = min(dp[i], dp[i - j * j] + 1) + //print(dp[i]) + j += 1 + } + } + return dp[n] + } + + func test() { + print(numSquares(2)) + } +} diff --git a/Week_06/StockIII.swift b/Week_06/StockIII.swift new file mode 100644 index 00000000..15993da6 --- /dev/null +++ b/Week_06/StockIII.swift @@ -0,0 +1,23 @@ +// +// StockIII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/9. +// + +import Foundation + +class StockIII { + func maxProfit(_ prices: [Int]) -> Int { + let n = prices.count + var buy1 = -prices[0], sell1 = 0 + var buy2 = -prices[0], sell2 = 0 + for i in 1.. Int { + var dp = triangle + let n = dp.count + for i in 1.. Int { + var dp = triangle + let n = dp.count + for i in (0.. Int { + let n = triangle.count + var dp = triangle[n - 1] + for i in (0.. Int { + guard m > 0, n > 0 else { + return 0 + } + var dp = [[Int]](repeating: [Int](repeating: 1, count: n), count: m) + for i in 1.. Int { + guard m > 0, n > 0 else { + return 0 + } + var cur = [Int](repeating: 1, count: n) + for _ in 1.. Int { + var ans = 1 + var x = n, y = 1 + while y < m { + ans = ans * x / y + x += 1 + y += 1 + } + return ans + } + +} diff --git a/Week_06/UniquePathsII.swift b/Week_06/UniquePathsII.swift new file mode 100644 index 00000000..56701360 --- /dev/null +++ b/Week_06/UniquePathsII.swift @@ -0,0 +1,58 @@ +// +// UniquePathsII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/2. +// + +import Foundation + +class UniquePathsII { + + func uniquePathsWithObstacles(_ obstacleGrid: [[Int]]) -> Int { + guard obstacleGrid.count > 0 else { + return 0 + } + let m = obstacleGrid.count, n = obstacleGrid[0].count + var dp = [[Int]](repeating: [Int](repeating: 0, count: n), count: m) + dp[0][0] = 1 + for i in 0..= 0 { + dp[i][j] += dp[i - 1][j] + } + if j - 1 >= 0 { + dp[i][j] += dp[i][j - 1] + } + } + } + return dp[m-1][n-1] + } + + + func uniquePathsWithObstacles10(_ obstacleGrid: [[Int]]) -> Int { + guard obstacleGrid.count > 0 else { + return 0 + } + let m = obstacleGrid.count, n = obstacleGrid[0].count + var f = [Int](repeating: 0, count: n) + f[0] = 1 + for i in 0..= 0 && obstacleGrid[i][j - 1] == 0 { + f[j] += f[j - 1] + } + } + } + return f[n - 1] + } + +} From 4879111145da969f560599790a71bd2247df9c38 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 10 Jan 2021 22:39:38 +0800 Subject: [PATCH 24/51] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_05/README.md | 5 ++++- Week_06/DecodeWays.swift | 32 -------------------------------- Week_06/README.md | 27 ++++++++++++++++++++++++++- 3 files changed, 30 insertions(+), 34 deletions(-) delete mode 100644 Week_06/DecodeWays.swift diff --git a/Week_05/README.md b/Week_05/README.md index 50de3041..14c7d4cd 100644 --- a/Week_05/README.md +++ b/Week_05/README.md @@ -1 +1,4 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 动态规划 + diff --git a/Week_06/DecodeWays.swift b/Week_06/DecodeWays.swift deleted file mode 100644 index c042ddd8..00000000 --- a/Week_06/DecodeWays.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// DecodeWays.swift -// LeetCodeDemo -// -// Created by Yangdongwu on 2021/1/10. -// - -import Foundation - -class DecodeWays { -// func numDecodings(_ s: String) -> Int { -// if s.count <= 0 { -// return 0 -// } -// let s = Array(s) -// if s[0] == "0" { -// return 0 -// } -// let n = s.count -// var dp = [Int](repeating: 1, count: n + 1) -// dp[0] = 1 -// dp[1] = s[0] == "0" ? 0 : 1 -// for i in 1.. Date: Sun, 10 Jan 2021 22:53:52 +0800 Subject: [PATCH 25/51] =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_06/README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Week_06/README.md b/Week_06/README.md index 4d478437..d26ec152 100644 --- a/Week_06/README.md +++ b/Week_06/README.md @@ -2,7 +2,7 @@ ## 总结 -这周题目是真的多啊,做不完啊,只能慢慢做了。 +这周题目是真的多啊,做不完啊,只能慢慢做了。。。 DP方程写不出,看到题目就懵懵的。 @@ -14,8 +14,19 @@ DP方程写不出,看到题目就懵懵的。 - 适用于有重叠子问题 - 适用于最优子结构 +- 无后效性(状态一旦确定,不受后续状态影响) - 所耗时间往往远少于朴素解法 +### 解题方法 + +#### 状态转移表 +- 大多动态规划可以解决的问题都可以画出状态转移表 +- 一般都是二维的,可以优化空间复杂度为一维的 + +#### 状态转移方程 + +状态转移方程是解决动态规划的关键,也是比较难的地方。 + ### 常见问题 - 爬楼梯 @@ -23,4 +34,5 @@ DP方程写不出,看到题目就懵懵的。 - 零钱兑换 - 最长公共子序列 - 不同路径 -- 最小路径和 \ No newline at end of file +- 最小路径和 +- 0-1背包问题 \ No newline at end of file From 9035ea10623431d26e27a8a5bd9c7d4d7a05e889 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sat, 16 Jan 2021 22:45:17 +0800 Subject: [PATCH 26/51] =?UTF-8?q?=E6=80=BB=E7=BB=93=20Trie=20=E6=A0=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_07/README.md | 91 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 90 insertions(+), 1 deletion(-) diff --git a/Week_07/README.md b/Week_07/README.md index 50de3041..10dcaf7f 100644 --- a/Week_07/README.md +++ b/Week_07/README.md @@ -1 +1,90 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 总结 + +时间过得好快啊,开始下半学期的学习了,上学期的东西感觉还有好多没有掌握,还要加油啊,还好这周的题目好几个都是以前做过的,比较熟悉,拍拍我的小心脏,缓缓气。加油!!! + +## Trie 树 + +别名:字典树,单词查找树或键树 +### 基本结构 +- 它是一个树形结构。 +- 它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。 +- 典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计 +- 优点,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 + +### 基本性质 +- 节点不存完整单词 + - 字符(也可以通过数组位置对应得到) + - 下一个字符对应的节点列表 + - 是否是最后一个字符(到此是否可以组成单词) +- 从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串; +- 每个结点的所有子结点路径代表的字符都不相同。 + +### 核心思想 +- Trie 树的核心思想是空间换时间。 +- 利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。 + +### 时间复杂度: +- 插入:O(n),n是所有插入字符串的长度和 +- 查找:O(k),k是查找单词的字符长度 + +### 代码 + +``` swift + +class TrieTreeNode { + public var next = [Character: TrieTreeNode]() + public var end: Bool + + public init() { + self.end = false + } +} + +class Trie { + + var root: TrieTreeNode + + /** Initialize your data structure here. */ + init() { + root = TrieTreeNode() + } + + /** Inserts a word into the trie. */ + func insert(_ word: String) { + var node = root + for c in word { + if node.next[c] == nil { + node.next[c] = TrieTreeNode() + } + node = node.next[c]! + } + node.end = true + } + + /** Returns if the word is in the trie. */ + func search(_ word: String) -> Bool { + return findWord(word)?.end ?? false + } + + /** Returns if there is any word in the trie that starts with the given prefix. */ + func startsWith(_ prefix: String) -> Bool { + return findWord(prefix) != nil + } + + func findWord(_ word: String) -> TrieTreeNode? { + var node = root + for c in word { + if let next = node.next[c] { + node = next + } else { + return nil + } + } + return node + } +} + +``` + From 77195001cc89cd8e100c5e572257f244173e6127 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 17 Jan 2021 22:09:24 +0800 Subject: [PATCH 27/51] Update README.md --- Week_07/README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/Week_07/README.md b/Week_07/README.md index 10dcaf7f..bd9893e1 100644 --- a/Week_07/README.md +++ b/Week_07/README.md @@ -88,3 +88,83 @@ class Trie { ``` +## 高级搜索 + +- 朴素搜索 +- 优化方式: + - 不重复,利用缓存 + - 剪枝,剪掉不必要的分支 +- 搜索方向 + - 广度优先搜索 DFS + - 深度优先搜索 BFS +- 双向搜索 + - 首尾同时扩散 + - 避免减少搜索访问数量 +- 启发式搜索 Heuristic Search (A*) + - 估价函数 + - 优先级搜索 + +启发式函数:h(n),它用来评价哪些结点最有希望的是一个我们要找的结点,h(n) 会返回一个非负实数,也可以认为是从结点n的目标结点路径的估计成本。 +启发式函数是一种告知搜索方向的方法。它提供了一种明智的方法来猜测哪个邻居结点会导向一个目标。 + +## 二叉树 + +### 二叉树的遍历 +- 前序遍历Pre-order:根左右 +- 中序遍历In-order:左根右 +- 后序遍历Post-order:左右根 + +### 二叉搜索树(Binary Search Tree) +别名:有序二叉树,排序二叉树(Sorted Binary Tree),有序二叉树 +- 左子树所有结点的值均小于根节点的值,右子树所有结点的值均大于根结点的值 +- 依次类推,左右子树也为二叉搜索树(这就是重复性) +- 中序遍历是升序排列的 +- 空树也是二叉搜索树 + +#### 问题 +当二叉树的结构趋于一个链表的时候,查找时间复杂的退化为O(n),保证性能的关键是保证二维维度。 + +## 平衡二叉搜索树 + +#### AVL树 + +- 左右两个子树的高度差的绝对值不超过1 +- 左右两个子树都是一棵平衡二叉树 + +#### 平衡因子 +- 结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(BF,Balance Factor)。 +- 平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1 + +#### 添加节点 +- 添加节点会破坏平衡 +- 通过旋转操作进行平衡(左旋,右旋,左右旋,右左旋) + +#### 红黑树 + +### 红黑树 + +红黑树是一种近似平衡的二叉搜索树(Binary Search Tree),它能够确保任何一 +个结点的左右子树的高度差小于两倍。 + +- 每个结点要么是红色,要么是黑色 +- 根节点是黑色的; +- 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; +- 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的; +- 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点; + +### 红黑树 + +红黑树是一种近似平衡的二叉搜索树(Binary Search Tree),它能够确保任何一 +个结点的左右子树的高度差小于两倍。 + +- 每个结点要么是红色,要么是黑色 +- 根节点是黑色的; +- 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; +- 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的; +- 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点; + +### AVL树和红黑树的区别 +- AVL树是严格平衡,红黑树是近似平衡 +- 红黑树的查询性能略微逊色于AVL树; +- 红黑树在插入和删除上优于AVL树,AVL树每次插入删除会进行大量的平衡度计算; +- 实际应用中,若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择红黑树。 \ No newline at end of file From 0c2d6246411ace4b386c41e25b36a49b8f49cd38 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 17 Jan 2021 22:26:05 +0800 Subject: [PATCH 28/51] =?UTF-8?q?week07=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_07/ClimbStairs.swift | 44 +++++++++++++ Week_07/GenerateParenthesis.swift | 33 ++++++++++ Week_07/MinGeneticMutation.swift | 59 +++++++++++++++++ Week_07/NQueens.swift | 57 ++++++++++++++++ Week_07/NumberOfIsland.swift | 39 +++++++++++ Week_07/TrieTree.swift | 80 ++++++++++++++++++++++ Week_07/WordLadder.swift | 106 ++++++++++++++++++++++++++++++ 7 files changed, 418 insertions(+) create mode 100644 Week_07/ClimbStairs.swift create mode 100644 Week_07/GenerateParenthesis.swift create mode 100644 Week_07/MinGeneticMutation.swift create mode 100644 Week_07/NQueens.swift create mode 100644 Week_07/NumberOfIsland.swift create mode 100644 Week_07/TrieTree.swift create mode 100644 Week_07/WordLadder.swift diff --git a/Week_07/ClimbStairs.swift b/Week_07/ClimbStairs.swift new file mode 100644 index 00000000..2e98a595 --- /dev/null +++ b/Week_07/ClimbStairs.swift @@ -0,0 +1,44 @@ +// +// ClimbStairs.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/23. +// + +import Foundation + +class ClimbStairs { + //动态规划 + func climbStairs(_ n: Int) -> Int { + var p = 0, q = 0, r = 1 + for _ in 0.. Int { + if dic[n] == nil { + dic[n] = climbStairs(n - 1) + climbStairs(n - 2) + } + return dic[n]! + } + //可以指定每步台阶数 + func climbStairs20(_ n: Int) -> Int { + let steps = [1, 2] + var dp = [Int](repeating: 0, count: n + 1) + dp[0] = 1 + for i in 0.. [String] { + var res = [String]() + generate(0, 0, n, "", &res) + return res + } + + func generate(_ left: Int, _ right: Int, _ n: Int, _ s: String, _ res: inout [String]) { + if left == n && right == n { + res.append(s) + return + } + //剪枝 + if left < n { + generate(left + 1, right, n, s + "(", &res) + } + if left > right { + generate(left, right + 1, n, s + ")", &res) + } + } + + +} diff --git a/Week_07/MinGeneticMutation.swift b/Week_07/MinGeneticMutation.swift new file mode 100644 index 00000000..b14455f8 --- /dev/null +++ b/Week_07/MinGeneticMutation.swift @@ -0,0 +1,59 @@ +// +// MinGeneticMutation.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/28. +// + +import Foundation +class MinGeneticMutation { + func minMutation(_ start: String, _ end: String, _ bank: [String]) -> Int { + let bankSet = Set(bank) + guard bankSet.contains(end) else { + return -1 + } + var queue = [start] + var visited = Set() + visited.insert(start) + var res = 0 + while !queue.isEmpty { + let levelCount = queue.count + for _ in 0.., _ queue: inout [String], _ visited: inout Set) -> Bool { + var arr: [Character] = Array(cur) + for i in 0.. [[String]] { + var res = [[String]]() + var queens = [Int](repeating: -1, count: n) + var cols = Set(), dia1 = Set(), dia2 = Set() + func backtrack(_ row: Int) { + if row == n { + res.append(generateBoard(queens, n)) + return + } + for i in 0.. [String] { + var board = [String]() + for i in 0.. Int { + guard grid.count > 0, grid[0].count > 0 else { + return 0 + } + var temp = grid, res = 0 + for i in 0..= 0, row < m, col >= 0, col < n, temp[row][col] == "1" else { + return + } + temp[row][col] = "0" + dfs(row - 1, col, m, n, &temp) + dfs(row + 1, col, m, n, &temp) + dfs(row, col - 1, m, n, &temp) + dfs(row, col + 1, m, n, &temp) + } + +} diff --git a/Week_07/TrieTree.swift b/Week_07/TrieTree.swift new file mode 100644 index 00000000..f569cb90 --- /dev/null +++ b/Week_07/TrieTree.swift @@ -0,0 +1,80 @@ +// +// TrieTree.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/16. +// + +import Foundation + +class TrieTreeNode { + public var next = [Character: TrieTreeNode]() + public var end: Bool + + public init() { + self.end = false + } +} + +class Trie { + + var root: TrieTreeNode + + /** Initialize your data structure here. */ + init() { + root = TrieTreeNode() + } + + /** Inserts a word into the trie. */ + func insert(_ word: String) { + var node = root + for c in word { + if node.next[c] == nil { + node.next[c] = TrieTreeNode() + } + node = node.next[c]! + } + node.end = true + } + + /** Returns if the word is in the trie. */ + func search(_ word: String) -> Bool { + return findWord(word)?.end ?? false + } + + /** Returns if there is any word in the trie that starts with the given prefix. */ + func startsWith(_ prefix: String) -> Bool { + return findWord(prefix) != nil + } + + func findWord(_ word: String) -> TrieTreeNode? { + var node = root + for c in word { + if let next = node.next[c] { + node = next + } else { + return nil + } + } + return node + } + + func test() { + let word = "apple" + let obj = Trie() + obj.insert(word) + let ret_2: Bool = obj.search(word) + let ret_3: Bool = obj.startsWith("app") + let ret_4: Bool = obj.search("app") + let ret_5: Bool = obj.startsWith("apl") + print(ret_2, ret_3, ret_4, ret_5); + } +} + +/** + * Your Trie object will be instantiated and called as such: + * let obj = Trie() + * obj.insert(word) + * let ret_2: Bool = obj.search(word) + * let ret_3: Bool = obj.startsWith(prefix) + */ diff --git a/Week_07/WordLadder.swift b/Week_07/WordLadder.swift new file mode 100644 index 00000000..53e98781 --- /dev/null +++ b/Week_07/WordLadder.swift @@ -0,0 +1,106 @@ +// +// WordLadder.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/26. +// + +import Foundation + +class WordLadder { + + //单向bfs + func ladderLength(_ beginWord: String, _ endWord: String, _ wordList: [String]) -> Int { + let wordSet = Set(wordList) + guard wordSet.contains(endWord) else { + return 0 + } + var queue = [beginWord] + var visited: Set = [beginWord] + var res = 1 + while !queue.isEmpty { + let n = queue.count + for _ in 0.., _ visited: inout Set) -> Bool { + var wordArr = Array(curWord) + for i in 0.. Int { + let wordSet = Set(wordList) + guard wordSet.contains(endWord) else { + return 0 + } + var beginSet: Set = [beginWord], endSet: Set = [endWord], visited: Set = [beginWord] + var res = 1 + while !beginSet.isEmpty && !endSet.isEmpty { + if beginSet.count > endSet.count { + swap(&beginSet, &endSet) + } + var nextLevelSet = Set() + for word in beginSet { + if changeWordEveryOneLetter10(word, endSet, wordSet, &visited, &nextLevelSet) { + return res + 1 + } + } + beginSet = nextLevelSet + res += 1 + } + return 0 + } + + func changeWordEveryOneLetter10(_ word: String, _ endSet: Set, _ wordSet: Set, _ visited: inout Set, _ nextLevelSet: inout Set) -> Bool { + var wordArr = Array(word) + for i in 0.. Date: Sun, 17 Jan 2021 22:29:37 +0800 Subject: [PATCH 29/51] Update README.md --- Week_07/README.md | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/Week_07/README.md b/Week_07/README.md index bd9893e1..3e0d30e2 100644 --- a/Week_07/README.md +++ b/Week_07/README.md @@ -139,19 +139,6 @@ class Trie { - 添加节点会破坏平衡 - 通过旋转操作进行平衡(左旋,右旋,左右旋,右左旋) -#### 红黑树 - -### 红黑树 - -红黑树是一种近似平衡的二叉搜索树(Binary Search Tree),它能够确保任何一 -个结点的左右子树的高度差小于两倍。 - -- 每个结点要么是红色,要么是黑色 -- 根节点是黑色的; -- 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; -- 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的; -- 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点; - ### 红黑树 红黑树是一种近似平衡的二叉搜索树(Binary Search Tree),它能够确保任何一 @@ -167,4 +154,4 @@ class Trie { - AVL树是严格平衡,红黑树是近似平衡 - 红黑树的查询性能略微逊色于AVL树; - 红黑树在插入和删除上优于AVL树,AVL树每次插入删除会进行大量的平衡度计算; -- 实际应用中,若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择红黑树。 \ No newline at end of file +- 实际应用中,若搜索的次数远远大于插入和删除,那么选择AVL,如果搜索,插入删除次数几乎差不多,应该选择红黑树。 From de93b179248852ff8d55b44fc56319e7b14e86ca Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 17 Jan 2021 22:35:19 +0800 Subject: [PATCH 30/51] Update README.md --- Week_07/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_07/README.md b/Week_07/README.md index 3e0d30e2..20110c54 100644 --- a/Week_07/README.md +++ b/Week_07/README.md @@ -126,7 +126,7 @@ class Trie { ## 平衡二叉搜索树 -#### AVL树 +### AVL树 - 左右两个子树的高度差的绝对值不超过1 - 左右两个子树都是一棵平衡二叉树 From ae0c70e10211224ee6dfb510a69245b3c04b0ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Mon, 18 Jan 2021 14:13:07 +0800 Subject: [PATCH 31/51] =?UTF-8?q?=E5=9F=BA=E5=9B=A0=E5=8F=98=E5=8C=96?= =?UTF-8?q?=EF=BC=9A=E5=8F=8C=E5=90=91BFS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_07/MinGeneticMutation.swift | 50 +++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/Week_07/MinGeneticMutation.swift b/Week_07/MinGeneticMutation.swift index b14455f8..0127083b 100644 --- a/Week_07/MinGeneticMutation.swift +++ b/Week_07/MinGeneticMutation.swift @@ -7,6 +7,7 @@ import Foundation class MinGeneticMutation { + //单向BFS func minMutation(_ start: String, _ end: String, _ bank: [String]) -> Int { let bankSet = Set(bank) guard bankSet.contains(end) else { @@ -52,8 +53,55 @@ class MinGeneticMutation { return false } + //双向BFS + func minMutation10(_ start: String, _ end: String, _ bank: [String]) -> Int { + let bankSet = Set(bank) + guard bankSet.contains(end) else { + return -1 + } + var startSet: Set = [start], endSet: Set = [end], visited: Set = [start] + var res = 0 + while !startSet.isEmpty && !endSet.isEmpty { + if startSet.count > endSet.count { + swap(&startSet, &endSet) + } + var nextSet = Set() + for word in startSet { + if changeGenetic10(word, &nextSet, endSet, &visited, bankSet) { + return res + 1 + } + } + res += 1 + startSet = nextSet + } + return -1 + } + + func changeGenetic10(_ word: String, _ nextSet: inout Set, _ endSet: Set, _ visited: inout Set, _ bankSet: Set) -> Bool { + var word = Array(word) + for i in 0.. Date: Thu, 21 Jan 2021 14:26:36 +0800 Subject: [PATCH 32/51] =?UTF-8?q?=E6=95=B0=E7=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_07/SolveSudoku.swift | 65 +++++++++++++++++++++++++++++++++++++++ Week_07/ValidSudoku.swift | 33 ++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 Week_07/SolveSudoku.swift create mode 100644 Week_07/ValidSudoku.swift diff --git a/Week_07/SolveSudoku.swift b/Week_07/SolveSudoku.swift new file mode 100644 index 00000000..741ea689 --- /dev/null +++ b/Week_07/SolveSudoku.swift @@ -0,0 +1,65 @@ +// +// SolveSudoku.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/20. +// + +import Foundation + +class SolveSudoku { + + //第一种方式 + func solveSudoku10(_ board: inout [[Character]]) { + guard board.count > 0, board[0].count > 0 else { + return + } + solve(&board) + } + + @discardableResult + func solve(_ board: inout [[Character]]) -> Bool { + for i in 0..<9 { + for j in 0..<9 { + if board[i][j] == "." { + for c in "123456789" { + if isValid(board, i, j, c) { + board[i][j] = c + if solve(&board) { + return true + } else { + board[i][j] = "." + } + } + } + return false + } + } + } + return true + } + + func isValid(_ board: [[Character]], _ i: Int, _ j: Int, _ c: Character) -> Bool { + for k in 0..<9 { + if board[i][k] == c { + return false + } + if board[k][j] == c { + return false + } + if board[3 * (i / 3) + k / 3][3 * (j / 3) + k % 3] == c { + return false + } + } + return true + } + + func test() { + var a: [[Character]] = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] + solveSudoku10(&a) + print(a) + } + +} + + diff --git a/Week_07/ValidSudoku.swift b/Week_07/ValidSudoku.swift new file mode 100644 index 00000000..8805ec3e --- /dev/null +++ b/Week_07/ValidSudoku.swift @@ -0,0 +1,33 @@ +// +// ValidSudoku.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/21. +// + +import Foundation + +class ValidSudoku { + //有效的数独 + func isValidSudoku(_ board: [[Character]]) -> Bool { + var cols = [Set](repeating: [], count: 9) + var rows = [Set](repeating: [], count: 9) + var boxs = [Set](repeating: [], count: 9) + for i in 0..<9 { + for j in 0..<9 { + let char = board[i][j] + if char == "." { + continue + } + let boxIndex = (i / 3) * 3 + j / 3 + if rows[i].contains(char) || cols[j].contains(char) || boxs[boxIndex].contains(char) { + return false + } + rows[i].insert(char) + cols[j].insert(char) + boxs[boxIndex].insert(char) + } + } + return true + } +} From 43be7c6518bda33cc1659beb9a52c9c7cbed088c Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 24 Jan 2021 22:03:25 +0800 Subject: [PATCH 33/51] =?UTF-8?q?=E7=AC=AC=E5=85=AB=E5=91=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_08/NQueens.swift | 84 +++++++++++++++++++++ Week_08/NumberOfOneBit.swift | 33 ++++++++ Week_08/PowerOfTwo.swift | 27 +++++++ Week_08/RelativeSortArray.swift | 46 +++++++++++ Week_08/ReverseBits.swift | 32 ++++++++ Week_08/SolveSudoku.swift | 130 ++++++++++++++++++++++++++++++++ Week_08/ValidAnagram.swift | 64 ++++++++++++++++ Week_08/ValidSudoku.swift | 33 ++++++++ 8 files changed, 449 insertions(+) create mode 100644 Week_08/NQueens.swift create mode 100644 Week_08/NumberOfOneBit.swift create mode 100644 Week_08/PowerOfTwo.swift create mode 100644 Week_08/RelativeSortArray.swift create mode 100644 Week_08/ReverseBits.swift create mode 100644 Week_08/SolveSudoku.swift create mode 100644 Week_08/ValidAnagram.swift create mode 100644 Week_08/ValidSudoku.swift diff --git a/Week_08/NQueens.swift b/Week_08/NQueens.swift new file mode 100644 index 00000000..6953b778 --- /dev/null +++ b/Week_08/NQueens.swift @@ -0,0 +1,84 @@ +// +// NQueens.swift +// LeetCodeDemo +// +// Created by Apple on 2020/12/23. +// + +import Foundation + +class NQueens { + + func solveNQueens(_ n: Int) -> [[String]] { + var res = [[String]]() + var queens = [Int](repeating: -1, count: n) + var cols = Set(), dia1 = Set(), dia2 = Set() + func backtrack(_ row: Int) { + if row == n { + res.append(generateBoard(queens, n)) + return + } + for i in 0.. [String] { + var board = [String]() + for i in 0.. [[String]] { + var res = [[String]]() + var queens = [Int](repeating: -1, count: n) + var colSet = Set(), diaSet1 = Set(), diaSet2 = Set() + backtrack(0, n, &queens, &colSet, &diaSet1, &diaSet2, &res) + return res + } + + func backtrack(_ row: Int, _ n: Int, _ queens: inout [Int], _ colSet: inout Set, _ diaSet1: inout Set, _ diaSet2: inout Set, _ res: inout [[String]]) { + if row == n { + res.append(generateBoard(queens, n)) + return + } + for i in 0.. Int { + var res = 0, n = n + while n != 0 { + n &= (n - 1) + res += 1 + } + return res + } + + func hammingWeight10(_ n: Int) -> Int { + var count = 0, n = n + while n != 0 { + if n & 1 == 1{ + count += 1 + } + n >>= 1 + } + return count + } + +} diff --git a/Week_08/PowerOfTwo.swift b/Week_08/PowerOfTwo.swift new file mode 100644 index 00000000..af8f8172 --- /dev/null +++ b/Week_08/PowerOfTwo.swift @@ -0,0 +1,27 @@ +// +// PowerOfTwo.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/21. +// + +import Foundation + +class PowerOfTwo { + + //2的幂, 如果一个数是2的幂, 则这个数的二进制只有一个位是1 + + /* + n & (n - 1) 清除最低位的1, 如果结果等于0, 说明只有一位是1 + */ + func isPowerOfTwo(_ n: Int) -> Bool { + return n > 0 && n & (n - 1) == 0 + } + + /* + n & (-n) 保留最小位的1, 如果结果等于n, 说明只有一位是1 + */ + func isPowerOfTwo10(_ n: Int) -> Bool { + return n > 0 && n & (-n) == n + } +} diff --git a/Week_08/RelativeSortArray.swift b/Week_08/RelativeSortArray.swift new file mode 100644 index 00000000..589833f0 --- /dev/null +++ b/Week_08/RelativeSortArray.swift @@ -0,0 +1,46 @@ +// +// RelativeSortArray.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/24. +// + +import Foundation + +/*数组的相对排序*/ + +class RelativeSortArray { + + func relativeSortArray(_ arr1: [Int], _ arr2: [Int]) -> [Int] { + var dict = [Int: Int]() + for i in arr1 { + dict[i] = (dict[i] ?? 0) + 1 + } + var res = [Int]() + for j in arr2 { + res.append(contentsOf: Array(repeating: j, count: dict[j]!)) + dict[j] = nil + } + for (key, val) in dict.sorted(by: {$0.0 < $1.0}) { + res.append(contentsOf: Array(repeating: key, count: val)) + } + return res + } + + func relativeSortArray10(_ arr1: [Int], _ arr2: [Int]) -> [Int] { + var countArr = [Int](repeating: 0, count: 1001) + for i in arr1 { + countArr[i] += 1 + } + var res = [Int]() + for j in arr2 { + res.append(contentsOf: Array(repeating: j, count: countArr[j])) + countArr[j] = 0 + } + for (index, value) in countArr.enumerated() where value > 0 { + res.append(contentsOf: Array(repeating: index, count: value)) + } + return res + } + +} diff --git a/Week_08/ReverseBits.swift b/Week_08/ReverseBits.swift new file mode 100644 index 00000000..ddccc6df --- /dev/null +++ b/Week_08/ReverseBits.swift @@ -0,0 +1,32 @@ +// +// ReverseBits.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/21. +// + +import Foundation + +class ReverseBits { + //颠倒二进制位 + func reverseBits(_ n: Int) -> Int { + let n = UInt32(n) + var res = UInt32(0) + for i in 0..<32 { + let temp = (n >> i) & 1 + res |= (temp << (31 - i)) + } + return Int(res) + } + + //思路更清晰 + func reverseBits10(_ n: Int) -> Int { + var n = UInt32(n), res = UInt32(0) + for _ in 0..<32 { + res <<= 1 + res |= n & 1 + n >>= 1 + } + return Int(res) + } +} diff --git a/Week_08/SolveSudoku.swift b/Week_08/SolveSudoku.swift new file mode 100644 index 00000000..1742c4fd --- /dev/null +++ b/Week_08/SolveSudoku.swift @@ -0,0 +1,130 @@ +// +// SolveSudoku.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/20. +// + +import Foundation + +class SolveSudoku { + + /* + 第一种方式: + 直接找出空格位置 + 对指定的空格和剩余的数字进行匹配 + 效率更高 + */ + + var rows = Array(repeating: Set("123456789"), count: 9) + var cols = Array(repeating: Set("123456789"), count: 9) + var blocks = Array(repeating: Set("123456789"), count: 9) + var spaces = [[Int]]() + func solveSudoku(_ board: inout [[Character]]) { + let m = board.count, n = board[0].count + for i in 0.. Bool { + if iter == spaces.count { + return true + } + let i = spaces[iter][0], j = spaces[iter][1], b = getBlockIndex(i, j) + //三个方向可以填入的值取交集, 放到temp + let temp = rows[i].intersection(cols[j]).intersection(blocks[b]) + for val in temp { + rows[i].remove(val) + cols[j].remove(val) + blocks[b].remove(val) + board[i][j] = val + if backtrack(iter + 1, &board) { + return true + } + board[i][j] = "." + rows[i].insert(val) + cols[j].insert(val) + blocks[b].insert(val) + } + return false + } + + func getBlockIndex(_ i: Int, _ j: Int) -> Int { + return 3 * (i / 3) + j / 3 + } + + /* + 第二种方式: + 相比第一种方案每次都从1~9尝试, 会有一些无用的尝试操作 + */ + func solveSudoku10(_ board: inout [[Character]]) { + guard board.count > 0, board[0].count > 0 else { + return + } + solve(&board) + } + + @discardableResult + func solve(_ board: inout [[Character]]) -> Bool { + for i in 0..<9 { + for j in 0..<9 { + if board[i][j] != "." { + continue + } + //没有值 + for c in "123456789" { + if !isValid(board, i, j, c) { + continue + } + //c是有效的, 设置值, 进行回溯 + board[i][j] = c + if solve(&board) { + return true + } + board[i][j] = "." + } + return false + } + } + return true + } + + func isValid(_ board: [[Character]], _ i: Int, _ j: Int, _ c: Character) -> Bool { + for k in 0..<9 { + if board[i][k] == c { + return false + } + if board[k][j] == c { + return false + } + if board[3 * (i / 3) + k / 3][3 * (j / 3) + k % 3] == c { + return false + } + } + return true + } + + + + func test() { + var a: [[Character]] = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]] + solveSudoku(&a) + print(a) + } + + +} + + diff --git a/Week_08/ValidAnagram.swift b/Week_08/ValidAnagram.swift new file mode 100644 index 00000000..b68db83c --- /dev/null +++ b/Week_08/ValidAnagram.swift @@ -0,0 +1,64 @@ +// +// ValidAnagram.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/12. +// + +import Foundation + +class ValidAnagram { + /// 有效异位词 + func isAnagram(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + if s.sorted() == t.sorted() { + return true + } else { + return false + } + } + + // 数组方式 + func isAnagram01(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + var arr = [Int](repeating: 0, count: 26) + let aCharUnicodeScalar = Int("a".unicodeScalars.first!.value) + for c in s.unicodeScalars { + arr[Int(c.value) - aCharUnicodeScalar] += 1 + } + for c in t.unicodeScalars { + arr[Int(c.value) - aCharUnicodeScalar] -= 1 + } + guard arr.first( where: {$0 != 0} ) == nil else { + return false + } + return true + } + + //字典方式 + func isAnagram02(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + var hashMap = [Character: Int]() + for c in s { + hashMap[c] = hashMap[c] ?? 0 + 1 + } + for c in t { + if hashMap[c] == nil { + return false + } + hashMap[c]! -= 1 + if hashMap[c]! < 0 { + return false + } + } + return true + } + + +} diff --git a/Week_08/ValidSudoku.swift b/Week_08/ValidSudoku.swift new file mode 100644 index 00000000..8805ec3e --- /dev/null +++ b/Week_08/ValidSudoku.swift @@ -0,0 +1,33 @@ +// +// ValidSudoku.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/21. +// + +import Foundation + +class ValidSudoku { + //有效的数独 + func isValidSudoku(_ board: [[Character]]) -> Bool { + var cols = [Set](repeating: [], count: 9) + var rows = [Set](repeating: [], count: 9) + var boxs = [Set](repeating: [], count: 9) + for i in 0..<9 { + for j in 0..<9 { + let char = board[i][j] + if char == "." { + continue + } + let boxIndex = (i / 3) * 3 + j / 3 + if rows[i].contains(char) || cols[j].contains(char) || boxs[boxIndex].contains(char) { + return false + } + rows[i].insert(char) + cols[j].insert(char) + boxs[boxIndex].insert(char) + } + } + return true + } +} From 96e620dc3ad536ba4449695a068d0ac801543957 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 24 Jan 2021 22:29:33 +0800 Subject: [PATCH 34/51] =?UTF-8?q?=E4=BD=8D=E8=BF=90=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_08/README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/Week_08/README.md b/Week_08/README.md index 50de3041..2fb6fa60 100644 --- a/Week_08/README.md +++ b/Week_08/README.md @@ -1 +1,45 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 总结 + +这周学习了位运算,布隆过滤器,LRU Cache,排序算法,感觉这周内容还是挺多的, + +## 位运算 + +#### 基本的位运算 + +- 左移 >> 0011=>0110 +- 右移 << 0110=>0011 + +- 按位或 | 有一得一 +- 按位与 & 有零得零 +- 按位取反 ~ 一变零,零变一 +- 按位异或 ^ 不同得一,相同得零 + +#### 异或常用操作 + +* x ^ 0 = x +* x ^ 1s = ~x // 1s = ~0 +* x ^ (~x) = 1s +* x ^ x = 0 +* c = a ^ b => a ^ c = b , b ^ c = a // 交换两个数 +* a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c // associative + +#### 指定位置的位运算 + +1. 将x最右边的n位清零:x & (~0 << n) +2. 获取x的第你位值(0或1):(x >> n) & 1 +3. 获取x的第n位幂值: x & (1 << n) +4. 仅将第n位置为1: x | (1 << n) +5. 仅将第n位置为0: x & (~(1 << n)) +6. 将x的最高位到第n位清零: x & ((1 << n) - 1) + +#### 实战运算要点 + +* 判断奇偶 + * x % 2 == 1 => x & 1 == 1 + * x % 2 == 0 => x & 1 == 0 +* x >> 1 => x / 2 +* x = x & (x - 1) //清零最低位的1 +* x & (-x) //得到最低位的1 +* x & ~x => 0 \ No newline at end of file From 74171f07aec5ed8df68f87be1befcd5c040d7164 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 24 Jan 2021 22:50:31 +0800 Subject: [PATCH 35/51] Update README.md --- Week_08/README.md | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/Week_08/README.md b/Week_08/README.md index 2fb6fa60..d8a3d1be 100644 --- a/Week_08/README.md +++ b/Week_08/README.md @@ -42,4 +42,48 @@ * x >> 1 => x / 2 * x = x & (x - 1) //清零最低位的1 * x & (-x) //得到最低位的1 -* x & ~x => 0 \ No newline at end of file +* x & ~x => 0 + +## 布隆过滤器 Bloom Filter + +#### 介绍 + +* 作用:检索一个元素是否在一个集合中。 +* 优点:空间效率和查询时间都远远超出一般算法。 +* 缺点:有一定的误识别率和删除困难。 + +#### 案例 + +1. 比特币网络 +2. 分布式系统 +3. Redis缓存 +4. 垃圾邮件、评论过滤 + +## LRU Cache + +least recently used 最近最少使用 + +## 排序 + +#### 比较类排序 + +- 交换排序 + - 冒泡排序 + - 快速排序 +- 插入排序 + - 简单插入排序 + - 希尔排序 +- 选择排序 + - 简单选择排序 + - 堆排序 +- 归并排序 + - 二路归并排序 + - 多路归并排序 + +#### 非比较类排序 + +- 计数排序 +- 桶排序 +- 基数排序 + + From d63ad9c8f581c7e63892f88afc1966c51ebf79d3 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 24 Jan 2021 22:51:47 +0800 Subject: [PATCH 36/51] Update README.md --- Week_08/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_08/README.md b/Week_08/README.md index d8a3d1be..a0f38943 100644 --- a/Week_08/README.md +++ b/Week_08/README.md @@ -2,7 +2,7 @@ ## 总结 -这周学习了位运算,布隆过滤器,LRU Cache,排序算法,感觉这周内容还是挺多的, +这周学习了位运算,布隆过滤器,LRU Cache,排序算法,感觉这周内容还是挺多的,排序的很多代码都没有完成,需要慢慢完善下。这周题目做的不多,还需要加油。 ## 位运算 From 72b4ce1a9558f8bb1d1d34e8fceb61ce9c454492 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 24 Jan 2021 23:11:15 +0800 Subject: [PATCH 37/51] =?UTF-8?q?=E6=AF=94=E7=89=B9=E4=BD=8D=E8=AE=A1?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_08/CountingBits.swift | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Week_08/CountingBits.swift diff --git a/Week_08/CountingBits.swift b/Week_08/CountingBits.swift new file mode 100644 index 00000000..00889cf6 --- /dev/null +++ b/Week_08/CountingBits.swift @@ -0,0 +1,28 @@ +// +// CountingBits.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/24. +// + +import Foundation + +class CountingBits { + + func countBits(_ num: Int) -> [Int] { + var dp = [Int](repeating: 0, count: num + 1) + for i in 1..> 1] + i & 1 + } + return dp + } + + func countBits10(_ num: Int) -> [Int] { + var dp = [Int](repeating: 0, count: num + 1) + for i in 1.. Date: Mon, 25 Jan 2021 12:03:56 +0800 Subject: [PATCH 38/51] =?UTF-8?q?=E9=83=A8=E5=88=86=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_08/README.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/Week_08/README.md b/Week_08/README.md index a0f38943..b4587160 100644 --- a/Week_08/README.md +++ b/Week_08/README.md @@ -86,4 +86,61 @@ least recently used 最近最少使用 - 桶排序 - 基数排序 - +#### 简单排序的代码 + +``` +/* + 插入排序: + 1. 从第一个元素开始,该元素可以认为已经被排序 + 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 + 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 + 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 + 5. 将新元素插入到该位置中 + 6. 重复步骤2 + */ +func insertSort(_ arr: inout [Int]) { + for i in 1..= 0 && arr[j] > key { + arr[j + 1] = arr[j] + j -= 1 + } + arr[j + 1] = key + } +} + +/* + 选择排序: + 1. 遍历数组,找到最小的元素,将其置于数组起始位置。 + 2. 从上次最小元素存放的后一个元素开始遍历至数组尾,将最小的元素置于开始处。 + 3. 重复上述过程,直到元素排序完毕。 + */ +func selectionSort(_ arr: inout [Int]) { + for i in 0.. arr[j + 1] { + arr.swapAt(j, j + 1) + } + } + } +} +``` \ No newline at end of file From dd92856b900f9195355533421e7df91753406cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Tue, 26 Jan 2021 19:25:47 +0800 Subject: [PATCH 39/51] =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_08/Sort.swift | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 Week_08/Sort.swift diff --git a/Week_08/Sort.swift b/Week_08/Sort.swift new file mode 100644 index 00000000..98e5c72b --- /dev/null +++ b/Week_08/Sort.swift @@ -0,0 +1,200 @@ +// +// Sort.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/25. +// + +import Foundation + +class Sort { + + /* + 插入排序:O(n^2) O(1) 稳定 + 1. 从第一个元素开始,该元素可以认为已经被排序 + 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 + 3. 如果该元素(已排序)大于新元素,将该元素移到下一位置 + 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 + 5. 将新元素插入到该位置中 + 6. 重复步骤2 + */ + func insertSort(_ arr: inout [Int]) { + for i in 1..= 0 && arr[j] > key { + arr[j + 1] = arr[j] + j -= 1 + } + arr[j + 1] = key + } + } + + /* + 选择排序:O(n^2) O(1) 不稳定 + 1. 遍历数组,找到最小的元素,将其置于数组起始位置。 + 2. 从上次最小元素存放的后一个元素开始遍历至数组尾,将最小的元素置于开始处。 + 3. 重复上述过程,直到元素排序完毕。 + */ + func selectionSort(_ arr: inout [Int]) { + for i in 0.. arr[j + 1] { + arr.swapAt(j, j + 1) + } + } + } + } + + + /* + 归并排序: O(nlogn) O(n) 稳定 + 1. 申请空间,创建两个数组,长度分别为两个有序数组的长度 + 2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置 + 3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 + 4. 重复步骤3直到某一指针达到序列尾 + 5. 将另一序列剩下的所有元素直接复制到合并序列尾 + */ + func mergeSort(_ arr: inout [Int]) { + mergeSortHelper(&arr, 0, arr.count - 1) + } + + func mergeSortHelper(_ arr: inout [Int], _ left: Int, _ right: Int) { + if left >= right { + return + } + let mid = (left + right) >> 1 + mergeSortHelper(&arr, left, mid) + mergeSortHelper(&arr, mid + 1, right) + merge(&arr, left, mid, right) + } + + func merge(_ arr: inout [Int], _ left: Int, _ mid: Int, _ right: Int) { + var temp = [Int]() + var i = left, j = mid + 1 + while i <= mid && j <= right { + if arr[i] <= arr[j] { + temp.append(arr[i]) + i += 1 + } else { + temp.append(arr[j]) + j += 1 + } + } + while i <= mid { + temp.append(arr[i]) + i += 1 + } + while j <= right { + temp.append(arr[j]) + j += 1 + } + for p in 0..= right { + return + } + let pivot = partition(&arr, left, right) + quickSortHelper(&arr, left, pivot - 1) + quickSortHelper(&arr, pivot + 1, right) + } + + func partition(_ arr: inout [Int], _ left: Int, _ right: Int) -> Int { + var pivot = right, counter = left + for i in left.. 0 { + arr.swapAt(0, k) + k -= 1 + heapify(&arr, k, 0) + } + } + + func buildHeap(_ arr: inout [Int], _ n: Int) { + var i = n / 2 + while i >= 0 { + heapify(&arr, n, i) + i -= 1 + } + } + + func heapify(_ arr: inout [Int], _ n: Int, _ i: Int) { + var i = i + while true { + var maxPos = i + let left = i * 2 + 1 + if left <= n && arr[left] > arr[maxPos] { + maxPos = left + } + let right = i * 2 + 2 + if right <= n && arr[right] > arr[maxPos] { + maxPos = right + } + if maxPos == i { + break + } + arr.swapAt(maxPos, i) + i = maxPos + } + } + + + func test() { + var arr = [15,2,1,6,7,9,34,5] + heapSort(&arr) + print(arr) + } + +} From bd012c77d54060fcbceee1f9a5682afad30b79c2 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 31 Jan 2021 21:29:37 +0800 Subject: [PATCH 40/51] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E5=91=A8=E6=80=BB?= =?UTF-8?q?=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/README.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/Week_09/README.md b/Week_09/README.md index 50de3041..7fbb109f 100644 --- a/Week_09/README.md +++ b/Week_09/README.md @@ -1 +1,25 @@ -学习笔记 \ No newline at end of file +# 学习笔记 + +## 总结 +这时间过得好快,算法训练营就要结束了,算法训练营的学习帮助自己快速的了解了基本的数据结构和算法,自己后续仍需继续学习和刷题。算法训练营的学习相比自己的学习效率还是很高的,以往自己学习很难坚持下去,尤其遇到不懂的点,很容易丧失动力,导致拖延和放弃,算法训练营有老师带,有助教帮,还有班主任督促,同学们共同学习,进步很大。 + +但是这段时间学习的东西比较多,自身还需要不断的消化才行,希望自己后面仍然可以继续坚持学习,慢慢熟练和消化算法训练营学习的知识。 + +## 字符串 + +字符串是比较基础的数据类型,和字符串相关的算法基础算法也是考核最多的算法。 +例如字符串的翻转,转小写等,字符串转整数一定要多练习,考核基本功的题目。 + +### 经典问题 +- 字符串转整数 +- 字母异位词问题 +- 回文串问题 +- 和动态规划结合的问题 + - 最长子串 + - 子序列 + - 编辑距离 + +### 字符串匹配算法 +- 暴力匹配 +- Rabin-Karp算法 +- KMP算法 \ No newline at end of file From 513d34c00d488c11c065217c79b4e552bdcf6344 Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 31 Jan 2021 21:30:20 +0800 Subject: [PATCH 41/51] =?UTF-8?q?=E7=AC=AC=E4=B9=9D=E5=91=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/FindAllAnagramsInAString.swift | 139 +++++++++++++++++++++++++ Week_09/FirstUniqueChar.swift | 89 ++++++++++++++++ Week_09/GroupAnagrams.swift | 28 +++++ Week_09/JewelsAndStones.swift | 32 ++++++ Week_09/LengthOfLastWord.swift | 43 ++++++++ Week_09/LongestCommonPrefix.swift | 39 +++++++ Week_09/MinCostClimbingStairs.swift | 51 +++++++++ Week_09/ReverseOnlyLetters.swift | 81 ++++++++++++++ Week_09/ReverseString.swift | 32 ++++++ Week_09/ReverseStringII.swift | 46 ++++++++ Week_09/ReverseWordInString.swift | 30 ++++++ Week_09/ReverseWordInStringIII.swift | 59 +++++++++++ Week_09/ToLowerCase.swift | 45 ++++++++ Week_09/ValidAnagram.swift | 64 ++++++++++++ Week_09/ValidPalindrome.swift | 65 ++++++++++++ 15 files changed, 843 insertions(+) create mode 100644 Week_09/FindAllAnagramsInAString.swift create mode 100644 Week_09/FirstUniqueChar.swift create mode 100644 Week_09/GroupAnagrams.swift create mode 100644 Week_09/JewelsAndStones.swift create mode 100644 Week_09/LengthOfLastWord.swift create mode 100644 Week_09/LongestCommonPrefix.swift create mode 100644 Week_09/MinCostClimbingStairs.swift create mode 100644 Week_09/ReverseOnlyLetters.swift create mode 100644 Week_09/ReverseString.swift create mode 100644 Week_09/ReverseStringII.swift create mode 100644 Week_09/ReverseWordInString.swift create mode 100644 Week_09/ReverseWordInStringIII.swift create mode 100644 Week_09/ToLowerCase.swift create mode 100644 Week_09/ValidAnagram.swift create mode 100644 Week_09/ValidPalindrome.swift diff --git a/Week_09/FindAllAnagramsInAString.swift b/Week_09/FindAllAnagramsInAString.swift new file mode 100644 index 00000000..9c280c81 --- /dev/null +++ b/Week_09/FindAllAnagramsInAString.swift @@ -0,0 +1,139 @@ +// +// FindAllAnagramsInAString.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/30. +// + +import Foundation + +class FindAllAnagramsInAString { + + func findAnagrams(_ s: String, _ p: String) -> [Int] { + guard s.count >= p.count else { + return [] + } + var pf = [Int](repeating: 0, count: 26) + for c in p.unicodeScalars { + pf[Int(c.value) - 97] += 1 + } + let pCnt = p.count + var res = [Int](), s = Array(s) + var popLatter: Character? = nil + for i in 0...s.count - pCnt { + if s[i + pCnt - 1] == popLatter { + res.append(i) + popLatter = s[i] + continue + } + if isAnagrams(String(s[i.. Bool { + var pf = pf + for c in s.unicodeScalars { + pf[Int(c.value) - 97] -= 1 + if pf[Int(c.value) - 97] < 0 { + return false + } + } + for i in pf { + if i != 0 { + return false + } + } + return true + } + + + + func findAnagrams10(_ s: String, _ p: String) -> [Int] { + + //滑动窗口的值,和p的值 + var window = [Character: Int]() + var needs = [Character: Int]() + for char in p { + needs[char, default: 0] += 1 + } + + let sArray = Array(s) + var left = 0, right = 0 + var match = 0 //匹配上的字母数量 + var res = [Int]() + + while right < sArray.count { + let rightChar = sArray[right] + right += 1 + + if let needCharCount = needs[rightChar] { + window[rightChar, default: 0] += 1 + if window[rightChar] == needCharCount { + match += 1 + } + } else { + continue + } + + while match == needs.count { + //匹配上的时候如果字符串长度等于P的长度,加入答案 + if right - left == p.count { + res.append(left) + } + //否者左边向前移动一位 + let leftChar = sArray[left] + left += 1 + //如果移出去的字符在P中 + if let needCharCount = needs[leftChar] { + //如果窗口值和P值相等,match记录减一 + if window[leftChar] == needCharCount { + match -= 1 + } + //窗口值减一 + window[leftChar]! -= 1 + } + } + } + + return res + } + + + func findAnagrams20(_ s: String, _ p: String) -> [Int] { + let arrs = Array(s) + let arrp = Array(p) + let base = Character("a").asciiValue! + var window = Array(repeating: 0, count: 26) + var needs = Array(repeating: 0, count: 26) + var res = [Int]() + for c in arrp { + needs[Int(c.asciiValue! - base)] += 1 + } + var left = 0, right = 0 + while right < arrs.count { + let curR = Int(arrs[right].asciiValue! - base) + right += 1 + window[curR] += 1 + while window[curR] > needs[curR] { + let curL = Int(arrs[left].asciiValue! - base) + left += 1 + window[curL] -= 1 + } + if right - left == arrp.count { + res.append(left) + } + } + return res + } + + + + + func test() { + print(findAnagrams20("cba", "abc")) + } +} diff --git a/Week_09/FirstUniqueChar.swift b/Week_09/FirstUniqueChar.swift new file mode 100644 index 00000000..243570bf --- /dev/null +++ b/Week_09/FirstUniqueChar.swift @@ -0,0 +1,89 @@ +// +// FirstUniqueChar.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/25. +// + +import Foundation + +/* + 字符串中的第一个唯一字符 + 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 + 提示:你可以假定该字符串只包含小写字母。 + */ + +class FirstUniqueChar { + + func firstUniqChar(_ s: String) -> Int { + var dict = [Character: Int]() + for c in s { + dict[c] = (dict[c] ?? 0) + 1 + } + for (i, v) in s.enumerated() { + if dict[v] == 1 { + return i + } + } + return -1 + } + + func firstUniqChar10(_ s: String) -> Int { + var position = [Character: Int]() + for (i, v) in s.enumerated() { + position[v] = position[v] == nil ? i : -1 + } + var first = s.count + for val in position.values { + if val != -1 && val < first { + first = val + } + } + return first == s.count ? -1 : first + } + + + func firstUniqChar30(_ s: String) -> Int { + var sa = [Int](repeating: 0, count: 26) + for c in s.unicodeScalars { + sa[Int(c.value) - 97] += 1 + } + var i = 0 + for c in s.unicodeScalars { + if sa[Int(c.value) - 97] == 1 { + return i + } + i += 1 + } + return -1 + } + + + //队列的方式 + func firstUniqChar20(_ s: String) -> Int { + var position = [Character: Int]() + var queue = [Pair]() + for (i, v) in s.enumerated() { + if position[v] == nil { + position[v] = i + queue.append(Pair(v, i)) + } else { + position[v] = -1 + while !queue.isEmpty && position[queue.first!.char] == -1 { + queue.removeFirst() + } + } + } + return queue.isEmpty ? -1 : queue.first!.pos + } + +} + +class Pair { + public var char: Character + public var pos: Int + public init(_ char: Character,_ pos: Int) { + self.char = char + self.pos = pos + } +} diff --git a/Week_09/GroupAnagrams.swift b/Week_09/GroupAnagrams.swift new file mode 100644 index 00000000..e6953e30 --- /dev/null +++ b/Week_09/GroupAnagrams.swift @@ -0,0 +1,28 @@ +// +// GroupAnagrams.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/12. +// + +import Foundation + +class GroupAnagrams { + + func groupAnagrams(_ strs: [String]) -> [[String]] { + var hashMap = [String: [String]]() + for str in strs { + let key = String(str.sorted()) + if hashMap[key] == nil { + hashMap[key] = [] + } + hashMap[key]!.append(str) + } + return Array(hashMap.values) + } + + func test(_ strs: [String]) { + let result = groupAnagrams(strs) + print(result) + } +} diff --git a/Week_09/JewelsAndStones.swift b/Week_09/JewelsAndStones.swift new file mode 100644 index 00000000..71c9162a --- /dev/null +++ b/Week_09/JewelsAndStones.swift @@ -0,0 +1,32 @@ +// +// JewelsAndStones.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/28. +// + +import Foundation + +/* + 宝石和石头 + + 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 + J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。 + +来源:力扣(LeetCode) +链接:https://leetcode-cn.com/problems/jewels-and-stones +著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class JewelsAndStones { + func numJewelsInStones(_ jewels: String, _ stones: String) -> Int { + let jSet = Set(jewels) + var cnt = 0 + for c in stones { + if jSet.contains(c) { + cnt += 1 + } + } + return cnt + } +} diff --git a/Week_09/LengthOfLastWord.swift b/Week_09/LengthOfLastWord.swift new file mode 100644 index 00000000..ac879b92 --- /dev/null +++ b/Week_09/LengthOfLastWord.swift @@ -0,0 +1,43 @@ +// +// LengthOfLastWord.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/28. +// + +import Foundation +/* + 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 + + 如果不存在最后一个单词,请返回 0 。 + + 说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。 + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/length-of-last-word + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ +class LengthOfLastWord { + + func lengthOfLastWord(_ s: String) -> Int { + let s = Array(s) + var count = 0, i = s.count + while i >= 0 { + if s[i] == " " && count != 0 { + break + } else if s[i] != " " { + count += 1 + } + i -= 1 + } + return count + } + + func lengthOfLastWord10(_ s: String) -> Int { + let arr = s.split(separator: " ") + if let last = arr.last { + return last.count + } + return 0 + } +} diff --git a/Week_09/LongestCommonPrefix.swift b/Week_09/LongestCommonPrefix.swift new file mode 100644 index 00000000..56d7913d --- /dev/null +++ b/Week_09/LongestCommonPrefix.swift @@ -0,0 +1,39 @@ +// +// LongestCommonPrefix.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/29. +// + +import Foundation + +/* + 编写一个函数来查找字符串数组中的最长公共前缀。 + + 如果不存在公共前缀,返回空字符串 ""。 + + 提示: + 0 <= strs.length <= 200 + 0 <= strs[i].length <= 200 + strs[i] 仅由小写英文字母组成 + */ + +class LongestCommonPrefix { + + func longestCommonPrefix(_ strs: [String]) -> String { + guard strs.count > 0 else { + return "" + } + let firstStr = Array(strs.first!) + for i in 0.. Int { + guard cost.count >= 2 else { + return 0 + } + let n = cost.count + var pre = 0, cur = 0, temp = 0 + for i in 2.. Int { + guard cost.count >= 2 else { + return 0 + } + let n = cost.count + var dp = [Int](repeating: 0, count: n + 1) + dp[0] = 0; dp[1] = 0 + for i in 2.. String { + var S = Array(S) + var left = 0, right = S.count - 1 + while left < right { + if !S[left].isLetter { + left += 1 + continue + } + if !S[right].isLetter { + right -= 1 + continue + } + S.swapAt(left, right) + left += 1 + right -= 1 + } + return String(S) + } + + func reverseOnlyLetters10(_ S: String) -> String { + var stack = [Character](), ans = "" + for c in S { + if c.isLetter { + stack.append(c) + } + } + for c in S { + if c.isLetter { + ans.append(stack.popLast()!) + } else { + ans.append(c) + } + } + return ans + } + + func test() { + print(reverseOnlyLetters("123456789")) + } +} diff --git a/Week_09/ReverseString.swift b/Week_09/ReverseString.swift new file mode 100644 index 00000000..b62e99ca --- /dev/null +++ b/Week_09/ReverseString.swift @@ -0,0 +1,32 @@ +// +// ReverseString.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/29. +// + +import Foundation + +/* + 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 + + 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 + + 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/reverse-string + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class ReverseString { + func reverseString(_ s: inout [Character]) { + if s.count <= 1 { return } + var left = 0, right = s.count - 1 + while left < right { + s.swapAt(left, right) + left += 1 + right -= 1 + } + } +} diff --git a/Week_09/ReverseStringII.swift b/Week_09/ReverseStringII.swift new file mode 100644 index 00000000..8632ac52 --- /dev/null +++ b/Week_09/ReverseStringII.swift @@ -0,0 +1,46 @@ +// +// ReverseStringII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/30. +// + +import Foundation + +/* + 541. 反转字符串 II + 给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。 + + 如果剩余字符少于 k 个,则将剩余字符全部反转。 + 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 + + 提示: + + 该字符串只包含小写英文字母。 + 给定字符串的长度和 k 在 [1, 10000] 范围内。 + + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/reverse-string-ii + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class ReverseStringII { + func reverseStr(_ s: String, _ k: Int) -> String { + var s = Array(s) + for i in stride(from: 0, to: s.count, by: 2 * k) { + let right = (i + k - 1 > s.count - 1) ? (s.count - 1) : (i + k - 1) + reverseString(&s, i, right) + } + return String(s) + } + + func reverseString(_ s: inout [Character], _ left: Int, _ right: Int) { + var left = left, right = right + while left < right { + s.swapAt(left, right) + left += 1 + right -= 1 + } + } +} diff --git a/Week_09/ReverseWordInString.swift b/Week_09/ReverseWordInString.swift new file mode 100644 index 00000000..c9aec269 --- /dev/null +++ b/Week_09/ReverseWordInString.swift @@ -0,0 +1,30 @@ +// +// ReverseWordInString.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/30. +// + +import Foundation + +/* + 给定一个字符串,逐个翻转字符串中的每个单词。 + + 说明: + + 无空格字符构成一个 单词 。 + 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 + 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/reverse-words-in-a-string + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class ReverseWordInString { + func reverseWords(_ s: String) -> String { + var arr = s.split(separator: " ") + arr.reverse() + return arr.joined(separator: " ") + } +} diff --git a/Week_09/ReverseWordInStringIII.swift b/Week_09/ReverseWordInStringIII.swift new file mode 100644 index 00000000..78654796 --- /dev/null +++ b/Week_09/ReverseWordInStringIII.swift @@ -0,0 +1,59 @@ +// +// ReverseWordInStringIII.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/30. +// + +import Foundation + +/* + 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 + + + + 示例: + + 输入:"Let's take LeetCode contest" + 输出:"s'teL ekat edoCteeL tsetnoc" + + + + 提示: + + 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。 + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + + +class ReverseWordInStringIII { + + func reverseWords(_ s: String) -> String { + var s = Array(s) + let n = s.count + var i = 0 + while i < n { + var start = i + while i < n && s[i] != " " { + i += 1 + } + var end = i - 1 + while start < end { + s.swapAt(start, end) + start += 1 + end -= 1 + } + while i < n && s[i] == " " { + i += 1 + } + } + return String(s) + } + + func reverseWords10(_ s: String) -> String { + return String(s.split(separator: " ").map( { $0.reversed() }).joined(separator: " ")) + } +} diff --git a/Week_09/ToLowerCase.swift b/Week_09/ToLowerCase.swift new file mode 100644 index 00000000..ab9c3639 --- /dev/null +++ b/Week_09/ToLowerCase.swift @@ -0,0 +1,45 @@ +// +// ToLowerCase.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/27. +// + +import Foundation + +/* + 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。 + */ + +class ToLowerCase { + + func toLowerCase(_ str: String) -> String { + guard str.count > 0 else { + return str + } + var res = Array(str) + for c in str { + var i = c.asciiValue! + i |= 32 + res.append(Character(UnicodeScalar(i))) + } + return String(res) + } + + func toLowerCase10(_ str: String) -> String { + return String(str.map { Character(UnicodeScalar($0.asciiValue! | 32)) }) + } + + func toLowerCase20(_ str: String) -> String { + return str.lowercased() + } + + func toLowerCase30(_ str: String) -> String { + var cArr = [Character]() + for c in str.unicodeScalars { + cArr.append(Character(UnicodeScalar(c.value | 32)!)) + } + return String(cArr) + } + +} diff --git a/Week_09/ValidAnagram.swift b/Week_09/ValidAnagram.swift new file mode 100644 index 00000000..b68db83c --- /dev/null +++ b/Week_09/ValidAnagram.swift @@ -0,0 +1,64 @@ +// +// ValidAnagram.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2020/12/12. +// + +import Foundation + +class ValidAnagram { + /// 有效异位词 + func isAnagram(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + if s.sorted() == t.sorted() { + return true + } else { + return false + } + } + + // 数组方式 + func isAnagram01(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + var arr = [Int](repeating: 0, count: 26) + let aCharUnicodeScalar = Int("a".unicodeScalars.first!.value) + for c in s.unicodeScalars { + arr[Int(c.value) - aCharUnicodeScalar] += 1 + } + for c in t.unicodeScalars { + arr[Int(c.value) - aCharUnicodeScalar] -= 1 + } + guard arr.first( where: {$0 != 0} ) == nil else { + return false + } + return true + } + + //字典方式 + func isAnagram02(_ s: String, _ t: String) -> Bool { + guard s.count == t.count else { + return false + } + var hashMap = [Character: Int]() + for c in s { + hashMap[c] = hashMap[c] ?? 0 + 1 + } + for c in t { + if hashMap[c] == nil { + return false + } + hashMap[c]! -= 1 + if hashMap[c]! < 0 { + return false + } + } + return true + } + + +} diff --git a/Week_09/ValidPalindrome.swift b/Week_09/ValidPalindrome.swift new file mode 100644 index 00000000..802e6276 --- /dev/null +++ b/Week_09/ValidPalindrome.swift @@ -0,0 +1,65 @@ +// +// ValidPalindrome.swift +// LeetCodeDemo +// +// Created by Apple on 2021/1/31. +// + +import Foundation + +/* + 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 + + 说明:本题中,我们将空字符串定义为有效的回文串。 + + 示例 1: + + 输入: "A man, a plan, a canal: Panama" + 输出: true + + 示例 2: + + 输入: "race a car" + 输出: false + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/valid-palindrome + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class ValidPalindrome { + func isPalindrome(_ s: String) -> Bool { + let lowS = s.lowercased() + var sArr = [Character]() + for c in lowS { + if c.isLetter || c.isNumber { + sArr.append(c) + } + } + var left = 0, right = sArr.count - 1 + while left < right { + if sArr[left] != sArr[right] { + return false + } + left += 1 + right -= 1 + } + return true + } + + func isPalindrome10(_ s: String) -> Bool { + let lowS = s.lowercased() + var sArr = "" + for c in lowS { + if c.isLetter || c.isNumber { + sArr.append(c) + } + } + let reverseLowS = sArr.reversed() + return sArr == String(reverseLowS) + } + + func test() { + print(isPalindrome10("A man, a plan, a canal: Panama")) + } +} From 2a6d8d8be59cb9e00c515edb380503877198afdc Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 31 Jan 2021 21:42:07 +0800 Subject: [PATCH 42/51] =?UTF-8?q?=E4=B8=8D=E5=90=8C=E8=B7=AF=E5=BE=842?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E8=BD=AC=E7=A7=BB=E6=96=B9=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Week_09/README.md b/Week_09/README.md index 7fbb109f..776ed52d 100644 --- a/Week_09/README.md +++ b/Week_09/README.md @@ -22,4 +22,13 @@ ### 字符串匹配算法 - 暴力匹配 - Rabin-Karp算法 -- KMP算法 \ No newline at end of file +- KMP算法 + + +### 不同路径2 + +状态转移方程 + +f(i, j) = 0 , ob[i, j] == 0 + +f(i, j) = f(i - 1, j) + f(i, j - 1) , ob[i, j] != 0 \ No newline at end of file From 118281e15e7082dbc106c58f03b00cdd255a173d Mon Sep 17 00:00:00 2001 From: DovYoung <1591759055@qq.com> Date: Sun, 31 Jan 2021 22:13:38 +0800 Subject: [PATCH 43/51] =?UTF-8?q?=E8=A7=A3=E7=A0=81=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=92=8C=E6=9C=80=E9=95=BF=E5=85=AC=E5=85=B1=E5=AD=90=E5=BA=8F?= =?UTF-8?q?=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/DecodeWays.swift | 37 ++++++++++++++++++++++++++ Week_09/LongestCommonSubsequence.swift | 33 +++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 Week_09/DecodeWays.swift create mode 100644 Week_09/LongestCommonSubsequence.swift diff --git a/Week_09/DecodeWays.swift b/Week_09/DecodeWays.swift new file mode 100644 index 00000000..b61059bb --- /dev/null +++ b/Week_09/DecodeWays.swift @@ -0,0 +1,37 @@ +// +// DecodeWays.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/10. +// + +import Foundation + +class DecodeWays { + + func numDecodings(_ s: String) -> Int { + let s = Array(s) + var pre = 1, cur = 1 + if s[0] == "0" { return 0 } + for i in 1.. Int { + guard text1.count > 0, text2.count > 0 else { + return 0 + } + let n1 = text1.count, n2 = text2.count + var dp = [[Int]](repeating: [Int](repeating: 0, count: n2 + 1), count: n1 + 1) + let charArr1 = Array(text1), charArr2 = Array(text2) + for i in 1.. Date: Sun, 31 Jan 2021 22:31:56 +0800 Subject: [PATCH 44/51] =?UTF-8?q?=E5=90=8C=E6=9E=84=E5=AD=97=E7=AC=A6?= =?UTF-8?q?=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/IsomorphicStrings.swift | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 Week_09/IsomorphicStrings.swift diff --git a/Week_09/IsomorphicStrings.swift b/Week_09/IsomorphicStrings.swift new file mode 100644 index 00000000..2c87f575 --- /dev/null +++ b/Week_09/IsomorphicStrings.swift @@ -0,0 +1,61 @@ +// +// IsomorphicStrings.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/31. +// + +import Foundation + +/* + 给定两个字符串 s 和 t,判断它们是否是同构的。 + + 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 + + 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。 + + + + 示例 1: + + 输入:s = "egg", t = "add" + 输出:true + + 示例 2: + + 输入:s = "foo", t = "bar" + 输出:false + + 示例 3: + + 输入:s = "paper", t = "title" + 输出:true + + + + 提示: + + 可以假设 s 和 t 长度相同。 + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/isomorphic-strings + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class Solution { + func isIsomorphic(_ s: String, _ t: String) -> Bool { + var s2t = [Character: Character]() + var t2s = [Character: Character]() + let s = Array(s), t = Array(t) + for i in 0.. Date: Sun, 31 Jan 2021 23:00:14 +0800 Subject: [PATCH 45/51] =?UTF-8?q?=E6=9C=80=E9=95=BF=E4=B8=8A=E5=8D=87?= =?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/LengthOfLIS.swift | 90 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 Week_09/LengthOfLIS.swift diff --git a/Week_09/LengthOfLIS.swift b/Week_09/LengthOfLIS.swift new file mode 100644 index 00000000..0bfe56b5 --- /dev/null +++ b/Week_09/LengthOfLIS.swift @@ -0,0 +1,90 @@ +// +// LengthOfLIS.swift +// LeetCodeDemo +// +// Created by Yangdongwu on 2021/1/31. +// + +import Foundation +/* + 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 + + 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 + + + 示例 1: + + 输入:nums = [10,9,2,5,3,7,101,18] + 输出:4 + 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 + + 示例 2: + + 输入:nums = [0,1,0,3,2,3] + 输出:4 + + 示例 3: + + 输入:nums = [7,7,7,7,7,7,7] + 输出:1 + + + + 提示: + + 1 <= nums.length <= 2500 + -104 <= nums[i] <= 104 + + + + 进阶: + + 你可以设计时间复杂度为 O(n2) 的解决方案吗? + 你能将算法的时间复杂度降低到 O(n log(n)) 吗? + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/longest-increasing-subsequence + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class LengthOfLIS { + + func lengthOfLIS(_ nums: [Int]) -> Int { + var tails = [Int](repeating: 0, count: nums.count) + var res = 0 + for num in nums { + var i = 0, j = res + while i < j { + let m = (i + j) >> 1 + if tails[m] < num { + i = m + 1 + } else { + j = m + } + } + tails[i] = num + if res == j { + res += 1 + } + } + return res + } + + func lengthOfLIS10(_ nums: [Int]) -> Int { + guard nums.count > 0 else { + return 0 + } + let n = nums.count + var dp = [Int](repeating: 1, count: n) + var ans = 1 + for i in 0.. nums[j] { + dp[i] = max(dp[i], dp[j] + 1) + } + } + ans = max(ans, dp[i]) + } + return ans + } +} From 5b71302c5a67d58d4243689d81ea0db99e1ea886 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Mon, 1 Feb 2021 11:50:01 +0800 Subject: [PATCH 46/51] =?UTF-8?q?=E6=9C=80=E9=95=BF=E5=9B=9E=E6=96=87?= =?UTF-8?q?=E5=AD=90=E4=B8=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Week_09/LongestPalindromic.swift | 70 ++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 Week_09/LongestPalindromic.swift diff --git a/Week_09/LongestPalindromic.swift b/Week_09/LongestPalindromic.swift new file mode 100644 index 00000000..e28bd430 --- /dev/null +++ b/Week_09/LongestPalindromic.swift @@ -0,0 +1,70 @@ +// +// LongestPalindromic.swift +// LeetCodeDemo +// +// Created by Apple on 2021/2/1. +// + +import Foundation + +/* + 给你一个字符串 s,找到 s 中最长的回文子串。 + 示例 1: + 输入:s = "babad" + 输出:"bab" + 解释:"aba" 同样是符合题意的答案。 + + 示例 2: + 输入:s = "cbbd" + 输出:"bb" + + 示例 3: + + 输入:s = "a" + 输出:"a" + + 示例 4: + + 输入:s = "ac" + 输出:"a" + + 提示: + + 1 <= s.length <= 1000 + s 仅由数字和英文字母(大写和/或小写)组成 + + 来源:力扣(LeetCode) + 链接:https://leetcode-cn.com/problems/longest-palindromic-substring + 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 + */ + +class LongestPalindromic { + + //中心扩展法 + func longestPalindrome10(_ s: String) -> String { + guard s.count > 1 else { + return s + } + let s = Array(s) + var start = 0, end = 0 + for i in 0.. end - start { + start = i - (len - 1) / 2 + end = i + len / 2 + } + } + return String(s[start.. Int { + var l = left, r = right + while l >= 0 && l < s.count && r < s.count && r < s.count && s[l] == s[r] { + l -= 1 + r += 1 + } + return r - l - 1 + } +} From 531a2bd3986b287e1de62b28e65cd879dd913707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Mon, 1 Feb 2021 15:08:52 +0800 Subject: [PATCH 47/51] Update LongestPalindromic.swift --- Week_09/LongestPalindromic.swift | 61 ++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/Week_09/LongestPalindromic.swift b/Week_09/LongestPalindromic.swift index e28bd430..fdbd72ab 100644 --- a/Week_09/LongestPalindromic.swift +++ b/Week_09/LongestPalindromic.swift @@ -40,6 +40,63 @@ import Foundation class LongestPalindromic { + //动态规划(超时) + func longestPalindrome(_ s: String) -> String { + guard s.count > 1 else { + return s + } + let n = s.count + var dp = [[Bool]](repeating: [Bool](repeating: false, count: n), count: n) + var res = "", s = Array(s) + for i in (0.. res.count { + res = String(s[i.. String { + guard s.count > 1 else { + return s + } + let n = s.count + var dp = [[Bool]](repeating: [Bool](repeating: false, count: n), count: n) + var maxLengh = 1, begin = 0, s = Array(s) + //中间赋值,空串 + for i in 0.. maxLengh { + maxLengh = j - i + 1 + begin = i + } + + } + } + return String(s[begin.. String { guard s.count > 1 else { @@ -67,4 +124,8 @@ class LongestPalindromic { } return r - l - 1 } + + func test() { + print(longestPalindrome("aaaaaa")) + } } From 17ece31fae663e2d0b880fe4942f644bb165eeac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Sun, 7 Feb 2021 09:27:35 +0800 Subject: [PATCH 48/51] =?UTF-8?q?=E6=AF=95=E4=B8=9A=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" index 50de3041..03bc0c2e 100644 --- "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" +++ "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" @@ -1 +1,12 @@ -学习笔记 \ No newline at end of file +# 毕业总结 + +## 初衷 +我是一名非计算机专业毕业的iOS开发工程师,深知自身基础知识的薄弱,遂开始学习数据结构和算法,身边的同事有的鼓励我,也有的说学习算法平时工作用不上,但是数据结构和算法是一门计算机基础课程,精通算法是每一名优秀开发者的基本素养,我想成为一名合格的开发者,我要学习算法。 +## 学习 +开始自学时买了书《大话数据结构》,也用微信读书看电子书《算法图解》,但是在学习的过程中总是很难坚持下去,最终的结果就是过了几个月依然停留在几种简单的数据结构学习,无法继续下去,自己的信心也受到了很大的打击。 +在这种情况下,我能怎么改变现状呢,我一度陷入了迷茫,因为平时有用极客时间学习iOS课程,2020年11月30号的晚上,在看了超哥的直播后,又刚好赶上算法训练营开班招生,便毅然决然的报名了。 +## 开始 +开始还有些害怕自己跟不上大家的节奏,但是经过了几周的学习后,发现自己的担心是多余的,自己在不断的学习中有了很大的进步,算法训练营的学习既系统又高效,覃超老师不光教会我们各种算法知识,还教会我们学习方法,就像指路的明灯,让我们在学习中克服眼前的困难,披荆斩棘,不断前行。 +## 结束并不是终点 +现在算法训练营接近尾声了,我们马上也就要毕业了,算法训练营的学习要结束了,但是在算法学习道路上我们才刚刚开始,希望在以后的工作学习中,我能够不忘初心,坚持学习,坚持刷题,让做题成为一种习惯,让自己的力扣主页能够如一片草地,生机昂然。 + From 73789413d90812e4df10b8809cb4442bac93546c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Sun, 7 Feb 2021 10:44:52 +0800 Subject: [PATCH 49/51] =?UTF-8?q?=E6=AF=95=E4=B8=9A=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" index 03bc0c2e..207b224d 100644 --- "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" +++ "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" @@ -2,11 +2,29 @@ ## 初衷 我是一名非计算机专业毕业的iOS开发工程师,深知自身基础知识的薄弱,遂开始学习数据结构和算法,身边的同事有的鼓励我,也有的说学习算法平时工作用不上,但是数据结构和算法是一门计算机基础课程,精通算法是每一名优秀开发者的基本素养,我想成为一名合格的开发者,我要学习算法。 + ## 学习 开始自学时买了书《大话数据结构》,也用微信读书看电子书《算法图解》,但是在学习的过程中总是很难坚持下去,最终的结果就是过了几个月依然停留在几种简单的数据结构学习,无法继续下去,自己的信心也受到了很大的打击。 在这种情况下,我能怎么改变现状呢,我一度陷入了迷茫,因为平时有用极客时间学习iOS课程,2020年11月30号的晚上,在看了超哥的直播后,又刚好赶上算法训练营开班招生,便毅然决然的报名了。 + ## 开始 开始还有些害怕自己跟不上大家的节奏,但是经过了几周的学习后,发现自己的担心是多余的,自己在不断的学习中有了很大的进步,算法训练营的学习既系统又高效,覃超老师不光教会我们各种算法知识,还教会我们学习方法,就像指路的明灯,让我们在学习中克服眼前的困难,披荆斩棘,不断前行。 + ## 结束并不是终点 -现在算法训练营接近尾声了,我们马上也就要毕业了,算法训练营的学习要结束了,但是在算法学习道路上我们才刚刚开始,希望在以后的工作学习中,我能够不忘初心,坚持学习,坚持刷题,让做题成为一种习惯,让自己的力扣主页能够如一片草地,生机昂然。 +现在算法训练营接近尾声了,我们马上也就要毕业了,算法训练营的学习要结束了,但是在算法学习道路上我们才刚刚开始,希望在以后的工作学习中,能够不忘初心,坚持学习,坚持刷题,让做题成为一种习惯,让自己的力扣主页能够如一片草地,生机昂然。 + +## 心得体会 +自从我开始学习算法以来就不乏言之无用者,我是一名iOS开发者,现在就职于一家租车公司,负责iOS客户APP的开发,平时工作对数据结构和算法使用不多。现如今大多数人做什么事情必定是有其明确的目的,在眼前看不到收益的情况下很难坚持做一件事情,尤其是一件没那么简单的事情。拿到大厂offer成为了大多数人学习算法的最初驱动力,当然这无可厚非,就像高中的时候我们努力学习就是为了考上心仪的大学一样。 + +我也希望能到大厂工作,但是这并不是学习的最终目的,《论语》有言, +> 子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?” + +让学习成为一种习惯,“学而时习之”,这才是学习的真谛。 + + +算法是计算机基础知识,类比于武侠小说,数据结构和算法就像是基本功法,也是后续学习高级功法的基础,一座楼的高度是由地基决定的,一个人的高度就是由基本功决定的。 + +参加算法训练营,有良师指导,助教解惑,还有优秀的同学一起进步,更有班主任的时刻督促,这十周的学习真可谓是受益匪浅,感谢有你们的陪伴。 + + From 97ed34bb1fa86fe2e52be645d7b47338c7209fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Sun, 7 Feb 2021 10:56:03 +0800 Subject: [PATCH 50/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=AF=95=E4=B8=9A?= =?UTF-8?q?=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" index 207b224d..4cda3b09 100644 --- "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" +++ "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" @@ -1,20 +1,20 @@ # 毕业总结 ## 初衷 -我是一名非计算机专业毕业的iOS开发工程师,深知自身基础知识的薄弱,遂开始学习数据结构和算法,身边的同事有的鼓励我,也有的说学习算法平时工作用不上,但是数据结构和算法是一门计算机基础课程,精通算法是每一名优秀开发者的基本素养,我想成为一名合格的开发者,我要学习算法。 +我是一名非计算机专业毕业的开发者,深知自身基础知识的薄弱,遂开始学习数据结构和算法,身边的同事有的鼓励我,也有的说学习算法平时工作用不上,但是数据结构和算法是一门计算机基础课程,精通算法是每一名优秀开发者的基本素养,我想成为一名合格的开发者,我要学习算法。 -## 学习 +## 学习的困惑 开始自学时买了书《大话数据结构》,也用微信读书看电子书《算法图解》,但是在学习的过程中总是很难坚持下去,最终的结果就是过了几个月依然停留在几种简单的数据结构学习,无法继续下去,自己的信心也受到了很大的打击。 -在这种情况下,我能怎么改变现状呢,我一度陷入了迷茫,因为平时有用极客时间学习iOS课程,2020年11月30号的晚上,在看了超哥的直播后,又刚好赶上算法训练营开班招生,便毅然决然的报名了。 +在这种情况下,我能怎么改变现状呢,一度陷入了迷茫,因为平时有用极客时间学习iOS课程,2020年11月30号的晚上,在看了超哥的直播后,又刚好赶上算法训练营开班招生,便毅然决然的报名了。 ## 开始 开始还有些害怕自己跟不上大家的节奏,但是经过了几周的学习后,发现自己的担心是多余的,自己在不断的学习中有了很大的进步,算法训练营的学习既系统又高效,覃超老师不光教会我们各种算法知识,还教会我们学习方法,就像指路的明灯,让我们在学习中克服眼前的困难,披荆斩棘,不断前行。 ## 结束并不是终点 -现在算法训练营接近尾声了,我们马上也就要毕业了,算法训练营的学习要结束了,但是在算法学习道路上我们才刚刚开始,希望在以后的工作学习中,能够不忘初心,坚持学习,坚持刷题,让做题成为一种习惯,让自己的力扣主页能够如一片草地,生机昂然。 +现在算法训练营接近尾声了,我们马上也就要毕业了,算法训练营毕业了,但是在算法的学习才刚刚开始,希望在以后的工作学习中,能够不忘初心,坚持学习,坚持刷题,让做题成为一种习惯,让算法在脑海中根深蒂固。 ## 心得体会 -自从我开始学习算法以来就不乏言之无用者,我是一名iOS开发者,现在就职于一家租车公司,负责iOS客户APP的开发,平时工作对数据结构和算法使用不多。现如今大多数人做什么事情必定是有其明确的目的,在眼前看不到收益的情况下很难坚持做一件事情,尤其是一件没那么简单的事情。拿到大厂offer成为了大多数人学习算法的最初驱动力,当然这无可厚非,就像高中的时候我们努力学习就是为了考上心仪的大学一样。 +自从我开始学习算法以来就不乏言之无用者,我是一名iOS开发者,现在就职于一家租车公司,负责iOS客户APP的开发,平时工作对数据结构和算法使用不多。现如今大多数人做什么事情必定是有其明确的目的,在眼前看不到收益的情况下很难坚持做一件事情,更何况学习算法并不是一件简单的事情。在这种情况下,拿到大厂offer成为了大多数人学习算法的最初驱动力,当然这无可厚非,就像高中的时候我们努力学习就是为了考上心仪的大学一样。 我也希望能到大厂工作,但是这并不是学习的最终目的,《论语》有言, > 子曰:“学而时习之,不亦说乎?有朋自远方来,不亦乐乎?人不知而不愠,不亦君子乎?” @@ -22,7 +22,7 @@ 让学习成为一种习惯,“学而时习之”,这才是学习的真谛。 -算法是计算机基础知识,类比于武侠小说,数据结构和算法就像是基本功法,也是后续学习高级功法的基础,一座楼的高度是由地基决定的,一个人的高度就是由基本功决定的。 +算法是计算机基础知识,类比于武侠小说,数据结构和算法就像是基本功法,也是后续学习高级功法的基础,一座楼的高度是由地基决定的,一个人的高度就是由基本功决定的,学习算法意义重大。 参加算法训练营,有良师指导,助教解惑,还有优秀的同学一起进步,更有班主任的时刻督促,这十周的学习真可谓是受益匪浅,感谢有你们的陪伴。 From ef465019ab375ab714f323f96400a1a45a9b4854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=86=AC=E6=AD=A6?= Date: Sun, 7 Feb 2021 10:57:13 +0800 Subject: [PATCH 51/51] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=AF=95=E4=B8=9A?= =?UTF-8?q?=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" index 4cda3b09..8616b97d 100644 --- "a/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" +++ "b/Week_\346\257\225\344\270\232\346\200\273\347\273\223/README.md" @@ -3,7 +3,7 @@ ## 初衷 我是一名非计算机专业毕业的开发者,深知自身基础知识的薄弱,遂开始学习数据结构和算法,身边的同事有的鼓励我,也有的说学习算法平时工作用不上,但是数据结构和算法是一门计算机基础课程,精通算法是每一名优秀开发者的基本素养,我想成为一名合格的开发者,我要学习算法。 -## 学习的困惑 +## 困惑 开始自学时买了书《大话数据结构》,也用微信读书看电子书《算法图解》,但是在学习的过程中总是很难坚持下去,最终的结果就是过了几个月依然停留在几种简单的数据结构学习,无法继续下去,自己的信心也受到了很大的打击。 在这种情况下,我能怎么改变现状呢,一度陷入了迷茫,因为平时有用极客时间学习iOS课程,2020年11月30号的晚上,在看了超哥的直播后,又刚好赶上算法训练营开班招生,便毅然决然的报名了。