From 2170b8b33f72eed5e09d95880025b1868294064f Mon Sep 17 00:00:00 2001 From: zhangzc Date: Mon, 25 Oct 2021 11:34:54 +0800 Subject: [PATCH] add exercises --- .../desc.html" | 1 + .../solution.cpp" | 23 ++++ .../desc.html" | 1 + .../solution.cpp" | 18 +++ .../desc.html" | 69 ++++++++++ .../solution.cpp" | 39 ++++++ .../desc.html" | 69 ++++++++++ .../solution.cpp" | 38 ++++++ .../desc.html" | 1 + .../solution.cpp" | 38 ++++++ .../desc.html" | 1 + .../solution.cpp" | 57 +++++++++ .../desc.html" | 1 + .../solution.cpp" | 49 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 52 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 41 ++++++ .../desc.html" | 1 + .../solution.cpp" | 27 ++++ .../desc.html" | 1 + .../solution.cpp" | 35 ++++++ .../desc.html" | 1 + .../solution.cpp" | 50 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 31 +++++ .../desc.html" | 1 + .../solution.cpp" | 35 ++++++ .../desc.html" | 1 + .../solution.cpp" | 43 +++++++ .../desc.html" | 1 + .../solution.cpp" | 29 +++++ .../desc.html" | 1 + .../solution.cpp" | 37 ++++++ .../desc.html" | 54 ++++++++ .../solution.cpp" | 22 ++++ .../desc.html" | 56 +++++++++ .../solution.cpp" | 18 +++ .../desc.html" | 23 ++++ .../solution.cpp" | 10 ++ .../desc.html" | 1 + .../solution.cpp" | 45 +++++++ .../desc.html" | 8 ++ .../solution.cpp" | 37 ++++++ .../desc.html" | 2 + .../solution.cpp" | 14 +++ .../desc.html" | 1 + .../solution.cpp" | 28 +++++ .../desc.html" | 1 + .../solution.cpp" | 39 ++++++ .../desc.html" | 26 ++++ .../solution.cpp" | 42 +++++++ .../desc.html" | 21 ++++ .../solution.cpp" | 64 ++++++++++ .../desc.html" | 1 + .../solution.cpp" | 24 ++++ .../desc.html" | 48 +++++++ .../solution.cpp" | 65 ++++++++++ .../desc.html" | 51 ++++++++ .../solution.cpp" | 75 +++++++++++ .../desc.html" | 65 ++++++++++ .../solution.cpp" | 71 +++++++++++ .../desc.html" | 20 +++ .../solution.cpp" | 34 +++++ .../desc.html" | 12 ++ .../solution.cpp" | 40 ++++++ .../desc.html" | 1 + .../solution.cpp" | 35 ++++++ .../desc.html" | 1 + .../solution.cpp" | 33 +++++ .../desc.html" | 1 + .../solution.cpp" | 40 ++++++ .../desc.html" | 1 + .../solution.cpp" | 30 +++++ .../desc.html" | 1 + .../solution.cpp" | 50 ++++++++ .../desc.html" | 7 ++ .../solution.cpp" | 23 ++++ .../desc.html" | 1 + .../solution.cpp" | 36 ++++++ .../desc.html" | 1 + .../solution.cpp" | 41 ++++++ .../desc.html" | 1 + .../solution.cpp" | 22 ++++ .../desc.html" | 8 ++ .../solution.cpp" | 31 +++++ .../1.leetcode/49_Pow(x, n)/desc.html" | 1 + .../1.leetcode/49_Pow(x, n)/solution.cpp" | 35 ++++++ .../desc.html" | 1 + .../solution.cpp" | 44 +++++++ .../50_N \347\232\207\345\220\216/desc.html" | 1 + .../solution.cpp" | 46 +++++++ .../desc.html" | 34 +++++ .../solution.cpp" | 43 +++++++ .../desc.html" | 1 + .../solution.cpp" | 23 ++++ .../desc.html" | 1 + .../solution.cpp" | 54 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 31 +++++ .../desc.html" | 1 + .../solution.cpp" | 71 +++++++++++ .../desc.html" | 23 ++++ .../solution.cpp" | 73 +++++++++++ .../desc.html" | 1 + .../solution.cpp" | 29 +++++ .../desc.html" | 1 + .../solution.cpp" | 53 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 47 +++++++ .../desc.html" | 50 ++++++++ .../solution.cpp" | 44 +++++++ .../desc.html" | 1 + .../solution.cpp" | 45 +++++++ .../desc.html" | 19 +++ .../solution.cpp" | 33 +++++ .../desc.html" | 23 ++++ .../solution.cpp" | 82 ++++++++++++ .../desc.html" | 1 + .../solution.cpp" | 56 +++++++++ .../desc.html" | 1 + .../solution.cpp" | 49 ++++++++ .../65_\345\212\240\344\270\200/desc.html" | 1 + .../65_\345\212\240\344\270\200/solution.cpp" | 23 ++++ .../desc.html" | 1 + .../solution.cpp" | 101 +++++++++++++++ .../desc.html" | 63 ++++++++++ .../solution.cpp" | 118 ++++++++++++++++++ .../desc.html" | 7 ++ .../solution.cpp" | 35 ++++++ .../desc.html" | 1 + .../solution.cpp" | 19 +++ .../desc.html" | 1 + .../solution.cpp" | 14 +++ .../desc.html" | 1 + .../solution.cpp" | 93 ++++++++++++++ .../desc.html" | 1 + .../solution.cpp" | 36 ++++++ .../desc.html" | 1 + .../solution.cpp" | 51 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 91 ++++++++++++++ .../desc.html" | 1 + .../solution.cpp" | 39 ++++++ .../desc.html" | 1 + .../solution.cpp" | 37 ++++++ .../76_\347\273\204\345\220\210/desc.html" | 3 + .../76_\347\273\204\345\220\210/solution.cpp" | 30 +++++ .../77_\345\255\220\351\233\206/desc.html" | 1 + .../77_\345\255\220\351\233\206/solution.cpp" | 24 ++++ .../desc.html" | 1 + .../solution.cpp" | 68 ++++++++++ .../desc.html" | 28 +++++ .../solution.cpp" | 44 +++++++ .../desc.html" | 109 ++++++++++++++++ .../solution.cpp" | 41 ++++++ .../desc.html" | 30 +++++ .../solution.cpp" | 57 +++++++++ .../desc.html" | 1 + .../solution.cpp" | 63 ++++++++++ .../desc.html" | 1 + .../solution.cpp" | 34 +++++ .../desc.html" | 1 + .../solution.cpp" | 42 +++++++ .../desc.html" | 1 + .../solution.cpp" | 73 +++++++++++ .../desc.html" | 1 + .../solution.cpp" | 76 +++++++++++ .../desc.html" | 59 +++++++++ .../solution.cpp" | 63 ++++++++++ .../desc.html" | 1 + .../solution.cpp" | 27 ++++ .../desc.html" | 8 ++ .../solution.cpp" | 33 +++++ .../89_\345\255\220\351\233\206 II/desc.html" | 1 + .../solution.cpp" | 30 +++++ .../desc.html" | 1 + .../solution.cpp" | 14 +++ .../desc.html" | 27 ++++ .../solution.cpp" | 36 ++++++ .../desc.html" | 1 + .../solution.cpp" | 56 +++++++++ .../desc.html" | 1 + .../solution.cpp" | 87 +++++++++++++ .../desc.html" | 1 + .../solution.cpp" | 38 ++++++ .../desc.html" | 32 +++++ .../solution.cpp" | 107 ++++++++++++++++ .../desc.html" | 27 ++++ .../solution.cpp" | 19 +++ .../desc.html" | 1 + .../solution.cpp" | 50 ++++++++ .../desc.html" | 35 ++++++ .../solution.cpp" | 42 +++++++ .../desc.html" | 1 + .../solution.cpp" | 49 ++++++++ .../desc.html" | 1 + .../solution.cpp" | 31 +++++ .../desc.html" | 1 + .../solution.cpp" | 14 +++ leetcode_helper.py | 30 +++++ 201 files changed, 5587 insertions(+) create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/solution.cpp" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/desc.html" create mode 100644 "data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/solution.cpp" create mode 100644 leetcode_helper.py diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/desc.html" new file mode 100644 index 000000000..9b33e3441 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/desc.html" @@ -0,0 +1 @@ +

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

 

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:
[0,1]
解释:
因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:
[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:
[0,1]

 

提示:

\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/solution.cpp" new file mode 100644 index 000000000..d2e19472a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/0_\344\270\244\346\225\260\344\271\213\345\222\214/solution.cpp" @@ -0,0 +1,23 @@ +#include +class Solution +{ +public: + vector twoSum(vector &nums, int target) + { + std::unordered_map hset; + vector r; + for (int i = 0; i < nums.size(); ++i) + { + int c = target - nums[i]; + auto iter = hset.find(c); + if (iter != hset.end() && iter->second != i) + { + r.push_back(i); + r.push_back(iter->second); + return r; + } + hset.insert(std::make_pair(nums[i], i)); + } + return r; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/desc.html" new file mode 100644 index 000000000..a2b525f95 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/desc.html" @@ -0,0 +1 @@ +

给你 n 个非负整数 a1,a2,...,an每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai)(i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

 

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:
49
解释:
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:
1

示例 3:

输入:height = [4,3,2,1,4]
输出:
16

示例 4:

输入:height = [1,2,1]
输出:
2

 

提示:

  • n = height.length
  • 2 <= n <= 3 * 104
  • 0 <= height[i] <= 3 * 104
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/solution.cpp" new file mode 100644 index 000000000..464c78156 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/10_\347\233\233\346\234\200\345\244\232\346\260\264\347\232\204\345\256\271\345\231\250/solution.cpp" @@ -0,0 +1,18 @@ +#define MAX(a, b) (((a) < (b)) ? (b) : (a)) +#define MIN(a, b) (((a) > (b)) ? (b) : (a)) +int maxArea(int *height, int heightSize) +{ + int max = 0; + int i = 0, j = heightSize - 1; + int a; + while (i < j) + { + a = MIN(height[i], height[j]) * (j - i); + max = MAX(max, a); + if (height[i] > height[j]) + --j; + else + ++i; + } + return max; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/desc.html" new file mode 100644 index 000000000..edfacd34c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/desc.html" @@ -0,0 +1,69 @@ +
+

罗马数字包含以下七种字符: I, V, X, LCD 和 M。 +

+ +
字符          数值
+I             1
+V             5
+X             10
+L             50
+C             100
+D             500
+M             1000
+ +

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 + 写做 XII ,即为 X + II 。 27 + 写做  XXVII, + 即为 XX + V + II 。

+ +

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 + 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

+ +
    +
  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • +
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 + 和 90。 
  • +
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 + 和 900。
  • +
+ +

给你一个整数,将其转为罗马数字。

+ +

 

+ +

示例 1:

+ +
输入: num = 3
+
输出:
"III"
+ +

示例 2:

+ +
输入: num = 4
+
输出:
"IV"
+ +

示例 3:

+ +
输入: num = 9
+
输出:
"IX"
+ +

示例 4:

+ +
输入: num = 58
+
输出:
"LVIII" +
解释:
L = 50, V = 5, III = 3. +
+ +

示例 5:

+ +
输入: num = 1994
+
输出:
"MCMXCIV" +
解释:
M = 1000, CM = 900, XC = 90, IV = 4.
+ +

 

+ +

提示:

+ +
    +
  • 1 <= num <= 3999
  • +
+
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/solution.cpp" new file mode 100644 index 000000000..e22752076 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/11_\346\225\264\346\225\260\350\275\254\347\275\227\351\251\254\346\225\260\345\255\227/solution.cpp" @@ -0,0 +1,39 @@ +struct rmap +{ + char *r; + int v; +} units[] = { + {"M", 1000}, + {"CM", 900}, + {"D", 500}, + {"CD", 400}, + {"C", 100}, + {"XC", 90}, + {"L", 50}, + {"XL", 40}, + {"X", 10}, + {"IX", 9}, + {"V", 5}, + {"IV", 4}, + {"I", 1}}; +#include +char result[64]; +char *intToRoman(int num) +{ + result[0] = 0; + int ri = 0; + int i = 0; + while (num) + { + if (num >= units[i].v) + { + strcat(result, units[i].r); + num -= units[i].v; + } + else + { + i++; + } + } + return result; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/desc.html" new file mode 100644 index 000000000..edfacd34c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/desc.html" @@ -0,0 +1,69 @@ +
+

罗马数字包含以下七种字符: I, V, X, LCD 和 M。 +

+ +
字符          数值
+I             1
+V             5
+X             10
+L             50
+C             100
+D             500
+M             1000
+ +

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 + 写做 XII ,即为 X + II 。 27 + 写做  XXVII, + 即为 XX + V + II 。

+ +

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 + 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

+ +
    +
  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • +
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 + 和 90。 
  • +
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 + 和 900。
  • +
+ +

给你一个整数,将其转为罗马数字。

+ +

 

+ +

示例 1:

+ +
输入: num = 3
+
输出:
"III"
+ +

示例 2:

+ +
输入: num = 4
+
输出:
"IV"
+ +

示例 3:

+ +
输入: num = 9
+
输出:
"IX"
+ +

示例 4:

+ +
输入: num = 58
+
输出:
"LVIII" +
解释:
L = 50, V = 5, III = 3. +
+ +

示例 5:

+ +
输入: num = 1994
+
输出:
"MCMXCIV" +
解释:
M = 1000, CM = 900, XC = 90, IV = 4.
+ +

 

+ +

提示:

+ +
    +
  • 1 <= num <= 3999
  • +
+
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/solution.cpp" new file mode 100644 index 000000000..92c086e0e --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/12_\347\275\227\351\251\254\346\225\260\345\255\227\350\275\254\346\225\264\346\225\260/solution.cpp" @@ -0,0 +1,38 @@ +struct rmap +{ + char *r; + int v; + int l; +} units[] = { + {"M", 1000, 1}, + {"CM", 900, 2}, + {"D", 500, 1}, + {"CD", 400, 2}, + {"C", 100, 1}, + {"XC", 90, 2}, + {"L", 50, 1}, + {"XL", 40, 2}, + {"X", 10, 1}, + {"IX", 9, 2}, + {"V", 5, 1}, + {"IV", 4, 2}, + {"I", 1, 1}}; +#include +int romanToInt(char *s) +{ + int len = strlen(s); + char *end = s + len; + int i = 0; + int r = 0; + while (i < 13) + { + if (end - s >= units[i].l && memcmp(s, units[i].r, units[i].l) == 0) + { + r += units[i].v; + s += units[i].l; + } + else + i++; + } + return r; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/desc.html" new file mode 100644 index 000000000..fdf06a6ae --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/desc.html" @@ -0,0 +1 @@ +

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

 

示例 1:

输入:strs = ["flower","flow","flight"]
输出:
"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:
""
解释:
输入不存在公共前缀。

 

提示:

  • 0 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/solution.cpp" new file mode 100644 index 000000000..8679fdabc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/13_\346\234\200\351\225\277\345\205\254\345\205\261\345\211\215\347\274\200/solution.cpp" @@ -0,0 +1,38 @@ +class Solution +{ +public: + string longestCommonPrefix(vector &strs) + { + string lcp; + if (strs.size() == 0) + return lcp; + int min_len = INT_MAX; + int min_idx = 0; + for (int i = 0; i < strs.size(); ++i) + { + auto &s = strs[i]; + if (s.size() < min_len) + { + min_len = s.size(); + min_idx = i; + } + } + auto &smin = strs[min_idx]; + for (int i = 0; i < min_len; ++i) + { + char c = smin[i]; + int j; + for (j = 0; j < strs.size(); ++j) + { + auto &cs = strs[j]; + if (c != cs[i]) + break; + } + if (j == strs.size()) + lcp += c; + else + break; + } + return lcp; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" new file mode 100644 index 000000000..80d11845a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" @@ -0,0 +1 @@ +

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

 

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:
[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:
[]

示例 3:

输入:nums = [0]
输出:
[]

 

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" new file mode 100644 index 000000000..3e52d8693 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/14_\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" @@ -0,0 +1,57 @@ +#include +#include +class Solution +{ +public: + vector> threeSum(vector &nums) + { + vector> r; + if (nums.size() == 0) + return r; + sort(nums.begin(), nums.end()); + int cur, left, right; + cur = 0; + while (cur < nums.size()) + { + if (nums[cur] > 0) + break; + left = cur + 1; + right = nums.size() - 1; + while (left < right) + { + int n = nums[cur] + nums[left] + nums[right]; + if (n == 0) + { + r.emplace_back(vector({nums[cur], nums[left], nums[right]})); + int t = left + 1; + while (t < right && nums[t] == nums[left]) + t++; + left = t; + t = right - 1; + while (t > left && nums[t] == nums[right]) + t--; + right = t; + } + else if (n > 0) + { + int t = right - 1; + while (t > left && nums[t] == nums[right]) + t--; + right = t; + } + else + { + int t = left + 1; + while (t < right && nums[t] == nums[left]) + t++; + left = t; + } + } + int t = cur + 1; + while (t < nums.size() && nums[t] == nums[cur]) + t++; + cur = t; + } + return r; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" new file mode 100644 index 000000000..0c6ad2141 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/desc.html" @@ -0,0 +1 @@ +

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

 

示例:

输入:nums = [-1,2,1,-4], target = 1
输出:
2
解释:
与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

 

提示:

  • 3 <= nums.length <= 10^3
  • -10^3 <= nums[i] <= 10^3
  • -10^4 <= target <= 10^4
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" new file mode 100644 index 000000000..d451fc893 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/15_\346\234\200\346\216\245\350\277\221\347\232\204\344\270\211\346\225\260\344\271\213\345\222\214/solution.cpp" @@ -0,0 +1,49 @@ +#include +class Solution +{ +public: + int threeSumClosest(vector &nums, int target) + { + sort(nums.begin(), nums.end()); + int cur, left, right; + cur = 0; + int closest = nums[0] + nums[1] + nums[2]; + while (cur < nums.size() - 2) + { + left = cur + 1; + right = nums.size() - 1; + int n; + while (left < right) + { + n = nums[cur] + nums[left] + nums[right]; + if (abs(target - n) < abs(target - closest)) + { + closest = n; + } + if (n == target) + { + break; + } + else if (n > target) + { + int t = right - 1; + while (t > left && nums[t] == nums[right]) + t--; + right = t; + } + else + { + int t = left + 1; + while (t < right && nums[t] == nums[left]) + t++; + left = t; + } + } + int t = cur + 1; + while (t < nums.size() && nums[t] == nums[cur]) + t++; + cur = t; + } + return closest; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/desc.html" new file mode 100644 index 000000000..30320d99d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/desc.html" @@ -0,0 +1 @@ +

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

 

示例 1:

输入:digits = "23"
输出:
["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:
[]

示例 3:

输入:digits = "2"
输出:
["a","b","c"]

 

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/solution.cpp" new file mode 100644 index 000000000..70290ddff --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/16_\347\224\265\350\257\235\345\217\267\347\240\201\347\232\204\345\255\227\346\257\215\347\273\204\345\220\210/solution.cpp" @@ -0,0 +1,52 @@ +class Solution +{ +public: + vector letterCombinations(string digits) + { + vector nummap({" ", + "", + "abc", + "def", + "ghi", + "jkl", + "mno", + "pqrs", + "tuv", + "wxyz"}); + vector rs; + vector empty; + if (digits.size() == 0) + return empty; + for (auto d : digits) + { + if (d == '0') + return empty; + if (d == '1') + return empty; + auto &s = nummap[d - '0']; + if (s.size() == 0) + continue; + if (rs.size() == 0) + for (auto c : s) + { + string t; + t.push_back(c); + rs.emplace_back(t); + } + else + { + vector rn; + for (auto c : s) + { + for (auto r : rs) + { + r.push_back(c); + rn.emplace_back(std::move(r)); + } + } + std::swap(rs, rn); + } + } + return rs; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/desc.html" new file mode 100644 index 000000000..2f103d45c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/desc.html" @@ -0,0 +1 @@ +

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:答案中不可以包含重复的四元组。

 

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:
[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [], target = 0
输出:
[]

 

提示:

  • 0 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/solution.cpp" new file mode 100644 index 000000000..21101b501 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/17_\345\233\233\346\225\260\344\271\213\345\222\214/solution.cpp" @@ -0,0 +1,41 @@ +class Solution +{ +public: + vector> fourSum(vector &nums, int target) + { + long long l_target = target; + sort(nums.begin(), nums.end()); + vector> results; + int N = nums.size(); + for (int i = 0; i < N - 3; i++) + { + if (i > 0 && nums[i] == nums[i - 1]) + continue; + for (int j = i + 1; j < N - 2; j++) + { + if (j > i + 1 && nums[j] == nums[j - 1]) + continue; + for (int k = j + 1, l = N - 1; k < l; k++) + { + if (k > j + 1 && nums[k] == nums[k - 1]) + continue; + while (k < l && + (l_target - nums[i] - nums[j] - nums[k] - nums[l]) < 0) + { + l--; + } + if (k >= l) + { + break; + } + if ((target - nums[i] - nums[j] - nums[k] - nums[l]) == 0) + { + results.emplace_back( + vector({nums[i], nums[j], nums[k], nums[l]})); + } + } + } + } + return results; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/desc.html" new file mode 100644 index 000000000..592dbba62 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/desc.html" @@ -0,0 +1 @@ +

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

 

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:
[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:
[]

示例 3:

输入:head = [1,2], n = 1
输出:
[1]

 

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/solution.cpp" new file mode 100644 index 000000000..798a985e8 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/18_\345\210\240\351\231\244\351\223\276\350\241\250\347\232\204\345\200\222\346\225\260\347\254\254 N \344\270\252\347\273\223\347\202\271/solution.cpp" @@ -0,0 +1,27 @@ +struct ListNode +{ + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +#include +class Solution +{ +public: + ListNode *removeNthFromEnd(ListNode *head, int n) + { + ListNode empty_node(0, head); + ListNode *p = &empty_node; + std::vector pv; + while (p != nullptr) + { + pv.push_back(p); + p = p->next; + } + p = pv[pv.size() - 1 - n]; + p->next = p->next->next; + return empty_node.next; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/desc.html" new file mode 100644 index 000000000..7effff2c9 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/desc.html" @@ -0,0 +1 @@ +

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

 

示例 1:

输入:s = "()"
输出:
true

示例 2:

输入:s = "()[]{}"
输出:
true

示例 3:

输入:s = "(]"
输出:
false

示例 4:

输入:s = "([)]"
输出:
false

示例 5:

输入:s = "{[]}"
输出:
true

 

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/solution.cpp" new file mode 100644 index 000000000..683c2e241 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/19_\346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/solution.cpp" @@ -0,0 +1,35 @@ +#include +char ascii_tab[128]; +class Solution +{ +public: + bool isValid(string s) + { + if (s.size() == 0) + return true; + std::stack st; + ascii_tab['('] = 11; + ascii_tab['{'] = 12; + ascii_tab['['] = 13; + ascii_tab[')'] = 21; + ascii_tab['}'] = 22; + ascii_tab[']'] = 23; + for (auto c : s) + { + char n = ascii_tab[c]; + if (n < 20) + st.push(n); + else + { + if (st.empty()) + return false; + if (n != st.top() + 10) + return false; + st.pop(); + } + } + if (st.empty()) + return true; + return false; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/desc.html" new file mode 100644 index 000000000..1d569f48f --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/desc.html" @@ -0,0 +1 @@ +

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

 

示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:
[7,0,8]
解释:
342 + 465 = 807.

示例 2:

输入:l1 = [0], l2 = [0]
输出:
[0]

示例 3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:
[8,9,9,9,0,0,0,1]

 

提示:

  • 每个链表中的节点数在范围 [1, 100]
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/solution.cpp" new file mode 100644 index 000000000..2c20725af --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/1_\344\270\244\346\225\260\347\233\270\345\212\240/solution.cpp" @@ -0,0 +1,50 @@ +struct ListNode +{ + int val; + struct ListNode *next; +}; +struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) +{ + struct ListNode *pp = NULL, *p = l1; + struct ListNode *qp = NULL, *q = l2; + int carry = 0; + while (p != NULL && q != NULL) + { + p->val += q->val + carry; + carry = 0; + if (p->val >= 10) + { + carry = 1; + p->val -= 10; + } + pp = p; + p = p->next; + qp = q; + q = q->next; + } + if (q) + { + pp->next = p = q; + qp->next = NULL; + } + while (carry && p) + { + p->val += carry; + carry = 0; + if (p->val >= 10) + { + carry = 1; + p->val -= 10; + } + pp = p; + p = p->next; + } + if (carry) + { + struct ListNode *n = (struct ListNode *)malloc(sizeof(struct ListNode)); + n->val = 1; + n->next = NULL; + pp->next = n; + } + return l1; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/desc.html" new file mode 100644 index 000000000..19853ee03 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/desc.html" @@ -0,0 +1 @@ +

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:
[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:
[]

示例 3:

输入:l1 = [], l2 = [0]
输出:
[0]

 

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/solution.cpp" new file mode 100644 index 000000000..8949d6d06 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/20_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/solution.cpp" @@ -0,0 +1,31 @@ +struct ListNode +{ + int val; + ListNode *next; + ListNode(int x) : val(x), next(NULL) {} +}; +class Solution +{ +public: + ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) + { + ListNode h(0, nullptr); + ListNode *p = &h; + while (l1 && l2) + { + ListNode **t; + if (l1->val < l2->val) + t = &l1; + else + t = &l2; + p->next = *t; + p = *t; + *t = (*t)->next; + } + if (l1) + p->next = l1; + else + p->next = l2; + return h.next; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/desc.html" new file mode 100644 index 000000000..9154f1ec1 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/desc.html" @@ -0,0 +1 @@ +

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

 

示例 1:

输入:n = 3
输出:
["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:
["()"]

 

提示:

  • 1 <= n <= 8
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/solution.cpp" new file mode 100644 index 000000000..75fa9a18b --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/21_\346\213\254\345\217\267\347\224\237\346\210\220/solution.cpp" @@ -0,0 +1,35 @@ +class Solution +{ +public: + void gen(string &p, int lc, int rc, vector &r, int n) + { + if (lc > n) + return; + if (lc == n && rc == n) + { + r.push_back(p); + return; + } + p.push_back('('); + lc++; + gen(p, lc, rc, r, n); + p.pop_back(); + lc--; + if (lc > rc) + { + p.push_back(')'); + rc++; + gen(p, lc, rc, r, n); + p.pop_back(); + rc--; + } + } + vector generateParenthesis(int n) + { + string p; + int lc = 0, rc = 0; + vector r; + gen(p, lc, rc, r, n); + return r; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/desc.html" new file mode 100644 index 000000000..72b205f62 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/desc.html" @@ -0,0 +1 @@ +

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

 

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:
[1,1,2,3,4,4,5,6]
解释:
链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:
[]

示例 3:

输入:lists = [[]]
输出:
[]

 

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i]升序 排列
  • lists[i].length 的总和不超过 10^4
\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/solution.cpp" new file mode 100644 index 000000000..77085215c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/22_\345\220\210\345\271\266K\344\270\252\345\215\207\345\272\217\351\223\276\350\241\250/solution.cpp" @@ -0,0 +1,43 @@ +#include +using namespace std; +struct ListNode +{ + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +class Solution +{ +public: + ListNode *mergeKLists(vector &lists) + { + auto cmp = [](struct ListNode *n1, struct ListNode *n2) + { + return n1->val > n2->val; + } priority_queue, decltype(cmp)> + queue(cmp); + for (int i = 0; i < lists.size(); i++) + { + if (lists[i] != nullptr) + { + queue.push(lists[i]); + } + } + struct ListNode dummy, *p = &dummy; + ; + while (!queue.empty()) + { + ListNode *node = queue.top(); + queue.pop(); + p->next = node; + p = node; + if (node->next != nullptr) + { + queue.push(node->next); + } + } + return dummy.next; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/desc.html" new file mode 100644 index 000000000..a1aeb81ca --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/desc.html" @@ -0,0 +1 @@ +

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

示例 1:

输入:head = [1,2,3,4]
输出:
[2,1,4,3]

示例 2:

输入:head = []
输出:
[]

示例 3:

输入:head = [1]
输出:
[1]

 

提示:

  • 链表中节点的数目在范围 [0, 100]
  • 0 <= Node.val <= 100

 

进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)

\ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/solution.cpp" new file mode 100644 index 000000000..4c3a37fbd --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/23_\344\270\244\344\270\244\344\272\244\346\215\242\351\223\276\350\241\250\344\270\255\347\232\204\350\212\202\347\202\271/solution.cpp" @@ -0,0 +1,29 @@ +#include +using namespace std; +struct ListNode +{ + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +class Solution +{ +public: + ListNode *swapPairs(ListNode *head) + { + struct ListNode dummy, *prev = &dummy, *p = head; + dummy.next = head; + while (p != nullptr && p->next != nullptr) + { + struct ListNode *q = p->next; + p->next = q->next; + q->next = prev->next; + prev->next = q; + prev = p; + p = p->next; + } + return dummy.next; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/desc.html" new file mode 100644 index 000000000..1454eed4b --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/desc.html" @@ -0,0 +1 @@ +

给你一个链表,每 个节点一组进行翻转,请你返回翻转后的链表。

是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 的整数倍,那么请将最后剩余的节点保持原有顺序。

进阶:

  • 你可以设计一个只使用常数额外空间的算法来解决此问题吗?
  • 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

 

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:
[2,1,4,3,5]

示例 2:

输入:head = [1,2,3,4,5], k = 3
输出:
[3,2,1,4,5]

示例 3:

输入:head = [1,2,3,4,5], k = 1
输出:
[1,2,3,4,5]

示例 4:

输入:head = [1], k = 1
输出:
[1]

    提示:

    • 列表中节点的数量在范围 sz
    • 1 <= sz <= 5000
    • 0 <= Node.val <= 1000
    • 1 <= k <= sz
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/solution.cpp" new file mode 100644 index 000000000..e3473727e --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/24_K \344\270\252\344\270\200\347\273\204\347\277\273\350\275\254\351\223\276\350\241\250/solution.cpp" @@ -0,0 +1,37 @@ +#include +using namespace std; +struct ListNode +{ + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +class Solution +{ +public: + ListNode *reverseGroup(ListNode *head, int k) + { + int len = 0; + struct ListNode dummy, *prev = &dummy; + dummy.next = head; + for (; head != nullptr; head = head->next) + { + if (++len % k == 0) + { + struct ListNode *p = prev->next; + while (prev->next != head) + { + struct ListNode *q = p->next; + p->next = q->next; + q->next = prev->next; + prev->next = q; + } + prev = p; + head = p; + } + } + return dummy.next; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/desc.html" new file mode 100644 index 000000000..cc96ba794 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/desc.html" @@ -0,0 +1,54 @@ +
    +

    给你一个有序数组 nums ,请你 + 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

    + +

    不要使用额外的数组空间,你必须在 原地 + 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    + +

     

    + +

    说明:

    + +

    为什么返回数值是整数,但输出的答案是数组呢?

    + +

    请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    + +

    你可以想象内部操作如下:

    + +
    // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
    +int len = removeDuplicates(nums);
    +
    +// 在函数里修改输入数组对于调用者是可见的。
    +// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
    +for (int i = 0; i < len; i++) {
    +    print(nums[i]);
    +}
    +
    +   + +

    示例 1:

    + +
    输入:nums = [1,1,2]
    +
    输出:
    2, nums = [1,2] +
    解释:
    函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。 +
    + +

    示例 2:

    + +
    输入:nums = [0,0,1,1,1,2,2,3,3,4]
    +
    输出:
    5, nums = [0,1,2,3,4] +
    解释:
    函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。 +
    + +

     

    + +

    提示:

    + +
      +
    • 0 <= nums.length <= 3 * 104
    • +
    • -104 <= nums[i] <= 104
    • +
    • nums 已按升序排列
    • +
    + +

     

    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/solution.cpp" new file mode 100644 index 000000000..27968c191 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/25_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/solution.cpp" @@ -0,0 +1,22 @@ +#include +using namespace std; +class Solution +{ +public: + int removeDuplicates(vector &nums) + { + if (nums.size() == 0) + { + return 0; + } + int count = 1; + for (int i = 1; i < nums.size(); i++) + { + if (nums[i - 1] != nums[i]) + { + nums[count++] = nums[i]; + } + } + return count; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/desc.html" new file mode 100644 index 000000000..9ef1c0eb3 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/desc.html" @@ -0,0 +1,56 @@ +
    +

    给你一个数组 nums 和一个值 val,你需要 原地 + 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

    + +

    不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

    + +

    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    + +

     

    + +

    说明:

    + +

    为什么返回数值是整数,但输出的答案是数组呢?

    + +

    请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    + +

    你可以想象内部操作如下:

    + +
    // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
    +int len = removeElement(nums, val);
    +
    +// 在函数里修改输入数组对于调用者是可见的。
    +// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
    +for (int i = 0; i < len; i++) {
    +    print(nums[i]);
    +}
    +
    + +

     

    + +

    示例 1:

    + +
    输入:nums = [3,2,2,3], val = 3
    +
    输出:
    2, nums = [2,2] +
    解释:
    函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。 +
    + +

    示例 2:

    + +
    输入:nums = [0,1,2,2,3,0,4,2], val = 2
    +
    输出:
    5, nums = [0,1,4,0,3] +
    解释:
    函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。 +
    + +

     

    + +

    提示:

    + +
      +
    • 0 <= nums.length <= 100
    • +
    • 0 <= nums[i] <= 50
    • +
    • 0 <= val <= 100
    • +
    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/solution.cpp" new file mode 100644 index 000000000..ad3675985 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/26_\347\247\273\351\231\244\345\205\203\347\264\240/solution.cpp" @@ -0,0 +1,18 @@ +#include +using namespace std; +class Solution +{ +public: + int removeElement(vector &nums, int val) + { + int count = 0; + for (int i = 0; i < nums.size(); i++) + { + if (nums[i] != val) + { + nums[count++] = nums[i]; + } + } + return count; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/desc.html" new file mode 100644 index 000000000..35b1fd2fd --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/desc.html" @@ -0,0 +1,23 @@ +

    实现 strStr() 函数。

    +

    给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle + 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1

    +

     

    +

    说明:

    +

    当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

    +

    对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

    +

     

    +

    示例 1:

    +
    输入:haystack = "hello", needle = "ll"
    输出:
    2
    +

    示例 2:

    +
    输入:haystack = "aaaaa", needle = "bba"
    输出:
    -1
    +

    示例 3:

    +
    输入:haystack = "", needle = ""
    输出:
    0
    +

     

    +

    提示:

    +
      +
    • 0 <= haystack.length, needle.length <= 5 * 104
    • +
    • haystackneedle 仅由小写英文字符组成
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/solution.cpp" new file mode 100644 index 000000000..5b3194f38 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/27_\345\256\236\347\216\260 strStr()/solution.cpp" @@ -0,0 +1,10 @@ +#include +using namespace std; +class Solution +{ +public: + int strStr(string haystack, string needle) + { + return haystack.find(needle); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/desc.html" new file mode 100644 index 000000000..73097ca31 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/desc.html" @@ -0,0 +1 @@ +

    给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

    返回被除数 dividend 除以除数 divisor 得到的商。

    整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

     

    示例 1:

    输入: dividend = 10, divisor = 3
    输出:
    3
    解释:
    10/3 = truncate(3.33333..) = truncate(3) = 3

    示例 2:

    输入: dividend = 7, divisor = -3
    输出:
    -2
    解释:
    7/-3 = truncate(-2.33333..) = -2

     

    提示:

    • 被除数和除数均为 32 位有符号整数。
    • 除数不为 0。
    • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/solution.cpp" new file mode 100644 index 000000000..58c76f5af --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/28_\344\270\244\346\225\260\347\233\270\351\231\244/solution.cpp" @@ -0,0 +1,45 @@ +#include +using namespace std; +class Solution +{ +public: + int divide(int dividend, int divisor) + { + int signal = 1; + unsigned int dvd = dividend; + if (dividend < 0) + { + signal *= -1; + dvd = ~dvd + 1; + } + unsigned int dvs = divisor; + if (divisor < 0) + { + signal *= -1; + dvs = ~dvs + 1; + } + int shift = 0; + while (dvd > dvs << shift) + { + shift++; + } + unsigned int res = 0; + while (dvd >= dvs) + { + while (dvd < dvs << shift) + { + shift--; + } + res |= (unsigned int)1 << shift; + dvd -= dvs << shift; + } + if (signal == 1 && res >= INT_MAX) + { + return INT_MAX; + } + else + { + return res * signal; + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/desc.html" new file mode 100644 index 000000000..00126986d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/desc.html" @@ -0,0 +1,8 @@ +

    给定一个字符串 和一些长度相同的单词 words。找出 s + 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

    +

    注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

    +

     

    +

    示例 1:

    +
    输入:  s = "barfoothefoobarman",  words = ["foo","bar"]
    输出:
    [0,9]
    解释:
    从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。输出的顺序不重要, [9,0] 也是有效答案。
    +

    示例 2:

    +
    输入:  s = "wordgoodgoodgoodbestword",  words = ["word","good","best","word"]
    输出:
    []
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/solution.cpp" new file mode 100644 index 000000000..6e78066c3 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/29_\344\270\262\350\201\224\346\211\200\346\234\211\345\215\225\350\257\215\347\232\204\345\255\220\344\270\262/solution.cpp" @@ -0,0 +1,37 @@ +#include +using namespace std; +class Solution +{ +public: + vector findSubstring(string s, vector &words) + { + vector res; + if (s.empty() || words.empty()) + { + return res; + } + unordered_map ht; + for (const auto &w : words) + { + ht[w]++; + } + int len = words[0].length(); + for (int i = 0, j = 0; i < s.length() - words.size() * len + 1; i++) + { + unordered_map counting; + for (j = 0; j < words.size(); j++) + { + string word = s.substr(i + j * len, len); + if (++counting[word] > ht[word]) + { + break; + } + } + if (j == words.size()) + { + res.push_back(i); + } + } + return res; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/desc.html" new file mode 100644 index 000000000..fafff153d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/desc.html" @@ -0,0 +1,2 @@ +

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

     

    示例 1:

    输入: s = "abcabcbb"
    输出:
    3
    解释:
    因为无重复字符的最长子串是 "abc",所以其长度为 3。

    示例 2:

    输入: s = "bbbbb"
    输出:
    1
    解释:
    因为无重复字符的最长子串是 "b",所以其长度为 1。

    示例 3:

    输入: s = "pwwkew"
    输出:
    3
    解释:
    因为无重复字符的最长子串是 "wke",所以其长度为 3。  +请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

    示例 4:

    输入: s = ""
    输出:
    0

     

    提示:

    • 0 <= s.length <= 5 * 104
    • s 由英文字母、数字、符号和空格组成
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/solution.cpp" new file mode 100644 index 000000000..ad1c8817d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/2_\346\227\240\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\346\234\200\351\225\277\345\255\220\344\270\262/solution.cpp" @@ -0,0 +1,14 @@ +int hset[128]; +int lengthOfLongestSubstring(char *s) +{ + int i = 0, j = 0; + int m = 0; + memset(hset, 0, sizeof hset); + for (; s[j]; j++) + { + i = hset[s[j]] > i ? hset[s[j]] : i; + m = m > j - i + 1 ? m : j - i + 1; + hset[s[j]] = j + 1; + } + return m; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/desc.html" new file mode 100644 index 000000000..0aeb4f2ed --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/desc.html" @@ -0,0 +1 @@ +

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

    必须 原地 修改,只允许使用额外常数空间。

     

    示例 1:

    输入:nums = [1,2,3]
    输出:
    [1,3,2]

    示例 2:

    输入:nums = [3,2,1]
    输出:
    [1,2,3]

    示例 3:

    输入:nums = [1,1,5]
    输出:
    [1,5,1]

    示例 4:

    输入:nums = [1]
    输出:
    [1]

     

    提示:

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 100
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/solution.cpp" new file mode 100644 index 000000000..15e4537a5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/30_\344\270\213\344\270\200\344\270\252\346\216\222\345\210\227/solution.cpp" @@ -0,0 +1,28 @@ +#include +using namespace std; +class Solution +{ +public: + void nextPermutation(vector &nums) + { + if (nums.size() < 2) + { + return; + } + int i = nums.size() - 2; + while (i >= 0 && nums[i] >= nums[i + 1]) + { + i--; + } + if (i >= 0) + { + int j = nums.size() - 1; + while (j >= 0 && nums[j] >= nums[i]) + { + j--; + } + swap(nums.begin() + i, nums.begin() + j); + } + reverse(nums.begin() + i + 1, nums.end()); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/desc.html" new file mode 100644 index 000000000..8b1ef148f --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/desc.html" @@ -0,0 +1 @@ +

    给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

     

    示例 1:

    输入:s = "(()"
    输出:
    2
    解释:
    最长有效括号子串是 "()"

    示例 2:

    输入:s = ")()())"
    输出:
    4
    解释:
    最长有效括号子串是 "()()"

    示例 3:

    输入:s = ""
    输出:
    0

     

    提示:

    • 0 <= s.length <= 3 * 104
    • s[i]'('')'
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/solution.cpp" new file mode 100644 index 000000000..c29a31241 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/31_\346\234\200\351\225\277\346\234\211\346\225\210\346\213\254\345\217\267/solution.cpp" @@ -0,0 +1,39 @@ +#include +using namespace std; +class Solution +{ +public: + int longestValidParentheses(string s) + { + stack stk; + int invalid = -1; + int len = 0, max_len = 0; + for (int i = 0; i < s.length(); i++) + { + if (s[i] == '(') + { + stk.push(i); + } + else + { + if (stk.empty()) + { + invalid = i; + } + else + { + stk.pop(); + if (stk.empty()) + { + max_len = max(i - invalid, max_len); + } + else + { + max_len = max(i - stk.top(), max_len); + } + } + } + } + return max_len; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/desc.html" new file mode 100644 index 000000000..8031a5ccc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/desc.html" @@ -0,0 +1,26 @@ +

    整数数组 nums 按升序排列,数组中的值 互不相同

    +

    在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转,使数组变为 + [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 + 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 +

    +

    给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 + target ,则返回它的下标,否则返回 -1 。 +

    +

     

    +

    示例 1:

    +
    输入:nums = [4,5,6,7,0,1,2], target = 0
    输出:
    4
    +

    示例 2:

    +
    输入:nums = [4,5,6,7,0,1,2], target = 3
    输出:
    -1
    +

    示例 3:

    +
    输入:nums = [1], target = 0
    输出:
    -1
    +

     

    +

    提示:

    +
      +
    • 1 <= nums.length <= 5000
    • +
    • -10^4 <= nums[i] <= 10^4
    • +
    • nums 中的每个值都 独一无二
    • +
    • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
    • +
    • -10^4 <= target <= 10^4
    • +
    +

     

    +

    进阶:你可以设计一个时间复杂度为 O(log n) 的解决方案吗?

    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/solution.cpp" new file mode 100644 index 000000000..16ffebbe3 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/32_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/solution.cpp" @@ -0,0 +1,42 @@ +#include +using namespace std; +class Solution +{ +public: + int search(vector &nums, int target) + { + int lo = 0; + int hi = nums.size() - 1; + for (lo <= hi) + { + int mid = lo + (hi - lo) / 2; + if (nums[mid] == target) + { + return mid; + } + if (nums[lo] <= nums[mid]) + { + if (nums[lo] <= target && target < nums[mid]) + { + hi = mid - 1; + } + else + { + lo = mid + 1; + } + } + else + { + if (nums[mid] < target && target <= nums[hi]) + { + lo = mid + 1; + } + else + { + hi = mid - 1; + } + } + } + return -1; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/desc.html" new file mode 100644 index 000000000..33108c1cc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/desc.html" @@ -0,0 +1,21 @@ +

    给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

    +

    如果数组中不存在目标值 target,返回 [-1, -1]

    +

    进阶:

    +
      +
    • 你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?
    • +
    +

     

    +

    示例 1:

    +
    输入:nums = [5,7,7,8,8,10], target = 8
    输出:
    [3,4]
    +

    示例 2:

    +
    输入:nums = [5,7,7,8,8,10], target = 6
    输出:
    [-1,-1]
    +

    示例 3:

    +
    输入:nums = [], target = 0
    输出:
    [-1,-1]
    +

     

    +

    提示:

    +
      +
    • 0 <= nums.length <= 105
    • +
    • -109 <= nums[i] <= 109
    • +
    • nums 是一个非递减数组
    • +
    • -109 <= target <= 109
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/solution.cpp" new file mode 100644 index 000000000..cfdec8d3c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/33_\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\346\237\245\346\211\276\345\205\203\347\264\240\347\232\204\347\254\254\344\270\200\344\270\252\345\222\214\346\234\200\345\220\216\344\270\200\344\270\252\344\275\215\347\275\256/solution.cpp" @@ -0,0 +1,64 @@ +#include +using namespace std; +class Solution +{ +public: + vector searchRange(vector &nums, int target) + { + vector res; + res.push_back(binary_search_begin(nums, target)); + res.push_back(binary_search_end(nums, target)); + return res; + } +private: + int binary_search_begin(vector nums, int target) + { + int lo = -1; + int hi = nums.size(); + while (lo + 1 < hi) + { + int mid = lo + (hi - lo) / 2; + if (target > nums[mid]) + { + lo = mid; + } + else + { + hi = mid; + } + } + if (hi == nums.size() || nums[hi] != target) + { + return -1; + } + else + { + return hi; + } + } + int binary_search_end(vector nums, int target) + { + int lo = -1; + int hi = nums.size(); + while (lo + 1 < hi) + { + int mid = lo + (hi - lo) / 2; + if (target < nums[mid]) + { + hi = mid; + } + else + { + lo = mid; + } + } + if (lo == -1 || nums[lo] != target) + { + return -1; + } + else + { + return lo; + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/desc.html" new file mode 100644 index 000000000..57bf58be5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/desc.html" @@ -0,0 +1 @@ +

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    你可以假设数组中无重复元素。

    示例 1:

    输入: [1,3,5,6], 5
    输出:
    2

    示例 2:

    输入: [1,3,5,6], 2
    输出:
    1

    示例 3:

    输入: [1,3,5,6], 7
    输出:
    4

    示例 4:

    输入: [1,3,5,6], 0
    输出:
    0
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/solution.cpp" new file mode 100644 index 000000000..a98e0be3d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/34_\346\220\234\347\264\242\346\217\222\345\205\245\344\275\215\347\275\256/solution.cpp" @@ -0,0 +1,24 @@ +#include +using namespace std; +class Solution +{ +public: + int searchInsert(vector &nums, int target) + { + int lo = -1; + int hi = nums.size(); + while (lo + 1 < hi) + { + int mid = lo + (hi - lo) / 2; + if (target > nums[mid]) + { + lo = mid; + } + else + { + hi = mid; + } + } + return hi; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/desc.html" new file mode 100644 index 000000000..7091d6a26 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/desc.html" @@ -0,0 +1,48 @@ +

    请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。

    +
      +
    1. 数字 1-9 在每一行只能出现一次。
    2. +
    3. 数字 1-9 在每一列只能出现一次。
    4. +
    5. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
    6. +
    +

    数独部分空格内已填入了数字,空白格用 '.' 表示。

    +

    注意:

    +
      +
    • 一个有效的数独(部分已被填充)不一定是可解的。
    • +
    • 只需要根据以上规则,验证已经填入的数字是否有效即可。
    • +
    +

     

    +

    示例 1:

    +
    输入:board = 
    +    [["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"]]
    +
    输出:
    true +
    +

    示例 2:

    +
    输入:board = 
    +    [["8","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"]]
    +
    输出:
    false +
    解释:
    除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。 但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
    +

     

    +

    提示:

    +
      +
    • board.length == 9
    • +
    • board[i].length == 9
    • +
    • board[i][j] 是一位数字或者 '.'
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/solution.cpp" new file mode 100644 index 000000000..987dfacbc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/35_\346\234\211\346\225\210\347\232\204\346\225\260\347\213\254/solution.cpp" @@ -0,0 +1,65 @@ +#include +using namespace std; +class Solution +{ +public: + bool isValidSudoku(vector> &board) + { + for (int i = 0; i < board.size(); i++) + { + vector mark(10); + for (int j = 0; j < board.size(); j++) + { + if (!valid(board, mark, i, j)) + { + return false; + } + } + } + for (int j = 0; j < board.size(); j++) + { + vector mark(10); + for (int i = 0; i < board.size(); i++) + { + if (!valid(board, mark, i, j)) + { + return false; + } + } + } + for (int k = 0; k < board.size(); k++) + { + int sr = k / 3 * 3; + int sc = (k % 3) * 3; + vector mark(10); + for (int i = sr; i < sr + 3; i++) + { + for (int j = sc; j < sc + 3; j++) + { + if (!valid(board, mark, i, j)) + { + return false; + } + } + } + } + return true; + } +private: + bool valid(vector> &board, vector &mark, int i, int j) + { + if (board[i][j] != '.') + { + int index = board[i][j] - '0'; + if (mark[index]) + { + return false; + } + else + { + mark[index] = 1; + } + } + return true; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/desc.html" new file mode 100644 index 000000000..a63fa6228 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/desc.html" @@ -0,0 +1,51 @@ +

    编写一个程序,通过填充空格来解决数独问题。

    +

    数独的解法需 遵循如下规则

    +
      +
    1. 数字 1-9 在每一行只能出现一次。
    2. +
    3. 数字 1-9 在每一列只能出现一次。
    4. +
    5. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
    6. +
    +

    数独部分空格内已填入了数字,空白格用 '.' 表示。

    +

     

    +
    +
    +
    +

    示例:

    +
    输入:board = 
    +    [["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"]]
    +
    输出:
    + [["5","3","4","6","7","8","9","1","2"], + ["6","7","2","1","9","5","3","4","8"], + ["1","9","8","3","4","2","5","6","7"], + ["8","5","9","7","6","1","4","2","3"], + ["4","2","6","8","5","3","7","9","1"], + ["7","1","3","9","2","4","8","5","6"], + ["9","6","1","5","3","7","2","8","4"], + ["2","8","7","4","1","9","6","3","5"], + ["3","4","5","2","8","6","1","7","9"]] +
    解释:
    输入的数独如上图所示,唯一有效的解决方案如下所示: +

     

    +
    + + +

     

    +

    提示:

    +
      +
    • board.length == 9
    • +
    • board[i].length == 9
    • +
    • board[i][j] 是一位数字或者 '.'
    • +
    • 题目数据 保证 输入数独仅有一个解
    • +
    +
    +
    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/solution.cpp" new file mode 100644 index 000000000..4d4cde6c4 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/36_\350\247\243\346\225\260\347\213\254/solution.cpp" @@ -0,0 +1,75 @@ +#include +using namespace std; +class Solution +{ +public: + void solveSudoku(vector> &board) + { + int size = board.size(); + vector> rows(size, vector(10)); + vector> cols(size, vector(10)); + vector> boxes(size, vector(10)); + for (int i = 0; i < size; i++) + { + for (int j = 0; j < size; j++) + { + if (board[i][j] != '.') + { + int num = board[i][j] - '0'; + int idx = i / 3 * 3 + j / 3; + rows[i][num] = true; + cols[j][num] = true; + boxes[idx][num] = true; + } + } + } + dfs(board, 0, rows, cols, boxes); + } +private: + bool valid(int num, int row, int col, int idx, vector> &rows, + vector> &cols, vector> &boxes) + { + return !rows[row][num] && !cols[col][num] && !boxes[idx][num]; + } + bool dfs(vector> &board, int size, vector> &rows, + vector> &cols, vector> &boxes) + { + if (size == 9 * 9) + { + return true; + } + else + { + bool ok = false; + int row = size / 9; + int col = size % 9; + int idx = row / 3 * 3 + col / 3; + if (board[row][col] == '.') + { + for (int i = 1; i <= 9; i++) + { + if (valid(i, row, col, idx, rows, cols, boxes)) + { + board[row][col] = i + '0'; + rows[row][i] = true; + cols[col][i] = true; + boxes[idx][i] = true; + ok = dfs(board, size + 1, rows, cols, boxes); + if (!ok) + { + rows[row][i] = false; + cols[col][i] = false; + boxes[idx][i] = false; + board[row][col] = '.'; + } + } + } + } + else + { + ok = dfs(board, size + 1, rows, cols, boxes); + } + return ok; + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/desc.html" new file mode 100644 index 000000000..1717104db --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/desc.html" @@ -0,0 +1,65 @@ +
    +

    给定一个正整数 n ,输出外观数列的第 n 项。

    + +

    「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

    + +

    你可以将其视作是由递归公式定义的数字字符串序列:

    + +
      +
    • countAndSay(1) = "1"
    • +
    • countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
    • +
    + +

    前五项如下:

    + +
    +    1.     1
    +    2.     11
    +    3.     21
    +    4.     1211
    +    5.     111221
    +    第一项是数字 1 
    +    描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
    +    描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
    +    描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
    +    描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
    +    
    + +

    描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 + 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

    + +

    例如,数字字符串 "3322251" 的描述如下图:

    + +
      +
    + +

     

    + +

    示例 1:

    + +
    输入:n = 1
    +
    输出:
    "1" +
    解释:
    这是一个基本样例。 +
    + +

    示例 2:

    + +
    输入:n = 4
    +
    输出:
    "1211" +
    解释:
    +countAndSay(1) = "1" +countAndSay(2) = 读 "1" = 一 个 1 = "11" +countAndSay(3) = 读 "11" = 二 个 1 = "21" +countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211" +
    + +

     

    + +

    提示:

    + +
      +
    • 1 <= n <= 30
    • +
    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/solution.cpp" new file mode 100644 index 000000000..036d53370 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/37_\345\244\226\350\247\202\346\225\260\345\210\227/solution.cpp" @@ -0,0 +1,71 @@ +#include +#include +#include +static void parse(char *input, char *output) +{ + char *p = input; + char *q = output; + while (*p != '\0') + { + int count = 1; + while (p[0] == p[1]) + { + count++; + p++; + } + int n = 0; + while (count > 0) + { + n += count % 10; + count /= 10; + } + while (n > 0) + { + *q++ = (n % 10) + '0'; + n /= 10; + } + *q++ = p[0]; + p++; + } + *q = '\0'; +} +static char *countAndSay(int n) +{ + if (n < 1) + { + return NULL; + } + char *result; + char *prev = malloc(10000); + char *next = malloc(10000); + strcpy(prev, "1"); + if (n == 1) + { + return prev; + } + int i; + for (i = 2; i <= n; i++) + { + if (i & 0x1) + { + parse(next, prev); + result = prev; + } + else + { + parse(prev, next); + result = next; + } + } + return result; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test n\n"); + exit(-1); + } + printf("%s\n", countAndSay(atoi(argv[1]))); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/desc.html" new file mode 100644 index 000000000..691ec0f52 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/desc.html" @@ -0,0 +1,20 @@ +

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 +

    +

    candidates 中的数字可以无限制重复被选取。

    +

    说明:

    +
      +
    • 所有数字(包括 target)都是正整数。
    • +
    • 解集不能包含重复的组合。 
    • +
    +

    示例 1:

    +
    输入:candidates = [2,3,6,7], target = 7,
    输出:
    [[7],[2,2,3]]
    +

    示例 2:

    +
    输入:candidates = [2,3,5], target = 8,
    输出:
    [[2,2,2,2],[2,3,3],[3,5]]
    +

     

    +

    提示:

    +
      +
    • 1 <= candidates.length <= 30
    • +
    • 1 <= candidates[i] <= 200
    • +
    • candidate 中的每个元素都是独一无二的。
    • +
    • 1 <= target <= 500
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/solution.cpp" new file mode 100644 index 000000000..7f066d421 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/38_\347\273\204\345\220\210\346\200\273\345\222\214/solution.cpp" @@ -0,0 +1,34 @@ +#include +using namespace std; +class Solution +{ +public: + vector> combinationSum(vector &candidates, int target) + { + vector> res; + dfs(candidates, 0, target, res); + return res; + } +private: + vector stack; + void dfs(vector &candidates, int start, int target, vector> &res) + { + if (target < 0) + { + return; + } + else if (target == 0) + { + res.push_back(stack); + } + else + { + for (int i = start; i < candidates.size(); i++) + { + stack.push_back(candidates[i]); + dfs(candidates, i, target - candidates[i], res); + stack.pop_back(); + } + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/desc.html" new file mode 100644 index 000000000..868079e12 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/desc.html" @@ -0,0 +1,12 @@ +

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 +

    +

    candidates 中的每个数字在每个组合中只能使用一次。

    +

    说明:

    +
      +
    • 所有数字(包括目标数)都是正整数。
    • +
    • 解集不能包含重复的组合。 
    • +
    +

    示例 1:

    +
    输入: candidates = [10,1,2,7,6,1,5], target = 8,
    所求解集为:
    [[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]
    +

    示例 2:

    +
    输入: candidates = [2,5,2,1,2], target = 5,
    所求解集为:
    [[1,2,2],[5]]
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/solution.cpp" new file mode 100644 index 000000000..5e4586464 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/39_\347\273\204\345\220\210\346\200\273\345\222\214 II/solution.cpp" @@ -0,0 +1,40 @@ +#include +using namespace std; +class Solution +{ +public: + vector> combinationSum2(vector &candidates, int target) + { + vector> res; + sort(candidates.begin(), candidates.end()); + dfs(candidates, 0, target, res); + return res; + } +private: + vector stack; + void dfs(vector &candidates, int start, int target, vector> &res) + { + if (target < 0) + { + return; + } + else if (target == 0) + { + res.push_back(stack); + } + else + { + int last = INT_MIN; + for (int i = start; i < candidates.size(); i++) + { + if (last != candidates[i]) + { + stack.push_back(candidates[i]); + dfs(candidates, i + 1, target - candidates[i], res); + stack.pop_back(); + } + last = candidates[i]; + } + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/desc.html" new file mode 100644 index 000000000..583e3f649 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/desc.html" @@ -0,0 +1 @@ +

    给定两个大小分别为 mn 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数

     

    示例 1:

    输入:nums1 = [1,3], nums2 = [2]
    输出:
    2.00000
    解释:
    合并数组 = [1,2,3] ,中位数 2

    示例 2:

    输入:nums1 = [1,2], nums2 = [3,4]
    输出:
    2.50000
    解释:
    合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

    示例 3:

    输入:nums1 = [0,0], nums2 = [0,0]
    输出:
    0.00000

    示例 4:

    输入:nums1 = [], nums2 = [1]
    输出:
    1.00000

    示例 5:

    输入:nums1 = [2], nums2 = []
    输出:
    2.00000

     

    提示:

    • nums1.length == m
    • nums2.length == n
    • 0 <= m <= 1000
    • 0 <= n <= 1000
    • 1 <= m + n <= 2000
    • -106 <= nums1[i], nums2[i] <= 106

     

    进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?

    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/solution.cpp" new file mode 100644 index 000000000..a1dc00653 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/3_\345\257\273\346\211\276\344\270\244\344\270\252\346\255\243\345\272\217\346\225\260\347\273\204\347\232\204\344\270\255\344\275\215\346\225\260/solution.cpp" @@ -0,0 +1,35 @@ +class Solution +{ +public: + double findMedianSortedArrays(vector &nums1, vector &nums2) + { + int nums1Size = nums1.size(); + int nums2Size = nums2.size(); + int na = nums1Size + nums2Size; + int *ns = (int *)malloc(4 * na); + int i = 0, j = 0, d = 0; + int m = na / 2 + 1; + while (d < m) + { + int n; + if (i < nums1Size && j < nums2Size) + { + n = (nums1[i] < nums2[j]) ? nums1[i++] : nums2[j++]; + } + else if (i < nums1Size) + { + n = nums1[i++]; + } + else if (j < nums2Size) + { + n = nums2[j++]; + } + ns[d++] = n; + } + if (na % 2) + { + return ns[d - 1]; + } + return (ns[d - 1] + ns[d - 2]) / 2.0; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/desc.html" new file mode 100644 index 000000000..7dafadcd6 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/desc.html" @@ -0,0 +1 @@ +

    给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

     

    进阶:你可以实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案吗?

     

    示例 1:

    输入:nums = [1,2,0]
    输出:
    3

    示例 2:

    输入:nums = [3,4,-1,1]
    输出:
    2

    示例 3:

    输入:nums = [7,8,9,11,12]
    输出:
    1

     

    提示:

    • 0 <= nums.length <= 300
    • -231 <= nums[i] <= 231 - 1
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/solution.cpp" new file mode 100644 index 000000000..5cdad3816 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/40_\347\274\272\345\244\261\347\232\204\347\254\254\344\270\200\344\270\252\346\255\243\346\225\260/solution.cpp" @@ -0,0 +1,33 @@ +#include +using namespace std; +class Solution +{ +public: + int firstMissingPositive(vector &nums) + { + if (nums.size() == 0) + { + return 1; + } + int i = 0; + while (i < nums.size()) + { + if (nums[i] > 0 && nums[i] != i + 1 && nums[i] - 1 < nums.size() && nums[nums[i] - 1] != nums[i]) + { + swap(nums[i], nums[nums[i] - 1]); + } + else + { + i++; + } + } + for (i = 0; i < nums.size(); i++) + { + if (nums[i] != i + 1) + { + break; + } + } + return i + 1; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/desc.html" new file mode 100644 index 000000000..3e62577c4 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/desc.html" @@ -0,0 +1 @@ +

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

     

    示例 1:

    输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
    输出:
    6
    解释:
    上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

    示例 2:

    输入:height = [4,2,0,3,2,5]
    输出:
    9

     

    提示:

    • n == height.length
    • 0 <= n <= 3 * 104
    • 0 <= height[i] <= 105
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/solution.cpp" new file mode 100644 index 000000000..922511f49 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/41_\346\216\245\351\233\250\346\260\264/solution.cpp" @@ -0,0 +1,40 @@ +#include +using namespace std; +class Solution +{ +public: + int trap(vector &height) + { + int res = 0; + int left = 0, left_max = 0; + int right = height.size() - 1, right_max = 0; + while (left < right) + { + if (height[left] < height[right]) + { + if (height[left] > left_max) + { + left_max = height[left]; + } + else + { + res += left_max - height[left]; + } + left++; + } + else + { + if (height[right] > right_max) + { + right_max = height[right]; + } + else + { + res += right_max - height[right]; + } + right--; + } + } + return res; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/desc.html" new file mode 100644 index 000000000..813171655 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/desc.html" @@ -0,0 +1 @@ +

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

    示例 1:

    输入: num1 = "2", num2 = "3"
    输出:
    "6"

    示例 2:

    输入: num1 = "123", num2 = "456"
    输出:
    "56088"

    说明:

    1. num1 和 num2 的长度小于110。
    2. num1 和 num2 只包含数字 0-9
    3. num1 和 num2 均不以零开头,除非是数字 0 本身。
    4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/solution.cpp" new file mode 100644 index 000000000..3d92a26be --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/42_\345\255\227\347\254\246\344\270\262\347\233\270\344\271\230/solution.cpp" @@ -0,0 +1,30 @@ +#include +using namespace std; +class Solution +{ +public: + string multiply(string num1, string num2) + { + string res(num1.length() + num2.length(), '0'); + for (int i = num2.length() - 1; i >= 0; i--) + { + int j, carry = 0; + for (j = num1.length() - 1; j >= 0; j--) + { + carry += (num1[j] - '0') * (num2[i] - '0') + (res[i + j + 1] - '0'); + res[i + j + 1] = carry % 10 + '0'; + carry /= 10; + } + res[i + j + 1] = carry + '0'; + } + int i; + for (i = 0; i < res.length() - 1; i++) + { + if (res[i] != '0') + { + break; + } + } + return res.substr(i); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/desc.html" new file mode 100644 index 000000000..c0f44e72e --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/desc.html" @@ -0,0 +1 @@ +

    给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。

    '?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。

    两个字符串完全匹配才算匹配成功。

    说明:

    • s 可能为空,且只包含从 a-z 的小写字母。
    • p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *

    示例 1:

    输入:s = "aa"p = "a"
    输出:
    false
    解释:
    "a" 无法匹配 "aa" 整个字符串。

    示例 2:

    输入:s = "aa"p = "*"
    输出:
    true
    解释:
     '*' 可以匹配任意字符串。

    示例 3:

    输入:s = "cb"p = "?a"
    输出:
    false
    解释:
     '?' 可以匹配 'c', 但第二个 'a' 无法匹配 'b'。

    示例 4:

    输入:s = "adceb"p = "*a*b"
    输出:
    true
    解释:
     第一个 '*' 可以匹配空字符串, 第二个 '*' 可以匹配字符串 "dce".

    示例 5:

    输入:s = "acdcb"p = "a*c?b"
    输出:
    false
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/solution.cpp" new file mode 100644 index 000000000..c02c2b975 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/43_\351\200\232\351\205\215\347\254\246\345\214\271\351\205\215/solution.cpp" @@ -0,0 +1,50 @@ +#include +#include +#include +#include +static bool isMatch(char *s, char *p) +{ + char *last_s = NULL; + char *last_p = NULL; + while (*s != '\0') + { + if (*p == '*') + { + if (*++p == '\0') + { + return true; + } + last_s = s; + last_p = p; + } + else if (*p == '?' || *s == *p) + { + s++; + p++; + } + else if (last_s != NULL) + { + p = last_p; + s = ++last_s; + } + else + { + return false; + } + } + while (*p == '*') + { + p++; + } + return *p == '\0'; +} +int main(int argc, char **argv) +{ + if (argc != 3) + { + fprintf(stderr, "Usage: ./test string pattern\n"); + exit(-1); + } + printf("%s\n", isMatch(argv[1], argv[2]) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/desc.html" new file mode 100644 index 000000000..033059c84 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/desc.html" @@ -0,0 +1,7 @@ +

    给定一个非负整数数组,你最初位于数组的第一个位置。

    +

    数组中的每个元素代表你在该位置可以跳跃的最大长度。

    +

    你的目标是使用最少的跳跃次数到达数组的最后一个位置。

    +

    示例:

    +
    输入: [2,3,1,1,4]
    输出:
    2
    解释:
    跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
    +

    说明:

    +

    假设你总是可以到达数组的最后一个位置。

    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/solution.cpp" new file mode 100644 index 000000000..1248a5382 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/44_\350\267\263\350\267\203\346\270\270\346\210\217 II/solution.cpp" @@ -0,0 +1,23 @@ +#include +using namespace std; +class Solution +{ +public: + int jump(vector &nums) + { + int steps = 0; + int lo = 0, hi = 0; + while (hi < nums.size() - 1) + { + int right = 0; + for (int i = lo; i <= hi; i++) + { + right = max(i + nums[i], right); + } + lo = hi + 1; + hi = right; + steps++; + } + return steps; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/desc.html" new file mode 100644 index 000000000..125d29fe1 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/desc.html" @@ -0,0 +1 @@ +

    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    示例:

    输入: [1,2,3]
    输出:
    [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/solution.cpp" new file mode 100644 index 000000000..bdc46606c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/45_\345\205\250\346\216\222\345\210\227/solution.cpp" @@ -0,0 +1,36 @@ +#include +using namespace std; +class Solution +{ +public: + vector> permute(vector &nums) + { + vector> res; + vector used(nums.size()); + dfs(nums, used, res); + return res; + } +private: + vector stack; + void dfs(vector &nums, vector &used, vector> &res) + { + if (stack.size() == nums.size()) + { + res.push_back(stack); + } + else + { + for (int i = 0; i < nums.size(); i++) + { + if (!used[i]) + { + used[i] = true; + stack.push_back(nums[i]); + dfs(nums, used, res); + stack.pop_back(); + used[i] = false; + } + } + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/desc.html" new file mode 100644 index 000000000..eaf0afc9c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/desc.html" @@ -0,0 +1 @@ +

    给定一个可包含重复数字的序列 nums按任意顺序 返回所有不重复的全排列。

     

    示例 1:

    输入:nums = [1,1,2]
    输出:
    [[1,1,2], [1,2,1], [2,1,1]]

    示例 2:

    输入:nums = [1,2,3]
    输出:
    [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

     

    提示:

    • 1 <= nums.length <= 8
    • -10 <= nums[i] <= 10
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/solution.cpp" new file mode 100644 index 000000000..5e96086b7 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/46_\345\205\250\346\216\222\345\210\227 II/solution.cpp" @@ -0,0 +1,41 @@ +#include +using namespace std; +class Solution +{ +public: + vector> permuteUnique(vector &nums) + { + vector> res; + vector used(nums.size()); + sort(nums.begin(), nums.end()); + dfs(nums, used, res); + return res; + } +private: + vector stack; + void dfs(vector &nums, vector &used, vector> &res) + { + if (stack.size() == nums.size()) + { + res.push_back(stack); + } + else + { + for (int i = 0; i < nums.size(); i++) + { + if (!used[i]) + { + if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) + { + continue; + } + stack.push_back(nums[i]); + used[i] = true; + dfs(nums, used, res); + stack.pop_back(); + used[i] = false; + } + } + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/desc.html" new file mode 100644 index 000000000..5792b68f1 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/desc.html" @@ -0,0 +1 @@ +

    给定一个 × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

    你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

     

    示例 1:

    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:
    [[7,4,1],[8,5,2],[9,6,3]]

    示例 2:

    输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
    输出:
    [[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

    示例 3:

    输入:matrix = [[1]]
    输出:
    [[1]]

    示例 4:

    输入:matrix = [[1,2],[3,4]]
    输出:
    [[3,1],[4,2]]

     

    提示:

    • matrix.length == n
    • matrix[i].length == n
    • 1 <= n <= 20
    • -1000 <= matrix[i][j] <= 1000
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/solution.cpp" new file mode 100644 index 000000000..567612da0 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/47_\346\227\213\350\275\254\345\233\276\345\203\217/solution.cpp" @@ -0,0 +1,22 @@ +#include +using namespace std; +class Solution +{ +public: + void rotate(vector> &matrix) + { + int size = matrix.size(); + for (int i = 0; i < size / 2; i++) + { + int low = i, high = size - i - 1; + for (int j = low; j < high; j++) + { + int tmp = matrix[i][j]; + matrix[i][j] = matrix[size - 1 - j][i]; + matrix[size - 1 - j][i] = matrix[size - 1 - i][size - 1 - j]; + matrix[size - 1 - i][size - 1 - j] = matrix[j][size - 1 - i]; + matrix[j][size - 1 - i] = tmp; + } + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/desc.html" new file mode 100644 index 000000000..64bcde129 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/desc.html" @@ -0,0 +1,8 @@ +

    给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

    +

    示例:

    +
    输入:[eat", "tea", "tan", "ate", "nat", "bat"]
    输出:
    [[ate","eat","tea"],["nat","tan"],["bat"]]
    +

    说明:

    +
      +
    • 所有输入均为小写字母。
    • +
    • 不考虑答案输出的顺序。
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/solution.cpp" new file mode 100644 index 000000000..055df48aa --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/48_\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/solution.cpp" @@ -0,0 +1,31 @@ +#include +using namespace std; +class Solution +{ +public: + vector> groupAnagrams(vector &strs) + { + vector> res; + unordered_map> ht; + for (const auto &str : strs) + { + int counts[26] = {0}; + for (char c : str) + { + counts[c - 'a']++; + } + string key; + for (int i : counts) + { + key.push_back('#'); + key.push_back(i + '0'); + } + ht[key].push_back(str); + } + for (const auto &t : ht) + { + res.push_back(t.second); + } + return res; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/desc.html" new file mode 100644 index 000000000..0d9e7a2ce --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/desc.html" @@ -0,0 +1 @@ +

    实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

     

    示例 1:

    输入:x = 2.00000, n = 10
    输出:
    1024.00000

    示例 2:

    输入:x = 2.10000, n = 3
    输出:
    9.26100

    示例 3:

    输入:x = 2.00000, n = -2
    输出:
    0.25000
    解释:
    2-2 = 1/22 = 1/4 = 0.25

     

    提示:

    • -100.0 < x < 100.0
    • -231 <= n <= 231-1
    • -104 <= xn <= 104
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/solution.cpp" new file mode 100644 index 000000000..0f9724280 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/49_Pow(x, n)/solution.cpp" @@ -0,0 +1,35 @@ +#include +using namespace std; +class Solution +{ +public: + double myPow(double x, int n) + { + if (n == INT_MIN) + { + double t = dfs(x, -(n / 2)); + return 1 / t * 1 / t; + } + else + { + return n < 0 ? 1 / dfs(x, -n) : dfs(x, n); + } + } +private: + double dfs(double x, int n) + { + if (n == 0) + { + return 1; + } + else if (n == 1) + { + return x; + } + else + { + double t = dfs(x, n / 2); + return (n % 2) ? (x * t * t) : (t * t); + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/desc.html" new file mode 100644 index 000000000..2b999715b --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/desc.html" @@ -0,0 +1 @@ +

    给你一个字符串 s,找到 s 中最长的回文子串。

     

    示例 1:

    输入:s = "babad"
    输出:
    "bab"
    解释:
    "aba" 同样是符合题意的答案。

    示例 2:

    输入:s = "cbbd"
    输出:
    "bb"

    示例 3:

    输入:s = "a"
    输出:
    "a"

    示例 4:

    输入:s = "ac"
    输出:
    "a"

     

    提示:

    • 1 <= s.length <= 1000
    • s 仅由数字和英文字母(大写和/或小写)组成
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/solution.cpp" new file mode 100644 index 000000000..6d931dbdc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/4_\346\234\200\351\225\277\345\233\236\346\226\207\345\255\220\344\270\262/solution.cpp" @@ -0,0 +1,44 @@ +class Solution +{ +public: + string longestPalindrome(string s) + { + int ti = 0, maxlen = 0, i, t; + for (i = 0; s[i]; i++) + { + t = 1; + while (t <= i && s[i + t]) + { + if (s[i + t] == s[i - t]) + t++; + else + break; + } + t--; + if (2 * t + 1 > maxlen) + { + ti = i - t; + maxlen = 2 * t + 1; + } + } + for (i = 0; s[i]; i++) + { + t = 1; + while (t <= i + 1 && s[i + t]) + { + if (s[i - t + 1] == s[i + t]) + t++; + else + break; + } + t--; + if (2 * t > maxlen) + { + ti = i - t + 1; + maxlen = 2 * t; + } + } + s[ti + maxlen] = 0; + return s.c_str() + ti; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/desc.html" new file mode 100644 index 000000000..b632b8363 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/desc.html" @@ -0,0 +1 @@ +

    n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

    每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q''.' 分别代表了皇后和空位。

     

    示例 1:

    输入:n = 4
    输出:
    [[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
    解释:
    如上图所示,4 皇后问题存在两个不同的解法。

    示例 2:

    输入:n = 1
    输出:
    [["Q"]]

     

    提示:

    • 1 <= n <= 9
    • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/solution.cpp" new file mode 100644 index 000000000..e4592d494 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/50_N \347\232\207\345\220\216/solution.cpp" @@ -0,0 +1,46 @@ +#include +using namespace std; +class Solution +{ +public: + vector> solveNQueens(int n) + { + vector> res; + vector stack(n); + vector solution(n, string(n, '.')); + dfs(n, 0, stack, solution, res); + return res; + } +private: + void dfs(int n, int row, vector &stack, vector &solution, vector> &res) + { + if (row == n) + { + res.push_back(solution); + } + else + { + for (int i = 0; i < n; i++) + { + if (row == 0 || !conflict(stack, row, i)) + { + solution[row][i] = 'Q'; + stack[row] = i; + dfs(n, row + 1, stack, solution, res); + solution[row][i] = '.'; + } + } + } + } + bool conflict(vector &stack, int row, int col) + { + for (int i = 0; i < row; i++) + { + if (col == stack[i] || abs(row - i) == abs(col - stack[i])) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/desc.html" new file mode 100644 index 000000000..a3ca200f7 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/desc.html" @@ -0,0 +1,34 @@ +
    +

    n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    + +

    给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

    + +

     

    + +
    +
    +

    示例 1:

    + +
    输入:n = 4
    +
    输出:
    2 +
    解释:
    如上图所示,4 皇后问题存在两个不同的解法。 +
    + +

    示例 2:

    + +
    输入:n = 1
    +
    输出:
    1 +
    + +

     

    + +

    提示:

    + +
      +
    • 1 <= n <= 9
    • +
    • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。
    • +
    +
    +
    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/solution.cpp" new file mode 100644 index 000000000..211fcc9ad --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/51_N\347\232\207\345\220\216 II/solution.cpp" @@ -0,0 +1,43 @@ +#include +using namespace std; +class Solution +{ +public: + int totalNQueens(int n) + { + vector stack(n); + return dfs(n, 0, stack); + } +private: + int dfs(int n, int row, vector &stack) + { + int count = 0; + if (row == n) + { + return count + 1; + } + else + { + for (int i = 0; i < n; i++) + { + if (row == 0 || !conflict(stack, row, i)) + { + stack[row] = i; + count += dfs(n, row + 1, stack); + } + } + return count; + } + } + bool conflict(vector &stack, int row, int col) + { + for (int i = 0; i < row; i++) + { + if (col == stack[i] || abs(row - i) == abs(col - stack[i])) + { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/desc.html" new file mode 100644 index 000000000..223f961cc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/desc.html" @@ -0,0 +1 @@ +

    给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

     

    示例 1:

    输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
    输出:
    6
    解释:
    连续子数组 [4,-1,2,1] 的和最大,为 6 。

    示例 2:

    输入:nums = [1]
    输出:
    1

    示例 3:

    输入:nums = [0]
    输出:
    0

    示例 4:

    输入:nums = [-1]
    输出:
    -1

    示例 5:

    输入:nums = [-100000]
    输出:
    -100000

     

    提示:

    • 1 <= nums.length <= 3 * 104
    • -105 <= nums[i] <= 105

     

    进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/solution.cpp" new file mode 100644 index 000000000..1b3933c91 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/52_\346\234\200\345\244\247\345\255\220\345\272\217\345\222\214/solution.cpp" @@ -0,0 +1,23 @@ +#include +using namespace std; +class Solution +{ +public: + int maxSubArray(vector &nums) + { + int sum = 0, max_sum = INT_MIN; + for (int i = 0; i < nums.size(); i++) + { + if (sum < 0) + { + sum = nums[i]; + } + else + { + sum += nums[i]; + } + max_sum = max(sum, max_sum); + } + return max_sum; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/desc.html" new file mode 100644 index 000000000..4c1fee159 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/desc.html" @@ -0,0 +1 @@ +

    给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

     

    示例 1:

    输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
    输出:
    [1,2,3,6,9,8,7,4,5]

    示例 2:

    输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
    输出:
    [1,2,3,4,8,12,11,10,9,5,6,7]

     

    提示:

    • m == matrix.length
    • n == matrix[i].length
    • 1 <= m, n <= 10
    • -100 <= matrix[i][j] <= 100
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/solution.cpp" new file mode 100644 index 000000000..624f59aba --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/53_\350\236\272\346\227\213\347\237\251\351\230\265/solution.cpp" @@ -0,0 +1,54 @@ +#include +using namespace std; +class Solution +{ +public: + vector spiralOrder(vector> &matrix) + { + vector res; + int hor_top = 0; + int hor_bottom = matrix.size() - 1; + int ver_left = 0; + int ver_right = matrix[0].size() - 1; + int direction = 0; + while (hor_top <= hor_bottom && ver_left <= ver_right) + { + switch (direction) + { + case 0: + for (int i = ver_left; i <= ver_right; i++) + { + res.push_back(matrix[hor_top][i]); + } + hor_top++; + break; + case 1: + for (int i = hor_top; i <= hor_bottom; i++) + { + res.push_back(matrix[i][ver_right]); + } + ver_right--; + break; + case 2: + for (int i = ver_right; i >= ver_left; i--) + { + res.push_back(matrix[hor_bottom][i]); + } + hor_bottom--; + break; + case 3: + for (int i = hor_bottom; i >= hor_top; i--) + { + res.push_back(matrix[i][ver_left]); + } + ver_left++; + break; + default: + break; + } + direction++; + direction %= 4; + } + return res; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/desc.html" new file mode 100644 index 000000000..8568db0aa --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/desc.html" @@ -0,0 +1 @@ +

    给定一个非负整数数组 nums ,你最初位于数组的 第一个下标

    数组中的每个元素代表你在该位置可以跳跃的最大长度。

    判断你是否能够到达最后一个下标。

     

    示例 1:

    输入:nums = [2,3,1,1,4]
    输出:
    true
    解释:
    可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

    示例 2:

    输入:nums = [3,2,1,0,4]
    输出:
    false
    解释:
    无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

     

    提示:

    • 1 <= nums.length <= 3 * 104
    • 0 <= nums[i] <= 105
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/solution.cpp" new file mode 100644 index 000000000..7f05c2e64 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/54_\350\267\263\350\267\203\346\270\270\346\210\217/solution.cpp" @@ -0,0 +1,31 @@ +#include +#include +#include +static inline int max(int a, int b) +{ + return a > b ? a : b; +} +static bool canJump(int *nums, int numsSize) +{ + int i, pos = 0; + for (i = 0; i < numsSize - 1; i++) + { + if (pos < i || pos >= numsSize - 1) + { + break; + } + pos = max(i + nums[i], pos); + } + return pos >= numsSize - 1; +} +int main(int argc, char **argv) +{ + int i, count = argc - 1; + int *nums = malloc(count * sizeof(int)); + for (i = 0; i < count; i++) + { + nums[i] = atoi(argv[i + 1]); + } + printf("%s\n", canJump(nums, count) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/desc.html" new file mode 100644 index 000000000..b280dc839 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/desc.html" @@ -0,0 +1 @@ +

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

     

    示例 1:

    输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
    输出:
    [[1,6],[8,10],[15,18]]
    解释:
    区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

    示例 2:

    输入:intervals = [[1,4],[4,5]]
    输出:
    [[1,5]]
    解释:
    区间 [1,4] 和 [4,5] 可被视为重叠区间。

     

    提示:

    • 1 <= intervals.length <= 104
    • intervals[i].length == 2
    • 0 <= starti <= endi <= 104
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/solution.cpp" new file mode 100644 index 000000000..cd2443d65 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/55_\345\220\210\345\271\266\345\214\272\351\227\264/solution.cpp" @@ -0,0 +1,71 @@ +#include +#include +#include +static int compare(const void *a, const void *b) +{ + return ((int *)a)[0] - ((int *)b)[0]; +} +int **merge(int **intervals, int intervalsSize, int *intervalsColSize, int *returnSize, int **returnColumnSizes) +{ + if (intervalsSize == 0) + { + *returnSize = 0; + return intervals; + } + int i, len = 0; + int *tmp = malloc(intervalsSize * 2 * sizeof(int)); + for (i = 0; i < intervalsSize; i++) + { + tmp[i * 2] = intervals[i][0]; + tmp[i * 2 + 1] = intervals[i][1]; + } + qsort(tmp, intervalsSize, 2 * sizeof(int), compare); + intervals[0][0] = tmp[0]; + intervals[0][1] = tmp[1]; + for (i = 1; i < intervalsSize; i++) + { + if (tmp[i * 2] > intervals[len][1]) + { + len++; + intervals[len][0] = tmp[i * 2]; + intervals[len][1] = tmp[i * 2 + 1]; + } + else if (tmp[i * 2 + 1] > intervals[len][1]) + { + intervals[len][1] = tmp[i * 2 + 1]; + } + } + len += 1; + *returnSize = len; + *returnColumnSizes = malloc(len * sizeof(int)); + for (i = 0; i < len; i++) + { + (*returnColumnSizes)[i] = 2; + } + return intervals; +} +int main(int argc, char **argv) +{ + if (argc < 1 || argc % 2 == 0) + { + fprintf(stderr, "Usage: ./test s0 e0 s1 e1..."); + exit(-1); + } + int i, count = 0; + int *sizes = malloc((argc - 1) / 2 * sizeof(int)); + int **intervals = malloc((argc - 1) / 2 * sizeof(int *)); + for (i = 0; i < (argc - 1) / 2; i++) + { + sizes[i] = 2; + intervals[i] = malloc(2 * sizeof(int)); + intervals[i][0] = atoi(argv[i * 2 + 1]); + intervals[i][1] = atoi(argv[i * 2 + 2]); + } + int *col_sizes; + int **results = merge(intervals, (argc - 1) / 2, sizes, &count, &col_sizes); + for (i = 0; i < count; i++) + { + printf("[%d,%d]\n", results[i][0], results[i][1]); + } + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/desc.html" new file mode 100644 index 000000000..1f4137a47 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/desc.html" @@ -0,0 +1,23 @@ +

    给你一个 无重叠的按照区间起始端点排序的区间列表。

    +

    在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

    +

     

    +

    示例 1:

    +
    输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
    输出:
    [[1,5],[6,9]]
    +

    示例 2:

    +
    输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
    输出:
    [[1,2],[3,10],[12,16]]
    解释:
    这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
    +

    示例 3:

    +
    输入:intervals = [], newInterval = [5,7]
    输出:
    [[5,7]]
    +

    示例 4:

    +
    输入:intervals = [[1,5]], newInterval = [2,3]
    输出:
    [[1,5]]
    +

    示例 5:

    +
    输入:intervals = [[1,5]], newInterval = [2,7]
    输出:
    [[1,7]]
    +

     

    +

    提示:

    +
      +
    • 0 <= intervals.length <= 104
    • +
    • intervals[i].length == 2
    • +
    • 0 <= intervals[i][0] <= intervals[i][1] <= 105
    • +
    • intervals 根据 intervals[i][0]升序 排列
    • +
    • newInterval.length == 2
    • +
    • 0 <= newInterval[0] <= newInterval[1] <= 105
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/solution.cpp" new file mode 100644 index 000000000..e20ed7e6e --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/56_\346\217\222\345\205\245\345\214\272\351\227\264/solution.cpp" @@ -0,0 +1,73 @@ +#include +#include +static int compare(const void *a, const void *b) +{ + return ((int *)a)[0] - ((int *)b)[0]; +} +int **insert(int **intervals, int intervalsSize, int *intervalsColSize, int *newInterval, + int newIntervalSize, int *returnSize, int **returnColumnSizes) +{ + int i, len = 0; + int *tmp = malloc((intervalsSize + 1) * 2 * sizeof(int)); + for (i = 0; i < intervalsSize; i++) + { + tmp[i * 2] = intervals[i][0]; + tmp[i * 2 + 1] = intervals[i][1]; + } + tmp[i * 2] = newInterval[0]; + tmp[i * 2 + 1] = newInterval[1]; + qsort(tmp, intervalsSize + 1, 2 * sizeof(int), compare); + int **results = malloc((intervalsSize + 1) * sizeof(int *)); + results[0] = malloc(2 * sizeof(int)); + results[0][0] = tmp[0]; + results[0][1] = tmp[1]; + for (i = 1; i < intervalsSize + 1; i++) + { + results[i] = malloc(2 * sizeof(int)); + if (tmp[i * 2] > results[len][1]) + { + len++; + results[len][0] = tmp[i * 2]; + results[len][1] = tmp[i * 2 + 1]; + } + else if (tmp[i * 2 + 1] > results[len][1]) + { + results[len][1] = tmp[i * 2 + 1]; + } + } + len += 1; + *returnSize = len; + *returnColumnSizes = malloc(len * sizeof(int)); + for (i = 0; i < len; i++) + { + (*returnColumnSizes)[i] = 2; + } + return results; +} +int main(int argc, char **argv) +{ + if (argc < 3 || argc % 2 == 0) + { + fprintf(stderr, "Usage: ./test new_s new_e s0 e0 s1 e1..."); + exit(-1); + } + int new_interv[2]; + new_interv[0] = atoi(argv[1]); + new_interv[1] = atoi(argv[2]); + int i, count = 0; + int *size = malloc((argc - 3) / 2 * sizeof(int)); + int **intervals = malloc((argc - 3) / 2 * sizeof(int *)); + for (i = 0; i < (argc - 3) / 2; i++) + { + intervals[i] = malloc(2 * sizeof(int)); + intervals[i][0] = atoi(argv[i * 2 + 3]); + intervals[i][1] = atoi(argv[i * 2 + 4]); + } + int *col_sizes; + int **results = insert(intervals, (argc - 3) / 2, size, new_interv, 2, &count, &col_sizes); + for (i = 0; i < count; i++) + { + printf("[%d,%d]\n", results[i][0], results[i][1]); + } + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/desc.html" new file mode 100644 index 000000000..efee0d796 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/desc.html" @@ -0,0 +1 @@ +

    给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。

    单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

     

    示例 1:

    输入:s = "Hello World"
    输出:
    5

    示例 2:

    输入:s = " "
    输出:
    0

     

    提示:

    • 1 <= s.length <= 104
    • s 仅有英文字母和空格 ' ' 组成
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/solution.cpp" new file mode 100644 index 000000000..6c642f87c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/57_\346\234\200\345\220\216\344\270\200\344\270\252\345\215\225\350\257\215\347\232\204\351\225\277\345\272\246/solution.cpp" @@ -0,0 +1,29 @@ +#include +#include +int lengthOfLastWord(char *s) +{ + int len = 0; + while (*s != '\0') + { + if (s[-1] == ' ' && s[0] != ' ') + { + len = 1; + } + else if (*s != ' ') + { + len++; + } + s++; + } + return len; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test word\n"); + exit(-1); + } + printf("%d\n", lengthOfLastWord(argv[1])); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/desc.html" new file mode 100644 index 000000000..1c1f3eb87 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/desc.html" @@ -0,0 +1 @@ +

    给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

     

    示例 1:

    输入:n = 3
    输出:
    [[1,2,3],[8,9,4],[7,6,5]]

    示例 2:

    输入:n = 1
    输出:
    [[1]]

     

    提示:

    • 1 <= n <= 20
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/solution.cpp" new file mode 100644 index 000000000..effdd0884 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/58_\350\236\272\346\227\213\347\237\251\351\230\265 II/solution.cpp" @@ -0,0 +1,53 @@ +#include +using namespace std; +class Solution +{ +public: + vector> generateMatrix(int n) + { + vector> matrix(n, vector(n)); + int direction = 0; + int hor_top = 0; + int hor_bottom = n - 1; + int ver_left = 0; + int ver_right = n - 1; + int num = 0; + while (num < n * n) + { + switch (direction) + { + case 0: + for (int i = ver_left; i <= ver_right; i++) + { + matrix[hor_top][i] = ++num; + } + hor_top++; + break; + case 1: + for (int i = hor_top; i <= hor_bottom; i++) + { + matrix[i][ver_right] = ++num; + } + ver_right--; + break; + case 2: + for (int i = ver_right; i >= ver_left; i--) + { + matrix[hor_bottom][i] = ++num; + } + hor_bottom--; + break; + case 3: + for (int i = hor_bottom; i >= hor_top; i--) + { + matrix[i][ver_left] = ++num; + } + ver_left++; + break; + } + direction++; + direction %= 4; + } + return matrix; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/desc.html" new file mode 100644 index 000000000..9a3181df5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/desc.html" @@ -0,0 +1 @@ +

    给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

    按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

    1. "123"
    2. "132"
    3. "213"
    4. "231"
    5. "312"
    6. "321"

    给定 n 和 k,返回第 k 个排列。

     

    示例 1:

    输入:n = 3, k = 3
    输出:
    "213"

    示例 2:

    输入:n = 4, k = 9
    输出:
    "2314"

    示例 3:

    输入:n = 3, k = 1
    输出:
    "123"

     

    提示:

    • 1 <= n <= 9
    • 1 <= k <= n!
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/solution.cpp" new file mode 100644 index 000000000..5f441bc80 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/59_\346\216\222\345\210\227\345\272\217\345\210\227/solution.cpp" @@ -0,0 +1,47 @@ +#include +#include +#include +#include +static char *getPermutation(int n, int k) +{ + int i; + char *result = malloc(n + 1); + bool *used = malloc(n * sizeof(bool)); + memset(used, false, n * sizeof(bool)); + int total = 1; + for (i = 1; i <= n; i++) + { + total *= i; + } + k = k - 1; + for (i = 0; i < n; i++) + { + total /= (n - i); + int gid = k / total; + k %= total; + int x = -1; + int count = 0; + while (count <= gid) + { + x = (x + 1) % n; + if (!used[x]) + { + count++; + } + } + used[x] = true; + result[i] = x + 1 + '0'; + } + result[n] = '\0'; + return result; +} +int main(int argc, char **argv) +{ + if (argc != 3) + { + fprintf(stderr, "Usage: ./test n, k\n"); + exit(-1); + } + printf("%s\n", getPermutation(atoi(argv[1]), atoi(argv[2]))); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/desc.html" new file mode 100644 index 000000000..550e2f59d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/desc.html" @@ -0,0 +1,50 @@ +
    +

    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

    + +

    比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

    + +
    +    P   A   H   N
    +    A P L S I I G
    +    Y   I   R
    + +

    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

    + +

    请你实现这个将字符串进行指定行数变换的函数:

    + +
    string convert(string s, int numRows);
    + +

     

    + +

    示例 1:

    + +
    输入:s = "PAYPALISHIRING", numRows = 3
    +
    输出:
    "PAHNAPLSIIGYIR" +
    + 示例 2: + +
    输入:s = "PAYPALISHIRING", numRows = 4
    +
    输出:
    "PINALSIGYAHRPI" +
    解释:
    +P I N +A L S I G +Y A H R +P I +
    + +

    示例 3:

    + +
    输入:s = "A", numRows = 1
    +
    输出:
    "A" +
    + +

     

    + +

    提示:

    + +
      +
    • 1 <= s.length <= 1000
    • +
    • s 由英文字母(小写和大写)、',''.' 组成
    • +
    • 1 <= numRows <= 1000
    • +
    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/solution.cpp" new file mode 100644 index 000000000..a301b7a68 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/5_Z \345\255\227\345\275\242\345\217\230\346\215\242/solution.cpp" @@ -0,0 +1,44 @@ +class Solution +{ +public: + string convert(string s, int numRows) + { + if (numRows == 1) + return s; + int len = s.size(); + if (len <= numRows) + return s; + int cycle_len = 2 * numRows - 2; + int full_cycles = len / cycle_len; + int left = len % cycle_len; + string r; + int i; + for (i = 0; i < full_cycles; ++i) + { + r += s[i * cycle_len]; + } + if (left) + r += s[i * cycle_len]; + for (i = 0; i < numRows - 2; ++i) + { + int j; + for (j = 0; j < full_cycles; ++j) + { + r += s[j * cycle_len + i + 1]; + r += s[j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)]; + } + if (left) + { + if (j * cycle_len + i + 1 < len) + r += s[j * cycle_len + i + 1]; + if (j * cycle_len + i + 1 + cycle_len - 2 * (i + 1) < len) + r += s[j * cycle_len + i + 1 + cycle_len - 2 * (i + 1)]; + } + } + for (i = 0; i < full_cycles; ++i) + r += s[i * cycle_len + numRows - 1]; + if (left >= numRows) + r += s[i * cycle_len + numRows - 1]; + return r; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/desc.html" new file mode 100644 index 000000000..e1f5092a5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/desc.html" @@ -0,0 +1 @@ +

    给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

     

    示例 1:

    输入:head = [1,2,3,4,5], k = 2
    输出:
    [4,5,1,2,3]

    示例 2:

    输入:head = [0,1,2], k = 4
    输出:
    [2,0,1]

     

    提示:

    • 链表中节点的数目在范围 [0, 500]
    • -100 <= Node.val <= 100
    • 0 <= k <= 2 * 109
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/solution.cpp" new file mode 100644 index 000000000..6dccf8c0a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/60_\346\227\213\350\275\254\351\223\276\350\241\250/solution.cpp" @@ -0,0 +1,45 @@ +#include +using namespace std; +struct ListNode +{ + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +class Solution +{ +public: + ListNode *rotateRight(ListNode *head, int k) + { + if (head == nullptr) + { + return head; + } + int len = 0; + ListNode dummy; + dummy.next = head; + ListNode *tail = &dummy; + while (tail->next != nullptr) + { + len++; + tail = tail->next; + } + ListNode *prev = &dummy; + ListNode *p = head; + k = k % len; + for (int i = 0; i < len - k; i++) + { + prev = p; + p = p->next; + } + if (p != nullptr) + { + prev->next = tail->next; + tail->next = head; + head = p; + } + return head; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/desc.html" new file mode 100644 index 000000000..e5f4cd08a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/desc.html" @@ -0,0 +1,19 @@ +

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

    +

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

    +

    问总共有多少条不同的路径?

    +

     

    +

    示例 1:

    +
    输入:m = 3, n = 7
    输出:
    28
    +

    示例 2:

    +
    输入:m = 3, n = 2
    输出:
    3
    解释:
    从左上角开始,总共有 3 条路径可以到达右下角。
    1. 向右 -> 向下 -> 向下
    2. 向下 -> 向下 -> 向右
    3. 向下 -> 向右 -> 向下
    +

    示例 3:

    +
    输入:m = 7, n = 3
    输出:
    28
    +

    示例 4:

    +
    输入:m = 3, n = 3
    输出:
    6
    +

     

    +

    提示:

    +
      +
    • 1 <= m, n <= 100
    • +
    • 题目数据保证答案小于等于 2 * 109
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/solution.cpp" new file mode 100644 index 000000000..77c10aa69 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/61_\344\270\215\345\220\214\350\267\257\345\276\204/solution.cpp" @@ -0,0 +1,33 @@ +#include +#include +static int uniquePaths(int m, int n) +{ + int row, col; + int *grids = malloc(m * n * sizeof(int)); + for (col = 0; col < m; col++) + { + grids[col] = 1; + } + for (row = 0; row < n; row++) + { + grids[row * m] = 1; + } + for (row = 1; row < n; row++) + { + for (col = 1; col < m; col++) + { + grids[row * m + col] = grids[row * m + col - 1] + grids[(row - 1) * m + col]; + } + } + return grids[m * n - 1]; +} +int main(int argc, char **argv) +{ + if (argc != 3) + { + fprintf(stderr, "Usage: ./test m n\n"); + exit(-1); + } + printf("%d\n", uniquePaths(atoi(argv[1]), atoi(argv[2]))); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/desc.html" new file mode 100644 index 000000000..58ea060cc --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/desc.html" @@ -0,0 +1,23 @@ +

    一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。

    +

    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。

    +

    现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

    +

    +

    网格中的障碍物和空位置分别用 10 来表示。

    +

     

    +

    示例 1:

    +
    输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
    输出:
    2
    解释:
    3x3 网格的正中间有一个障碍物。从左上角到右下角一共有 2 条不同的路径:
    1. 向右 -> 向右 -> 向下 -> 向下
    2. 向下 -> 向下 -> 向右 -> 向右
    +

    示例 2:

    +
    输入:obstacleGrid = [[0,1],[0,0]]
    输出:
    1
    +

     

    +

    提示:

    +
      +
    • m == obstacleGrid.length
    • +
    • n == obstacleGrid[i].length
    • +
    • 1 <= m, n <= 100
    • +
    • obstacleGrid[i][j]01
    • +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/solution.cpp" new file mode 100644 index 000000000..24844393a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/62_\344\270\215\345\220\214\350\267\257\345\276\204 II/solution.cpp" @@ -0,0 +1,82 @@ +#include +#include +static int uniquePathsWithObstacles(int **obstacleGrid, int obstacleGridRowSize, int obstacleGridColSize) +{ + int row, col; + int reset = 0; + for (row = 0; row < obstacleGridRowSize; row++) + { + if (reset) + { + obstacleGrid[row][0] = 1; + } + else + { + if (obstacleGrid[row][0] == 1) + { + reset = 1; + } + } + } + reset = 0; + for (col = 0; col < obstacleGridColSize; col++) + { + if (reset) + { + obstacleGrid[0][col] = 1; + } + else + { + if (obstacleGrid[0][col] == 1) + { + reset = 1; + } + } + } + for (row = 0; row < obstacleGridRowSize; row++) + { + int *line = obstacleGrid[row]; + for (col = 0; col < obstacleGridColSize; col++) + { + line[col] ^= 1; + } + } + for (row = 1; row < obstacleGridRowSize; row++) + { + int *last_line = obstacleGrid[row - 1]; + int *line = obstacleGrid[row]; + for (col = 1; col < obstacleGridColSize; col++) + { + if (line[col] != 0) + { + line[col] = line[col - 1] + last_line[col]; + } + } + } + return obstacleGrid[obstacleGridRowSize - 1][obstacleGridColSize - 1]; +} +int main(int argc, char **argv) +{ + if (argc < 3) + { + fprintf(stderr, "Usage: ./test m n\n"); + exit(-1); + } + int i, j, k = 3; + int row_size = atoi(argv[1]); + int col_size = atoi(argv[2]); + int **grids = malloc(row_size * sizeof(int *)); + for (i = 0; i < row_size; i++) + { + grids[i] = malloc(col_size * sizeof(int)); + int *line = grids[i]; + for (j = 0; j < col_size; j++) + { + line[j] = atoi(argv[k++]); + printf("%d ", line[j]); + } + printf("\n"); + } + printf("%d\n", uniquePathsWithObstacles(grids, row_size, col_size)); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/desc.html" new file mode 100644 index 000000000..94ffa23c2 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/desc.html" @@ -0,0 +1 @@ +

    给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

     

    示例 1:

    输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
    输出:
    7
    解释:
    因为路径 1→3→1→1→1 的总和最小。

    示例 2:

    输入:grid = [[1,2,3],[4,5,6]]
    输出:
    12

     

    提示:

    • m == grid.length
    • n == grid[i].length
    • 1 <= m, n <= 200
    • 0 <= grid[i][j] <= 100
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/solution.cpp" new file mode 100644 index 000000000..816e8b610 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/63_\346\234\200\345\260\217\350\267\257\345\276\204\345\222\214/solution.cpp" @@ -0,0 +1,56 @@ +#include +#include +#include +static inline int min(int a, int b) +{ + return a < b ? a : b; +} +int minPathSum(int **grid, int gridRowSize, int gridColSize) +{ + int i, j; + int **dp = malloc(gridRowSize * sizeof(int *)); + for (i = 0; i < gridRowSize; i++) + { + dp[i] = malloc(gridColSize * sizeof(int)); + } + dp[0][0] = grid[0][0]; + int sum = dp[0][0]; + for (i = 1; i < gridRowSize; i++) + { + sum += grid[i][0]; + dp[i][0] = sum; + } + sum = dp[0][0]; + for (i = 1; i < gridColSize; i++) + { + sum += grid[0][i]; + dp[0][i] = sum; + } + for (i = 1; i < gridRowSize; i++) + { + for (j = 1; j < gridColSize; j++) + { + dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]); + } + } + return dp[gridRowSize - 1][gridColSize - 1]; +} +int main(int argc, char **argv) +{ + int i, j; + int row = argc - 1; + int col = strlen(argv[1]); + int **grid = malloc(row * sizeof(int *)); + for (i = 0; i < row; i++) + { + grid[i] = malloc(col * sizeof(int)); + for (j = 0; j < col; j++) + { + grid[i][j] = argv[i + 1][j] - '0'; + printf("%d ", grid[i][j]); + } + printf("\n"); + } + printf("%d\n", minPathSum(grid, row, col)); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/desc.html" new file mode 100644 index 000000000..ca39ca6c6 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/desc.html" @@ -0,0 +1 @@ +

    有效数字(按顺序)可以分成以下几个部分:

    1. 一个 小数 或者 整数
    2. (可选)一个 'e''E' ,后面跟着一个 整数

    小数(按顺序)可以分成以下几个部分:

    1. (可选)一个符号字符('+''-'
    2. 下述格式之一:
      1. 至少一位数字,后面跟着一个点 '.'
      2. 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
      3. 一个点 '.' ,后面跟着至少一位数字

    整数(按顺序)可以分成以下几个部分:

    1. (可选)一个符号字符('+''-'
    2. 至少一位数字

    部分有效数字列举如下:

    • ["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]

    部分无效数字列举如下:

    • ["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

    给你一个字符串 s ,如果 s 是一个 有效数字 ,请返回 true

     

    示例 1:

    输入:s = "0"
    输出:
    true

    示例 2:

    输入:s = "e"
    输出:
    false

    示例 3:

    输入:s = "."
    输出:
    false

    示例 4:

    输入:s = ".1"
    输出:
    true

     

    提示:

    • 1 <= s.length <= 20
    • s 仅含英文字母(大写和小写),数字(0-9),加号 '+' ,减号 '-' ,或者点 '.'
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/solution.cpp" new file mode 100644 index 000000000..9ca289758 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/64_\346\234\211\346\225\210\346\225\260\345\255\227/solution.cpp" @@ -0,0 +1,49 @@ +#include +#include +#include +#include +static bool isNumber(const char *s) +{ + while (*s == ' ') + ++s; + bool if_find_num = false; + if (*s == '-' || *s == '+') + ++s; + while (isdigit(*s)) + { + if_find_num = true; + ++s; + } + if (*s == '.') + ++s; + while (isdigit(*s)) + { + if_find_num = true; + ++s; + } + if (if_find_num == true && *s == 'e') + { + ++s; + if (*s == '+' || *s == '-') + ++s; + if_find_num = false; + while (isdigit(*s)) + { + if_find_num = true; + ++s; + } + } + while (*s == ' ') + ++s; + return *s == '\0' && if_find_num == true; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test number\n"); + exit(-1); + } + printf("%s\n", isNumber(argv[1]) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/desc.html" new file mode 100644 index 000000000..10063d744 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/desc.html" @@ -0,0 +1 @@ +

    给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

    最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

    你可以假设除了整数 0 之外,这个整数不会以零开头。

     

    示例 1:

    输入:digits = [1,2,3]
    输出:
    [1,2,4]
    解释:
    输入数组表示数字 123。

    示例 2:

    输入:digits = [4,3,2,1]
    输出:
    [4,3,2,2]
    解释:
    输入数组表示数字 4321。

    示例 3:

    输入:digits = [0]
    输出:
    [1]

     

    提示:

    • 1 <= digits.length <= 100
    • 0 <= digits[i] <= 9
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/solution.cpp" new file mode 100644 index 000000000..36f8e0ee8 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/65_\345\212\240\344\270\200/solution.cpp" @@ -0,0 +1,23 @@ +#include +using namespace std; +class Solution +{ +public: + vector plusOne(vector &digits) + { + int carry = 1; + vector res; + for (int i = digits.size() - 1; i >= 0; i--) + { + int d = digits[i] + carry; + res.push_back(d % 10); + carry = d / 10; + } + if (carry > 0) + { + res.push_back(carry); + } + reverse(res.begin(), res.end()); + return res; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/desc.html" new file mode 100644 index 000000000..3b2f1b0ac --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/desc.html" @@ -0,0 +1 @@ +

    给你两个二进制字符串,返回它们的和(用二进制表示)。

    输入为 非空 字符串且只包含数字 1 和 0

     

    示例 1:

    输入: a = "11", b = "1"
    输出:
    "100"

    示例 2:

    输入: a = "1010", b = "1011"
    输出:
    "10101"

     

    提示:

    • 每个字符串仅由字符 '0''1' 组成。
    • 1 <= a.length, b.length <= 10^4
    • 字符串如果不是 "0" ,就都不含前导零。
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/solution.cpp" new file mode 100644 index 000000000..0df722720 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/66_\344\272\214\350\277\233\345\210\266\346\261\202\345\222\214/solution.cpp" @@ -0,0 +1,101 @@ +#include +using namespace std; +class Solution +{ +public: + string addBinary(string a, string b) + { + string res; + int carry = 0; + int i = a.length() - 1; + int j = b.length() - 1; + for (; i >= 0 && j >= 0; i--, j--) + { + if (a[i] == '1' && b[j] == '1') + { + if (carry > 0) + { + res.push_back('1'); + } + else + { + res.push_back('0'); + } + carry = 1; + } + else if (a[i] == '0' && b[j] == '0') + { + if (carry > 0) + { + res.push_back('1'); + } + else + { + res.push_back('0'); + } + carry = 0; + } + else + { + if (carry > 0) + { + res.push_back('0'); + carry = 1; + } + else + { + res.push_back('1'); + carry = 0; + } + } + } + while (i >= 0) + { + if (a[i--] == '1') + { + if (carry > 0) + { + res.push_back('0'); + carry = 1; + } + else + { + res.push_back('1'); + carry = 0; + } + } + else + { + res.push_back(carry + '0'); + carry = 0; + } + } + while (j >= 0) + { + if (b[j--] == '1') + { + if (carry > 0) + { + res.push_back('0'); + carry = 1; + } + else + { + res.push_back('1'); + carry = 0; + } + } + else + { + res.push_back(carry + '0'); + carry = 0; + } + } + if (carry > 0) + { + res.push_back('1'); + } + reverse(res.begin(), res.end()); + return res; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/desc.html" new file mode 100644 index 000000000..7c583861d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/desc.html" @@ -0,0 +1,63 @@ +
    +

    给定一个单词数组和一个长度 maxWidth,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。

    + +

    你应该使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ' ' 填充,使得每行恰好有 maxWidth 个字符。 +

    + +

    要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。

    + +

    文本的最后一行应为左对齐,且单词之间不插入额外的空格。

    + +

    说明:

    + +
      +
    • 单词是指由非空格字符组成的字符序列。
    • +
    • 每个单词的长度大于 0,小于等于 maxWidth
    • +
    • 输入单词数组 words 至少包含一个单词。
    • +
    + +

    示例:

    + +
    输入:
    +    words = ["This", "is", "an", "example", "of", "text", "justification."]
    +    maxWidth = 16
    +
    输出:
    + [ +    "This    is    an", +    "example  of text", +    "justification.  " + ] +
    + +

    示例 2:

    + +
    输入:
    +    words = ["What","must","be","acknowledgment","shall","be"]
    +    maxWidth = 16
    +
    输出:
    + [ +   "What   must   be", +   "acknowledgment  ", +   "shall be        " + ] +
    解释:
    注意最后一行的格式应为 "shall be " 而不是 "shall be" + 因为最后一行应为左对齐,而不是左右两端对齐,第二行同样为左对齐,这是因为这行只包含一个单词。 +
    + +

    示例 3:

    + +
    输入:
    +    words = ["Science","is","what","we","understand","well","enough","to","explain",
    +             "to","a","computer.","Art","is","everything","else","we","do"]
    +    maxWidth = 20
    +
    输出:
    + [ +   "Science  is  what we", + "understand      well", +   "enough to explain to", +   "a  computer.  Art is", +   "everything  else  we", +   "do                  " + ] +
    +
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/solution.cpp" new file mode 100644 index 000000000..0a058a189 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/67_\346\226\207\346\234\254\345\267\246\345\217\263\345\257\271\351\275\220/solution.cpp" @@ -0,0 +1,118 @@ +#include +#include +#include +static void line_fill(char *line, int len, char **words, int *word_lens, int max_size, + int even_spaces, int remain_spaces, int start, int end) +{ + int i, j; + char *p = line; + for (i = start; i < end; i++) + { + memcpy(p, words[i], word_lens[i]); + p += word_lens[i]; + if (i < end - 1) + { + for (j = 0; j < even_spaces; j++) + { + *p++ = ' '; + } + if (remain_spaces > 0) + { + *p++ = ' '; + remain_spaces--; + } + } + } + while (p - line < max_size) + { + *p++ = ' '; + } + *p++ = '\0'; +} +static char **fullJustify(char **words, int wordsSize, int maxWidth, int *returnSize) +{ + int i, j, k, cap = 100, count = 0; + char **lines = malloc(cap * sizeof(char *)); + char *buf = malloc(cap * (maxWidth + 1)); + for (i = 0; i < cap; i++) + { + lines[i] = buf + i * (maxWidth + 1); + } + int *word_lens = malloc(wordsSize * sizeof(int)); + for (i = 0; i < wordsSize; i++) + { + word_lens[i] = strlen(words[i]); + } + int wc = 0; + int len = 0; + int start = 0; + int chars = 0; + for (i = 0, j = 0; i < wordsSize; i++) + { + if (len + word_lens[i] > maxWidth) + { + int even_spaces = wc == 1 ? 0 : (maxWidth - chars) / (wc - 1); + int remain_spaces = wc == 1 ? 0 : (maxWidth - chars) % (wc - 1); + line_fill(lines[count], len, words, word_lens, maxWidth, even_spaces, remain_spaces, start, i); + count++; + wc = 1; + len = word_lens[i] + 1; + chars = word_lens[i]; + start = i; + } + else if (len + word_lens[i] == maxWidth) + { + chars += word_lens[i]; + int even_spaces = wc == 0 ? 0 : (maxWidth - chars) / wc; + int remain_spaces = wc == 0 ? 0 : (maxWidth - chars) % wc; + line_fill(lines[count], len, words, word_lens, maxWidth, even_spaces, remain_spaces, start, i + 1); + count++; + wc = 0; + len = 0; + chars = 0; + start = i + 1; + } + else + { + chars += word_lens[i]; + len += word_lens[i] + 1; + wc++; + } + } + if (wc > 0) + { + char *p = lines[count]; + for (i = start; i < start + wc; i++) + { + memcpy(p, words[i], word_lens[i]); + p += word_lens[i]; + if (i < start + wc - 1) + { + *p++ = ' '; + } + } + while (p - lines[count] < maxWidth) + { + *p++ = ' '; + } + *p++ = '\0'; + count++; + } + *returnSize = count; + return lines; +} +int main(int argc, char **argv) +{ + if (argc <= 2) + { + fprintf(stderr, "Usage: ./test maxsize words...\n"); + exit(-1); + } + int i, count; + char **lines = fullJustify(argv + 2, argc - 2, atoi(argv[1]), &count); + for (i = 0; i < count; i++) + { + printf("%s\n", lines[i]); + } + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/desc.html" new file mode 100644 index 000000000..97b915068 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/desc.html" @@ -0,0 +1,7 @@ +

    实现 int sqrt(int x) 函数。

    +

    计算并返回 x 的平方根,其中 x 是非负整数。

    +

    由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

    +

    示例 1:

    +
    输入: 4
    输出:
    2
    +

    示例 2:

    +
    输入: 8
    输出:
    2
    说明:
    8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/solution.cpp" new file mode 100644 index 000000000..4f139bfa5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/68_x \347\232\204\345\271\263\346\226\271\346\240\271/solution.cpp" @@ -0,0 +1,35 @@ +#include +using namespace std; +class Solution +{ +public: + int mySqrt(int x) + { + if (x == 0) + { + return 0; + } + unsigned int lo = 1, hi = x; + unsigned int mid = (lo + hi) / 2; + for (;;) + { + if (mid > x / mid) + { + hi = mid; + } + else + { + if (mid + 1 > x / (mid + 1)) + { + break; + } + else + { + lo = mid; + } + } + mid = (lo + hi) / 2; + } + return mid; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/desc.html" new file mode 100644 index 000000000..5a5fba907 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/desc.html" @@ -0,0 +1 @@ +

    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

    每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

    注意:给定 n 是一个正整数。

    示例 1:

    输入: 2
    输出:
    2
    解释:
    有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶

    示例 2:

    输入: 3
    输出:
    3
    解释:
    有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/solution.cpp" new file mode 100644 index 000000000..b6bf8ef90 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/69_\347\210\254\346\245\274\346\242\257/solution.cpp" @@ -0,0 +1,19 @@ +#include +using namespace std; +class Solution +{ +public: + int climbStairs(int n) + { + int a = 1; + int b = 2; + int c = 0; + for (int i = 3; i <= n; i++) + { + c = a + b; + a = b; + b = c; + } + return n == 1 ? a : (n == 2 ? b : c); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/desc.html" new file mode 100644 index 000000000..9143d6bb2 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/desc.html" @@ -0,0 +1 @@ +

    给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

    如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

    假设环境不允许存储 64 位整数(有符号或无符号)。

     

    示例 1:

    输入:x = 123
    输出:
    321

    示例 2:

    输入:x = -123
    输出:
    -321

    示例 3:

    输入:x = 120
    输出:
    21

    示例 4:

    输入:x = 0
    输出:
    0

     

    提示:

    • -231 <= x <= 231 - 1
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/solution.cpp" new file mode 100644 index 000000000..6668f76b7 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/6_\346\225\264\346\225\260\345\217\215\350\275\254/solution.cpp" @@ -0,0 +1,14 @@ +int reverse(int x) +{ + long long int r = 0; + while (x) + { + r = r * 10 + (x % 10); + x /= 10; + } + if (r > 2147483647) + return 0; + if (r < -2147483648) + return 0; + return (int)r; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/desc.html" new file mode 100644 index 000000000..f730116ee --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/desc.html" @@ -0,0 +1 @@ +

    给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

    在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

    请注意,返回的 规范路径 必须遵循下述格式:

    • 始终以斜杠 '/' 开头。
    • 两个目录名之间必须只有一个斜杠 '/'
    • 最后一个目录名(如果存在)不能 '/' 结尾。
    • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.''..')。

    返回简化后得到的 规范路径

     

    示例 1:

    输入:path = "/home/"
    输出:
    "/home"
    解释:
    注意,最后一个目录名后面没有斜杠。

    示例 2:

    输入:path = "/../"
    输出:
    "/"
    解释:
    从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

    示例 3:

    输入:path = "/home//foo/"
    输出:
    "/home/foo"
    解释:
    在规范路径中,多个连续斜杠需要用一个斜杠替换。

    示例 4:

    输入:path = "/a/./b/../../c/"
    输出:
    "/c"

     

    提示:

    • 1 <= path.length <= 3000
    • path 由英文字母,数字,'.''/''_' 组成。
    • path 是一个有效的 Unix 风格绝对路径。
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/solution.cpp" new file mode 100644 index 000000000..eeb87488b --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/70_\347\256\200\345\214\226\350\267\257\345\276\204/solution.cpp" @@ -0,0 +1,93 @@ +#include +#include +#include +static char *simplifyPath(char *path) +{ + int len = strlen(path); + if (len == 0) + { + return path; + } + char *p = path; + int *indexes = malloc(len * sizeof(int)); + int depth = 0; + int name_start = 1; + while (*p != '\0') + { + if (*p == '/') + { + if (p > path && *(p - 1) != '/' && *(p - 1) != '.') + { + name_start = 1; + } + } + else if (*p == '.') + { + if (*(p + 1) == '\0' || *(p + 1) == '/') + { + p += 1; + } + else if (*(p + 1) == '.' && (*(p + 2) == '\0' || *(p + 2) == '/')) + { + if (depth > 0) + { + depth--; + name_start = 1; + } + p += 2; + } + else + { + indexes[depth++] = p - path; + while (*p != '/' && *p != '\0') + { + p++; + } + } + if (*p == '\0') + { + break; + } + } + else + { + if (name_start && depth >= 0) + { + indexes[depth++] = p - path; + name_start = 0; + } + } + p++; + } + int i; + char *result = malloc(len + 1); + char *q = result; + if (depth <= 0) + { + *q++ = '/'; + } + else + { + for (i = 0; i < depth; i++) + { + p = path + indexes[i]; + *q++ = '/'; + while (*p != '/') + { + *q++ = *p++; + } + } + } + *q = '\0'; + return result; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test path\n"); + exit(-1); + } + printf("%s\n", simplifyPath(argv[1])); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/desc.html" new file mode 100644 index 000000000..d4f47ed6a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/desc.html" @@ -0,0 +1 @@ +

    给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

    你可以对一个单词进行如下三种操作:

    • 插入一个字符
    • 删除一个字符
    • 替换一个字符

     

    示例 1:

    输入:word1 = "horse", word2 = "ros"
    输出:
    3
    解释:
    horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')

    示例 2:

    输入:word1 = "intention", word2 = "execution"
    输出:
    5
    解释:
    intention -> inention (删除 't')inention -> enention (将 'i' 替换为 'e')enention -> exention (将 'n' 替换为 'x')exention -> exection (将 'n' 替换为 'c')exection -> execution (插入 'u')

     

    提示:

    • 0 <= word1.length, word2.length <= 500
    • word1word2 由小写英文字母组成
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/solution.cpp" new file mode 100644 index 000000000..e9e0e674c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/71_\347\274\226\350\276\221\350\267\235\347\246\273/solution.cpp" @@ -0,0 +1,36 @@ +#include +using namespace std; +class Solution +{ +public: + int minDistance(string word1, string word2) + { + int l1 = word1.length(); + int l2 = word2.length(); + vector dp(l2 + 1); + for (int i = 0; i <= l2; i++) + { + dp[i] = i; + } + int up = 0; + for (int i = 1; i <= l1; i++) + { + int left_up = dp[0]; + dp[0] = i; + for (int j = 1; j <= l2; j++) + { + up = dp[j]; + if (word1[i - 1] == word2[j - 1]) + { + dp[j] = left_up; + } + else + { + dp[j] = 1 + min(left_up, min(up, dp[j - 1])); + } + left_up = up; + } + } + return dp[l2]; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/desc.html" new file mode 100644 index 000000000..92e1e2d43 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/desc.html" @@ -0,0 +1 @@ +

    给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

    进阶:

    • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
    • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
    • 你能想出一个仅使用常量空间的解决方案吗?

     

    示例 1:

    输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
    输出:
    [[1,0,1],[0,0,0],[1,0,1]]

    示例 2:

    输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
    输出:
    [[0,0,0,0],[0,4,5,0],[0,3,1,0]]

     

    提示:

    • m == matrix.length
    • n == matrix[0].length
    • 1 <= m, n <= 200
    • -231 <= matrix[i][j] <= 231 - 1
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/solution.cpp" new file mode 100644 index 000000000..546f95b40 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/72_\347\237\251\351\230\265\347\275\256\351\233\266/solution.cpp" @@ -0,0 +1,51 @@ +#include +using namespace std; +public: +void setZeroes(vector> &matrix) +{ + bool bRow = false, bCol = false; + for (int row = 0; row < matrix.size(); row++) + { + for (int col = 0; col < matrix[row].size(); col++) + { + if (matrix[row][col] == 0) + { + if (row == 0) + { + bRow = true; + } + if (col == 0) + { + bCol = true; + } + matrix[0][col] = matrix[row][0] = 0; + } + } + } + for (int row = 1; row < matrix.size(); row++) + { + for (int col = 1; col < matrix[row].size(); col++) + { + if (matrix[0][col] == 0 || matrix[row][0] == 0) + { + matrix[row][col] = 0; + } + } + } + if (bRow) + { + for (auto &m : matrix[0]) + { + m = 0; + } + } + if (bCol) + { + for (int row = 0; row < matrix.size(); row++) + { + matrix[row][0] = 0; + } + } +} +} +; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/desc.html" new file mode 100644 index 000000000..78246975a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/desc.html" @@ -0,0 +1 @@ +

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

    • 每行中的整数从左到右按升序排列。
    • 每行的第一个整数大于前一行的最后一个整数。

     

    示例 1:

    输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
    输出:
    true

    示例 2:

    输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
    输出:
    false

     

    提示:

    • m == matrix.length
    • n == matrix[i].length
    • 1 <= m, n <= 100
    • -104 <= matrix[i][j], target <= 104
    \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/solution.cpp" new file mode 100644 index 000000000..171fe5568 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/73_\346\220\234\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/solution.cpp" @@ -0,0 +1,91 @@ +#include +#include +#include +static int binary_search(int *nums, int len, int target) +{ + int low = -1; + int high = len; + while (low + 1 < high) + { + int mid = low + (high - low) / 2; + if (target > nums[mid]) + { + low = mid; + } + else + { + high = mid; + } + } + if (high == len || nums[high] != target) + { + return -high - 1; + } + else + { + return high; + } +} +static bool searchMatrix(int **matrix, int matrixRowSize, int matrixColSize, int target) +{ + if (matrixRowSize == 0 || matrixColSize == 0) + { + return false; + } + if (target < matrix[0][0] || target > matrix[matrixRowSize - 1][matrixColSize - 1]) + { + return false; + } + int row = 0; + int *nums = NULL; + if (matrixRowSize > 0) + { + nums = malloc(matrixRowSize * sizeof(int)); + for (row = 0; row < matrixRowSize; row++) + { + nums[row] = matrix[row][0]; + } + row = binary_search(nums, matrixRowSize, target); + if (row >= 0) + { + return true; + } + else + { + row = -row - 1; + if (row == 0) + { + return false; + } + else + { + row--; + } + } + } + int col = binary_search(matrix[row], matrixColSize, target); + return col >= 0; +} +int main(int argc, char **argv) +{ + int row = 3; + int col = 4; + int **mat = malloc(row * sizeof(int *)); + mat[0] = malloc(col * sizeof(int)); + mat[0][0] = 1; + mat[0][1] = 3; + mat[0][2] = 5; + mat[0][3] = 7; + mat[1] = malloc(col * sizeof(int)); + mat[1][0] = 10; + mat[1][1] = 11; + mat[1][2] = 16; + mat[1][3] = 20; + mat[2] = malloc(col * sizeof(int)); + mat[2][0] = 23; + mat[2][1] = 30; + mat[2][2] = 34; + mat[2][3] = 50; + printf("%s\n", searchMatrix(mat, row, col, atoi(argv[1])) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/desc.html" new file mode 100644 index 000000000..a79029d74 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/desc.html" @@ -0,0 +1 @@ +

    给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

    此题中,我们使用整数 0、 12 分别表示红色、白色和蓝色。

       

      示例 1:

      输入:nums = [2,0,2,1,1,0]
      输出:
      [0,0,1,1,2,2]

      示例 2:

      输入:nums = [2,0,1]
      输出:
      [0,1,2]

      示例 3:

      输入:nums = [0]
      输出:
      [0]

      示例 4:

      输入:nums = [1]
      输出:
      [1]

       

      提示:

      • n == nums.length
      • 1 <= n <= 300
      • nums[i]012

       

      进阶:

      • 你可以不使用代码库中的排序函数来解决这道题吗?
      • 你能想出一个仅使用常数空间的一趟扫描算法吗?
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/solution.cpp" new file mode 100644 index 000000000..fc1d9739d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/74_\351\242\234\350\211\262\345\210\206\347\261\273/solution.cpp" @@ -0,0 +1,39 @@ +#include +using namespace std; +class Solution +{ +public: + void sortColors(vector &nums) + { + int i = 0, j = nums.size() - 1; + while (i < j) + { + if (nums[i] == 0) + { + i++; + continue; + } + if (nums[j] != 0) + { + j--; + continue; + } + swap(nums[i], nums[j]); + } + j = nums.size() - 1; + while (i < j) + { + if (nums[i] == 1) + { + i++; + continue; + } + if (nums[j] != 1) + { + j--; + continue; + } + swap(nums[i], nums[j]); + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/desc.html" new file mode 100644 index 000000000..bfa0f67a9 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/desc.html" @@ -0,0 +1 @@ +

      给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

      注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。

       

      示例 1:

      输入:s = "ADOBECODEBANC", t = "ABC"
      输出:
      "BANC"

      示例 2:

      输入:s = "a", t = "a"
      输出:
      "a"

       

      提示:

      • 1 <= s.length, t.length <= 105
      • st 由英文字母组成

       

      进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗? \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/solution.cpp" new file mode 100644 index 000000000..074e28830 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/75_\346\234\200\345\260\217\350\246\206\347\233\226\345\255\220\344\270\262/solution.cpp" @@ -0,0 +1,37 @@ +#include +using namespace std; +class Solution +{ +public: + string minWindow(string s, string t) + { + vector count(128); + for (char c : t) + { + count[c]++; + } + int l = 0, r = 0; + int need_to_meet = t.length(); + int start, min_len = INT_MAX; + while (r < s.length()) + { + if (--count[s[r++]] >= 0) + { + need_to_meet--; + } + while (need_to_meet == 0) + { + if (r - l < min_len) + { + start = l; + min_len = r - l; + } + if (++count[s[l++]] > 0) + { + need_to_meet++; + } + } + } + return min_len == INT_MAX ? "" : s.substr(start, min_len); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/desc.html" new file mode 100644 index 000000000..8ded3769c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/desc.html" @@ -0,0 +1,3 @@ +

      给定两个整数 nk,返回 1 ... n 中所有可能的 k 个数的组合。

      +

      示例:

      +
      输入: n = 4, k = 2
      输出:
      [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/solution.cpp" new file mode 100644 index 000000000..006e5510c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/76_\347\273\204\345\220\210/solution.cpp" @@ -0,0 +1,30 @@ +#include +using namespace std; +class Solution +{ +public: + vector> combine(int n, int k) + { + vector> res; + dfs(n, k, 1, res); + return res; + } +private: + vector stack; + void dfs(int n, int k, int start, vector> &res) + { + if (stack.size() == k) + { + res.push_back(stack); + } + else + { + for (int i = start; i <= n; i++) + { + stack.push_back(i); + dfs(n, k, i + 1, res); + stack.pop_back(); + } + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/desc.html" new file mode 100644 index 000000000..b599426d6 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/desc.html" @@ -0,0 +1 @@ +

      给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

      解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

       

      示例 1:

      输入:nums = [1,2,3]
      输出:
      [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

      示例 2:

      输入:nums = [0]
      输出:
      [[],[0]]

       

      提示:

      • 1 <= nums.length <= 10
      • -10 <= nums[i] <= 10
      • nums 中的所有元素 互不相同
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/solution.cpp" new file mode 100644 index 000000000..7cf9fd190 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/77_\345\255\220\351\233\206/solution.cpp" @@ -0,0 +1,24 @@ +#include +using namespace std; +class Solution +{ +public: + vector> subsets(vector &nums) + { + vector> res; + dfs(nums, 0, res); + return res; + } +private: + vector stack; + void dfs(vector &nums, int start, vector> &res) + { + res.push_back(stack); + for (int i = start; i < nums.size(); i++) + { + stack.push_back(nums[i]); + dfs(nums, i + 1, res); + stack.pop_back(); + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/desc.html" new file mode 100644 index 000000000..d0da23d85 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/desc.html" @@ -0,0 +1 @@ +

      给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false

      单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

       

      示例 1:

      输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
      输出:
      true

      示例 2:

      输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "SEE"
      输出:
      true

      示例 3:

      输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCB"
      输出:
      false

       

      提示:

      • m == board.length
      • n = board[i].length
      • 1 <= m, n <= 6
      • 1 <= word.length <= 15
      • boardword 仅由大小写英文字母组成

       

      进阶:你可以使用搜索剪枝的技术来优化解决方案,使其在 board 更大的情况下可以更快解决问题?

      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/solution.cpp" new file mode 100644 index 000000000..19ab6b777 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/78_\345\215\225\350\257\215\346\220\234\347\264\242/solution.cpp" @@ -0,0 +1,68 @@ +#include +#include +#include +#include +static bool dfs(char *word, char **board, bool *used, + int row, int col, int row_size, int col_size) +{ + if (board[row][col] != *word) + { + return false; + } + used[row * col_size + col] = true; + if (*(word + 1) == '\0') + { + return true; + } + bool result = false; + if (row > 0 && !used[(row - 1) * col_size + col]) + { + result = dfs(word + 1, board, used, row - 1, col, row_size, col_size); + } + if (!result && row < row_size - 1 && !used[(row + 1) * col_size + col]) + { + result = dfs(word + 1, board, used, row + 1, col, row_size, col_size); + } + if (!result && col > 0 && !used[row * col_size + col - 1]) + { + result = dfs(word + 1, board, used, row, col - 1, row_size, col_size); + } + if (!result && col < col_size - 1 && !used[row * col_size + col + 1]) + { + result = dfs(word + 1, board, used, row, col + 1, row_size, col_size); + } + used[row * col_size + col] = false; + return result; +} +static bool exist(char **board, int boardRowSize, int boardColSize, char *word) +{ + int i, j; + int len = strlen(word); + if (len > boardRowSize * boardColSize) + { + return false; + } + bool *used = malloc(boardRowSize * boardColSize); + for (i = 0; i < boardRowSize; i++) + { + for (j = 0; j < boardColSize; j++) + { + memset(used, false, boardRowSize * boardColSize); + if (dfs(word, board, used, i, j, boardRowSize, boardColSize)) + { + return true; + } + } + } + return false; +} +int main(int argc, char **argv) +{ + if (argc < 3) + { + fprintf(stderr, "Usage: ./test word row1 row2...\n"); + exit(-1); + } + printf("%s\n", exist(argv + 2, argc - 2, strlen(argv[2]), argv[1]) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/desc.html" new file mode 100644 index 000000000..af2e6a569 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/desc.html" @@ -0,0 +1,28 @@ +

      给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。

      +

      不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

      +

       

      +

      说明:

      +

      为什么返回数值是整数,但输出的答案是数组呢?

      +

      请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

      +

      你可以想象内部操作如下:

      +
      +    // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
      +    int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。
      +    // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
      +    for (int i = 0; i < len; i++) {
      +            print(nums[i]);
      +    }
      +

       

      +

      示例 1:

      +
      输入:nums = [1,1,1,2,2,3]
      输出:
      5, nums = [1,1,2,2,3]
      解释:
      函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 不需要考虑数组中超出新长度后面的元素。
      +

      示例 2:

      +
      输入:nums = [0,0,1,1,1,1,2,3,3]
      输出:
      7, nums = [0,0,1,1,2,3,3]
      解释:
      函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 不需要考虑数组中超出新长度后面的元素。
      +

       

      +

      提示:

      +
        +
      • 1 <= nums.length <= 3 * 104
      • +
      • -104 <= nums[i] <= 104
      • +
      • nums 已按升序排列
      • +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/solution.cpp" new file mode 100644 index 000000000..033af79f9 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/79_\345\210\240\351\231\244\346\234\211\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271 II/solution.cpp" @@ -0,0 +1,44 @@ +#include +#include +static int removeDuplicates(int *nums, int numsSize) +{ + if (numsSize == 0) + { + return 0; + } + int i; + int len = 0; + int count = 1; + for (i = 1; i < numsSize; i++) + { + if (nums[len] == nums[i]) + { + if (count < 2) + { + count++; + nums[++len] = nums[i]; + } + } + else + { + count = 1; + nums[++len] = nums[i]; + } + } + return len + 1; +} +int main(int argc, char **argv) +{ + int i, count = argc - 1; + int *nums = malloc(count * sizeof(int)); + for (i = 0; i < count; i++) + { + nums[i] = atoi(argv[i + 1]); + } + count = removeDuplicates(nums, count); + for (i = 0; i < count; i++) + { + printf("%d ", nums[i]); + } + printf("\n"); +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/desc.html" new file mode 100644 index 000000000..306518517 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/desc.html" @@ -0,0 +1,109 @@ +
      +

      请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

      + +

      函数 myAtoi(string s) 的算法如下:

      + +
        +
      • 读入字符串并丢弃无用的前导空格
      • +
      • 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
      • +
      • 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
      • +
      • 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
      • +
      • 如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] + ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 + 231 − 1 的整数应该被固定为 231 − 1 。 +
      • +
      • 返回整数作为最终结果。
      • +
      + +

      注意:

      + +
        +
      • 本题中的空白字符只包括空格字符 ' '
      • +
      • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
      • +
      + +

       

      + +

      示例 1:

      + +
      输入:s = "42"
      +
      输出:
      42 +
      解释:
      加粗的字符串为已经读入的字符,插入符号是当前读取的字符。 +第 1 步:"42"(当前没有读入字符,因为没有前导空格) + ^ +第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') + ^ +第 3 步:"42"(读入 "42") + ^ +解析得到整数 42 。 +由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。
      + +

      示例 2:

      + +
      输入:s = "   -42"
      +
      输出:
      -42 +
      解释:
      +第 1 步:" -42"(读入前导空格,但忽视掉) + ^ +第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数) + ^ +第 3 步:" -42"(读入 "42") + ^ +解析得到整数 -42 。 +由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。 +
      + +

      示例 3:

      + +
      输入:s = "4193 with words"
      +
      输出:
      4193 +
      解释:
      +第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格) + ^ +第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+') + ^ +第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止) + ^ +解析得到整数 4193 。 +由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。 +
      + +

      示例 4:

      + +
      输入:s = "words and 987"
      +
      输出:
      0 +
      解释:
      +第 1 步:"words and 987"(当前没有读入字符,因为没有前导空格) + ^ +第 2 步:"words and 987"(当前没有读入字符,因为这里不存在 '-' 或者 '+') + ^ +第 3 步:"words and 987"(由于当前字符 'w' 不是一个数字,所以读入停止) + ^ +解析得到整数 0 ,因为没有读入任何数字。 +由于 0 在范围 [-231, 231 - 1] 内,最终结果为 0 。
      + +

      示例 5:

      + +
      输入:s = "-91283472332"
      +
      输出:
      -2147483648 +
      解释:
      +第 1 步:"-91283472332"(当前没有读入字符,因为没有前导空格) + ^ +第 2 步:"-91283472332"(读入 '-' 字符,所以结果应该是负数) + ^ +第 3 步:"-91283472332"(读入 "91283472332") + ^ +解析得到整数 -91283472332 。 +由于 -91283472332 小于范围 [-231, 231 - 1] 的下界,最终结果被截断为 -231 = -2147483648 。
      + +

       

      + +

      提示:

      + +
        +
      • 0 <= s.length <= 200
      • +
      • s 由英文字母(大写和小写)、数字(0-9)、' ''+''-' 和 + '.' 组成 +
      • +
      +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/solution.cpp" new file mode 100644 index 000000000..ded96adaa --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/7_\345\255\227\347\254\246\344\270\262\350\275\254\346\215\242\346\225\264\346\225\260 (atoi)/solution.cpp" @@ -0,0 +1,41 @@ +int myAtoi(char *str) +{ + int i = 0; + int sign = 0; + while (str[i] && str[i] == ' ') + i++; + if (str[i] == NULL) + return 0; + if (str[i] == '-') + { + sign = 1; + i++; + } + else if (str[i] == '+') + { + sign = 0; + i++; + } + else if (str[i] < '0') + return 0; + else if (str[i] > '9') + return 0; + long long int r = 0; + while (str[i]) + { + if (str[i] < '0') + break; + else if (str[i] > '9') + break; + else + r = r * 10 + str[i++] - '0'; + if (r > INT_MAX) + break; + } + r = sign ? -r : r; + if (r < INT_MIN) + return INT_MIN; + if (r > INT_MAX) + return INT_MAX; + return (int)r; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/desc.html" new file mode 100644 index 000000000..0e811baae --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/desc.html" @@ -0,0 +1,30 @@ +

      已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

      +

      在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 + ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 + 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 + [4,5,6,6,7,0,1,2,4,4] 。 +

      +

      给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 + nums 中存在这个目标值 target ,则返回 true ,否则返回 false 。 +

      +

       

      +

      示例 1:

      +
      输入:nums = [2,5,6,0,0,1,2], target = 0
      输出:
      true
      +

      示例 2:

      +
      输入:nums = [2,5,6,0,0,1,2], target = 3
      输出:
      false
      +

       

      +

      提示:

      +
        +
      • 1 <= nums.length <= 5000
      • +
      • -104 <= nums[i] <= 104
      • +
      • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
      • +
      • -104 <= target <= 104
      • +
      +

       

      +

      进阶:

      +
        +
      • 这是 搜索旋转排序数组 的延伸题目,本题中的 nums  + 可能包含重复元素。
      • +
      • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
      • +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/solution.cpp" new file mode 100644 index 000000000..989beac50 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/80_\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204 II/solution.cpp" @@ -0,0 +1,57 @@ +#include +#include +#include +static bool search(int *nums, int numsSize, int target) +{ + int lo = 0; + int hi = numsSize - 1; + while (lo <= hi) + { + int mid = lo + (hi - lo) / 2; + if (nums[mid] == target) + { + return true; + } + if (nums[lo] == nums[mid] && nums[mid] == nums[hi]) + { + lo++; + hi--; + } + else if (nums[lo] <= nums[mid]) + { + if (nums[lo] <= target && target < nums[mid]) + { + hi = mid - 1; + } + else + { + lo = mid + 1; + } + } + else + { + if (nums[mid] < target && target <= nums[hi]) + { + lo = mid + 1; + } + else + { + hi = mid - 1; + } + } + } + return false; +} +int main(int argc, char **argv) +{ + int i; + int target = atoi(argv[1]); + int size = argc - 2; + int *nums = malloc(size * sizeof(int)); + for (i = 0; i < argc - 2; i++) + { + nums[i] = atoi(argv[i + 2]); + } + printf("%d\n", search(nums, size, target)); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/desc.html" new file mode 100644 index 000000000..96eb96169 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/desc.html" @@ -0,0 +1 @@ +

      存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

      返回同样按升序排列的结果链表。

       

      示例 1:

      输入:head = [1,2,3,3,4,4,5]
      输出:
      [1,2,5]

      示例 2:

      输入:head = [1,1,1,2,3]
      输出:
      [2,3]

       

      提示:

      • 链表中节点数目在范围 [0, 300]
      • -100 <= Node.val <= 100
      • 题目数据保证链表已经按升序排列
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/solution.cpp" new file mode 100644 index 000000000..c2fef4977 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/81_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240 II/solution.cpp" @@ -0,0 +1,63 @@ +#include +#include +struct ListNode +{ + int val; + struct ListNode *next; +}; +struct ListNode *deleteDuplicates(struct ListNode *head) +{ + struct ListNode dummy; + struct ListNode *p, *q, *prev; + prev = &dummy; + dummy.next = head; + p = q = head; + while (p != NULL) + { + while (q != NULL && q->val == p->val) + { + q = q->next; + } + if (p->next == q) + { + prev = p; + } + else + { + prev->next = q; + } + p = q; + } + return dummy.next; +} +int main(int argc, char **argv) +{ + int i; + struct ListNode *head = NULL; + struct ListNode *prev = NULL; + struct ListNode *p; + for (i = 0; i < argc - 1; i++) + { + p = malloc(sizeof(*p)); + p->val = atoi(argv[i + 1]); + p->next = NULL; + if (head == NULL) + { + head = p; + prev = head; + } + else + { + prev->next = p; + prev = p; + } + } + p = deleteDuplicates(head); + while (p != NULL) + { + printf("%d ", p->val); + p = p->next; + } + printf("\n"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/desc.html" new file mode 100644 index 000000000..380d1bf48 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/desc.html" @@ -0,0 +1 @@ +

      存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次

      返回同样按升序排列的结果链表。

       

      示例 1:

      输入:head = [1,1,2]
      输出:
      [1,2]

      示例 2:

      输入:head = [1,1,2,3,3]
      输出:
      [1,2,3]

       

      提示:

      • 链表中节点数目在范围 [0, 300]
      • -100 <= Node.val <= 100
      • 题目数据保证链表已经按升序排列
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/solution.cpp" new file mode 100644 index 000000000..fcd68c74c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/82_\345\210\240\351\231\244\346\216\222\345\272\217\351\223\276\350\241\250\344\270\255\347\232\204\351\207\215\345\244\215\345\205\203\347\264\240/solution.cpp" @@ -0,0 +1,34 @@ +#include +using namespace std; +struct ListNode +{ + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +class Solution +{ +public: + ListNode *deleteDuplicates(ListNode *head) + { + if (head == nullptr) + { + return nullptr; + } + ListNode *prev = head; + ListNode *p = prev->next; + while (p != nullptr) + { + if (p->val != prev->val) + { + prev->next = p; + prev = p; + } + p = p->next; + } + prev->next = p; + return head; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/desc.html" new file mode 100644 index 000000000..2bcf9513b --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/desc.html" @@ -0,0 +1 @@ +

      给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

      求在该柱状图中,能够勾勒出来的矩形的最大面积。

       

      以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]

       

      图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

       

      示例:

      输入: [2,1,5,6,2,3]
      输出:
      10
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/solution.cpp" new file mode 100644 index 000000000..0e7758843 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/83_\346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/solution.cpp" @@ -0,0 +1,42 @@ +#include +#include +static int largestRectangleArea(int *heights, int heightsSize) +{ + int *indexes = malloc(heightsSize * sizeof(int)); + int *left = malloc(heightsSize * sizeof(int)); + int *right = malloc(heightsSize * sizeof(int)); + int i, pos = 0; + for (i = 0; i < heightsSize; i++) + { + while (pos > 0 && heights[indexes[pos - 1]] >= heights[i]) + { + pos--; + } + left[i] = pos == 0 ? -1 : indexes[pos - 1]; + indexes[pos++] = i; + } + pos = 0; + for (i = heightsSize - 1; i >= 0; i--) + { + while (pos > 0 && heights[indexes[pos - 1]] >= heights[i]) + { + pos--; + } + right[i] = pos == 0 ? heightsSize : indexes[pos - 1]; + indexes[pos++] = i; + } + int max_area = 0; + for (i = 0; i < heightsSize; i++) + { + int area = heights[i] * (right[i] - left[i] - 1); + max_area = area > max_area ? area : max_area; + } + return max_area; +} +int main(void) +{ + int nums[] = {2, 1, 5, 6, 2, 3}; + int count = sizeof(nums) / sizeof(*nums); + printf("%d\n", largestRectangleArea(nums, count)); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/desc.html" new file mode 100644 index 000000000..6d9bdc4aa --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/desc.html" @@ -0,0 +1 @@ +

      给定一个仅包含 01 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

       

      示例 1:

      输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
      输出:
      6
      解释:
      最大矩形如上图所示。

      示例 2:

      输入:matrix = []
      输出:
      0

      示例 3:

      输入:matrix = [["0"]]
      输出:
      0

      示例 4:

      输入:matrix = [["1"]]
      输出:
      1

      示例 5:

      输入:matrix = [["0","0"]]
      输出:
      0

       

      提示:

      • rows == matrix.length
      • cols == matrix[0].length
      • 0 <= row, cols <= 200
      • matrix[i][j]'0''1'
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/solution.cpp" new file mode 100644 index 000000000..51b472439 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/84_\346\234\200\345\244\247\347\237\251\345\275\242/solution.cpp" @@ -0,0 +1,73 @@ +#include +#include +#include +#include +static inline int max(int a, int b) +{ + return a > b ? a : b; +} +static int area_calc(int *heights, int size) +{ + int *indexes = malloc(size * sizeof(int)); + int *lhist = malloc(size * sizeof(int)); + int *rhist = malloc(size * sizeof(int)); + int i, pos = 0; + for (i = 0; i < size; i++) + { + while (pos > 0 && heights[indexes[pos - 1]] >= heights[i]) + { + pos--; + } + lhist[i] = pos == 0 ? -1 : indexes[pos - 1]; + indexes[pos++] = i; + } + pos = 0; + for (i = size - 1; i >= 0; i--) + { + while (pos > 0 && heights[indexes[pos - 1]] >= heights[i]) + { + pos--; + } + rhist[i] = pos == 0 ? size : indexes[pos - 1]; + indexes[pos++] = i; + } + int max_area = 0; + for (i = 0; i < size; i++) + { + int area = heights[i] * (rhist[i] - lhist[i] - 1); + max_area = max(area, max_area); + } + return max_area; +} +static int maximalRectangle(char **matrix, int matrixRowSize, int matrixColSize) +{ + int i, j, max_area = 0; + int *heights = malloc(matrixColSize * sizeof(int)); + memset(heights, 0, matrixColSize * sizeof(int)); + for (i = 0; i < matrixRowSize; i++) + { + for (j = 0; j < matrixColSize; j++) + { + heights[j] = matrix[i][j] == '1' ? heights[j] + 1 : 0; + } + max_area = max(max_area, area_calc(heights, matrixColSize)); + } + return max_area; +} +int main(int argc, char **argv) +{ + if (argc < 2) + { + fprintf(stderr, "Usage: ./test row1 row2...\n"); + exit(-1); + } + int i, j; + int row_size = argc - 1; + int col_size = strlen(argv[1]); + for (i = 0; i < row_size; i++) + { + printf("%s\n", argv[i + 1]); + } + printf("%d\n", maximalRectangle(argv + 1, argc - 1, strlen(argv[1]))); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/desc.html" new file mode 100644 index 000000000..2962177ef --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/desc.html" @@ -0,0 +1 @@ +

      给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

      你应当 保留 两个分区中每个节点的初始相对位置。

       

      示例 1:

      输入:head = [1,4,3,2,5,2], x = 3
      输出
      :[1,2,2,4,3,5]

      示例 2:

      输入:head = [2,1], x = 2
      输出
      :[1,2]

       

      提示:

      • 链表中节点的数目在范围 [0, 200]
      • -100 <= Node.val <= 100
      • -200 <= x <= 200
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/solution.cpp" new file mode 100644 index 000000000..3cabea1af --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/85_\345\210\206\351\232\224\351\223\276\350\241\250/solution.cpp" @@ -0,0 +1,76 @@ +#include +#include +struct ListNode +{ + int val; + struct ListNode *next; +}; +struct ListNode *partition(struct ListNode *head, int x) +{ + struct ListNode dummy; + struct ListNode *prev1 = &dummy, *pivot; + dummy.next = head; + for (pivot = head; pivot != NULL; pivot = pivot->next) + { + if (pivot->val >= x) + { + break; + } + prev1 = pivot; + } + struct ListNode *p = pivot->next; + struct ListNode *prev2 = pivot; + while (p != NULL) + { + if (p->val < x) + { + prev2->next = p->next; + p->next = prev1->next; + prev1->next = p; + prev1 = p; + p = prev2->next; + } + else + { + prev2 = p; + p = p->next; + } + } + return dummy.next; +} +int main(int argc, char **argv) +{ + if (argc < 2) + { + fprintf(stderr, "Usage: ./test target n1 n2 n3...\n"); + exit(-1); + } + int i, target = atoi(argv[1]); + struct ListNode *head = NULL; + struct ListNode *prev = NULL; + struct ListNode *p; + for (i = 0; i < argc - 2; i++) + { + p = malloc(sizeof(*p)); + p->val = atoi(argv[i + 2]); + p->next = NULL; + if (head == NULL) + { + head = p; + prev = head; + } + else + { + prev->next = p; + prev = p; + } + } + p = partition(head, target); + while (p != NULL) + { + printf("%d ", p->val); + p = p->next; + } + printf("\n"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/desc.html" new file mode 100644 index 000000000..dcca706ce --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/desc.html" @@ -0,0 +1,59 @@ +
      使用下面描述的算法可以扰乱字符串 s 得到字符串 t : +
        +
      1. 如果字符串的长度为 1 ,算法停止
      2. +
      3. 如果字符串的长度 > 1 ,执行下述步骤: +
          +
        • 在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 xy + ,且满足 s = x + y
        • +
        • 随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 + s = x + y 或者 s = y + x 。 +
        • +
        • xy 这两个子字符串上继续从步骤 1 开始递归执行此算法。
        • +
        +
      4. +
      + +

      给你两个 长度相等 的字符串 s1 + 和 s2,判断 s2 是否是 s1 的扰乱字符串。如果是,返回 + true ;否则,返回 false 。 +

      + +

       

      + +

      示例 1:

      + +
      输入:s1 = "great", s2 = "rgeat"
      +
      输出:
      true +
      解释:
      s1 上可能发生的一种情形是: +"great" --> "gr/eat" // 在一个随机下标处分割得到两个子字符串 +"gr/eat" --> "gr/eat" // 随机决定:「保持这两个子字符串的顺序不变」 +"gr/eat" --> "g/r / e/at" // 在子字符串上递归执行此算法。两个子字符串分别在随机下标处进行一轮分割 +"g/r / e/at" --> "r/g / e/at" // 随机决定:第一组「交换两个子字符串」,第二组「保持这两个子字符串的顺序不变」 +"r/g / e/at" --> "r/g / e/ a/t" // 继续递归执行此算法,将 "at" 分割得到 "a/t" +"r/g / e/ a/t" --> "r/g / e/ a/t" // 随机决定:「保持这两个子字符串的顺序不变」 +算法终止,结果字符串和 s2 相同,都是 "rgeat" +这是一种能够扰乱 s1 得到 s2 的情形,可以认为 s2 是 s1 的扰乱字符串,返回 true +
      + +

      示例 2:

      + +
      输入:s1 = "abcde", s2 = "caebd"
      +
      输出:
      false +
      + +

      示例 3:

      + +
      输入:s1 = "a", s2 = "a"
      +
      输出:
      true +
      + +

       

      + +

      提示:

      + +
        +
      • s1.length == s2.length
      • +
      • 1 <= s1.length <= 30
      • +
      • s1s2 由小写英文字母组成
      • +
      +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/solution.cpp" new file mode 100644 index 000000000..39b717ec8 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/86_\346\211\260\344\271\261\345\255\227\347\254\246\344\270\262/solution.cpp" @@ -0,0 +1,63 @@ +#include +#include +#include +#include +static bool scramble(char *s1, int low1, int high1, char *s2, int low2, int high2) +{ + if (high1 - low1 != high2 - low2) + { + return false; + } + else if (!memcmp(s1 + low1, s2 + low2, high1 - low1 + 1)) + { + return true; + } + else + { + int i, c1[128] = {0}, c2[128] = {0}; + for (i = low1; i <= high1; i++) + { + c1[s1[i]]++; + } + for (i = low2; i <= high2; i++) + { + c2[s2[i]]++; + } + if (memcmp(c1, c2, 128 * sizeof(int))) + { + return false; + } + else + { + int len = high1 - low1 + 1; + for (i = 1; i < len; i++) + { + if (scramble(s1, low1, low1 + i - 1, s2, low2, low2 + i - 1) && + scramble(s1, low1 + i, high1, s2, low2 + i, high2)) + { + return true; + } + if (scramble(s1, low1, low1 + i - 1, s2, high2 - i + 1, high2) && + scramble(s1, low1 + i, high1, s2, low2, high2 - i)) + { + return true; + } + } + return false; + } + } +} +static bool isScramble(char *s1, char *s2) +{ + return scramble(s1, 0, strlen(s1) - 1, s2, 0, strlen(s2) - 1); +} +int main(int argc, char **argv) +{ + if (argc != 3) + { + fprintf(stderr, "Usage: ./test s1 s2\n"); + exit(-1); + } + printf("%s\n", isScramble(argv[1], argv[2]) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/desc.html" new file mode 100644 index 000000000..b32983576 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/desc.html" @@ -0,0 +1 @@ +

      给你两个有序整数数组 nums1 nums2,请你将 nums2 合并到 nums1 使 nums1 成为一个有序数组。

      初始化 nums1nums2 的元素数量分别为 mn 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。

       

      示例 1:

      输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
      输出:
      [1,2,2,3,5,6]

      示例 2:

      输入:nums1 = [1], m = 1, nums2 = [], n = 0
      输出:
      [1]

       

      提示:

      • nums1.length == m + n
      • nums2.length == n
      • 0 <= m, n <= 200
      • 1 <= m + n <= 200
      • -109 <= nums1[i], nums2[i] <= 109
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/solution.cpp" new file mode 100644 index 000000000..e5d43b3dd --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/87_\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/solution.cpp" @@ -0,0 +1,27 @@ +#include +using namespace std; +class Solution +{ +public: + void merge(vector &nums1, int m, vector &nums2, int n) + { + int i = m - 1; + int j = n - 1; + int k = nums1.size() - 1; + while (i >= 0 && j >= 0) + { + if (nums1[i] < nums2[j]) + { + nums1[k--] = nums2[j--]; + } + else + { + nums1[k--] = nums1[i--]; + } + } + while (j >= 0) + { + nums1[k--] = nums2[j--]; + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/desc.html" new file mode 100644 index 000000000..aeca3b47c --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/desc.html" @@ -0,0 +1,8 @@ +

      格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。

      +

      给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。即使有多个不同答案,你也只需要返回其中一种。

      +

      格雷编码序列必须以 0 开头。

      +

       

      +

      示例 1:

      +
      输入: 2
      输出:
       [0,1,3,2]
      解释:
      00 - 001 - 111 - 310 - 2对于给定的 n,其格雷编码序列并不唯一。例如,[0,2,3,1] 也是一个有效的格雷编码序列。00 - 010 - 211 - 301 - 1
      +

      示例 2:

      +
      输入: 0
      输出:
       [0]
      解释:
      我们定义格雷编码序列必须以 0 开头。给定编码总位数为 n 的格雷编码序列,其长度为 2n。当 n = 0 时,长度为 20 = 1。因此,当 n = 0 时,其格雷编码序列为 [0]。
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/solution.cpp" new file mode 100644 index 000000000..95b2724cb --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/88_\346\240\274\351\233\267\347\274\226\347\240\201/solution.cpp" @@ -0,0 +1,33 @@ +#include +#include +int *grayCode(int n, int *returnSize) +{ + if (n < 0) + { + return NULL; + } + int i, count = 1 << n; + int *codes = malloc(count * sizeof(int)); + for (i = 0; i < count; i++) + { + codes[i] = (i >> 1) ^ i; + } + *returnSize = 1 << n; + return codes; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test n\n"); + exit(-1); + } + int i, count; + int *list = grayCode(atoi(argv[1]), &count); + for (i = 0; i < count; i++) + { + printf("%d ", list[i]); + } + printf("\n"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/desc.html" new file mode 100644 index 000000000..ac437d3e5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/desc.html" @@ -0,0 +1 @@ +

      给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

      解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

       

      示例 1:

      输入:nums = [1,2,2]
      输出:
      [[],[1],[1,2],[1,2,2],[2],[2,2]]

      示例 2:

      输入:nums = [0]
      输出:
      [[],[0]]

       

      提示:

      • 1 <= nums.length <= 10
      • -10 <= nums[i] <= 10
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/solution.cpp" new file mode 100644 index 000000000..d9473a1d1 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/89_\345\255\220\351\233\206 II/solution.cpp" @@ -0,0 +1,30 @@ +#include +using namespace std; +class Solution +{ +public: + vector> subsetsWithDup(vector &nums) + { + vector> res; + sort(nums.begin(), nums.end()); + dfs(nums, 0, res); + return res; + } +private: + vector stack; + void dfs(vector &nums, int start, vector> &res) + { + res.push_back(stack); + int last = INT_MIN; + for (int i = start; i < nums.size(); i++) + { + if (last != nums[i]) + { + stack.push_back(nums[i]); + dfs(nums, i + 1, res); + stack.pop_back(); + } + last = nums[i]; + } + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/desc.html" new file mode 100644 index 000000000..97e9b415f --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/desc.html" @@ -0,0 +1 @@ +

      给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false

      回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

       

      示例 1:

      输入:x = 121
      输出:
      true

      示例 2:

      输入:x = -121
      输出:
      false
      解释:
      从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

      示例 3:

      输入:x = 10
      输出:
      false
      解释:
      从右向左读, 为 01 。因此它不是一个回文数。

      示例 4:

      输入:x = -101
      输出:
      false

       

      提示:

      • -231 <= x <= 231 - 1

       

      进阶:你能不将整数转为字符串来解决这个问题吗?

      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/solution.cpp" new file mode 100644 index 000000000..35aa41b87 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/8_\345\233\236\346\226\207\346\225\260/solution.cpp" @@ -0,0 +1,14 @@ +bool isPalindrome(int x) +{ + if (x < 0) + return false; + char r[11]; + int n = snprintf(r, 11, "%d", x); + int i; + for (i = 0; i < n / 2; i++) + { + if (r[i] != r[n - i - 1]) + return false; + } + return true; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/desc.html" new file mode 100644 index 000000000..2dfc923ff --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/desc.html" @@ -0,0 +1,27 @@ +

      一条包含字母 A-Z 的消息通过以下映射进行了 编码

      +
      'A' -> 1'B' -> 2...'Z' -> 26
      +

      解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

      +
        +
      • "AAJF" ,将消息分组为 (1 1 10 6)
      • +
      • "KJF" ,将消息分组为 (11 10 6)
      • +
      +

      注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 + "06" 在映射中并不等价。 +

      +

      给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数

      +

      题目数据保证答案肯定是一个 32 位 的整数。

      +

       

      +

      示例 1:

      +
      输入:s = "12"
      输出:
      2
      解释:
      它可以解码为 "AB"(1 2)或者 "L"(12)。
      +

      示例 2:

      +
      输入:s = "226"
      输出:
      3
      解释:
      它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
      +

      示例 3:

      +
      输入:s = "0"
      输出:
      0
      解释:
      没有字符映射到以 0 开头的数字。含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
      +

      示例 4:

      +
      输入:s = "06"
      输出:
      0
      解释:
      "06" 不能映射到 "F" ,因为字符串含有前导 0("6" 和 "06" 在映射中并不等价)。
      +

       

      +

      提示:

      +
        +
      • 1 <= s.length <= 100
      • +
      • s 只包含数字,并且可能包含前导零。
      • +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/solution.cpp" new file mode 100644 index 000000000..4b2cceb2a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/90_\350\247\243\347\240\201\346\226\271\346\263\225/solution.cpp" @@ -0,0 +1,36 @@ +#include +#include +#include +static int numDecodings(char *s) +{ + int len = strlen(s); + if (len == 0) + { + return 0; + } + int a = 1; + int b = s[0] == '0' ? 0 : a; + int c = b; + for (int i = 2; i <= len; i++) + { + c = s[i - 1] == '0' ? 0 : b; + int num = (s[i - 2] - '0') * 10 + (s[i - 1] - '0'); + if (num >= 10 && num <= 26) + { + c += a; + } + a = b; + b = c; + } + return c; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test number\n"); + exit(-1); + } + printf("%d\n", numDecodings(argv[1])); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/desc.html" new file mode 100644 index 000000000..a975784af --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/desc.html" @@ -0,0 +1 @@ +给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表

       

      示例 1:

      输入:head = [1,2,3,4,5], left = 2, right = 4
      输出:
      [1,4,3,2,5]

      示例 2:

      输入:head = [5], left = 1, right = 1
      输出:
      [5]

       

      提示:

      • 链表中节点数目为 n
      • 1 <= n <= 500
      • -500 <= Node.val <= 500
      • 1 <= left <= right <= n

       

      进阶: 你可以使用一趟扫描完成反转吗?

      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/solution.cpp" new file mode 100644 index 000000000..a2fb365df --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/91_\345\217\215\350\275\254\351\223\276\350\241\250 II/solution.cpp" @@ -0,0 +1,56 @@ +#include +#include +struct ListNode +{ + int val; + struct ListNode *next; +}; +static struct ListNode *reverseBetween(struct ListNode *head, int m, int n) +{ + int i; + struct ListNode dummy; + struct ListNode *prev = &dummy; + prev->next = head; + for (i = 1; i < m; i++) + { + prev = prev->next; + } + struct ListNode *p = prev->next; + for (i = m; i < n; i++) + { + struct ListNode *q = p->next; + p->next = q->next; + q->next = prev->next; + prev->next = q; + } + return dummy.next; +} +int main(int argc, char **argv) +{ + if (argc < 3) + { + fprintf(stderr, "Usage: ./test m n 1 2 3...\n"); + exit(-1); + } + int i, count = argc - 3; + struct ListNode dummy; + struct ListNode *prev = &dummy; + struct ListNode *p; + for (i = 0; i < count; i++) + { + p = malloc(sizeof(*p)); + p->val = atoi(argv[i + 3]); + p->next = NULL; + prev->next = p; + prev = p; + } + int m = atoi(argv[1]); + int n = atoi(argv[2]); + struct ListNode *head = reverseBetween(dummy.next, m, n); + for (p = head; p != NULL; p = p->next) + { + printf("%d ", p->val); + } + printf("\n"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/desc.html" new file mode 100644 index 000000000..46580cf36 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/desc.html" @@ -0,0 +1 @@ +

      给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。

      有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

      例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

       

      示例 1:

      输入:s = "25525511135"
      输出:
      ["255.255.11.135","255.255.111.35"]

      示例 2:

      输入:s = "0000"
      输出:
      ["0.0.0.0"]

      示例 3:

      输入:s = "1111"
      输出:
      ["1.1.1.1"]

      示例 4:

      输入:s = "010010"
      输出:
      ["0.10.0.10","0.100.1.0"]

      示例 5:

      输入:s = "101023"
      输出:
      ["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

       

      提示:

      • 0 <= s.length <= 3000
      • s 仅由数字组成
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/solution.cpp" new file mode 100644 index 000000000..595b14ddf --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/92_\345\244\215\345\216\237 IP \345\234\260\345\235\200/solution.cpp" @@ -0,0 +1,87 @@ +#include +#include +#include +#include +static bool valid(char *ip, int len) +{ + if (len > 1 && ip[0] == '0') + { + return false; + } + if (len == 3) + { + int n = (ip[0] - '0') * 100 + (ip[1] - '0') * 10 + (ip[2] - '0'); + if (n > 255) + { + return false; + } + } + return true; +} +#define WIDTH 4 +static void dfs(char *s, int start, char *stack, int num, char **results, int *count) +{ + int i, j; + if (num == 4) + { + if (s[start] == '\0') + { + results[*count] = malloc(3 * 4 + 3 + 1); + char *p = results[*count]; + for (j = 0; j < num; j++) + { + char *q = stack + j * WIDTH; + while ((*p++ = *q++) != '\0') + { + } + if (j != 3) + { + *(p - 1) = '.'; + } + } + (*count)++; + } + } + else + { + char *p = stack + num * WIDTH; + char *q = p; + for (i = start; s[i] != '\0' && i < start + 3; i++) + { + *q++ = s[i]; + *q = '\0'; + if (!valid(p, q - p)) + { + return; + } + dfs(s, i + 1, stack, num + 1, results, count); + if (num + 1 < 4) + { + memset(stack + (num + 1) * WIDTH, 0, WIDTH); + } + } + } +} +static char **restoreIpAddresses(char *s, int *returnSize) +{ + int count = 0; + char **results = malloc(100 * sizeof(char *)); + char addr[16] = {'\0'}; + dfs(s, 0, addr, 0, results, &count); + *returnSize = count; + return results; +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test num\n"); + exit(-1); + } + int i, count = 0; + char **list = restoreIpAddresses(argv[1], &count); + for (i = 0; i < count; i++) + { + printf("%s\n", list[i]); + } +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/desc.html" new file mode 100644 index 000000000..3ec64b13a --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/desc.html" @@ -0,0 +1 @@ +

      给定一个二叉树的根节点 root ,返回它的 中序 遍历。

       

      示例 1:

      输入:root = [1,null,2,3]
      输出:
      [1,3,2]

      示例 2:

      输入:root = []
      输出:
      []

      示例 3:

      输入:root = [1]
      输出:
      [1]

      示例 4:

      输入:root = [1,2]
      输出:
      [2,1]

      示例 5:

      输入:root = [1,null,2]
      输出:
      [1,2]

       

      提示:

      • 树中节点数目在范围 [0, 100]
      • -100 <= Node.val <= 100

       

      进阶: 递归算法很简单,你可以通过迭代算法完成吗?

      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/solution.cpp" new file mode 100644 index 000000000..793341422 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/93_\344\272\214\345\217\211\346\240\221\347\232\204\344\270\255\345\272\217\351\201\215\345\216\206/solution.cpp" @@ -0,0 +1,38 @@ +#include +#include +struct TreeNode +{ + int val; + struct TreeNode *left; + struct TreeNode *right; +}; +static void traverse(struct TreeNode *node, int *result, int *count) +{ + if (node == NULL) + { + return; + } + traverse(node->left, result, count); + result[*count] = node->val; + (*count)++; + traverse(node->right, result, count); +} +static int *inorderTraversal(struct TreeNode *root, int *returnSize) +{ + if (root == NULL) + { + *returnSize = 0; + return NULL; + } + int count = 0; + int *result = malloc(5000 * sizeof(int)); + traverse(root, result, &count); + *returnSize = count; + return result; +} +int main() +{ + int count = 0; + inorderTraversal(NULL, &count); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/desc.html" new file mode 100644 index 000000000..88428f902 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/desc.html" @@ -0,0 +1,32 @@ +
      +

      给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1n 互不相同的不同 + 二叉搜索树 。可以按 任意顺序 返回答案。 +

      + +

       

      + +
      +
      +

      示例 1:

      + +
      输入:n = 3
      +
      输出:
      [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]] +
      + +

      示例 2:

      + +
      输入:n = 1
      +
      输出:
      [[1]] +
      + +

       

      + +

      提示:

      + +
        +
      • 1 <= n <= 8
      • +
      +
      +
      +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/solution.cpp" new file mode 100644 index 000000000..3948594b4 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/94_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221 II/solution.cpp" @@ -0,0 +1,107 @@ +#include +#include +struct TreeNode +{ + int val; + struct TreeNode *left; + struct TreeNode *right; +}; +static struct TreeNode *dfs(int low, int high, int *count) +{ + int i, j, k; + if (low > high) + { + *count = 0; + return NULL; + } + else if (low == high) + { + struct TreeNode *node = malloc(sizeof(*node)); + node->val = low; + node->left = NULL; + node->right = NULL; + *count = 1; + return node; + } + else + { + *count = 0; + int capacity = 5; + struct TreeNode *roots = malloc(capacity * sizeof(struct TreeNode)); + for (i = low; i <= high; i++) + { + int left_cnt, right_cnt; + struct TreeNode *left_subs = dfs(low, i - 1, &left_cnt); + struct TreeNode *right_subs = dfs(i + 1, high, &right_cnt); + if (left_cnt == 0) + left_cnt = 1; + if (right_cnt == 0) + right_cnt = 1; + if (*count + (left_cnt * right_cnt) >= capacity) + { + capacity *= 2; + capacity += left_cnt * right_cnt; + roots = realloc(roots, capacity * sizeof(struct TreeNode)); + } + for (j = 0; j < left_cnt; j++) + { + for (k = 0; k < right_cnt; k++) + { + roots[*count].val = i; + roots[*count].left = left_subs == NULL ? NULL : &left_subs[j]; + roots[*count].right = right_subs == NULL ? NULL : &right_subs[k]; + (*count)++; + } + } + } + return roots; + } +} +static struct TreeNode **generateTrees(int n, int *returnSize) +{ + int i, count = 0; + struct TreeNode *roots = dfs(1, n, &count); + struct TreeNode **results = malloc(count * sizeof(struct TreeNode *)); + for (i = 0; i < count; i++) + { + results[i] = &roots[i]; + } + *returnSize = count; + return results; +} +static void dump(struct TreeNode *node) +{ + printf("%d ", node->val); + if (node->left != NULL) + { + dump(node->left); + } + else + { + printf("# "); + } + if (node->right != NULL) + { + dump(node->right); + } + else + { + printf("# "); + } +} +int main(int argc, char **argv) +{ + if (argc != 2) + { + fprintf(stderr, "Usage: ./test n\n"); + exit(-1); + } + int i, count = 0; + struct TreeNode **results = generateTrees(atoi(argv[1]), &count); + for (i = 0; i < count; i++) + { + dump(results[i]); + printf("\n"); + } + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" new file mode 100644 index 000000000..c0050e32d --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" @@ -0,0 +1,27 @@ +
      +

      给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 + 有多少种?返回满足题意的二叉搜索树的种数。

      + +

       

      + +

      示例 1:

      + +
      输入:n = 3
      +
      输出:
      5 +
      + +

      示例 2:

      + +
      输入:n = 1
      +
      输出:
      1 +
      + +

       

      + +

      提示:

      + +
        +
      • 1 <= n <= 19
      • +
      +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" new file mode 100644 index 000000000..f09edabce --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/95_\344\270\215\345\220\214\347\232\204\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" @@ -0,0 +1,19 @@ +#include +using namespace std; +class Solution +{ +public: + int numTrees(int n) + { + vector sum(n + 1); + sum[0] = 1; + for (int i = 1; i <= n; i++) + { + for (int j = 0; j < i; j++) + { + sum[i] += sum[j] * sum[i - j - 1]; + } + } + return sum[n]; + } +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/desc.html" new file mode 100644 index 000000000..7dfd6b6e4 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/desc.html" @@ -0,0 +1 @@ +

      给定三个字符串 s1s2s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。

      两个字符串 st 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:

      • s = s1 + s2 + ... + sn
      • t = t1 + t2 + ... + tm
      • |n - m| <= 1
      • 交错s1 + t1 + s2 + t2 + s3 + t3 + ... 或者 t1 + s1 + t2 + s2 + t3 + s3 + ...

      提示:a + b 意味着字符串 ab 连接。

       

      示例 1:

      输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbcbcac"
      输出:
      true

      示例 2:

      输入:s1 = "aabcc", s2 = "dbbca", s3 = "aadbbbaccc"
      输出:
      false

      示例 3:

      输入:s1 = "", s2 = "", s3 = ""
      输出:
      true

       

      提示:

      • 0 <= s1.length, s2.length <= 100
      • 0 <= s3.length <= 200
      • s1s2、和 s3 都由小写英文字母组成
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/solution.cpp" new file mode 100644 index 000000000..9c7733164 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/96_\344\272\244\351\224\231\345\255\227\347\254\246\344\270\262/solution.cpp" @@ -0,0 +1,50 @@ +#include +#include +#include +#include +static bool isInterleave(char *s1, char *s2, char *s3) +{ + int i, j; + int len1 = strlen(s1); + int len2 = strlen(s2); + int len3 = strlen(s3); + if (len1 + len2 != len3) + { + return false; + } + bool *table = malloc((len1 + 1) * (len2 + 1) * sizeof(bool)); + bool **dp = malloc((len1 + 1) * sizeof(bool *)); + for (i = 0; i < len1 + 1; i++) + { + dp[i] = &table[i * (len2 + 1)]; + } + dp[0][0] = true; + for (i = 1; i < len1 + 1; i++) + { + dp[i][0] = dp[i - 1][0] && s1[i - 1] == s3[i - 1]; + } + for (i = 1; i < len2 + 1; i++) + { + dp[0][i] = dp[0][i - 1] && s2[i - 1] == s3[i - 1]; + } + for (i = 1; i < len1 + 1; i++) + { + for (j = 1; j < len2 + 1; j++) + { + bool up = dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]; + bool left = dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]; + dp[i][j] = up || left; + } + } + return dp[len1][len2]; +} +int main(int argc, char **argv) +{ + if (argc != 4) + { + fprintf(stderr, "Usage: ./test s1 s2 s3\n"); + exit(-1); + } + printf("%s\n", isInterleave(argv[1], argv[2], argv[3]) ? "true" : "false"); + return 0; +} \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" new file mode 100644 index 000000000..d66bc8eb7 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" @@ -0,0 +1,35 @@ +
      +

      给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

      + +

      有效 二叉搜索树定义如下:

      + +
        +
      • 节点的左子树只包含 小于 当前节点的数。
      • +
      • 节点的右子树只包含 大于 当前节点的数。
      • +
      • 所有左子树和右子树自身必须也是二叉搜索树。
      • +
      + +

       

      + +

      示例 1:

      + +
      输入:root = [2,1,3]
      +
      输出:
      true +
      + +

      示例 2:

      + +
      输入:root = [5,1,4,null,null,3,6]
      +
      输出:
      false +
      解释:
      根节点的值是 5 ,但是右子节点的值是 4 。 +
      + +

       

      + +

      提示:

      + +
        +
      • 树中节点数目范围在[1, 104]
      • +
      • -231 <= Node.val <= 231 - 1
      • +
      +
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" new file mode 100644 index 000000000..1a1e24e10 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/97_\351\252\214\350\257\201\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" @@ -0,0 +1,42 @@ +#include +using namespace std; +struct TreeNode +{ + int val; + TreeNode *left; + TreeNode *right; + TreeNode() : val(0), left(nullptr), right(nullptr) {} + TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} +}; +class Solution +{ +public: + bool isValidBST(TreeNode *root) + { + stack stk; + int prev = INT_MIN; + bool first = true; + while (!stk.empty() || root != nullptr) + { + if (root != nullptr) + { + stk.push(root); + root = root->left; + } + else + { + root = stk.top(); + stk.pop(); + if (!first && prev >= root->val) + { + return false; + } + first = false; + prev = root->val; + root = root->right; + } + } + return true; + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" new file mode 100644 index 000000000..a4c049d29 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/desc.html" @@ -0,0 +1 @@ +

      给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。

      进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

       

      示例 1:

      输入:root = [1,3,null,null,2]
      输出:
      [3,1,null,null,2]
      解释:
      3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。

      示例 2:

      输入:root = [3,1,4,null,null,2]
      输出:
      [2,1,4,null,null,3]
      解释:
      2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。

       

      提示:

      • 树上节点的数目在范围 [2, 1000]
      • -231 <= Node.val <= 231 - 1
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" new file mode 100644 index 000000000..9a885cee5 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/98_\346\201\242\345\244\215\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221/solution.cpp" @@ -0,0 +1,49 @@ +#include +using namespace std; +struct TreeNode +{ + int val; + TreeNode *left; + TreeNode *right; + TreeNode() : val(0), left(nullptr), right(nullptr) {} + TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} +}; +class Solution +{ +public: + void recoverTree(TreeNode *root) + { + dfs(root); + int tmp = p0_->val; + p0_->val = p1_->val; + p1_->val = tmp; + } +private: + int wrong_ = 0; + TreeNode *prev_ = nullptr; + TreeNode *p0_ = nullptr; + TreeNode *p1_ = nullptr; + void dfs(TreeNode *root) + { + if (root == nullptr || wrong_ == 2) + { + return; + } + dfs(root->left); + if (prev_ != nullptr && prev_->val > root->val) + { + if (++wrong_ == 1) + { + p0_ = prev_; + p1_ = root; + } + else if (wrong_ == 2) + { + p1_ = root; + } + } + prev_ = root; + dfs(root->right); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/desc.html" new file mode 100644 index 000000000..2d8a4c002 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/desc.html" @@ -0,0 +1 @@ +

      给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

      如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

       

      示例 1:

      输入:p = [1,2,3], q = [1,2,3]
      输出:
      true

      示例 2:

      输入:p = [1,2], q = [1,null,2]
      输出:
      false

      示例 3:

      输入:p = [1,2,1], q = [1,1,2]
      输出:
      false

       

      提示:

      • 两棵树上的节点数目都在范围 [0, 100]
      • -104 <= Node.val <= 104
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/solution.cpp" new file mode 100644 index 000000000..d46533601 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/99_\347\233\270\345\220\214\347\232\204\346\240\221/solution.cpp" @@ -0,0 +1,31 @@ +#include +using namespace std; +struct TreeNode +{ + int val; + TreeNode *left; + TreeNode *right; + TreeNode() : val(0), left(nullptr), right(nullptr) {} + TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} +}; +class Solution +{ +public: + bool isSameTree(TreeNode *p, TreeNode *q) + { + if (p == nullptr && q == nullptr) + { + return true; + } + if (p == nullptr || q == nullptr) + { + return false; + } + if (p->val != q->val) + { + return false; + } + return isSameTree(p->left, q->left) && isSameTree(p->right, q->right); + } +}; \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/desc.html" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/desc.html" new file mode 100644 index 000000000..b04daa917 --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/desc.html" @@ -0,0 +1 @@ +

      给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。

      • '.' 匹配任意单个字符
      • '*' 匹配零个或多个前面的那一个元素

      所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

      示例 1:

      输入:s = "aa" p = "a"
      输出:
      false
      解释:
      "a" 无法匹配 "aa" 整个字符串。

      示例 2:

      输入:s = "aa" p = "a*"
      输出:
      true
      解释:
      因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。

      示例 3:

      输入:s = "ab" p = ".*"
      输出:
      true
      解释:
      ".*" 表示可匹配零个或多个('*')任意字符('.')。

      示例 4:

      输入:s = "aab" p = "c*a*b"
      输出:
      true
      解释:
      因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。

      示例 5:

      输入:s = "mississippi" p = "mis*is*p*."
      输出:
      false

       

      提示:

      • 0 <= s.length <= 20
      • 0 <= p.length <= 30
      • s 可能为空,且只包含从 a-z 的小写字母。
      • p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *
      • 保证每次出现字符 * 时,前面都匹配到有效的字符
      \ No newline at end of file diff --git "a/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/solution.cpp" "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/solution.cpp" new file mode 100644 index 000000000..0787cd12b --- /dev/null +++ "b/data/3.\347\256\227\346\263\225\351\253\230\351\230\266/1.leetcode/9_\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215/solution.cpp" @@ -0,0 +1,14 @@ +bool isMatch(char *s, char *p) +{ + if (!p || p[0] == NULL) + return (!s || s[0] == NULL); + bool head_match = (s && s[0] && (s[0] == p[0] || p[0] == '.')); + if (p[1] && p[1] == '*') + { + return (head_match && isMatch(s + 1, p)) || isMatch(s, p + 2); + } + else + { + return head_match && isMatch(s + 1, p + 1); + } +} \ No newline at end of file diff --git a/leetcode_helper.py b/leetcode_helper.py new file mode 100644 index 000000000..12b4a23da --- /dev/null +++ b/leetcode_helper.py @@ -0,0 +1,30 @@ +import os +import shutil +def leetcode_helper(): + data_dir = 'data/3.算法高阶/1.leetcode' + dailycode_exercises_dir = '/Users/zhangzc/Desktop/workplace/daily-code-data/data/input/dailycode/leetcode/exercises' + dirs_ = os.listdir(data_dir) + dirs = [] + for dir in dirs_: + dir = os.path.join(data_dir, dir) + if os.path.isdir(dir): + dirs.append(dir) + for dir in dirs: + assert os.path.isdir(dir) + exercises_id = dir.split('/')[-1].split('_')[0] + if 0 <= int(exercises_id) and int(exercises_id) < 100: + desc_src_path = os.path.join(os.path.join(dailycode_exercises_dir, exercises_id), '{}_desc.html'.format(exercises_id)) + cpp_code_src_path = os.path.join(os.path.join(dailycode_exercises_dir, exercises_id),'{}.cpp'.format(exercises_id)) + + + desc_dst_path = os.path.join(dir, 'desc.html') + cpp_code_dst_path = os.path.join(dir, 'solution.cpp') + + print(cpp_code_src_path) + print(cpp_code_dst_path) + shutil.copy(desc_src_path, desc_dst_path) + shutil.copy(cpp_code_src_path, cpp_code_dst_path) + else: + continue + +leetcode_helper() \ No newline at end of file -- GitLab