From cc1cc0ddbccfd2faf3175993333db10646a85353 Mon Sep 17 00:00:00 2001 From: YDZ Date: Mon, 24 Aug 2020 08:23:21 +0800 Subject: [PATCH] Change to zdoc --- website/config.toml | 114 +- website/content/ChapterFour/0001.Two-Sum.md | 50 - .../ChapterFour/0002.Add-Two-Numbers.md | 78 -- ...-Substring-Without-Repeating-Characters.md | 124 -- .../0004.Median-of-Two-Sorted-Arrays.md | 98 -- .../ChapterFour/0007.Reverse-Integer.md | 55 - .../ChapterFour/0009.Palindrome-Number.md | 69 - .../0011.Container-With-Most-Water.md | 59 - .../ChapterFour/0013.Roman-to-Integer.md | 132 -- website/content/ChapterFour/0015.3Sum.md | 83 -- .../content/ChapterFour/0016.3Sum-Closest.md | 89 -- website/content/ChapterFour/0018.4Sum.md | 97 -- .../0019.Remove-Nth-Node-From-End-of-List.md | 100 -- .../ChapterFour/0020.Valid-Parentheses.md | 96 -- .../0021.Merge-Two-Sorted-Lists.md | 53 - .../ChapterFour/0022.Generate-Parentheses.md | 60 - .../ChapterFour/0023.Merge-k-Sorted-Lists.md | 74 -- .../ChapterFour/0024.Swap-Nodes-in-Pairs.md | 71 - .../0025.Reverse-Nodes-in-k-Group.md | 74 -- ...026.Remove-Duplicates-from-Sorted-Array.md | 128 -- .../ChapterFour/0027.Remove-Element.md | 93 -- .../ChapterFour/0028.Implement-strStr.md | 86 -- .../ChapterFour/0029.Divide-Two-Integers.md | 148 --- ...bstring-with-Concatenation-of-All-Words.md | 98 -- .../0033.Search-in-Rotated-Sorted-Array.md | 78 -- ...ast-Position-of-Element-in-Sorted-Array.md | 121 -- .../0035.Search-Insert-Position.md | 65 - .../content/ChapterFour/0036.Valid-Sudoku.md | 168 --- .../content/ChapterFour/0037.Sudoku-Solver.md | 118 -- .../ChapterFour/0039.Combination-Sum.md | 87 -- .../ChapterFour/0040.Combination-Sum-II.md | 89 -- .../0041.First-Missing-Positive.md | 66 - .../ChapterFour/0042.Trapping-Rain-Water.md | 61 - .../content/ChapterFour/0046.Permutations.md | 66 - .../ChapterFour/0047.Permutations-II.md | 70 - .../content/ChapterFour/0048.Rotate-Image.md | 127 -- .../ChapterFour/0049.Group-Anagrams.md | 72 -- website/content/ChapterFour/0050.Powx-n.md | 69 - website/content/ChapterFour/0051.N-Queens.md | 134 -- .../content/ChapterFour/0052.N-Queens-II.md | 107 -- .../ChapterFour/0053.Maximum-Subarray.md | 75 -- .../content/ChapterFour/0054.Spiral-Matrix.md | 165 --- website/content/ChapterFour/0055.Jump-Game.md | 58 - .../ChapterFour/0056.Merge-Intervals.md | 109 -- .../ChapterFour/0057.Insert-Interval.md | 75 -- .../ChapterFour/0059.Spiral-Matrix-II.md | 94 -- .../ChapterFour/0060.Permutation-Sequence.md | 96 -- .../content/ChapterFour/0061.Rotate-List.md | 81 -- .../content/ChapterFour/0062.Unique-Paths.md | 69 - .../ChapterFour/0063.Unique-Paths-II.md | 80 -- .../ChapterFour/0064.Minimum-Path-Sum.md | 93 -- website/content/ChapterFour/0066.Plus-One.md | 63 - .../content/ChapterFour/0067.Add-Binary.md | 76 -- website/content/ChapterFour/0069.Sqrtx.md | 91 -- .../ChapterFour/0070.Climbing-Stairs.md | 55 - .../content/ChapterFour/0071.Simplify-Path.md | 117 -- .../ChapterFour/0074.Search-a-2D-Matrix.md | 72 -- .../content/ChapterFour/0075.Sort-Colors.md | 72 -- .../0076.Minimum-Window-Substring.md | 76 -- .../content/ChapterFour/0077.Combinations.md | 60 - website/content/ChapterFour/0078.Subsets.md | 105 -- .../content/ChapterFour/0079.Word-Search.md | 83 -- .../0081.Search-in-Rotated-Sorted-Array-II.md | 85 -- ...0083.Remove-Duplicates-from-Sorted-List.md | 66 - .../0084.Largest-Rectangle-in-Histogram.md | 75 -- .../ChapterFour/0086.Partition-List.md | 148 --- .../ChapterFour/0088.Merge-Sorted-Array.md | 69 - website/content/ChapterFour/0089.Gray-Code.md | 117 -- .../content/ChapterFour/0090.Subsets-II.md | 76 -- .../content/ChapterFour/0091.Decode-Ways.md | 82 -- .../0092.Reverse-Linked-List-II.md | 65 - .../ChapterFour/0093.Restore-IP-Addresses.md | 78 -- .../0094.Binary-Tree-Inorder-Traversal.md | 73 -- .../0096.Unique-Binary-Search-Trees.md | 53 - .../0098.Validate-Binary-Search-Tree.md | 99 -- .../0099.Recover-Binary-Search-Tree.md | 101 -- website/content/ChapterFour/0100.Same-Tree.md | 92 -- .../ChapterFour/0101.Symmetric-Tree.md | 71 - .../0102.Binary-Tree-Level-Order-Traversal.md | 115 -- .../0104.Maximum-Depth-of-Binary-Tree.md | 60 - ...ree-from-Preorder-and-Inorder-Traversal.md | 73 -- ...ee-from-Inorder-and-Postorder-Traversal.md | 71 - ...07.Binary-Tree-Level-Order-Traversal-II.md | 70 - ...vert-Sorted-Array-to-Binary-Search-Tree.md | 52 - ...nvert-Sorted-List-to-Binary-Search-Tree.md | 97 -- .../ChapterFour/0110.Balanced-Binary-Tree.md | 90 -- .../0111.Minimum-Depth-of-Binary-Tree.md | 62 - website/content/ChapterFour/0112.Path-Sum.md | 59 - .../content/ChapterFour/0113.Path-Sum-II.md | 108 -- ...0114.Flatten-Binary-Tree-to-Linked-List.md | 191 --- .../ChapterFour/0118.Pascals-Triangle.md | 60 - website/content/ChapterFour/0120.Triangle.md | 89 -- .../0121.Best-Time-to-Buy-and-Sell-Stock.md | 82 -- ...0122.Best-Time-to-Buy-and-Sell-Stock-II.md | 60 - .../0124.Binary-Tree-Maximum-Path-Sum.md | 80 -- .../ChapterFour/0125.Valid-Palindrome.md | 70 - .../ChapterFour/0126.Word-Ladder-II.md | 130 -- .../0128.Longest-Consecutive-Sequence.md | 139 -- .../0129.Sum-Root-to-Leaf-Numbers.md | 97 -- .../ChapterFour/0130.Surrounded-Regions.md | 126 -- .../0131.Palindrome-Partitioning.md | 121 -- .../content/ChapterFour/0136.Single-Number.md | 46 - .../ChapterFour/0137.Single-Number-II.md | 109 -- .../ChapterFour/0141.Linked-List-Cycle.md | 48 - .../ChapterFour/0142.Linked-List-Cycle-II.md | 109 -- .../content/ChapterFour/0143.Reorder-List.md | 127 -- .../0144.Binary-Tree-Preorder-Traversal.md | 112 -- .../0145.Binary-Tree-Postorder-Traversal.md | 71 - website/content/ChapterFour/0148.Sort-List.md | 95 -- .../0150.Evaluate-Reverse-Polish-Notation.md | 115 -- .../0151.Reverse-Words-in-a-String.md | 82 -- .../0152.Maximum-Product-Subarray.md | 52 - ...53.Find-Minimum-in-Rotated-Sorted-Array.md | 108 -- ...Find-Minimum-in-Rotated-Sorted-Array-II.md | 67 - website/content/ChapterFour/0155.Min-Stack.md | 87 -- .../0160.Intersection-of-Two-Linked-Lists.md | 116 -- .../ChapterFour/0162.Find-Peak-Element.md | 94 -- .../content/ChapterFour/0164.Maximum-Gap.md | 140 -- ...0167.Two-Sum-II---Input-array-is-sorted.md | 68 - .../0168.Excel-Sheet-Column-Title.md | 80 -- .../ChapterFour/0169.Majority-Element.md | 66 - .../0171.Excel-Sheet-Column-Number.md | 67 - .../0172.Factorial-Trailing-Zeroes.md | 51 - .../0173.Binary-Search-Tree-Iterator.md | 118 -- .../content/ChapterFour/0174.Dungeon-Game.md | 124 -- .../ChapterFour/0179.Largest-Number.md | 122 -- .../0187.Repeated-DNA-Sequences.md | 71 - .../content/ChapterFour/0190.Reverse-Bits.md | 53 - .../ChapterFour/0191.Number-of-1-Bits.md | 65 - .../content/ChapterFour/0198.House-Robber.md | 94 -- .../0199.Binary-Tree-Right-Side-View.md | 84 -- .../ChapterFour/0200.Number-of-Islands.md | 81 -- .../0201.Bitwise-AND-of-Numbers-Range.md | 66 - .../content/ChapterFour/0202.Happy-Number.md | 65 - .../0203.Remove-Linked-List-Elements.md | 56 - .../content/ChapterFour/0204.Count-Primes.md | 50 - .../ChapterFour/0205.Isomorphic-Strings.md | 90 -- .../ChapterFour/0206.Reverse-Linked-List.md | 47 - .../ChapterFour/0207.Course-Schedule.md | 82 -- .../0208.Implement-Trie-Prefix-Tree.md | 99 -- .../0209.Minimum-Size-Subarray-Sum.md | 61 - .../ChapterFour/0210.Course-Schedule-II.md | 80 -- ...and-Search-Word---Data-structure-design.md | 95 -- .../ChapterFour/0212.Word-Search-II.md | 57 - .../ChapterFour/0213.House-Robber-II.md | 70 - .../0215.Kth-Largest-Element-in-an-Array.md | 76 -- .../ChapterFour/0216.Combination-Sum-III.md | 73 -- .../ChapterFour/0217.Contains-Duplicate.md | 62 - .../ChapterFour/0218.The-Skyline-Problem.md | 287 ---- .../ChapterFour/0219.Contains-Duplicate-II.md | 69 - .../0220.Contains-Duplicate-III.md | 103 -- .../0222.Count-Complete-Tree-Nodes.md | 82 -- .../ChapterFour/0223.Rectangle-Area.md | 53 - .../0225.Implement-Stack-using-Queues.md | 95 -- .../ChapterFour/0226.Invert-Binary-Tree.md | 76 -- .../ChapterFour/0229.Majority-Element-II.md | 100 -- .../0230.Kth-Smallest-Element-in-a-BST.md | 78 -- .../content/ChapterFour/0231.Power-of-Two.md | 70 - .../0232.Implement-Queue-using-Stacks.md | 99 -- .../0234.Palindrome-Linked-List.md | 111 -- ...Common-Ancestor-of-a-Binary-Search-Tree.md | 72 -- ...Lowest-Common-Ancestor-of-a-Binary-Tree.md | 72 -- .../0237.Delete-Node-in-a-Linked-List.md | 72 -- .../0239.Sliding-Window-Maximum.md | 95 -- .../ChapterFour/0240.Search-a-2D-Matrix-II.md | 89 -- .../content/ChapterFour/0242.Valid-Anagram.md | 117 -- .../ChapterFour/0257.Binary-Tree-Paths.md | 71 - .../content/ChapterFour/0258.Add-Digits.md | 47 - .../ChapterFour/0260.Single-Number-III.md | 61 - .../content/ChapterFour/0263.Ugly-Number.md | 69 - .../ChapterFour/0268.Missing-Number.md | 47 - website/content/ChapterFour/0274.H-Index.md | 78 -- .../content/ChapterFour/0275.H-Index-II.md | 71 - .../content/ChapterFour/0283.Move-Zeroes.md | 55 - .../0287.Find-the-Duplicate-Number.md | 107 -- .../content/ChapterFour/0290.Word-Pattern.md | 98 -- .../0300.Longest-Increasing-Subsequence.md | 79 -- .../0303.Range-Sum-Query---Immutable.md | 110 -- .../ChapterFour/0306.Additive-Number.md | 89 -- .../0307.Range-Sum-Query---Mutable.md | 121 -- ...ime-to-Buy-and-Sell-Stock-with-Cooldown.md | 84 -- ...315.Count-of-Smaller-Numbers-After-Self.md | 88 -- .../0318.Maximum-Product-of-Word-Lengths.md | 77 -- .../content/ChapterFour/0322.Coin-Change.md | 61 - .../ChapterFour/0324.Wiggle-Sort-II.md | 263 ---- .../ChapterFour/0326.Power-of-Three.md | 77 -- .../ChapterFour/0327.Count-of-Range-Sum.md | 145 --- .../ChapterFour/0328.Odd-Even-Linked-List.md | 77 -- ...329.Longest-Increasing-Path-in-a-Matrix.md | 92 -- ...Preorder-Serialization-of-a-Binary-Tree.md | 85 -- .../ChapterFour/0337.House-Robber-III.md | 73 -- .../content/ChapterFour/0338.Counting-Bits.md | 54 - .../content/ChapterFour/0342.Power-of-Four.md | 55 - .../content/ChapterFour/0343.Integer-Break.md | 53 - .../ChapterFour/0344.Reverse-String.md | 53 - .../0345.Reverse-Vowels-of-a-String.md | 69 - .../0347.Top-K-Frequent-Elements.md | 103 -- .../0349.Intersection-of-Two-Arrays.md | 60 - .../0350.Intersection-of-Two-Arrays-II.md | 72 -- .../0354.Russian-Doll-Envelopes.md | 81 -- .../0357.Count-Numbers-with-Unique-Digits.md | 61 - .../ChapterFour/0367.Valid-Perfect-Square.md | 57 - .../ChapterFour/0371.Sum-of-Two-Integers.md | 47 - website/content/ChapterFour/0372.Super-Pow.md | 108 -- .../0373.Find-K-Pairs-with-Smallest-Sums.md | 126 -- ...Kth-Smallest-Element-in-a-Sorted-Matrix.md | 135 -- .../content/ChapterFour/0385.Mini-Parser.md | 175 --- .../0386.Lexicographical-Numbers.md | 51 - ...0387.First-Unique-Character-in-a-String.md | 48 - .../ChapterFour/0389.Find-the-Difference.md | 48 - .../ChapterFour/0393.UTF-8-Validation.md | 105 -- .../content/ChapterFour/0394.Decode-String.md | 81 -- .../ChapterFour/0397.Integer-Replacement.md | 86 -- .../ChapterFour/0399.Evaluate-Division.md | 117 -- .../content/ChapterFour/0401.Binary-Watch.md | 138 -- .../ChapterFour/0402.Remove-K-Digits.md | 88 -- .../ChapterFour/0404.Sum-of-Left-Leaves.md | 55 - .../0405.Convert-a-Number-to-Hexadecimal.md | 80 -- .../ChapterFour/0409.Longest-Palindrome.md | 57 - .../0410.Split-Array-Largest-Sum.md | 92 -- website/content/ChapterFour/0412.Fizz-Buzz.md | 71 - .../ChapterFour/0414.Third-Maximum-Number.md | 72 -- .../0416.Partition-Equal-Subset-Sum.md | 76 -- ....Maximum-XOR-of-Two-Numbers-in-an-Array.md | 99 -- .../0433.Minimum-Genetic-Mutation.md | 183 --- .../0435.Non-overlapping-Intervals.md | 135 -- .../ChapterFour/0436.Find-Right-Interval.md | 142 -- .../content/ChapterFour/0437.Path-Sum-III.md | 85 -- .../0438.Find-All-Anagrams-in-a-String.md | 106 -- .../ChapterFour/0441.Arranging-Coins.md | 75 -- .../ChapterFour/0445.Add-Two-Numbers-II.md | 96 -- .../ChapterFour/0447.Number-of-Boomerangs.md | 66 - ...ind-All-Numbers-Disappeared-in-an-Array.md | 57 - .../0451.Sort-Characters-By-Frequency.md | 113 -- ...3.Minimum-Moves-to-Equal-Array-Elements.md | 51 - website/content/ChapterFour/0454.4Sum-II.md | 65 - .../ChapterFour/0455.Assign-Cookies.md | 69 - .../content/ChapterFour/0456.132-Pattern.md | 103 -- .../ChapterFour/0457.Circular-Array-Loop.md | 104 -- .../ChapterFour/0461.Hamming-Distance.md | 53 - .../ChapterFour/0463.Island-Perimeter.md | 71 - .../0470.Implement-Rand10-Using-Rand7.md | 100 -- .../ChapterFour/0474.Ones-and-Zeroes.md | 78 -- website/content/ChapterFour/0475.Heaters.md | 122 -- .../ChapterFour/0476.Number-Complement.md | 68 - .../0477.Total-Hamming-Distance.md | 66 - .../ChapterFour/0480.Sliding-Window-Median.md | 276 ---- .../ChapterFour/0483.Smallest-Good-Base.md | 138 -- .../ChapterFour/0485.Max-Consecutive-Ones.md | 59 - .../0491.Increasing-Subsequences.md | 84 -- .../content/ChapterFour/0493.Reverse-Pairs.md | 126 -- .../content/ChapterFour/0494.Target-Sum.md | 108 -- ...dom-Point-in-Non-overlapping-Rectangles.md | 134 -- .../ChapterFour/0498.Diagonal-Traverse.md | 184 --- .../content/ChapterFour/0500.Keyboard-Row.md | 62 - .../0503.Next-Greater-Element-II.md | 78 -- .../ChapterFour/0507.Perfect-Number.md | 64 - .../0508.Most-Frequent-Subtree-Sum.md | 123 -- .../ChapterFour/0509.Fibonacci-Number.md | 171 --- .../0513.Find-Bottom-Left-Tree-Value.md | 112 -- ...515.Find-Largest-Value-in-Each-Tree-Row.md | 93 -- ...est-Word-in-Dictionary-through-Deleting.md | 76 -- .../ChapterFour/0526.Beautiful-Arrangement.md | 110 -- .../0528.Random-Pick-with-Weight.md | 108 -- .../content/ChapterFour/0529.Minesweeper.md | 145 --- .../0532.K-diff-Pairs-in-an-Array.md | 95 -- .../0537.Complex-Number-Multiplication.md | 73 -- .../ChapterFour/0541.Reverse-String-II.md | 56 - website/content/ChapterFour/0542.01-Matrix.md | 202 --- .../ChapterFour/0547.Friend-Circles.md | 111 -- .../0557.Reverse-Words-in-a-String-III.md | 57 - .../ChapterFour/0561.Array-Partition-I.md | 58 - .../ChapterFour/0563.Binary-Tree-Tilt.md | 83 -- .../ChapterFour/0566.Reshape-the-Matrix.md | 102 -- .../ChapterFour/0567.Permutation-in-String.md | 87 -- .../0572.Subtree-of-Another-Tree.md | 87 -- .../ChapterFour/0575.Distribute-Candies.md | 59 - .../0594.Longest-Harmonious-Subsequence.md | 57 - .../ChapterFour/0598.Range-Addition-II.md | 82 -- .../0599.Minimum-Index-Sum-of-Two-Lists.md | 77 -- .../0628.Maximum-Product-of-Three-Numbers.md | 96 -- ...st-Range-Covering-Elements-from-K-Lists.md | 113 -- .../ChapterFour/0633.Sum-of-Square-Numbers.md | 53 - .../0636.Exclusive-Time-of-Functions.md | 100 -- .../0637.Average-of-Levels-in-Binary-Tree.md | 85 -- .../ChapterFour/0638.Shopping-Offers.md | 129 -- .../content/ChapterFour/0645.Set-Mismatch.md | 62 - .../content/ChapterFour/0648.Replace-Words.md | 111 -- .../0653.Two-Sum-IV---Input-is-a-BST.md | 75 -- .../0658.Find-K-Closest-Elements.md | 82 -- .../ChapterFour/0661.Image-Smoother.md | 111 -- .../0662.Maximum-Width-of-Binary-Tree.md | 152 --- ...Smallest-Number-in-Multiplication-Table.md | 84 -- .../0676.Implement-Magic-Dictionary.md | 87 -- .../content/ChapterFour/0682.Baseball-Game.md | 106 -- .../ChapterFour/0684.Redundant-Connection.md | 85 -- .../0685.Redundant-Connection-II.md | 110 -- ...693.Binary-Number-with-Alternating-Bits.md | 80 -- .../ChapterFour/0695.Max-Area-of-Island.md | 77 -- .../ChapterFour/0697.Degree-of-an-Array.md | 80 -- .../ChapterFour/0699.Falling-Squares.md | 145 --- .../content/ChapterFour/0704.Binary-Search.md | 67 - .../ChapterFour/0705.Design-HashSet.md | 94 -- .../ChapterFour/0706.Design-HashMap.md | 151 --- .../ChapterFour/0707.Design-Linked-List.md | 140 -- .../0710.Random-Pick-with-Blacklist.md | 145 --- .../0713.Subarray-Product-Less-Than-K.md | 65 - ...Buy-and-Sell-Stock-with-Transaction-Fee.md | 80 -- .../content/ChapterFour/0715.Range-Module.md | 270 ---- .../0717.1-bit-and-2-bit-Characters.md | 65 - ...718.Maximum-Length-of-Repeated-Subarray.md | 123 -- .../0719.Find-K-th-Smallest-Pair-Distance.md | 97 -- .../0720.Longest-Word-in-Dictionary.md | 72 -- .../ChapterFour/0721.Accounts-Merge.md | 149 --- .../ChapterFour/0724.Find-Pivot-Index.md | 74 -- .../ChapterFour/0726.Number-of-Atoms.md | 186 --- .../content/ChapterFour/0729.My-Calendar-I.md | 180 --- .../ChapterFour/0732.My-Calendar-III.md | 142 -- .../content/ChapterFour/0733.Flood-Fill.md | 81 -- .../ChapterFour/0735.Asteroid-Collision.md | 105 -- .../ChapterFour/0739.Daily-Temperatures.md | 59 - ...ind-Smallest-Letter-Greater-Than-Target.md | 92 -- .../0745.Prefix-and-Suffix-Search.md | 98 -- .../0746.Min-Cost-Climbing-Stairs.md | 71 - .../0748.Shortest-Completing-Word.md | 102 -- .../ChapterFour/0753.Cracking-the-Safe.md | 92 -- .../0756.Pyramid-Transition-Matrix.md | 92 -- ...er-of-Set-Bits-in-Binary-Representation.md | 78 -- .../ChapterFour/0763.Partition-Labels.md | 92 -- .../ChapterFour/0765.Couples-Holding-Hands.md | 93 -- .../ChapterFour/0766.Toeplitz-Matrix.md | 79 -- .../ChapterFour/0767.Reorganize-String.md | 149 --- .../ChapterFour/0771.Jewels-and-Stones.md | 74 -- .../ChapterFour/0778.Swim-in-Rising-Water.md | 132 -- .../ChapterFour/0781.Rabbits-in-Forest.md | 69 - .../0784.Letter-Case-Permutation.md | 120 -- .../0786.K-th-Smallest-Prime-Fraction.md | 119 -- ...image-Size-of-Factorial-Zeroes-Function.md | 106 -- .../0802.Find-Eventual-Safe-States.md | 73 -- .../0803.Bricks-Falling-When-Hit.md | 125 -- .../ChapterFour/0811.Subdomain-Visit-Count.md | 143 -- .../ChapterFour/0812.Largest-Triangle-Area.md | 70 - .../content/ChapterFour/0815.Bus-Routes.md | 88 -- .../0817.Linked-List-Components.md | 109 -- .../ChapterFour/0819.Most-Common-Word.md | 89 -- .../0826.Most-Profit-Assigning-Work.md | 107 -- .../ChapterFour/0832.Flipping-an-Image.md | 63 - .../0834.Sum-of-Distances-in-Tree.md | 101 -- .../ChapterFour/0836.Rectangle-Overlap.md | 54 - .../content/ChapterFour/0838.Push-Dominoes.md | 144 --- .../ChapterFour/0839.Similar-String-Groups.md | 98 -- .../ChapterFour/0841.Keys-and-Rooms.md | 80 -- ...842.Split-Array-into-Fibonacci-Sequence.md | 135 -- .../0844.Backspace-String-Compare.md | 111 -- .../0845.Longest-Mountain-in-Array.md | 91 -- .../ChapterFour/0850.Rectangle-Area-II.md | 293 ----- .../content/ChapterFour/0851.Loud-and-Rich.md | 108 -- .../0852.Peak-Index-in-a-Mountain-Array.md | 91 -- website/content/ChapterFour/0853.Car-Fleet.md | 98 -- .../ChapterFour/0856.Score-of-Parentheses.md | 102 -- ...2.Shortest-Subarray-with-Sum-at-Least-K.md | 90 -- ...863.All-Nodes-Distance-K-in-Binary-Tree.md | 96 -- .../0864.Shortest-Path-to-Get-All-Keys.md | 231 ---- .../ChapterFour/0867.Transpose-Matrix.md | 57 - .../ChapterFour/0872.Leaf-Similar-Trees.md | 62 - .../ChapterFour/0875.Koko-Eating-Bananas.md | 101 -- .../0876.Middle-of-the-Linked-List.md | 82 -- .../ChapterFour/0878.Nth-Magical-Number.md | 81 -- .../0880.Decoded-String-at-Index.md | 104 -- .../ChapterFour/0881.Boats-to-Save-People.md | 90 -- .../0884.Uncommon-Words-from-Two-Sentences.md | 66 - .../ChapterFour/0885.Spiral-Matrix-III.md | 84 -- .../ChapterFour/0887.Super-Egg-Drop.md | 155 --- .../ChapterFour/0888.Fair-Candy-Swap.md | 110 -- .../0891.Sum-of-Subsequence-Widths.md | 68 - .../0892.Surface-Area-of-3D-Shapes.md | 108 -- .../0895.Maximum-Frequency-Stack.md | 113 -- .../ChapterFour/0896.Monotonic-Array.md | 99 -- .../0898.Bitwise-ORs-of-Subarrays.md | 143 -- .../ChapterFour/0901.Online-Stock-Span.md | 111 -- .../ChapterFour/0904.Fruit-Into-Baskets.md | 115 -- .../0907.Sum-of-Subarray-Minimums.md | 124 -- .../ChapterFour/0911.Online-Election.md | 99 -- .../0914.X-of-a-Kind-in-a-Deck-of-Cards.md | 105 -- .../0918.Maximum-Sum-Circular-Subarray.md | 101 -- .../0920.Number-of-Music-Playlists.md | 85 -- ...1.Minimum-Add-to-Make-Parentheses-Valid.md | 88 -- .../0922.Sort-Array-By-Parity-II.md | 61 - .../0923.3Sum-With-Multiplicity.md | 102 -- .../0924.Minimize-Malware-Spread.md | 105 -- .../ChapterFour/0927.Three-Equal-Parts.md | 113 -- .../0928.Minimize-Malware-Spread-II.md | 137 -- .../0930.Binary-Subarrays-With-Sum.md | 65 - .../0933.Number-of-Recent-Calls.md | 74 -- .../ChapterFour/0942.DI-String-Match.md | 73 -- .../0946.Validate-Stack-Sequences.md | 68 - ...-Stones-Removed-with-Same-Row-or-Column.md | 82 -- .../0949.Largest-Time-for-Given-Digits.md | 78 -- ...Largest-Component-Size-by-Common-Factor.md | 119 -- .../0953.Verifying-an-Alien-Dictionary.md | 81 -- .../0959.Regions-Cut-By-Slashes.md | 150 --- ...961.N-Repeated-Element-in-Size-2N-Array.md | 60 - .../ChapterFour/0968.Binary-Tree-Cameras.md | 103 -- .../ChapterFour/0969.Pancake-Sorting.md | 96 -- .../ChapterFour/0970.Powerful-Integers.md | 88 -- .../0973.K-Closest-Points-to-Origin.md | 71 - .../0976.Largest-Perimeter-Triangle.md | 78 -- .../0977.Squares-of-a-Sorted-Array.md | 86 -- .../0978.Longest-Turbulent-Subarray.md | 109 -- .../0979.Distribute-Coins-in-Binary-Tree.md | 96 -- .../0981.Time-Based-Key-Value-Store.md | 124 -- .../0984.String-Without-AAA-or-BBB.md | 93 -- .../0985.Sum-of-Even-Numbers-After-Queries.md | 72 -- .../0986.Interval-List-Intersections.md | 73 -- ...90.Satisfiability-of-Equality-Equations.md | 99 -- ...992.Subarrays-with-K-Different-Integers.md | 113 -- .../0993.Cousins-in-Binary-Tree.md | 163 --- ...nimum-Number-of-K-Consecutive-Bit-Flips.md | 97 -- .../0996.Number-of-Squareful-Arrays.md | 107 -- .../0999.Available-Captures-for-Rook.md | 99 -- .../1002.Find-Common-Characters.md | 74 -- ...ck-If-Word-Is-Valid-After-Substitutions.md | 107 -- .../1004.Max-Consecutive-Ones-III.md | 80 -- ...Maximize-Sum-Of-Array-After-K-Negations.md | 83 -- ...Capacity-To-Ship-Packages-Within-D-Days.md | 101 -- .../ChapterFour/1017.Convert-to-Base--2.md | 75 -- .../1019.Next-Greater-Node-In-Linked-List.md | 96 -- .../ChapterFour/1020.Number-of-Enclaves.md | 93 -- .../1021.Remove-Outermost-Parentheses.md | 123 -- .../content/ChapterFour/1025.Divisor-Game.md | 62 - ...um-Difference-Between-Node-and-Ancestor.md | 74 -- ....Recover-a-Tree-From-Preorder-Traversal.md | 135 -- .../1030.Matrix-Cells-in-Distance-Order.md | 84 -- .../ChapterFour/1037.Valid-Boomerang.md | 49 - ...1040.Moving-Stones-Until-Consecutive-II.md | 121 -- ...emove-All-Adjacent-Duplicates-In-String.md | 57 - .../ChapterFour/1049.Last-Stone-Weight-II.md | 79 -- .../ChapterFour/1051.Height-Checker.md | 72 -- .../1052.Grumpy-Bookstore-Owner.md | 106 -- .../ChapterFour/1054.Distant-Barcodes.md | 92 -- .../1073.Adding-Two-Negabinary-Numbers.md | 146 --- ...umber-of-Submatrices-That-Sum-to-Target.md | 143 -- .../1078.Occurrences-After-Bigram.md | 64 - .../ChapterFour/1089.Duplicate-Zeros.md | 58 - .../1093.Statistics-from-a-Large-Sample.md | 95 -- .../1105.Filling-Bookcase-Shelves.md | 68 - .../1108.Defanging-an-IP-Address.md | 54 - .../1110.Delete-Nodes-And-Return-Forest.md | 82 -- ...-Depth-of-Two-Valid-Parentheses-Strings.md | 132 -- .../ChapterFour/1122.Relative-Sort-Array.md | 101 -- ...owest-Common-Ancestor-of-Deepest-Leaves.md | 101 -- .../1128.Number-of-Equivalent-Domino-Pairs.md | 68 - .../1137.N-th-Tribonacci-Number.md | 71 - .../1145.Binary-Tree-Coloring-Game.md | 82 -- .../ChapterFour/1154.Day-of-the-Year.md | 81 -- ...157.Online-Majority-Element-In-Subarray.md | 196 --- ...-Words-That-Can-Be-Formed-by-Characters.md | 81 -- ...-by-Frequency-of-the-Smallest-Character.md | 86 -- ...-Sum-Consecutive-Nodes-from-Linked-List.md | 140 -- .../ChapterFour/1175.Prime-Arrangements.md | 65 - .../1184.Distance-Between-Bus-Stops.md | 82 -- .../ChapterFour/1185.Day-of-the-Week.md | 61 - .../1189.Maximum-Number-of-Balloons.md | 70 - .../1200.Minimum-Absolute-Difference.md | 77 -- .../ChapterFour/1201.Ugly-Number-III.md | 92 -- .../1202.Smallest-String-With-Swaps.md | 102 -- .../1207.Unique-Number-of-Occurrences.md | 68 - ...1208.Get-Equal-Substrings-Within-Budget.md | 77 -- .../ChapterFour/1217.Play-with-Chips.md | 76 -- ...1221.Split-a-String-in-Balanced-Strings.md | 73 -- .../1232.Check-If-It-Is-a-Straight-Line.md | 71 - ...place-the-Substring-for-Balanced-String.md | 93 -- .../1235.Maximum-Profit-in-Job-Scheduling.md | 118 -- .../1252.Cells-with-Odd-Values-in-a-Matrix.md | 103 -- .../1254.Number-of-Closed-Islands.md | 110 -- .../content/ChapterFour/1260.Shift-2D-Grid.md | 90 -- .../1266.Minimum-Time-Visiting-All-Points.md | 75 -- .../1275.Find-Winner-on-a-Tic-Tac-Toe-Game.md | 154 --- ...Product-and-Sum-of-Digits-of-an-Integer.md | 59 - ...-the-Smallest-Divisor-Given-a-Threshold.md | 87 -- ...-Appearing-More-Than-25-In-Sorted-Array.md | 49 - ...nary-Number-in-a-Linked-List-to-Integer.md | 81 -- ...Find-Numbers-with-Even-Number-of-Digits.md | 63 - ...nts-with-Greatest-Element-on-Right-Side.md | 51 - .../ChapterFour/1302.Deepest-Leaves-Sum.md | 58 - ...4.Find-N-Unique-Integers-Sum-up-to-Zero.md | 62 - ...All-Elements-in-Two-Binary-Search-Trees.md | 90 -- .../content/ChapterFour/1306.Jump-Game-III.md | 80 -- ...1313.Decompress-Run-Length-Encoded-List.md | 60 - ...eger-to-the-Sum-of-Two-No-Zero-Integers.md | 96 -- .../1380.Lucky-Numbers-in-a-Matrix.md | 87 -- ...d-the-Distance-Value-Between-Two-Arrays.md | 98 -- ....Create-Target-Array-in-the-Given-Order.md | 90 -- ...s-As-a-Prefix-of-Any-Word-in-a-Sentence.md | 98 -- ...mum-Product-of-Two-Elements-in-an-Array.md | 66 - .../ChapterFour/1470.Shuffle-the-Array.md | 64 - website/content/ChapterFour/_index.md | 17 - website/content/ChapterFour/pytool/AddTOC.py | 25 - .../ChapterFour/pytool/GenerateIndex.py | 21 - .../content/ChapterFour/pytool/GenerateOne.py | 24 - website/content/ChapterFour/pytool/GetFile.py | 56 - website/content/ChapterOne/_index.md | 89 -- website/content/ChapterThree/Segment_Tree.md | 275 ---- website/content/ChapterThree/UnionFind.md | 144 --- website/content/ChapterThree/_index.md | 13 - website/content/ChapterTwo/Array.md | 62 - website/content/ChapterTwo/Backtracking.md | 132 -- .../content/ChapterTwo/Binary_Indexed_Tree.md | 8 - website/content/ChapterTwo/Binary_Search.md | 145 --- .../content/ChapterTwo/Bit_Manipulation.md | 74 -- .../ChapterTwo/Breadth_First_Search.md | 24 - .../content/ChapterTwo/Depth_First_Search.md | 33 - .../content/ChapterTwo/Dynamic_Programming.md | 36 - website/content/ChapterTwo/Hash_Table.md | 43 - website/content/ChapterTwo/Linked_List.md | 53 - website/content/ChapterTwo/Math.md | 28 - website/content/ChapterTwo/Sliding_Window.md | 43 - website/content/ChapterTwo/Sort.md | 42 - website/content/ChapterTwo/Stack.md | 54 - website/content/ChapterTwo/String.md | 30 - website/content/ChapterTwo/Tree.md | 43 - website/content/ChapterTwo/Two_Pointers.md | 83 -- website/content/ChapterTwo/Union_Find.md | 38 - website/content/ChapterTwo/_index.md | 21 - website/content/_index.md | 88 -- website/content/docs/example/_index.md | 71 - .../example/collapsed/3rd-level/4th-level.md | 12 - .../example/collapsed/3rd-level/_index.md | 26 - .../content/docs/example/collapsed/_index.md | 23 - website/content/docs/example/hidden.md | 52 - .../docs/example/table-of-contents/_index.md | 85 -- .../example/table-of-contents/with-toc.md | 64 - .../example/table-of-contents/without-toc.md | 59 - website/content/docs/shortcodes/_index.md | 3 - website/content/docs/shortcodes/buttons.md | 13 - website/content/docs/shortcodes/columns.md | 45 - website/content/docs/shortcodes/details.md | 22 - website/content/docs/shortcodes/expand.md | 35 - website/content/docs/shortcodes/hints.md | 32 - website/content/docs/shortcodes/katex.md | 28 - website/content/docs/shortcodes/mermaid.md | 38 - .../content/docs/shortcodes/section/_index.md | 15 - .../content/docs/shortcodes/section/page1.md | 1 - .../content/docs/shortcodes/section/page2.md | 1 - website/content/docs/shortcodes/tabs.md | 50 - website/content/en/_index.md | 115 ++ website/content/en/about/index.md | 27 + website/content/en/archive/_index.md | 9 + website/content/en/gallery/cartoon/index.md | 10 + website/content/en/gallery/photo/index.md | 20 + website/content/en/posts/_index.md | 7 + website/content/en/posts/emoji-support.md | 56 + website/content/en/posts/markdown-syntax.md | 151 +++ website/content/en/posts/math-typesetting.md | 48 + website/content/en/posts/rich-content.md | 47 + website/content/en/posts/shortcodes.md | 135 ++ website/content/en/posts/syntax-highlight.md | 326 +++++ website/content/en/posts/test-chartjs.md | 54 + website/content/en/posts/test-flowchart.md | 36 + .../en/posts/test-js-sequence-diagrams.md | 31 + website/content/en/posts/test-katex.md | 47 + website/content/en/posts/test-mathjax.md | 20 + website/content/en/posts/test-mermaid.md | 94 ++ website/content/en/posts/test-viz.md | 48 + website/content/en/posts/test-wavedrom.md | 27 + website/content/en/presentation/_index.md | 4 + website/content/en/presentation/dir/fourth.md | 87 ++ website/content/en/presentation/first.md | 30 + website/content/en/presentation/second.md | 30 + website/content/en/presentation/third.md | 75 ++ .../content/en/publication/article/_index.md | 5 + .../article_any_folder_name_1/cite.bib | 14 + .../article_any_folder_name_1/index.md | 16 + website/content/en/publication/book/_index.md | 5 + .../book/book_any_folder_name_1/cite.bib | 13 + .../book/book_any_folder_name_1/index.md | 14 + website/content/en/publication/misc/_index.md | 5 + .../misc/misc_any_folder_name_1/cite.bib | 14 + .../misc/misc_any_folder_name_1/index.md | 16 + website/content/en/showcase/_index.md | 6 + website/content/en/showcase/hugo/_index.md | 7 + .../en/showcase/hugo/hugo-theme-zdoc.md | 10 + .../en/showcase/hugo/hugo-theme-zzo.md | 10 + website/content/ko/_index.md | 115 ++ website/content/ko/about/index.ko.md | 7 + website/content/ko/archive/_index.ko.md | 9 + .../content/ko/gallery/cartoon/index.ko.md | 6 + website/content/ko/gallery/photo/index.ko.md | 9 + website/content/ko/posts/_index.ko.md | 7 + website/languages.toml | 13 + website/menus.en.toml | 51 + website/menus.ko.toml | 28 + website/params.toml | 196 +++ ...s_50fc8c04e12a2f59027287995557ceff.content | 1 - ...scss_50fc8c04e12a2f59027287995557ceff.json | 1 - ...s_b4f67ac5085b89b62b54c1923e5a9145.content | 1 + ...scss_b4f67ac5085b89b62b54c1923e5a9145.json | 1 + .../static/favicon/android-icon-144x144.png | Bin 0 -> 6058 bytes .../static/favicon/android-icon-192x192.png | Bin 0 -> 7799 bytes website/static/favicon/android-icon-36x36.png | Bin 0 -> 1866 bytes website/static/favicon/android-icon-48x48.png | Bin 0 -> 2206 bytes .../static/favicon/android-icon-512x512.png | Bin 0 -> 18562 bytes website/static/favicon/android-icon-72x72.png | Bin 0 -> 2846 bytes website/static/favicon/android-icon-96x96.png | Bin 0 -> 3718 bytes website/static/favicon/apple-icon-114x114.png | Bin 0 -> 4746 bytes website/static/favicon/apple-icon-120x120.png | Bin 0 -> 4969 bytes website/static/favicon/apple-icon-144x144.png | Bin 0 -> 6058 bytes website/static/favicon/apple-icon-152x152.png | Bin 0 -> 6668 bytes website/static/favicon/apple-icon-180x180.png | Bin 0 -> 8295 bytes website/static/favicon/apple-icon-57x57.png | Bin 0 -> 2370 bytes website/static/favicon/apple-icon-60x60.png | Bin 0 -> 2514 bytes website/static/favicon/apple-icon-72x72.png | Bin 0 -> 2846 bytes website/static/favicon/apple-icon-76x76.png | Bin 0 -> 2981 bytes .../static/favicon/apple-icon-precomposed.png | Bin 0 -> 8373 bytes website/static/favicon/apple-icon.png | Bin 0 -> 8373 bytes website/static/favicon/favicon-16x16.png | Bin 0 -> 1253 bytes website/static/favicon/favicon-32x32.png | Bin 0 -> 1717 bytes website/static/favicon/favicon-96x96.png | Bin 0 -> 3718 bytes website/static/favicon/favicon.ico | Bin 0 -> 1150 bytes website/static/favicon/ms-icon-144x144.png | Bin 0 -> 6058 bytes website/static/favicon/ms-icon-150x150.png | Bin 0 -> 6535 bytes website/static/favicon/ms-icon-310x310.png | Bin 0 -> 18061 bytes website/static/favicon/ms-icon-70x70.png | Bin 0 -> 2792 bytes .../gallery/cartoon/abstract-3159733_640.jpg | Bin 0 -> 103645 bytes .../cartoon/boxing-ring-149840_640.png | Bin 0 -> 90298 bytes .../cartoon/fairy-tale-1077856_640.jpg | Bin 0 -> 59361 bytes .../gallery/cartoon/giraffe-3258053_640.png | Bin 0 -> 105379 bytes .../cartoon/robot-in-space-4556429_640.png | Bin 0 -> 172122 bytes .../gallery/cartoon/sketch-3047721_640.jpg | Bin 0 -> 104490 bytes .../cartoon/watercolour-2045917_640.jpg | Bin 0 -> 107166 bytes website/static/gallery/photo/beach.jpg | Bin 0 -> 55767 bytes website/static/gallery/photo/beautiful.jpg | Bin 0 -> 80225 bytes website/static/gallery/photo/child.jpg | Bin 0 -> 36057 bytes website/static/gallery/photo/people.jpg | Bin 0 -> 61047 bytes website/static/images/feature1/flowchart.png | Bin 0 -> 1790 bytes website/static/images/feature1/graph.png | Bin 0 -> 4131 bytes website/static/images/feature1/infinity.png | Bin 0 -> 8623 bytes website/static/images/feature1/markdown.png | Bin 0 -> 2385 bytes .../static/images/feature1/number-four.png | Bin 0 -> 11847 bytes website/static/images/feature1/number-one.png | Bin 0 -> 11355 bytes .../static/images/feature1/number-three.png | Bin 0 -> 12777 bytes website/static/images/feature1/number-two.png | Bin 0 -> 12516 bytes website/static/images/feature1/wave.png | Bin 0 -> 2470 bytes website/static/images/feature2/bam.png | Bin 0 -> 27313 bytes .../static/images/feature2/color-palette.png | Bin 0 -> 4083 bytes website/static/images/feature2/content.png | Bin 0 -> 2786 bytes website/static/images/feature2/gallery.png | Bin 0 -> 4371 bytes website/static/images/feature2/graph.png | Bin 0 -> 4460 bytes website/static/images/feature2/mathbook.png | Bin 0 -> 10558 bytes website/static/images/feature2/transfer.png | Bin 0 -> 2479 bytes website/static/images/feature2/workflow.png | Bin 0 -> 5659 bytes website/static/images/feature3/code-file.png | Bin 0 -> 3293 bytes website/static/images/feature3/css3-bare.png | Bin 0 -> 3381 bytes website/static/images/feature3/css3.png | Bin 0 -> 6380 bytes website/static/images/header/background.jpg | Bin 0 -> 67168 bytes website/static/images/whoami/avatar.jpg | Bin 0 -> 72898 bytes website/static/logo.png | Bin 358501 -> 0 bytes website/static/manifest.json | 56 + website/static/prism.css | 140 -- website/static/prism.js | 78 -- .../themes/book/.github/workflows/main.yml | 33 - website/themes/book/.gitignore | 3 - website/themes/book/LICENSE | 20 - website/themes/book/README.md | 304 ----- website/themes/book/archetypes/docs.md | 9 - website/themes/book/assets/_defaults.scss | 50 - website/themes/book/assets/_fonts.scss | 49 - website/themes/book/assets/_main.scss | 381 ------ website/themes/book/assets/_markdown.scss | 190 --- website/themes/book/assets/_print.scss | 17 - website/themes/book/assets/_shortcodes.scss | 104 -- website/themes/book/assets/_utils.scss | 92 -- website/themes/book/assets/_variables.scss | 3 - website/themes/book/assets/book.scss | 14 - website/themes/book/assets/manifest.json | 54 - website/themes/book/assets/menu-reset.js | 7 - website/themes/book/assets/normalize.css | 349 ----- website/themes/book/assets/plugins/_dark.scss | 10 - .../themes/book/assets/plugins/_numbered.scss | 36 - .../book/assets/plugins/_scrollbars.scss | 26 - website/themes/book/assets/search-data.js | 30 - website/themes/book/assets/search.js | 101 -- website/themes/book/assets/sw-register.js | 7 - website/themes/book/assets/sw.js | 55 - .../book/exampleSite/assets/_custom.scss | 4 - .../book/exampleSite/assets/_variables.scss | 3 - website/themes/book/exampleSite/config.toml | 103 -- website/themes/book/exampleSite/config.yaml | 99 -- .../book/exampleSite/content.ru/_index.md | 79 -- .../book/exampleSite/content.zh/_index.md | 79 -- .../themes/book/exampleSite/content/_index.md | 41 - .../content/docs/example/_index.md | 71 - .../example/collapsed/3rd-level/4th-level.md | 12 - .../example/collapsed/3rd-level/_index.md | 26 - .../content/docs/example/collapsed/_index.md | 23 - .../content/docs/example/hidden.md | 52 - .../docs/example/table-of-contents/_index.md | 85 -- .../example/table-of-contents/with-toc.md | 64 - .../example/table-of-contents/without-toc.md | 59 - .../content/docs/shortcodes/_index.md | 3 - .../content/docs/shortcodes/buttons.md | 13 - .../content/docs/shortcodes/columns.md | 45 - .../content/docs/shortcodes/details.md | 22 - .../content/docs/shortcodes/expand.md | 35 - .../content/docs/shortcodes/hints.md | 32 - .../content/docs/shortcodes/katex.md | 28 - .../content/docs/shortcodes/mermaid.md | 38 - .../content/docs/shortcodes/section/_index.md | 15 - .../content/docs/shortcodes/section/page1.md | 1 - .../content/docs/shortcodes/section/page2.md | 1 - .../content/docs/shortcodes/tabs.md | 50 - .../book/exampleSite/content/menu/index.md | 22 - .../book/exampleSite/content/posts/_index.md | 7 - .../content/posts/creating-a-new-theme.md | 1150 ----------------- .../content/posts/goisforlovers.md | 344 ----- .../content/posts/hugoisforlovers.md | 89 -- .../content/posts/migrate-from-jekyll.md | 156 --- ...s_50fc8c04e12a2f59027287995557ceff.content | 1 - ...scss_50fc8c04e12a2f59027287995557ceff.json | 1 - ...s_50fc8c04e12a2f59027287995557ceff.content | 1 - ...scss_50fc8c04e12a2f59027287995557ceff.json | 1 - website/themes/book/i18n/cn.yaml | 21 - website/themes/book/i18n/cs.yaml | 14 - website/themes/book/i18n/de.yaml | 14 - website/themes/book/i18n/en.yaml | 14 - website/themes/book/i18n/es.yaml | 14 - website/themes/book/i18n/fr.yaml | 14 - website/themes/book/i18n/ja.yaml | 20 - website/themes/book/i18n/jp.yaml | 21 - website/themes/book/i18n/ko.yaml | 20 - website/themes/book/i18n/nb.yaml | 14 - website/themes/book/i18n/pt.yaml | 14 - website/themes/book/i18n/ru.yaml | 14 - website/themes/book/i18n/sv.yaml | 14 - website/themes/book/i18n/uk.yaml | 14 - website/themes/book/i18n/zh.yaml | 20 - website/themes/book/images/screenshot.png | Bin 189080 -> 0 bytes website/themes/book/images/tn.png | Bin 195683 -> 0 bytes website/themes/book/layouts/404.html | 35 - .../_default/_markup/render-heading.html | 4 - .../_default/_markup/render-image.html | 19 - .../layouts/_default/_markup/render-link.html | 28 - .../themes/book/layouts/_default/baseof.html | 85 -- .../themes/book/layouts/_default/list.html | 1 - .../themes/book/layouts/_default/single.html | 1 - .../book/layouts/partials/docs/brand.html | 588 --------- .../book/layouts/partials/docs/comments.html | 2 - .../book/layouts/partials/docs/date.html | 6 - .../book/layouts/partials/docs/gitalk.html | 25 - .../book/layouts/partials/docs/header.html | 14 - .../book/layouts/partials/docs/html-head.html | 44 - .../layouts/partials/docs/inject/body.html | 26 - .../partials/docs/inject/content-after.html | 0 .../partials/docs/inject/content-before.html | 0 .../layouts/partials/docs/inject/footer.html | 0 .../partials/docs/inject/menu-after.html | 0 .../partials/docs/inject/menu-before.html | 0 .../book/layouts/partials/docs/languages.html | 28 - .../layouts/partials/docs/menu-bundle.html | 4 - .../layouts/partials/docs/menu-filetree.html | 43 - .../book/layouts/partials/docs/menu-hugo.html | 28 - .../book/layouts/partials/docs/menu.html | 22 - .../book/layouts/partials/docs/post-meta.html | 13 - .../book/layouts/partials/docs/taxonomy.html | 19 - .../book/layouts/partials/docs/title.html | 15 - .../book/layouts/partials/docs/toc.html | 1 - website/themes/book/layouts/posts/list.html | 22 - website/themes/book/layouts/posts/single.html | 15 - .../book/layouts/shortcodes/button.html | 12 - .../book/layouts/shortcodes/columns.html | 7 - .../book/layouts/shortcodes/details.html | 6 - .../book/layouts/shortcodes/expand.html | 13 - .../themes/book/layouts/shortcodes/hint.html | 3 - .../themes/book/layouts/shortcodes/katex.html | 13 - .../book/layouts/shortcodes/mermaid.html | 14 - .../book/layouts/shortcodes/section.html | 10 - .../themes/book/layouts/shortcodes/tab.html | 12 - .../themes/book/layouts/shortcodes/tabs.html | 15 - .../themes/book/layouts/taxonomy/list.html | 13 - .../book/layouts/taxonomy/taxonomy.html | 22 - website/themes/book/static/LeetCode_Icon.png | Bin 54903 -> 0 bytes website/themes/book/static/LeetCode_logo.png | Bin 31073 -> 0 bytes .../themes/book/static/LeetCode_logo2048.png | Bin 21258 -> 0 bytes .../static/apple-touch-icon-1024x1024.png | Bin 18265 -> 0 bytes .../book/static/apple-touch-icon-120x120.png | Bin 2701 -> 0 bytes .../book/static/apple-touch-icon-152x152.png | Bin 3143 -> 0 bytes .../book/static/apple-touch-icon-180x180.png | Bin 3659 -> 0 bytes .../book/static/apple-touch-icon-512x512.png | Bin 8576 -> 0 bytes .../book/static/apple-touch-icon-60x60.png | Bin 1423 -> 0 bytes .../book/static/apple-touch-icon-76x76.png | Bin 1885 -> 0 bytes website/themes/book/static/favicon.png | Bin 1331 -> 0 bytes website/themes/book/static/favicon.svg | 584 --------- website/themes/book/static/flexsearch.min.js | 42 - .../fonts/roboto-mono-v6-latin-regular.woff | Bin 19972 -> 0 bytes .../fonts/roboto-mono-v6-latin-regular.woff2 | Bin 16328 -> 0 bytes .../fonts/roboto-v19-latin-300italic.woff | Bin 22204 -> 0 bytes .../fonts/roboto-v19-latin-300italic.woff2 | Bin 17448 -> 0 bytes .../static/fonts/roboto-v19-latin-700.woff | Bin 20356 -> 0 bytes .../static/fonts/roboto-v19-latin-700.woff2 | Bin 15816 -> 0 bytes .../fonts/roboto-v19-latin-regular.woff | Bin 20268 -> 0 bytes .../fonts/roboto-v19-latin-regular.woff2 | Bin 15736 -> 0 bytes .../book/static/katex/auto-render.min.js | 1 - .../static/katex/fonts/KaTeX_AMS-Regular.ttf | Bin 70972 -> 0 bytes .../static/katex/fonts/KaTeX_AMS-Regular.woff | Bin 38868 -> 0 bytes .../katex/fonts/KaTeX_AMS-Regular.woff2 | Bin 32944 -> 0 bytes .../katex/fonts/KaTeX_Caligraphic-Bold.ttf | Bin 19316 -> 0 bytes .../katex/fonts/KaTeX_Caligraphic-Bold.woff | Bin 11696 -> 0 bytes .../katex/fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 10448 -> 0 bytes .../katex/fonts/KaTeX_Caligraphic-Regular.ttf | Bin 18684 -> 0 bytes .../fonts/KaTeX_Caligraphic-Regular.woff | Bin 11460 -> 0 bytes .../fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 10240 -> 0 bytes .../static/katex/fonts/KaTeX_Fraktur-Bold.ttf | Bin 35660 -> 0 bytes .../katex/fonts/KaTeX_Fraktur-Bold.woff | Bin 22632 -> 0 bytes .../katex/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 20360 -> 0 bytes .../katex/fonts/KaTeX_Fraktur-Regular.ttf | Bin 34352 -> 0 bytes .../katex/fonts/KaTeX_Fraktur-Regular.woff | Bin 22088 -> 0 bytes .../katex/fonts/KaTeX_Fraktur-Regular.woff2 | Bin 19784 -> 0 bytes .../static/katex/fonts/KaTeX_Main-Bold.ttf | Bin 60784 -> 0 bytes .../static/katex/fonts/KaTeX_Main-Bold.woff | Bin 35464 -> 0 bytes .../static/katex/fonts/KaTeX_Main-Bold.woff2 | Bin 30244 -> 0 bytes .../katex/fonts/KaTeX_Main-BoldItalic.ttf | Bin 44496 -> 0 bytes .../katex/fonts/KaTeX_Main-BoldItalic.woff | Bin 25352 -> 0 bytes .../katex/fonts/KaTeX_Main-BoldItalic.woff2 | Bin 21944 -> 0 bytes .../static/katex/fonts/KaTeX_Main-Italic.ttf | Bin 47640 -> 0 bytes .../static/katex/fonts/KaTeX_Main-Italic.woff | Bin 26228 -> 0 bytes .../katex/fonts/KaTeX_Main-Italic.woff2 | Bin 22748 -> 0 bytes .../static/katex/fonts/KaTeX_Main-Regular.ttf | Bin 69520 -> 0 bytes .../katex/fonts/KaTeX_Main-Regular.woff | Bin 38112 -> 0 bytes .../katex/fonts/KaTeX_Main-Regular.woff2 | Bin 32464 -> 0 bytes .../katex/fonts/KaTeX_Math-BoldItalic.ttf | Bin 39308 -> 0 bytes .../katex/fonts/KaTeX_Math-BoldItalic.woff | Bin 22324 -> 0 bytes .../katex/fonts/KaTeX_Math-BoldItalic.woff2 | Bin 19720 -> 0 bytes .../static/katex/fonts/KaTeX_Math-Italic.ttf | Bin 40992 -> 0 bytes .../static/katex/fonts/KaTeX_Math-Italic.woff | Bin 22844 -> 0 bytes .../katex/fonts/KaTeX_Math-Italic.woff2 | Bin 20096 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Bold.ttf | Bin 33688 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Bold.woff | Bin 18516 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 15732 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Italic.ttf | Bin 30960 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Italic.woff | Bin 17572 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Italic.woff2 | Bin 15024 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Regular.ttf | Bin 29812 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Regular.woff | Bin 16228 -> 0 bytes .../katex/fonts/KaTeX_SansSerif-Regular.woff2 | Bin 13708 -> 0 bytes .../katex/fonts/KaTeX_Script-Regular.ttf | Bin 24620 -> 0 bytes .../katex/fonts/KaTeX_Script-Regular.woff | Bin 13428 -> 0 bytes .../katex/fonts/KaTeX_Script-Regular.woff2 | Bin 12064 -> 0 bytes .../katex/fonts/KaTeX_Size1-Regular.ttf | Bin 12916 -> 0 bytes .../katex/fonts/KaTeX_Size1-Regular.woff | Bin 6696 -> 0 bytes .../katex/fonts/KaTeX_Size1-Regular.woff2 | Bin 5592 -> 0 bytes .../katex/fonts/KaTeX_Size2-Regular.ttf | Bin 12172 -> 0 bytes .../katex/fonts/KaTeX_Size2-Regular.woff | Bin 6436 -> 0 bytes .../katex/fonts/KaTeX_Size2-Regular.woff2 | Bin 5392 -> 0 bytes .../katex/fonts/KaTeX_Size3-Regular.ttf | Bin 8120 -> 0 bytes .../katex/fonts/KaTeX_Size3-Regular.woff | Bin 4568 -> 0 bytes .../katex/fonts/KaTeX_Size3-Regular.woff2 | Bin 3728 -> 0 bytes .../katex/fonts/KaTeX_Size4-Regular.ttf | Bin 11016 -> 0 bytes .../katex/fonts/KaTeX_Size4-Regular.woff | Bin 6184 -> 0 bytes .../katex/fonts/KaTeX_Size4-Regular.woff2 | Bin 5028 -> 0 bytes .../katex/fonts/KaTeX_Typewriter-Regular.ttf | Bin 35924 -> 0 bytes .../katex/fonts/KaTeX_Typewriter-Regular.woff | Bin 20260 -> 0 bytes .../fonts/KaTeX_Typewriter-Regular.woff2 | Bin 17272 -> 0 bytes .../themes/book/static/katex/katex.min.css | 1 - website/themes/book/static/katex/katex.min.js | 1 - website/themes/book/static/mermaid.min.js | 49 - website/themes/book/static/prism.css | 140 -- website/themes/book/static/prism.js | 78 -- website/themes/book/static/svg/calendar.svg | 1 - website/themes/book/static/svg/edit.svg | 1 - website/themes/book/static/svg/menu.svg | 1 - website/themes/book/static/svg/toc.svg | 1 - website/themes/book/static/svg/translate.svg | 1 - website/themes/book/theme.toml | 15 - website/themes/zdoc/LICENSE.md | 21 + website/themes/zdoc/README.md | 383 ++++++ .../posts.md => zdoc/archetypes/default.md} | 4 + website/themes/zdoc/assets/js/enquire.min.js | 6 + website/themes/zdoc/assets/js/fuse.min.js | 13 + .../themes/zdoc/assets/js/helper/closest.js | 12 + .../themes/zdoc/assets/js/helper/fadeinout.js | 41 + .../zdoc/assets/js/helper/getParents.js | 58 + website/themes/zdoc/assets/js/helper/next.js | 7 + website/themes/zdoc/assets/js/helper/prev.js | 7 + website/themes/zdoc/assets/js/helper/prop.js | 6 + .../themes/zdoc/assets/js/lazysizes.min.js | 2 + website/themes/zdoc/assets/js/swipe.js | 828 ++++++++++++ .../zdoc/assets/sass/abstracts/_flexbox.scss | 138 ++ .../assets/sass/abstracts/_functions.scss | 12 + .../zdoc/assets/sass/abstracts/_mixins.scss | 230 ++++ .../assets/sass/abstracts/_variables.scss | 39 + .../zdoc/assets/sass/base/_animation.scss | 26 + .../themes/zdoc/assets/sass/base/_fonts.scss | 205 +++ .../zdoc/assets/sass/base/_helpers.scss | 38 + .../themes/zdoc/assets/sass/base/_reset.scss | 153 +++ .../zdoc/assets/sass/base/_typography.scss | 56 + .../zdoc/assets/sass/components/_alert.scss | 60 + .../zdoc/assets/sass/components/_bgcolor.scss | 11 + .../assets/sass/components/_breadcrumb.scss | 52 + .../zdoc/assets/sass/components/_button.scss | 61 + .../zdoc/assets/sass/components/_drawer.scss | 59 + .../assets/sass/components/_dropdown.scss | 22 + .../zdoc/assets/sass/components/_expand.scss | 81 ++ .../assets/sass/components/_language.scss | 56 + .../zdoc/assets/sass/components/_lib.scss | 7 + .../zdoc/assets/sass/components/_menu.scss | 191 +++ .../zdoc/assets/sass/components/_modal.scss | 15 + .../zdoc/assets/sass/components/_notice.scss | 235 ++++ .../assets/sass/components/_pagination.scss | 96 ++ .../zdoc/assets/sass/components/_search.scss | 368 ++++++ .../zdoc/assets/sass/components/_section.scss | 214 +++ .../zdoc/assets/sass/components/_summary.scss | 116 ++ .../zdoc/assets/sass/components/_switch.scss | 63 + .../zdoc/assets/sass/components/_tag.scss | 29 + .../zdoc/assets/sass/components/_toc.scss | 75 ++ .../zdoc/assets/sass/layout/_footer.scss | 49 + .../themes/zdoc/assets/sass/layout/_grid.scss | 75 ++ .../zdoc/assets/sass/layout/_header.scss | 66 + .../themes/zdoc/assets/sass/layout/_main.scss | 14 + .../zdoc/assets/sass/layout/_navbar.scss | 297 +++++ website/themes/zdoc/assets/sass/main.scss | 62 + .../themes/zdoc/assets/sass/pages/_blog.scss | 21 + .../themes/zdoc/assets/sass/pages/_home.scss | 76 ++ .../themes/zdoc/assets/sass/pages/_list.scss | 57 + .../zdoc/assets/sass/pages/_single.scss | 539 ++++++++ .../zdoc/assets/sass/syntax/_dracula.scss | 62 + .../assets/sass/syntax/_duotonelight.scss | 75 ++ .../zdoc/assets/sass/syntax/_monokai.scss | 61 + .../zdoc/assets/sass/syntax/_syntax.scss | 11 + .../themes/zdoc/assets/sass/themes/_dark.scss | 50 + .../zdoc/assets/sass/themes/_darkcode.scss | 9 + .../zdoc/assets/sass/themes/_light.scss | 50 + .../zdoc/assets/sass/themes/_lightcode.scss | 9 + .../zdoc/assets/sass/themes/_theme.scss | 15 + website/themes/zdoc/data/color.toml | 14 + website/themes/zdoc/data/flowchartjs.json | 58 + website/themes/zdoc/data/font.toml | 2 + website/themes/zdoc/data/lib.toml | 40 + .../exampleSite/config/_default/config.toml | 46 + .../config/_default/languages.toml | 11 + .../exampleSite/config/_default/menus.en.toml | 17 + .../exampleSite/config/_default/menus.ko.toml | 17 + .../exampleSite/config/_default/params.toml | 77 ++ .../zdoc/exampleSite/content/en/_index.md | 30 + .../exampleSite/content/en/blog/_index.md | 33 + .../content/en/blog/emoji-support.md | 53 + .../content/en/blog/markdown-syntax.md | 151 +++ .../content/en/blog/placeholder-text.md | 59 + .../exampleSite/content/en/docs/_index.md | 8 + .../content/en/docs/contentfortmats.md | 8 + .../en/docs/contentmanagement/_index.md | 9 + .../en/docs/contentmanagement/frontmatter.md | 8 + .../en/docs/contentmanagement/sections.md | 146 +++ .../en/docs/contentmanagement/shortcodes.md | 8 + .../content/en/docs/depth1/_index.md | 8 + .../content/en/docs/depth1/depth2/_index.md | 8 + .../en/docs/depth1/depth2/depth3/_index.md | 8 + .../en/docs/depth1/depth2/depth3/test3.md | 8 + .../content/en/docs/depth1/depth2/test2.md | 8 + .../content/en/docs/depth1/test1.md | 8 + .../content/en/docs/depth1/ttttest.md | 8 + .../content/en/docs/gettingstarted/_index.md | 9 + .../en/docs/gettingstarted/basicusage.md | 9 + .../en/docs/gettingstarted/configuration.md | 9 + .../en/docs/gettingstarted/installation.md | 9 + .../en/docs/gettingstarted/quickstart.md | 9 + .../content/en/docs/imageprocessing.md | 8 + .../content/en/docs/pagebundles.md | 8 + .../content/en/docs/pageresources.md | 8 + .../content/en/docs/relatedcontent.md | 8 + .../content/en/updates/2019_april.md | 9 + .../content/en/updates/2019_february.md | 9 + .../content/en/updates/2019_january.md | 9 + .../content/en/updates/2019_march.md | 9 + .../content/en/updates/2019_may.md | 9 + .../exampleSite/content/en/updates/_index.md | 8 + .../zdoc/exampleSite/content/ko/_index.md | 30 + .../exampleSite/content/ko/blog/_index.md | 33 + .../content/ko/blog/emoji-support.md | 53 + .../content/ko/blog/markdown-syntax.md | 151 +++ .../content/ko/blog/placeholder-text.md | 59 + .../exampleSite/content/ko/docs/_index.md | 8 + .../content/ko/docs/contentfortmats.md | 8 + .../ko/docs/contentmanagement/_index.md | 9 + .../ko/docs/contentmanagement/frontmatter.md | 8 + .../ko/docs/contentmanagement/sections.md | 146 +++ .../ko/docs/contentmanagement/shortcodes.md | 8 + .../content/ko/docs/gettingstarted/_index.md | 9 + .../ko/docs/gettingstarted/basicusage.md | 9 + .../ko/docs/gettingstarted/configuration.md | 9 + .../ko/docs/gettingstarted/installation.md | 9 + .../ko/docs/gettingstarted/quickstart.md | 9 + .../content/ko/docs/imageprocessing.md | 8 + .../content/ko/docs/pagebundles.md | 8 + .../content/ko/docs/pageresources.md | 8 + .../content/ko/docs/relatedcontent.md | 8 + .../content/ko/updates/2019_april.md | 9 + .../content/ko/updates/2019_february.md | 9 + .../content/ko/updates/2019_january.md | 9 + .../content/ko/updates/2019_march.md | 9 + .../content/ko/updates/2019_may.md | 9 + .../exampleSite/content/ko/updates/_index.md | 8 + ...s_b4f67ac5085b89b62b54c1923e5a9145.content | 1 + ...scss_b4f67ac5085b89b62b54c1923e5a9145.json | 1 + .../static/favicon/android-icon-144x144.png | Bin 0 -> 3658 bytes .../static/favicon/android-icon-192x192.png | Bin 0 -> 3772 bytes .../static/favicon/android-icon-36x36.png | Bin 0 -> 1262 bytes .../static/favicon/android-icon-48x48.png | Bin 0 -> 1567 bytes .../static/favicon/android-icon-512x512.png | Bin 0 -> 8688 bytes .../static/favicon/android-icon-72x72.png | Bin 0 -> 1653 bytes .../static/favicon/android-icon-96x96.png | Bin 0 -> 1911 bytes .../static/favicon/apple-icon-114x114.png | Bin 0 -> 2237 bytes .../static/favicon/apple-icon-120x120.png | Bin 0 -> 2383 bytes .../static/favicon/apple-icon-144x144.png | Bin 0 -> 3658 bytes .../static/favicon/apple-icon-152x152.png | Bin 0 -> 3756 bytes .../static/favicon/apple-icon-180x180.png | Bin 0 -> 4474 bytes .../static/favicon/apple-icon-57x57.png | Bin 0 -> 1415 bytes .../static/favicon/apple-icon-60x60.png | Bin 0 -> 1531 bytes .../static/favicon/apple-icon-72x72.png | Bin 0 -> 1653 bytes .../static/favicon/apple-icon-76x76.png | Bin 0 -> 1673 bytes .../static/favicon/apple-icon-precomposed.png | Bin 0 -> 4346 bytes .../exampleSite/static/favicon/apple-icon.png | Bin 0 -> 4346 bytes .../static/favicon/favicon-16x16.png | Bin 0 -> 982 bytes .../static/favicon/favicon-32x32.png | Bin 0 -> 1241 bytes .../static/favicon/favicon-96x96.png | Bin 0 -> 1911 bytes .../exampleSite/static/favicon/favicon.ico | Bin 0 -> 1150 bytes .../static/favicon/ms-icon-144x144.png | Bin 0 -> 3658 bytes .../static/favicon/ms-icon-150x150.png | Bin 0 -> 3699 bytes .../static/favicon/ms-icon-310x310.png | Bin 0 -> 9220 bytes .../static/favicon/ms-icon-70x70.png | Bin 0 -> 1616 bytes .../exampleSite/static/images/landscape.jpg | Bin 0 -> 254154 bytes .../exampleSite/static/images/mountain.jpg | Bin 0 -> 209091 bytes .../exampleSite/static/images/mountains.jpg | Bin 0 -> 289048 bytes .../themes/zdoc/exampleSite/static/logo.png | Bin 0 -> 1567 bytes .../zdoc/exampleSite/static/manifest.json | 56 + website/themes/zdoc/i18n/en.toml | 23 + website/themes/zdoc/i18n/ko.toml | 23 + website/themes/zdoc/images/screenshot.png | Bin 0 -> 276518 bytes website/themes/zdoc/images/tn.png | Bin 0 -> 135526 bytes website/themes/zdoc/layouts/404.html | 5 + .../_default/_markup/render-image.html | 3 + .../layouts/_default/_markup/render-link.html | 1 + .../themes/zdoc/layouts/_default/baseof.html | 33 + .../layouts/_default/list.searchindex.json | 8 + website/themes/zdoc/layouts/_default/rss.xml | 41 + .../themes/zdoc/layouts/_default/section.html | 7 + .../themes/zdoc/layouts/_default/single.html | 6 + .../layouts/_default/single.searchindex.json | 8 + .../themes/zdoc/layouts/_default/sitemap.xml | 22 + .../themes/zdoc/layouts/_default/summary.html | 42 + .../zdoc/layouts/_default/taxonomy.html | 72 ++ .../layouts/_default/terms.searchindex.json | 8 + website/themes/zdoc/layouts/blog/section.html | 71 + website/themes/zdoc/layouts/blog/single.html | 68 + website/themes/zdoc/layouts/index.html | 7 + website/themes/zdoc/layouts/index.json | 8 + .../layouts/partials/comments/changyan.html | 11 + .../layouts/partials/comments/commento.html | 2 + .../layouts/partials/comments/comments.html | 21 + .../layouts/partials/comments/disqus.html | 18 + .../layouts/partials/comments/gitalk.html | 17 + .../layouts/partials/comments/gitment.html | 19 + .../zdoc/layouts/partials/comments/isso.html | 6 + .../layouts/partials/comments/livere.html | 17 + .../layouts/partials/comments/utterances.html | 29 + .../layouts/partials/comments/valine.html | 22 + .../partials/drawer/drawer-section.html | 10 + .../zdoc/layouts/partials/drawer/drawer.html | 41 + .../zdoc/layouts/partials/footer/footer.html | 40 + .../zdoc/layouts/partials/head/meta.html | 42 + .../layouts/partials/head/meta_json_ld.html | 47 + .../zdoc/layouts/partials/head/scripts.html | 965 ++++++++++++++ .../zdoc/layouts/partials/head/services.html | 2 + .../zdoc/layouts/partials/head/styles.html | 14 + .../partials/header/blog-header-img.html | 27 + .../partials/header/blog-header-text.html | 26 + .../layouts/partials/header/blog-header.html | 7 + .../partials/header/custom-header.html | 1 + .../layouts/partials/header/site-header.html | 13 + .../layouts/partials/header/taxo-header.html | 5 + .../partials/main/component/article-meta.html | 1 + .../partials/main/component/breadcrumb.html | 21 + .../main/component/edit-this-page.html | 7 + .../main/component/pagination-single.html | 42 + .../partials/main/component/pagination.html | 31 + .../layouts/partials/main/component/toc.html | 6 + .../main/component/toggle-sidebar.html | 13 + .../zdoc/layouts/partials/main/header.html | 21 + .../zdoc/layouts/partials/main/home.html | 6 + .../partials/main/landing/home-landing.html | 73 ++ .../partials/main/landing/home-sections.html | 15 + .../partials/main/landing/home-social.html | 11 + .../partials/main/landing/section-card.html | 66 + .../partials/main/landing/section-normal.html | 48 + .../zdoc/layouts/partials/main/list.html | 64 + .../partials/main/sections/list-main.html | 14 + .../partials/main/sections/list-menu.html | 87 ++ .../partials/main/sections/list-section.html | 13 + .../partials/main/sections/single-menu.html | 62 + .../zdoc/layouts/partials/main/single.html | 67 + .../navbar/icons/light-dark-toggle.html | 21 + .../partials/navbar/icons/navbar-icons.html | 10 + .../partials/navbar/icons/select-lang.html | 28 + .../navbar/logo/navbar-logo-mobile.html | 7 + .../navbar/logo/navbar-logo-tablet.html | 13 + .../partials/navbar/logo/navbar-logo.html | 14 + .../navbar/menu/navbar-menu-collapse.html | 5 + .../navbar/menu/navbar-menu-mobile.html | 11 + .../partials/navbar/menu/navbar-menu.html | 10 + .../zdoc/layouts/partials/navbar/navbar.html | 97 ++ .../navbar/search/site-search-mobile.html | 17 + .../partials/navbar/search/site-search.html | 14 + .../partials/script/single-script.html | 225 ++++ .../zdoc/layouts/partials/side/toc.html | 7 + .../zdoc/layouts/partials/svgs/arrow-back.svg | 1 + .../zdoc/layouts/partials/svgs/arrow-down.svg | 1 + .../layouts/partials/svgs/arrow-forward.svg | 1 + .../zdoc/layouts/partials/svgs/arrow-left.svg | 1 + .../layouts/partials/svgs/arrow-right.svg | 1 + .../zdoc/layouts/partials/svgs/avatar.svg | 1 + .../zdoc/layouts/partials/svgs/calendar.svg | 1 + .../zdoc/layouts/partials/svgs/cancel.svg | 1 + .../zdoc/layouts/partials/svgs/close.svg | 1 + .../zdoc/layouts/partials/svgs/dark-mode.svg | 1 + .../zdoc/layouts/partials/svgs/edit.svg | 1 + .../zdoc/layouts/partials/svgs/github.svg | 1 + .../layouts/partials/svgs/hand-with-pen.svg | 1 + .../zdoc/layouts/partials/svgs/home.svg | 1 + .../layouts/partials/svgs/invert-colors.svg | 1 + .../zdoc/layouts/partials/svgs/light-mode.svg | 1 + .../zdoc/layouts/partials/svgs/menu.svg | 1 + .../zdoc/layouts/partials/svgs/search.svg | 1 + .../zdoc/layouts/partials/svgs/time.svg | 1 + .../zdoc/layouts/partials/svgs/translate.svg | 1 + website/themes/zdoc/layouts/robots.txt | 1 + .../themes/zdoc/layouts/shortcodes/alert.html | 6 + .../themes/zdoc/layouts/shortcodes/box.html | 1 + .../themes/zdoc/layouts/shortcodes/color.html | 1 + .../zdoc/layouts/shortcodes/expand.html | 11 + .../themes/zdoc/layouts/shortcodes/img.html | 17 + .../zdoc/layouts/shortcodes/notice.html | 3 + .../zdoc/static/fonts/montserrat-black.woff | Bin 0 -> 30436 bytes .../zdoc/static/fonts/montserrat-black.woff2 | Bin 0 -> 23192 bytes .../zdoc/static/fonts/montserrat-bold.woff | Bin 0 -> 33608 bytes .../zdoc/static/fonts/montserrat-bold.woff2 | Bin 0 -> 25816 bytes .../zdoc/static/fonts/montserrat-regular.woff | Bin 0 -> 33084 bytes .../static/fonts/montserrat-regular.woff2 | Bin 0 -> 25500 bytes .../zdoc/static/fonts/muli-latin-200.woff | Bin 0 -> 20892 bytes .../zdoc/static/fonts/muli-latin-200.woff2 | Bin 0 -> 16936 bytes .../static/fonts/muli-latin-200italic.woff | Bin 0 -> 21496 bytes .../static/fonts/muli-latin-200italic.woff2 | Bin 0 -> 17320 bytes .../zdoc/static/fonts/muli-latin-300.woff | Bin 0 -> 20932 bytes .../zdoc/static/fonts/muli-latin-300.woff2 | Bin 0 -> 16872 bytes .../static/fonts/muli-latin-300italic.woff | Bin 0 -> 21520 bytes .../static/fonts/muli-latin-300italic.woff2 | Bin 0 -> 17332 bytes .../zdoc/static/fonts/muli-latin-400.woff | Bin 0 -> 21240 bytes .../zdoc/static/fonts/muli-latin-400.woff2 | Bin 0 -> 17172 bytes .../static/fonts/muli-latin-400italic.woff | Bin 0 -> 21964 bytes .../static/fonts/muli-latin-400italic.woff2 | Bin 0 -> 17732 bytes .../zdoc/static/fonts/muli-latin-600.woff | Bin 0 -> 21208 bytes .../zdoc/static/fonts/muli-latin-600.woff2 | Bin 0 -> 17080 bytes .../static/fonts/muli-latin-600italic.woff | Bin 0 -> 21924 bytes .../static/fonts/muli-latin-600italic.woff2 | Bin 0 -> 17776 bytes .../zdoc/static/fonts/muli-latin-700.woff | Bin 0 -> 21220 bytes .../zdoc/static/fonts/muli-latin-700.woff2 | Bin 0 -> 17128 bytes .../static/fonts/muli-latin-700italic.woff | Bin 0 -> 21960 bytes .../static/fonts/muli-latin-700italic.woff2 | Bin 0 -> 17756 bytes .../zdoc/static/fonts/muli-latin-800.woff | Bin 0 -> 21244 bytes .../zdoc/static/fonts/muli-latin-800.woff2 | Bin 0 -> 17140 bytes .../static/fonts/muli-latin-800italic.woff | Bin 0 -> 21872 bytes .../static/fonts/muli-latin-800italic.woff2 | Bin 0 -> 17644 bytes .../zdoc/static/fonts/muli-latin-900.woff | Bin 0 -> 21676 bytes .../zdoc/static/fonts/muli-latin-900.woff2 | Bin 0 -> 17436 bytes .../static/fonts/muli-latin-900italic.woff | Bin 0 -> 22220 bytes .../static/fonts/muli-latin-900italic.woff2 | Bin 0 -> 17948 bytes .../themes/zdoc/static/images/landscape.jpg | Bin 0 -> 254154 bytes .../themes/zdoc/static/images/mountain.jpg | Bin 0 -> 209091 bytes .../themes/zdoc/static/images/mountains.jpg | Bin 0 -> 289048 bytes .../zdoc/static/images/section/keyboard.png | Bin 0 -> 2123 bytes .../zdoc/static/images/section/processor.png | Bin 0 -> 3279 bytes .../static/images/section/root-server.png | Bin 0 -> 2761 bytes website/themes/zdoc/static/logo.png | Bin 0 -> 1567 bytes website/themes/zdoc/static/manifest.json | 56 + website/themes/zdoc/theme.toml | 12 + 1183 files changed, 12730 insertions(+), 55659 deletions(-) delete mode 100644 website/content/ChapterFour/0001.Two-Sum.md delete mode 100644 website/content/ChapterFour/0002.Add-Two-Numbers.md delete mode 100644 website/content/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md delete mode 100755 website/content/ChapterFour/0004.Median-of-Two-Sorted-Arrays.md delete mode 100755 website/content/ChapterFour/0007.Reverse-Integer.md delete mode 100644 website/content/ChapterFour/0009.Palindrome-Number.md delete mode 100644 website/content/ChapterFour/0011.Container-With-Most-Water.md delete mode 100644 website/content/ChapterFour/0013.Roman-to-Integer.md delete mode 100644 website/content/ChapterFour/0015.3Sum.md delete mode 100644 website/content/ChapterFour/0016.3Sum-Closest.md delete mode 100644 website/content/ChapterFour/0018.4Sum.md delete mode 100644 website/content/ChapterFour/0019.Remove-Nth-Node-From-End-of-List.md delete mode 100644 website/content/ChapterFour/0020.Valid-Parentheses.md delete mode 100644 website/content/ChapterFour/0021.Merge-Two-Sorted-Lists.md delete mode 100755 website/content/ChapterFour/0022.Generate-Parentheses.md delete mode 100644 website/content/ChapterFour/0023.Merge-k-Sorted-Lists.md delete mode 100644 website/content/ChapterFour/0024.Swap-Nodes-in-Pairs.md delete mode 100644 website/content/ChapterFour/0025.Reverse-Nodes-in-k-Group.md delete mode 100644 website/content/ChapterFour/0026.Remove-Duplicates-from-Sorted-Array.md delete mode 100644 website/content/ChapterFour/0027.Remove-Element.md delete mode 100644 website/content/ChapterFour/0028.Implement-strStr.md delete mode 100755 website/content/ChapterFour/0029.Divide-Two-Integers.md delete mode 100644 website/content/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md delete mode 100755 website/content/ChapterFour/0033.Search-in-Rotated-Sorted-Array.md delete mode 100755 website/content/ChapterFour/0034.Find-First-and-Last-Position-of-Element-in-Sorted-Array.md delete mode 100755 website/content/ChapterFour/0035.Search-Insert-Position.md delete mode 100755 website/content/ChapterFour/0036.Valid-Sudoku.md delete mode 100755 website/content/ChapterFour/0037.Sudoku-Solver.md delete mode 100755 website/content/ChapterFour/0039.Combination-Sum.md delete mode 100755 website/content/ChapterFour/0040.Combination-Sum-II.md delete mode 100644 website/content/ChapterFour/0041.First-Missing-Positive.md delete mode 100644 website/content/ChapterFour/0042.Trapping-Rain-Water.md delete mode 100755 website/content/ChapterFour/0046.Permutations.md delete mode 100755 website/content/ChapterFour/0047.Permutations-II.md delete mode 100755 website/content/ChapterFour/0048.Rotate-Image.md delete mode 100644 website/content/ChapterFour/0049.Group-Anagrams.md delete mode 100755 website/content/ChapterFour/0050.Powx-n.md delete mode 100755 website/content/ChapterFour/0051.N-Queens.md delete mode 100755 website/content/ChapterFour/0052.N-Queens-II.md delete mode 100755 website/content/ChapterFour/0053.Maximum-Subarray.md delete mode 100755 website/content/ChapterFour/0054.Spiral-Matrix.md delete mode 100644 website/content/ChapterFour/0055.Jump-Game.md delete mode 100644 website/content/ChapterFour/0056.Merge-Intervals.md delete mode 100644 website/content/ChapterFour/0057.Insert-Interval.md delete mode 100755 website/content/ChapterFour/0059.Spiral-Matrix-II.md delete mode 100755 website/content/ChapterFour/0060.Permutation-Sequence.md delete mode 100644 website/content/ChapterFour/0061.Rotate-List.md delete mode 100755 website/content/ChapterFour/0062.Unique-Paths.md delete mode 100755 website/content/ChapterFour/0063.Unique-Paths-II.md delete mode 100755 website/content/ChapterFour/0064.Minimum-Path-Sum.md delete mode 100755 website/content/ChapterFour/0066.Plus-One.md delete mode 100644 website/content/ChapterFour/0067.Add-Binary.md delete mode 100755 website/content/ChapterFour/0069.Sqrtx.md delete mode 100755 website/content/ChapterFour/0070.Climbing-Stairs.md delete mode 100644 website/content/ChapterFour/0071.Simplify-Path.md delete mode 100755 website/content/ChapterFour/0074.Search-a-2D-Matrix.md delete mode 100644 website/content/ChapterFour/0075.Sort-Colors.md delete mode 100644 website/content/ChapterFour/0076.Minimum-Window-Substring.md delete mode 100755 website/content/ChapterFour/0077.Combinations.md delete mode 100755 website/content/ChapterFour/0078.Subsets.md delete mode 100755 website/content/ChapterFour/0079.Word-Search.md delete mode 100755 website/content/ChapterFour/0081.Search-in-Rotated-Sorted-Array-II.md delete mode 100644 website/content/ChapterFour/0083.Remove-Duplicates-from-Sorted-List.md delete mode 100644 website/content/ChapterFour/0084.Largest-Rectangle-in-Histogram.md delete mode 100644 website/content/ChapterFour/0086.Partition-List.md delete mode 100644 website/content/ChapterFour/0088.Merge-Sorted-Array.md delete mode 100755 website/content/ChapterFour/0089.Gray-Code.md delete mode 100755 website/content/ChapterFour/0090.Subsets-II.md delete mode 100755 website/content/ChapterFour/0091.Decode-Ways.md delete mode 100644 website/content/ChapterFour/0092.Reverse-Linked-List-II.md delete mode 100755 website/content/ChapterFour/0093.Restore-IP-Addresses.md delete mode 100644 website/content/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md delete mode 100755 website/content/ChapterFour/0096.Unique-Binary-Search-Trees.md delete mode 100755 website/content/ChapterFour/0098.Validate-Binary-Search-Tree.md delete mode 100755 website/content/ChapterFour/0099.Recover-Binary-Search-Tree.md delete mode 100644 website/content/ChapterFour/0100.Same-Tree.md delete mode 100644 website/content/ChapterFour/0101.Symmetric-Tree.md delete mode 100644 website/content/ChapterFour/0102.Binary-Tree-Level-Order-Traversal.md delete mode 100644 website/content/ChapterFour/0104.Maximum-Depth-of-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0105.Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal.md delete mode 100755 website/content/ChapterFour/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md delete mode 100644 website/content/ChapterFour/0107.Binary-Tree-Level-Order-Traversal-II.md delete mode 100755 website/content/ChapterFour/0108.Convert-Sorted-Array-to-Binary-Search-Tree.md delete mode 100644 website/content/ChapterFour/0109.Convert-Sorted-List-to-Binary-Search-Tree.md delete mode 100644 website/content/ChapterFour/0110.Balanced-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0112.Path-Sum.md delete mode 100755 website/content/ChapterFour/0113.Path-Sum-II.md delete mode 100755 website/content/ChapterFour/0114.Flatten-Binary-Tree-to-Linked-List.md delete mode 100644 website/content/ChapterFour/0118.Pascals-Triangle.md delete mode 100755 website/content/ChapterFour/0120.Triangle.md delete mode 100755 website/content/ChapterFour/0121.Best-Time-to-Buy-and-Sell-Stock.md delete mode 100755 website/content/ChapterFour/0122.Best-Time-to-Buy-and-Sell-Stock-II.md delete mode 100755 website/content/ChapterFour/0124.Binary-Tree-Maximum-Path-Sum.md delete mode 100644 website/content/ChapterFour/0125.Valid-Palindrome.md delete mode 100755 website/content/ChapterFour/0126.Word-Ladder-II.md delete mode 100755 website/content/ChapterFour/0128.Longest-Consecutive-Sequence.md delete mode 100755 website/content/ChapterFour/0129.Sum-Root-to-Leaf-Numbers.md delete mode 100755 website/content/ChapterFour/0130.Surrounded-Regions.md delete mode 100755 website/content/ChapterFour/0131.Palindrome-Partitioning.md delete mode 100755 website/content/ChapterFour/0136.Single-Number.md delete mode 100755 website/content/ChapterFour/0137.Single-Number-II.md delete mode 100644 website/content/ChapterFour/0141.Linked-List-Cycle.md delete mode 100644 website/content/ChapterFour/0142.Linked-List-Cycle-II.md delete mode 100644 website/content/ChapterFour/0143.Reorder-List.md delete mode 100644 website/content/ChapterFour/0144.Binary-Tree-Preorder-Traversal.md delete mode 100644 website/content/ChapterFour/0145.Binary-Tree-Postorder-Traversal.md delete mode 100644 website/content/ChapterFour/0148.Sort-List.md delete mode 100644 website/content/ChapterFour/0150.Evaluate-Reverse-Polish-Notation.md delete mode 100755 website/content/ChapterFour/0151.Reverse-Words-in-a-String.md delete mode 100755 website/content/ChapterFour/0152.Maximum-Product-Subarray.md delete mode 100755 website/content/ChapterFour/0153.Find-Minimum-in-Rotated-Sorted-Array.md delete mode 100755 website/content/ChapterFour/0154.Find-Minimum-in-Rotated-Sorted-Array-II.md delete mode 100644 website/content/ChapterFour/0155.Min-Stack.md delete mode 100644 website/content/ChapterFour/0160.Intersection-of-Two-Linked-Lists.md delete mode 100755 website/content/ChapterFour/0162.Find-Peak-Element.md delete mode 100644 website/content/ChapterFour/0164.Maximum-Gap.md delete mode 100644 website/content/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md delete mode 100644 website/content/ChapterFour/0168.Excel-Sheet-Column-Title.md delete mode 100755 website/content/ChapterFour/0169.Majority-Element.md delete mode 100644 website/content/ChapterFour/0171.Excel-Sheet-Column-Number.md delete mode 100755 website/content/ChapterFour/0172.Factorial-Trailing-Zeroes.md delete mode 100755 website/content/ChapterFour/0173.Binary-Search-Tree-Iterator.md delete mode 100755 website/content/ChapterFour/0174.Dungeon-Game.md delete mode 100644 website/content/ChapterFour/0179.Largest-Number.md delete mode 100755 website/content/ChapterFour/0187.Repeated-DNA-Sequences.md delete mode 100755 website/content/ChapterFour/0190.Reverse-Bits.md delete mode 100755 website/content/ChapterFour/0191.Number-of-1-Bits.md delete mode 100755 website/content/ChapterFour/0198.House-Robber.md delete mode 100644 website/content/ChapterFour/0199.Binary-Tree-Right-Side-View.md delete mode 100755 website/content/ChapterFour/0200.Number-of-Islands.md delete mode 100755 website/content/ChapterFour/0201.Bitwise-AND-of-Numbers-Range.md delete mode 100644 website/content/ChapterFour/0202.Happy-Number.md delete mode 100644 website/content/ChapterFour/0203.Remove-Linked-List-Elements.md delete mode 100755 website/content/ChapterFour/0204.Count-Primes.md delete mode 100644 website/content/ChapterFour/0205.Isomorphic-Strings.md delete mode 100644 website/content/ChapterFour/0206.Reverse-Linked-List.md delete mode 100755 website/content/ChapterFour/0207.Course-Schedule.md delete mode 100755 website/content/ChapterFour/0208.Implement-Trie-Prefix-Tree.md delete mode 100644 website/content/ChapterFour/0209.Minimum-Size-Subarray-Sum.md delete mode 100755 website/content/ChapterFour/0210.Course-Schedule-II.md delete mode 100755 website/content/ChapterFour/0211.Add-and-Search-Word---Data-structure-design.md delete mode 100755 website/content/ChapterFour/0212.Word-Search-II.md delete mode 100755 website/content/ChapterFour/0213.House-Robber-II.md delete mode 100644 website/content/ChapterFour/0215.Kth-Largest-Element-in-an-Array.md delete mode 100755 website/content/ChapterFour/0216.Combination-Sum-III.md delete mode 100644 website/content/ChapterFour/0217.Contains-Duplicate.md delete mode 100755 website/content/ChapterFour/0218.The-Skyline-Problem.md delete mode 100644 website/content/ChapterFour/0219.Contains-Duplicate-II.md delete mode 100644 website/content/ChapterFour/0220.Contains-Duplicate-III.md delete mode 100644 website/content/ChapterFour/0222.Count-Complete-Tree-Nodes.md delete mode 100755 website/content/ChapterFour/0223.Rectangle-Area.md delete mode 100644 website/content/ChapterFour/0225.Implement-Stack-using-Queues.md delete mode 100644 website/content/ChapterFour/0226.Invert-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0229.Majority-Element-II.md delete mode 100755 website/content/ChapterFour/0230.Kth-Smallest-Element-in-a-BST.md delete mode 100755 website/content/ChapterFour/0231.Power-of-Two.md delete mode 100644 website/content/ChapterFour/0232.Implement-Queue-using-Stacks.md delete mode 100644 website/content/ChapterFour/0234.Palindrome-Linked-List.md delete mode 100755 website/content/ChapterFour/0235.Lowest-Common-Ancestor-of-a-Binary-Search-Tree.md delete mode 100755 website/content/ChapterFour/0236.Lowest-Common-Ancestor-of-a-Binary-Tree.md delete mode 100644 website/content/ChapterFour/0237.Delete-Node-in-a-Linked-List.md delete mode 100755 website/content/ChapterFour/0239.Sliding-Window-Maximum.md delete mode 100755 website/content/ChapterFour/0240.Search-a-2D-Matrix-II.md delete mode 100644 website/content/ChapterFour/0242.Valid-Anagram.md delete mode 100755 website/content/ChapterFour/0257.Binary-Tree-Paths.md delete mode 100644 website/content/ChapterFour/0258.Add-Digits.md delete mode 100755 website/content/ChapterFour/0260.Single-Number-III.md delete mode 100644 website/content/ChapterFour/0263.Ugly-Number.md delete mode 100755 website/content/ChapterFour/0268.Missing-Number.md delete mode 100644 website/content/ChapterFour/0274.H-Index.md delete mode 100755 website/content/ChapterFour/0275.H-Index-II.md delete mode 100644 website/content/ChapterFour/0283.Move-Zeroes.md delete mode 100644 website/content/ChapterFour/0287.Find-the-Duplicate-Number.md delete mode 100644 website/content/ChapterFour/0290.Word-Pattern.md delete mode 100755 website/content/ChapterFour/0300.Longest-Increasing-Subsequence.md delete mode 100755 website/content/ChapterFour/0303.Range-Sum-Query---Immutable.md delete mode 100755 website/content/ChapterFour/0306.Additive-Number.md delete mode 100755 website/content/ChapterFour/0307.Range-Sum-Query---Mutable.md delete mode 100755 website/content/ChapterFour/0309.Best-Time-to-Buy-and-Sell-Stock-with-Cooldown.md delete mode 100755 website/content/ChapterFour/0315.Count-of-Smaller-Numbers-After-Self.md delete mode 100755 website/content/ChapterFour/0318.Maximum-Product-of-Word-Lengths.md delete mode 100755 website/content/ChapterFour/0322.Coin-Change.md delete mode 100644 website/content/ChapterFour/0324.Wiggle-Sort-II.md delete mode 100755 website/content/ChapterFour/0326.Power-of-Three.md delete mode 100755 website/content/ChapterFour/0327.Count-of-Range-Sum.md delete mode 100644 website/content/ChapterFour/0328.Odd-Even-Linked-List.md delete mode 100755 website/content/ChapterFour/0329.Longest-Increasing-Path-in-a-Matrix.md delete mode 100644 website/content/ChapterFour/0331.Verify-Preorder-Serialization-of-a-Binary-Tree.md delete mode 100644 website/content/ChapterFour/0337.House-Robber-III.md delete mode 100755 website/content/ChapterFour/0338.Counting-Bits.md delete mode 100755 website/content/ChapterFour/0342.Power-of-Four.md delete mode 100755 website/content/ChapterFour/0343.Integer-Break.md delete mode 100644 website/content/ChapterFour/0344.Reverse-String.md delete mode 100644 website/content/ChapterFour/0345.Reverse-Vowels-of-a-String.md delete mode 100644 website/content/ChapterFour/0347.Top-K-Frequent-Elements.md delete mode 100644 website/content/ChapterFour/0349.Intersection-of-Two-Arrays.md delete mode 100644 website/content/ChapterFour/0350.Intersection-of-Two-Arrays-II.md delete mode 100755 website/content/ChapterFour/0354.Russian-Doll-Envelopes.md delete mode 100755 website/content/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md delete mode 100755 website/content/ChapterFour/0367.Valid-Perfect-Square.md delete mode 100755 website/content/ChapterFour/0371.Sum-of-Two-Integers.md delete mode 100755 website/content/ChapterFour/0372.Super-Pow.md delete mode 100755 website/content/ChapterFour/0373.Find-K-Pairs-with-Smallest-Sums.md delete mode 100755 website/content/ChapterFour/0378.Kth-Smallest-Element-in-a-Sorted-Matrix.md delete mode 100755 website/content/ChapterFour/0385.Mini-Parser.md delete mode 100755 website/content/ChapterFour/0386.Lexicographical-Numbers.md delete mode 100755 website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md delete mode 100755 website/content/ChapterFour/0389.Find-the-Difference.md delete mode 100755 website/content/ChapterFour/0393.UTF-8-Validation.md delete mode 100644 website/content/ChapterFour/0394.Decode-String.md delete mode 100755 website/content/ChapterFour/0397.Integer-Replacement.md delete mode 100755 website/content/ChapterFour/0399.Evaluate-Division.md delete mode 100755 website/content/ChapterFour/0401.Binary-Watch.md delete mode 100644 website/content/ChapterFour/0402.Remove-K-Digits.md delete mode 100755 website/content/ChapterFour/0404.Sum-of-Left-Leaves.md delete mode 100755 website/content/ChapterFour/0405.Convert-a-Number-to-Hexadecimal.md delete mode 100755 website/content/ChapterFour/0409.Longest-Palindrome.md delete mode 100755 website/content/ChapterFour/0410.Split-Array-Largest-Sum.md delete mode 100644 website/content/ChapterFour/0412.Fizz-Buzz.md delete mode 100644 website/content/ChapterFour/0414.Third-Maximum-Number.md delete mode 100755 website/content/ChapterFour/0416.Partition-Equal-Subset-Sum.md delete mode 100755 website/content/ChapterFour/0421.Maximum-XOR-of-Two-Numbers-in-an-Array.md delete mode 100755 website/content/ChapterFour/0433.Minimum-Genetic-Mutation.md delete mode 100755 website/content/ChapterFour/0435.Non-overlapping-Intervals.md delete mode 100755 website/content/ChapterFour/0436.Find-Right-Interval.md delete mode 100755 website/content/ChapterFour/0437.Path-Sum-III.md delete mode 100644 website/content/ChapterFour/0438.Find-All-Anagrams-in-a-String.md delete mode 100755 website/content/ChapterFour/0441.Arranging-Coins.md delete mode 100644 website/content/ChapterFour/0445.Add-Two-Numbers-II.md delete mode 100644 website/content/ChapterFour/0447.Number-of-Boomerangs.md delete mode 100644 website/content/ChapterFour/0448.Find-All-Numbers-Disappeared-in-an-Array.md delete mode 100644 website/content/ChapterFour/0451.Sort-Characters-By-Frequency.md delete mode 100644 website/content/ChapterFour/0453.Minimum-Moves-to-Equal-Array-Elements.md delete mode 100644 website/content/ChapterFour/0454.4Sum-II.md delete mode 100755 website/content/ChapterFour/0455.Assign-Cookies.md delete mode 100755 website/content/ChapterFour/0456.132-Pattern.md delete mode 100755 website/content/ChapterFour/0457.Circular-Array-Loop.md delete mode 100755 website/content/ChapterFour/0461.Hamming-Distance.md delete mode 100755 website/content/ChapterFour/0463.Island-Perimeter.md delete mode 100755 website/content/ChapterFour/0470.Implement-Rand10-Using-Rand7.md delete mode 100755 website/content/ChapterFour/0474.Ones-and-Zeroes.md delete mode 100755 website/content/ChapterFour/0475.Heaters.md delete mode 100755 website/content/ChapterFour/0476.Number-Complement.md delete mode 100755 website/content/ChapterFour/0477.Total-Hamming-Distance.md delete mode 100755 website/content/ChapterFour/0480.Sliding-Window-Median.md delete mode 100755 website/content/ChapterFour/0483.Smallest-Good-Base.md delete mode 100644 website/content/ChapterFour/0485.Max-Consecutive-Ones.md delete mode 100755 website/content/ChapterFour/0491.Increasing-Subsequences.md delete mode 100755 website/content/ChapterFour/0493.Reverse-Pairs.md delete mode 100644 website/content/ChapterFour/0494.Target-Sum.md delete mode 100755 website/content/ChapterFour/0497.Random-Point-in-Non-overlapping-Rectangles.md delete mode 100755 website/content/ChapterFour/0498.Diagonal-Traverse.md delete mode 100755 website/content/ChapterFour/0500.Keyboard-Row.md delete mode 100644 website/content/ChapterFour/0503.Next-Greater-Element-II.md delete mode 100644 website/content/ChapterFour/0507.Perfect-Number.md delete mode 100755 website/content/ChapterFour/0508.Most-Frequent-Subtree-Sum.md delete mode 100755 website/content/ChapterFour/0509.Fibonacci-Number.md delete mode 100755 website/content/ChapterFour/0513.Find-Bottom-Left-Tree-Value.md delete mode 100755 website/content/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md delete mode 100644 website/content/ChapterFour/0524.Longest-Word-in-Dictionary-through-Deleting.md delete mode 100755 website/content/ChapterFour/0526.Beautiful-Arrangement.md delete mode 100755 website/content/ChapterFour/0528.Random-Pick-with-Weight.md delete mode 100644 website/content/ChapterFour/0529.Minesweeper.md delete mode 100644 website/content/ChapterFour/0532.K-diff-Pairs-in-an-Array.md delete mode 100644 website/content/ChapterFour/0537.Complex-Number-Multiplication.md delete mode 100755 website/content/ChapterFour/0541.Reverse-String-II.md delete mode 100755 website/content/ChapterFour/0542.01-Matrix.md delete mode 100755 website/content/ChapterFour/0547.Friend-Circles.md delete mode 100755 website/content/ChapterFour/0557.Reverse-Words-in-a-String-III.md delete mode 100644 website/content/ChapterFour/0561.Array-Partition-I.md delete mode 100755 website/content/ChapterFour/0563.Binary-Tree-Tilt.md delete mode 100755 website/content/ChapterFour/0566.Reshape-the-Matrix.md delete mode 100644 website/content/ChapterFour/0567.Permutation-in-String.md delete mode 100755 website/content/ChapterFour/0572.Subtree-of-Another-Tree.md delete mode 100755 website/content/ChapterFour/0575.Distribute-Candies.md delete mode 100755 website/content/ChapterFour/0594.Longest-Harmonious-Subsequence.md delete mode 100644 website/content/ChapterFour/0598.Range-Addition-II.md delete mode 100755 website/content/ChapterFour/0599.Minimum-Index-Sum-of-Two-Lists.md delete mode 100755 website/content/ChapterFour/0628.Maximum-Product-of-Three-Numbers.md delete mode 100755 website/content/ChapterFour/0632.Smallest-Range-Covering-Elements-from-K-Lists.md delete mode 100755 website/content/ChapterFour/0633.Sum-of-Square-Numbers.md delete mode 100755 website/content/ChapterFour/0636.Exclusive-Time-of-Functions.md delete mode 100644 website/content/ChapterFour/0637.Average-of-Levels-in-Binary-Tree.md delete mode 100644 website/content/ChapterFour/0638.Shopping-Offers.md delete mode 100755 website/content/ChapterFour/0645.Set-Mismatch.md delete mode 100755 website/content/ChapterFour/0648.Replace-Words.md delete mode 100755 website/content/ChapterFour/0653.Two-Sum-IV---Input-is-a-BST.md delete mode 100755 website/content/ChapterFour/0658.Find-K-Closest-Elements.md delete mode 100644 website/content/ChapterFour/0661.Image-Smoother.md delete mode 100755 website/content/ChapterFour/0662.Maximum-Width-of-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0668.Kth-Smallest-Number-in-Multiplication-Table.md delete mode 100755 website/content/ChapterFour/0676.Implement-Magic-Dictionary.md delete mode 100644 website/content/ChapterFour/0682.Baseball-Game.md delete mode 100755 website/content/ChapterFour/0684.Redundant-Connection.md delete mode 100755 website/content/ChapterFour/0685.Redundant-Connection-II.md delete mode 100755 website/content/ChapterFour/0693.Binary-Number-with-Alternating-Bits.md delete mode 100644 website/content/ChapterFour/0695.Max-Area-of-Island.md delete mode 100644 website/content/ChapterFour/0697.Degree-of-an-Array.md delete mode 100755 website/content/ChapterFour/0699.Falling-Squares.md delete mode 100755 website/content/ChapterFour/0704.Binary-Search.md delete mode 100755 website/content/ChapterFour/0705.Design-HashSet.md delete mode 100755 website/content/ChapterFour/0706.Design-HashMap.md delete mode 100644 website/content/ChapterFour/0707.Design-Linked-List.md delete mode 100644 website/content/ChapterFour/0710.Random-Pick-with-Blacklist.md delete mode 100644 website/content/ChapterFour/0713.Subarray-Product-Less-Than-K.md delete mode 100755 website/content/ChapterFour/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md delete mode 100755 website/content/ChapterFour/0715.Range-Module.md delete mode 100755 website/content/ChapterFour/0717.1-bit-and-2-bit-Characters.md delete mode 100755 website/content/ChapterFour/0718.Maximum-Length-of-Repeated-Subarray.md delete mode 100755 website/content/ChapterFour/0719.Find-K-th-Smallest-Pair-Distance.md delete mode 100755 website/content/ChapterFour/0720.Longest-Word-in-Dictionary.md delete mode 100755 website/content/ChapterFour/0721.Accounts-Merge.md delete mode 100644 website/content/ChapterFour/0724.Find-Pivot-Index.md delete mode 100755 website/content/ChapterFour/0726.Number-of-Atoms.md delete mode 100755 website/content/ChapterFour/0729.My-Calendar-I.md delete mode 100755 website/content/ChapterFour/0732.My-Calendar-III.md delete mode 100755 website/content/ChapterFour/0733.Flood-Fill.md delete mode 100644 website/content/ChapterFour/0735.Asteroid-Collision.md delete mode 100644 website/content/ChapterFour/0739.Daily-Temperatures.md delete mode 100755 website/content/ChapterFour/0744.Find-Smallest-Letter-Greater-Than-Target.md delete mode 100755 website/content/ChapterFour/0745.Prefix-and-Suffix-Search.md delete mode 100755 website/content/ChapterFour/0746.Min-Cost-Climbing-Stairs.md delete mode 100755 website/content/ChapterFour/0748.Shortest-Completing-Word.md delete mode 100644 website/content/ChapterFour/0753.Cracking-the-Safe.md delete mode 100755 website/content/ChapterFour/0756.Pyramid-Transition-Matrix.md delete mode 100755 website/content/ChapterFour/0762.Prime-Number-of-Set-Bits-in-Binary-Representation.md delete mode 100644 website/content/ChapterFour/0763.Partition-Labels.md delete mode 100755 website/content/ChapterFour/0765.Couples-Holding-Hands.md delete mode 100755 website/content/ChapterFour/0766.Toeplitz-Matrix.md delete mode 100644 website/content/ChapterFour/0767.Reorganize-String.md delete mode 100755 website/content/ChapterFour/0771.Jewels-and-Stones.md delete mode 100755 website/content/ChapterFour/0778.Swim-in-Rising-Water.md delete mode 100755 website/content/ChapterFour/0781.Rabbits-in-Forest.md delete mode 100755 website/content/ChapterFour/0784.Letter-Case-Permutation.md delete mode 100755 website/content/ChapterFour/0786.K-th-Smallest-Prime-Fraction.md delete mode 100755 website/content/ChapterFour/0793.Preimage-Size-of-Factorial-Zeroes-Function.md delete mode 100644 website/content/ChapterFour/0802.Find-Eventual-Safe-States.md delete mode 100755 website/content/ChapterFour/0803.Bricks-Falling-When-Hit.md delete mode 100755 website/content/ChapterFour/0811.Subdomain-Visit-Count.md delete mode 100644 website/content/ChapterFour/0812.Largest-Triangle-Area.md delete mode 100755 website/content/ChapterFour/0815.Bus-Routes.md delete mode 100644 website/content/ChapterFour/0817.Linked-List-Components.md delete mode 100755 website/content/ChapterFour/0819.Most-Common-Word.md delete mode 100644 website/content/ChapterFour/0826.Most-Profit-Assigning-Work.md delete mode 100644 website/content/ChapterFour/0832.Flipping-an-Image.md delete mode 100755 website/content/ChapterFour/0834.Sum-of-Distances-in-Tree.md delete mode 100755 website/content/ChapterFour/0836.Rectangle-Overlap.md delete mode 100644 website/content/ChapterFour/0838.Push-Dominoes.md delete mode 100755 website/content/ChapterFour/0839.Similar-String-Groups.md delete mode 100644 website/content/ChapterFour/0841.Keys-and-Rooms.md delete mode 100755 website/content/ChapterFour/0842.Split-Array-into-Fibonacci-Sequence.md delete mode 100644 website/content/ChapterFour/0844.Backspace-String-Compare.md delete mode 100644 website/content/ChapterFour/0845.Longest-Mountain-in-Array.md delete mode 100755 website/content/ChapterFour/0850.Rectangle-Area-II.md delete mode 100644 website/content/ChapterFour/0851.Loud-and-Rich.md delete mode 100755 website/content/ChapterFour/0852.Peak-Index-in-a-Mountain-Array.md delete mode 100755 website/content/ChapterFour/0853.Car-Fleet.md delete mode 100644 website/content/ChapterFour/0856.Score-of-Parentheses.md delete mode 100644 website/content/ChapterFour/0862.Shortest-Subarray-with-Sum-at-Least-K.md delete mode 100644 website/content/ChapterFour/0863.All-Nodes-Distance-K-in-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0864.Shortest-Path-to-Get-All-Keys.md delete mode 100755 website/content/ChapterFour/0867.Transpose-Matrix.md delete mode 100644 website/content/ChapterFour/0872.Leaf-Similar-Trees.md delete mode 100755 website/content/ChapterFour/0875.Koko-Eating-Bananas.md delete mode 100644 website/content/ChapterFour/0876.Middle-of-the-Linked-List.md delete mode 100755 website/content/ChapterFour/0878.Nth-Magical-Number.md delete mode 100644 website/content/ChapterFour/0880.Decoded-String-at-Index.md delete mode 100644 website/content/ChapterFour/0881.Boats-to-Save-People.md delete mode 100755 website/content/ChapterFour/0884.Uncommon-Words-from-Two-Sentences.md delete mode 100755 website/content/ChapterFour/0885.Spiral-Matrix-III.md delete mode 100755 website/content/ChapterFour/0887.Super-Egg-Drop.md delete mode 100644 website/content/ChapterFour/0888.Fair-Candy-Swap.md delete mode 100644 website/content/ChapterFour/0891.Sum-of-Subsequence-Widths.md delete mode 100644 website/content/ChapterFour/0892.Surface-Area-of-3D-Shapes.md delete mode 100644 website/content/ChapterFour/0895.Maximum-Frequency-Stack.md delete mode 100644 website/content/ChapterFour/0896.Monotonic-Array.md delete mode 100755 website/content/ChapterFour/0898.Bitwise-ORs-of-Subarrays.md delete mode 100644 website/content/ChapterFour/0901.Online-Stock-Span.md delete mode 100644 website/content/ChapterFour/0904.Fruit-Into-Baskets.md delete mode 100644 website/content/ChapterFour/0907.Sum-of-Subarray-Minimums.md delete mode 100755 website/content/ChapterFour/0911.Online-Election.md delete mode 100644 website/content/ChapterFour/0914.X-of-a-Kind-in-a-Deck-of-Cards.md delete mode 100755 website/content/ChapterFour/0918.Maximum-Sum-Circular-Subarray.md delete mode 100755 website/content/ChapterFour/0920.Number-of-Music-Playlists.md delete mode 100644 website/content/ChapterFour/0921.Minimum-Add-to-Make-Parentheses-Valid.md delete mode 100644 website/content/ChapterFour/0922.Sort-Array-By-Parity-II.md delete mode 100644 website/content/ChapterFour/0923.3Sum-With-Multiplicity.md delete mode 100755 website/content/ChapterFour/0924.Minimize-Malware-Spread.md delete mode 100755 website/content/ChapterFour/0927.Three-Equal-Parts.md delete mode 100755 website/content/ChapterFour/0928.Minimize-Malware-Spread-II.md delete mode 100644 website/content/ChapterFour/0930.Binary-Subarrays-With-Sum.md delete mode 100644 website/content/ChapterFour/0933.Number-of-Recent-Calls.md delete mode 100755 website/content/ChapterFour/0942.DI-String-Match.md delete mode 100644 website/content/ChapterFour/0946.Validate-Stack-Sequences.md delete mode 100755 website/content/ChapterFour/0947.Most-Stones-Removed-with-Same-Row-or-Column.md delete mode 100644 website/content/ChapterFour/0949.Largest-Time-for-Given-Digits.md delete mode 100755 website/content/ChapterFour/0952.Largest-Component-Size-by-Common-Factor.md delete mode 100755 website/content/ChapterFour/0953.Verifying-an-Alien-Dictionary.md delete mode 100755 website/content/ChapterFour/0959.Regions-Cut-By-Slashes.md delete mode 100755 website/content/ChapterFour/0961.N-Repeated-Element-in-Size-2N-Array.md delete mode 100755 website/content/ChapterFour/0968.Binary-Tree-Cameras.md delete mode 100644 website/content/ChapterFour/0969.Pancake-Sorting.md delete mode 100755 website/content/ChapterFour/0970.Powerful-Integers.md delete mode 100644 website/content/ChapterFour/0973.K-Closest-Points-to-Origin.md delete mode 100644 website/content/ChapterFour/0976.Largest-Perimeter-Triangle.md delete mode 100644 website/content/ChapterFour/0977.Squares-of-a-Sorted-Array.md delete mode 100755 website/content/ChapterFour/0978.Longest-Turbulent-Subarray.md delete mode 100755 website/content/ChapterFour/0979.Distribute-Coins-in-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0981.Time-Based-Key-Value-Store.md delete mode 100755 website/content/ChapterFour/0984.String-Without-AAA-or-BBB.md delete mode 100644 website/content/ChapterFour/0985.Sum-of-Even-Numbers-After-Queries.md delete mode 100644 website/content/ChapterFour/0986.Interval-List-Intersections.md delete mode 100755 website/content/ChapterFour/0990.Satisfiability-of-Equality-Equations.md delete mode 100644 website/content/ChapterFour/0992.Subarrays-with-K-Different-Integers.md delete mode 100755 website/content/ChapterFour/0993.Cousins-in-Binary-Tree.md delete mode 100755 website/content/ChapterFour/0995.Minimum-Number-of-K-Consecutive-Bit-Flips.md delete mode 100755 website/content/ChapterFour/0996.Number-of-Squareful-Arrays.md delete mode 100644 website/content/ChapterFour/0999.Available-Captures-for-Rook.md delete mode 100755 website/content/ChapterFour/1002.Find-Common-Characters.md delete mode 100644 website/content/ChapterFour/1003.Check-If-Word-Is-Valid-After-Substitutions.md delete mode 100644 website/content/ChapterFour/1004.Max-Consecutive-Ones-III.md delete mode 100644 website/content/ChapterFour/1005.Maximize-Sum-Of-Array-After-K-Negations.md delete mode 100755 website/content/ChapterFour/1011.Capacity-To-Ship-Packages-Within-D-Days.md delete mode 100755 website/content/ChapterFour/1017.Convert-to-Base--2.md delete mode 100644 website/content/ChapterFour/1019.Next-Greater-Node-In-Linked-List.md delete mode 100644 website/content/ChapterFour/1020.Number-of-Enclaves.md delete mode 100644 website/content/ChapterFour/1021.Remove-Outermost-Parentheses.md delete mode 100755 website/content/ChapterFour/1025.Divisor-Game.md delete mode 100644 website/content/ChapterFour/1026.Maximum-Difference-Between-Node-and-Ancestor.md delete mode 100755 website/content/ChapterFour/1028.Recover-a-Tree-From-Preorder-Traversal.md delete mode 100755 website/content/ChapterFour/1030.Matrix-Cells-in-Distance-Order.md delete mode 100644 website/content/ChapterFour/1037.Valid-Boomerang.md delete mode 100755 website/content/ChapterFour/1040.Moving-Stones-Until-Consecutive-II.md delete mode 100644 website/content/ChapterFour/1047.Remove-All-Adjacent-Duplicates-In-String.md delete mode 100755 website/content/ChapterFour/1049.Last-Stone-Weight-II.md delete mode 100644 website/content/ChapterFour/1051.Height-Checker.md delete mode 100755 website/content/ChapterFour/1052.Grumpy-Bookstore-Owner.md delete mode 100755 website/content/ChapterFour/1054.Distant-Barcodes.md delete mode 100755 website/content/ChapterFour/1073.Adding-Two-Negabinary-Numbers.md delete mode 100755 website/content/ChapterFour/1074.Number-of-Submatrices-That-Sum-to-Target.md delete mode 100755 website/content/ChapterFour/1078.Occurrences-After-Bigram.md delete mode 100644 website/content/ChapterFour/1089.Duplicate-Zeros.md delete mode 100755 website/content/ChapterFour/1093.Statistics-from-a-Large-Sample.md delete mode 100755 website/content/ChapterFour/1105.Filling-Bookcase-Shelves.md delete mode 100755 website/content/ChapterFour/1108.Defanging-an-IP-Address.md delete mode 100644 website/content/ChapterFour/1110.Delete-Nodes-And-Return-Forest.md delete mode 100755 website/content/ChapterFour/1111.Maximum-Nesting-Depth-of-Two-Valid-Parentheses-Strings.md delete mode 100755 website/content/ChapterFour/1122.Relative-Sort-Array.md delete mode 100755 website/content/ChapterFour/1123.Lowest-Common-Ancestor-of-Deepest-Leaves.md delete mode 100755 website/content/ChapterFour/1128.Number-of-Equivalent-Domino-Pairs.md delete mode 100755 website/content/ChapterFour/1137.N-th-Tribonacci-Number.md delete mode 100644 website/content/ChapterFour/1145.Binary-Tree-Coloring-Game.md delete mode 100755 website/content/ChapterFour/1154.Day-of-the-Year.md delete mode 100755 website/content/ChapterFour/1157.Online-Majority-Element-In-Subarray.md delete mode 100755 website/content/ChapterFour/1160.Find-Words-That-Can-Be-Formed-by-Characters.md delete mode 100755 website/content/ChapterFour/1170.Compare-Strings-by-Frequency-of-the-Smallest-Character.md delete mode 100755 website/content/ChapterFour/1171.Remove-Zero-Sum-Consecutive-Nodes-from-Linked-List.md delete mode 100755 website/content/ChapterFour/1175.Prime-Arrangements.md delete mode 100755 website/content/ChapterFour/1184.Distance-Between-Bus-Stops.md delete mode 100755 website/content/ChapterFour/1185.Day-of-the-Week.md delete mode 100755 website/content/ChapterFour/1189.Maximum-Number-of-Balloons.md delete mode 100755 website/content/ChapterFour/1200.Minimum-Absolute-Difference.md delete mode 100755 website/content/ChapterFour/1201.Ugly-Number-III.md delete mode 100755 website/content/ChapterFour/1202.Smallest-String-With-Swaps.md delete mode 100755 website/content/ChapterFour/1207.Unique-Number-of-Occurrences.md delete mode 100755 website/content/ChapterFour/1208.Get-Equal-Substrings-Within-Budget.md delete mode 100755 website/content/ChapterFour/1217.Play-with-Chips.md delete mode 100755 website/content/ChapterFour/1221.Split-a-String-in-Balanced-Strings.md delete mode 100755 website/content/ChapterFour/1232.Check-If-It-Is-a-Straight-Line.md delete mode 100755 website/content/ChapterFour/1234.Replace-the-Substring-for-Balanced-String.md delete mode 100755 website/content/ChapterFour/1235.Maximum-Profit-in-Job-Scheduling.md delete mode 100755 website/content/ChapterFour/1252.Cells-with-Odd-Values-in-a-Matrix.md delete mode 100755 website/content/ChapterFour/1254.Number-of-Closed-Islands.md delete mode 100644 website/content/ChapterFour/1260.Shift-2D-Grid.md delete mode 100755 website/content/ChapterFour/1266.Minimum-Time-Visiting-All-Points.md delete mode 100644 website/content/ChapterFour/1275.Find-Winner-on-a-Tic-Tac-Toe-Game.md delete mode 100644 website/content/ChapterFour/1281.Subtract-the-Product-and-Sum-of-Digits-of-an-Integer.md delete mode 100644 website/content/ChapterFour/1283.Find-the-Smallest-Divisor-Given-a-Threshold.md delete mode 100644 website/content/ChapterFour/1287.Element-Appearing-More-Than-25-In-Sorted-Array.md delete mode 100644 website/content/ChapterFour/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer.md delete mode 100644 website/content/ChapterFour/1295.Find-Numbers-with-Even-Number-of-Digits.md delete mode 100644 website/content/ChapterFour/1299.Replace-Elements-with-Greatest-Element-on-Right-Side.md delete mode 100644 website/content/ChapterFour/1302.Deepest-Leaves-Sum.md delete mode 100644 website/content/ChapterFour/1304.Find-N-Unique-Integers-Sum-up-to-Zero.md delete mode 100644 website/content/ChapterFour/1305.All-Elements-in-Two-Binary-Search-Trees.md delete mode 100644 website/content/ChapterFour/1306.Jump-Game-III.md delete mode 100644 website/content/ChapterFour/1313.Decompress-Run-Length-Encoded-List.md delete mode 100644 website/content/ChapterFour/1317.Convert-Integer-to-the-Sum-of-Two-No-Zero-Integers.md delete mode 100644 website/content/ChapterFour/1380.Lucky-Numbers-in-a-Matrix.md delete mode 100644 website/content/ChapterFour/1385.Find-the-Distance-Value-Between-Two-Arrays.md delete mode 100644 website/content/ChapterFour/1389.Create-Target-Array-in-the-Given-Order.md delete mode 100644 website/content/ChapterFour/1455.Check-If-a-Word-Occurs-As-a-Prefix-of-Any-Word-in-a-Sentence.md delete mode 100644 website/content/ChapterFour/1464.Maximum-Product-of-Two-Elements-in-an-Array.md delete mode 100644 website/content/ChapterFour/1470.Shuffle-the-Array.md delete mode 100644 website/content/ChapterFour/_index.md delete mode 100644 website/content/ChapterFour/pytool/AddTOC.py delete mode 100644 website/content/ChapterFour/pytool/GenerateIndex.py delete mode 100644 website/content/ChapterFour/pytool/GenerateOne.py delete mode 100644 website/content/ChapterFour/pytool/GetFile.py delete mode 100644 website/content/ChapterOne/_index.md delete mode 100644 website/content/ChapterThree/Segment_Tree.md delete mode 100644 website/content/ChapterThree/UnionFind.md delete mode 100644 website/content/ChapterThree/_index.md delete mode 100644 website/content/ChapterTwo/Array.md delete mode 100644 website/content/ChapterTwo/Backtracking.md delete mode 100644 website/content/ChapterTwo/Binary_Indexed_Tree.md delete mode 100644 website/content/ChapterTwo/Binary_Search.md delete mode 100644 website/content/ChapterTwo/Bit_Manipulation.md delete mode 100644 website/content/ChapterTwo/Breadth_First_Search.md delete mode 100644 website/content/ChapterTwo/Depth_First_Search.md delete mode 100644 website/content/ChapterTwo/Dynamic_Programming.md delete mode 100644 website/content/ChapterTwo/Hash_Table.md delete mode 100644 website/content/ChapterTwo/Linked_List.md delete mode 100644 website/content/ChapterTwo/Math.md delete mode 100644 website/content/ChapterTwo/Sliding_Window.md delete mode 100644 website/content/ChapterTwo/Sort.md delete mode 100644 website/content/ChapterTwo/Stack.md delete mode 100644 website/content/ChapterTwo/String.md delete mode 100644 website/content/ChapterTwo/Tree.md delete mode 100644 website/content/ChapterTwo/Two_Pointers.md delete mode 100644 website/content/ChapterTwo/Union_Find.md delete mode 100644 website/content/ChapterTwo/_index.md delete mode 100644 website/content/_index.md delete mode 100644 website/content/docs/example/_index.md delete mode 100644 website/content/docs/example/collapsed/3rd-level/4th-level.md delete mode 100644 website/content/docs/example/collapsed/3rd-level/_index.md delete mode 100644 website/content/docs/example/collapsed/_index.md delete mode 100644 website/content/docs/example/hidden.md delete mode 100644 website/content/docs/example/table-of-contents/_index.md delete mode 100644 website/content/docs/example/table-of-contents/with-toc.md delete mode 100644 website/content/docs/example/table-of-contents/without-toc.md delete mode 100644 website/content/docs/shortcodes/_index.md delete mode 100644 website/content/docs/shortcodes/buttons.md delete mode 100644 website/content/docs/shortcodes/columns.md delete mode 100644 website/content/docs/shortcodes/details.md delete mode 100644 website/content/docs/shortcodes/expand.md delete mode 100644 website/content/docs/shortcodes/hints.md delete mode 100644 website/content/docs/shortcodes/katex.md delete mode 100644 website/content/docs/shortcodes/mermaid.md delete mode 100644 website/content/docs/shortcodes/section/_index.md delete mode 100644 website/content/docs/shortcodes/section/page1.md delete mode 100644 website/content/docs/shortcodes/section/page2.md delete mode 100644 website/content/docs/shortcodes/tabs.md create mode 100644 website/content/en/_index.md create mode 100644 website/content/en/about/index.md create mode 100644 website/content/en/archive/_index.md create mode 100644 website/content/en/gallery/cartoon/index.md create mode 100644 website/content/en/gallery/photo/index.md create mode 100644 website/content/en/posts/_index.md create mode 100644 website/content/en/posts/emoji-support.md create mode 100644 website/content/en/posts/markdown-syntax.md create mode 100644 website/content/en/posts/math-typesetting.md create mode 100644 website/content/en/posts/rich-content.md create mode 100644 website/content/en/posts/shortcodes.md create mode 100644 website/content/en/posts/syntax-highlight.md create mode 100644 website/content/en/posts/test-chartjs.md create mode 100644 website/content/en/posts/test-flowchart.md create mode 100644 website/content/en/posts/test-js-sequence-diagrams.md create mode 100644 website/content/en/posts/test-katex.md create mode 100644 website/content/en/posts/test-mathjax.md create mode 100644 website/content/en/posts/test-mermaid.md create mode 100644 website/content/en/posts/test-viz.md create mode 100644 website/content/en/posts/test-wavedrom.md create mode 100644 website/content/en/presentation/_index.md create mode 100644 website/content/en/presentation/dir/fourth.md create mode 100644 website/content/en/presentation/first.md create mode 100644 website/content/en/presentation/second.md create mode 100644 website/content/en/presentation/third.md create mode 100644 website/content/en/publication/article/_index.md create mode 100644 website/content/en/publication/article/article_any_folder_name_1/cite.bib create mode 100644 website/content/en/publication/article/article_any_folder_name_1/index.md create mode 100644 website/content/en/publication/book/_index.md create mode 100644 website/content/en/publication/book/book_any_folder_name_1/cite.bib create mode 100644 website/content/en/publication/book/book_any_folder_name_1/index.md create mode 100644 website/content/en/publication/misc/_index.md create mode 100644 website/content/en/publication/misc/misc_any_folder_name_1/cite.bib create mode 100644 website/content/en/publication/misc/misc_any_folder_name_1/index.md create mode 100644 website/content/en/showcase/_index.md create mode 100644 website/content/en/showcase/hugo/_index.md create mode 100644 website/content/en/showcase/hugo/hugo-theme-zdoc.md create mode 100644 website/content/en/showcase/hugo/hugo-theme-zzo.md create mode 100644 website/content/ko/_index.md create mode 100644 website/content/ko/about/index.ko.md create mode 100644 website/content/ko/archive/_index.ko.md create mode 100644 website/content/ko/gallery/cartoon/index.ko.md create mode 100644 website/content/ko/gallery/photo/index.ko.md create mode 100644 website/content/ko/posts/_index.ko.md create mode 100644 website/languages.toml create mode 100644 website/menus.en.toml create mode 100644 website/menus.ko.toml create mode 100644 website/params.toml delete mode 100644 website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.content delete mode 100644 website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.json create mode 100644 website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.content create mode 100644 website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.json create mode 100644 website/static/favicon/android-icon-144x144.png create mode 100644 website/static/favicon/android-icon-192x192.png create mode 100644 website/static/favicon/android-icon-36x36.png create mode 100644 website/static/favicon/android-icon-48x48.png create mode 100644 website/static/favicon/android-icon-512x512.png create mode 100644 website/static/favicon/android-icon-72x72.png create mode 100644 website/static/favicon/android-icon-96x96.png create mode 100644 website/static/favicon/apple-icon-114x114.png create mode 100644 website/static/favicon/apple-icon-120x120.png create mode 100644 website/static/favicon/apple-icon-144x144.png create mode 100644 website/static/favicon/apple-icon-152x152.png create mode 100644 website/static/favicon/apple-icon-180x180.png create mode 100644 website/static/favicon/apple-icon-57x57.png create mode 100644 website/static/favicon/apple-icon-60x60.png create mode 100644 website/static/favicon/apple-icon-72x72.png create mode 100644 website/static/favicon/apple-icon-76x76.png create mode 100644 website/static/favicon/apple-icon-precomposed.png create mode 100644 website/static/favicon/apple-icon.png create mode 100644 website/static/favicon/favicon-16x16.png create mode 100644 website/static/favicon/favicon-32x32.png create mode 100644 website/static/favicon/favicon-96x96.png create mode 100644 website/static/favicon/favicon.ico create mode 100644 website/static/favicon/ms-icon-144x144.png create mode 100644 website/static/favicon/ms-icon-150x150.png create mode 100644 website/static/favicon/ms-icon-310x310.png create mode 100644 website/static/favicon/ms-icon-70x70.png create mode 100644 website/static/gallery/cartoon/abstract-3159733_640.jpg create mode 100644 website/static/gallery/cartoon/boxing-ring-149840_640.png create mode 100644 website/static/gallery/cartoon/fairy-tale-1077856_640.jpg create mode 100644 website/static/gallery/cartoon/giraffe-3258053_640.png create mode 100644 website/static/gallery/cartoon/robot-in-space-4556429_640.png create mode 100644 website/static/gallery/cartoon/sketch-3047721_640.jpg create mode 100644 website/static/gallery/cartoon/watercolour-2045917_640.jpg create mode 100644 website/static/gallery/photo/beach.jpg create mode 100644 website/static/gallery/photo/beautiful.jpg create mode 100644 website/static/gallery/photo/child.jpg create mode 100644 website/static/gallery/photo/people.jpg create mode 100644 website/static/images/feature1/flowchart.png create mode 100644 website/static/images/feature1/graph.png create mode 100644 website/static/images/feature1/infinity.png create mode 100644 website/static/images/feature1/markdown.png create mode 100644 website/static/images/feature1/number-four.png create mode 100644 website/static/images/feature1/number-one.png create mode 100644 website/static/images/feature1/number-three.png create mode 100644 website/static/images/feature1/number-two.png create mode 100644 website/static/images/feature1/wave.png create mode 100644 website/static/images/feature2/bam.png create mode 100644 website/static/images/feature2/color-palette.png create mode 100644 website/static/images/feature2/content.png create mode 100644 website/static/images/feature2/gallery.png create mode 100644 website/static/images/feature2/graph.png create mode 100644 website/static/images/feature2/mathbook.png create mode 100644 website/static/images/feature2/transfer.png create mode 100644 website/static/images/feature2/workflow.png create mode 100644 website/static/images/feature3/code-file.png create mode 100644 website/static/images/feature3/css3-bare.png create mode 100644 website/static/images/feature3/css3.png create mode 100644 website/static/images/header/background.jpg create mode 100644 website/static/images/whoami/avatar.jpg delete mode 100644 website/static/logo.png create mode 100644 website/static/manifest.json delete mode 100644 website/static/prism.css delete mode 100755 website/static/prism.js delete mode 100644 website/themes/book/.github/workflows/main.yml delete mode 100644 website/themes/book/.gitignore delete mode 100644 website/themes/book/LICENSE delete mode 100644 website/themes/book/README.md delete mode 100644 website/themes/book/archetypes/docs.md delete mode 100644 website/themes/book/assets/_defaults.scss delete mode 100644 website/themes/book/assets/_fonts.scss delete mode 100644 website/themes/book/assets/_main.scss delete mode 100644 website/themes/book/assets/_markdown.scss delete mode 100644 website/themes/book/assets/_print.scss delete mode 100644 website/themes/book/assets/_shortcodes.scss delete mode 100644 website/themes/book/assets/_utils.scss delete mode 100644 website/themes/book/assets/_variables.scss delete mode 100644 website/themes/book/assets/book.scss delete mode 100644 website/themes/book/assets/manifest.json delete mode 100644 website/themes/book/assets/menu-reset.js delete mode 100644 website/themes/book/assets/normalize.css delete mode 100644 website/themes/book/assets/plugins/_dark.scss delete mode 100644 website/themes/book/assets/plugins/_numbered.scss delete mode 100644 website/themes/book/assets/plugins/_scrollbars.scss delete mode 100644 website/themes/book/assets/search-data.js delete mode 100644 website/themes/book/assets/search.js delete mode 100644 website/themes/book/assets/sw-register.js delete mode 100644 website/themes/book/assets/sw.js delete mode 100644 website/themes/book/exampleSite/assets/_custom.scss delete mode 100644 website/themes/book/exampleSite/assets/_variables.scss delete mode 100644 website/themes/book/exampleSite/config.toml delete mode 100644 website/themes/book/exampleSite/config.yaml delete mode 100644 website/themes/book/exampleSite/content.ru/_index.md delete mode 100644 website/themes/book/exampleSite/content.zh/_index.md delete mode 100644 website/themes/book/exampleSite/content/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/collapsed/3rd-level/4th-level.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/collapsed/3rd-level/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/collapsed/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/hidden.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/table-of-contents/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/table-of-contents/with-toc.md delete mode 100644 website/themes/book/exampleSite/content/docs/example/table-of-contents/without-toc.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/buttons.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/columns.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/details.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/expand.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/hints.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/katex.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/mermaid.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/section/_index.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/section/page1.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/section/page2.md delete mode 100644 website/themes/book/exampleSite/content/docs/shortcodes/tabs.md delete mode 100644 website/themes/book/exampleSite/content/menu/index.md delete mode 100644 website/themes/book/exampleSite/content/posts/_index.md delete mode 100644 website/themes/book/exampleSite/content/posts/creating-a-new-theme.md delete mode 100644 website/themes/book/exampleSite/content/posts/goisforlovers.md delete mode 100644 website/themes/book/exampleSite/content/posts/hugoisforlovers.md delete mode 100644 website/themes/book/exampleSite/content/posts/migrate-from-jekyll.md delete mode 100644 website/themes/book/exampleSite/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.content delete mode 100644 website/themes/book/exampleSite/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.json delete mode 100644 website/themes/book/exampleSite/resources/_gen/assets/scss/example/book.scss_50fc8c04e12a2f59027287995557ceff.content delete mode 100644 website/themes/book/exampleSite/resources/_gen/assets/scss/example/book.scss_50fc8c04e12a2f59027287995557ceff.json delete mode 100644 website/themes/book/i18n/cn.yaml delete mode 100644 website/themes/book/i18n/cs.yaml delete mode 100644 website/themes/book/i18n/de.yaml delete mode 100644 website/themes/book/i18n/en.yaml delete mode 100644 website/themes/book/i18n/es.yaml delete mode 100644 website/themes/book/i18n/fr.yaml delete mode 100644 website/themes/book/i18n/ja.yaml delete mode 100644 website/themes/book/i18n/jp.yaml delete mode 100644 website/themes/book/i18n/ko.yaml delete mode 100644 website/themes/book/i18n/nb.yaml delete mode 100644 website/themes/book/i18n/pt.yaml delete mode 100644 website/themes/book/i18n/ru.yaml delete mode 100644 website/themes/book/i18n/sv.yaml delete mode 100644 website/themes/book/i18n/uk.yaml delete mode 100644 website/themes/book/i18n/zh.yaml delete mode 100644 website/themes/book/images/screenshot.png delete mode 100644 website/themes/book/images/tn.png delete mode 100644 website/themes/book/layouts/404.html delete mode 100644 website/themes/book/layouts/_default/_markup/render-heading.html delete mode 100644 website/themes/book/layouts/_default/_markup/render-image.html delete mode 100644 website/themes/book/layouts/_default/_markup/render-link.html delete mode 100644 website/themes/book/layouts/_default/baseof.html delete mode 100644 website/themes/book/layouts/_default/list.html delete mode 100644 website/themes/book/layouts/_default/single.html delete mode 100644 website/themes/book/layouts/partials/docs/brand.html delete mode 100644 website/themes/book/layouts/partials/docs/comments.html delete mode 100644 website/themes/book/layouts/partials/docs/date.html delete mode 100644 website/themes/book/layouts/partials/docs/gitalk.html delete mode 100644 website/themes/book/layouts/partials/docs/header.html delete mode 100644 website/themes/book/layouts/partials/docs/html-head.html delete mode 100644 website/themes/book/layouts/partials/docs/inject/body.html delete mode 100644 website/themes/book/layouts/partials/docs/inject/content-after.html delete mode 100644 website/themes/book/layouts/partials/docs/inject/content-before.html delete mode 100644 website/themes/book/layouts/partials/docs/inject/footer.html delete mode 100644 website/themes/book/layouts/partials/docs/inject/menu-after.html delete mode 100644 website/themes/book/layouts/partials/docs/inject/menu-before.html delete mode 100644 website/themes/book/layouts/partials/docs/languages.html delete mode 100644 website/themes/book/layouts/partials/docs/menu-bundle.html delete mode 100644 website/themes/book/layouts/partials/docs/menu-filetree.html delete mode 100644 website/themes/book/layouts/partials/docs/menu-hugo.html delete mode 100644 website/themes/book/layouts/partials/docs/menu.html delete mode 100644 website/themes/book/layouts/partials/docs/post-meta.html delete mode 100644 website/themes/book/layouts/partials/docs/taxonomy.html delete mode 100644 website/themes/book/layouts/partials/docs/title.html delete mode 100644 website/themes/book/layouts/partials/docs/toc.html delete mode 100644 website/themes/book/layouts/posts/list.html delete mode 100644 website/themes/book/layouts/posts/single.html delete mode 100644 website/themes/book/layouts/shortcodes/button.html delete mode 100644 website/themes/book/layouts/shortcodes/columns.html delete mode 100644 website/themes/book/layouts/shortcodes/details.html delete mode 100644 website/themes/book/layouts/shortcodes/expand.html delete mode 100644 website/themes/book/layouts/shortcodes/hint.html delete mode 100644 website/themes/book/layouts/shortcodes/katex.html delete mode 100644 website/themes/book/layouts/shortcodes/mermaid.html delete mode 100644 website/themes/book/layouts/shortcodes/section.html delete mode 100644 website/themes/book/layouts/shortcodes/tab.html delete mode 100644 website/themes/book/layouts/shortcodes/tabs.html delete mode 100644 website/themes/book/layouts/taxonomy/list.html delete mode 100644 website/themes/book/layouts/taxonomy/taxonomy.html delete mode 100644 website/themes/book/static/LeetCode_Icon.png delete mode 100644 website/themes/book/static/LeetCode_logo.png delete mode 100644 website/themes/book/static/LeetCode_logo2048.png delete mode 100644 website/themes/book/static/apple-touch-icon-1024x1024.png delete mode 100644 website/themes/book/static/apple-touch-icon-120x120.png delete mode 100644 website/themes/book/static/apple-touch-icon-152x152.png delete mode 100644 website/themes/book/static/apple-touch-icon-180x180.png delete mode 100644 website/themes/book/static/apple-touch-icon-512x512.png delete mode 100644 website/themes/book/static/apple-touch-icon-60x60.png delete mode 100644 website/themes/book/static/apple-touch-icon-76x76.png delete mode 100644 website/themes/book/static/favicon.png delete mode 100644 website/themes/book/static/favicon.svg delete mode 100644 website/themes/book/static/flexsearch.min.js delete mode 100644 website/themes/book/static/fonts/roboto-mono-v6-latin-regular.woff delete mode 100644 website/themes/book/static/fonts/roboto-mono-v6-latin-regular.woff2 delete mode 100644 website/themes/book/static/fonts/roboto-v19-latin-300italic.woff delete mode 100644 website/themes/book/static/fonts/roboto-v19-latin-300italic.woff2 delete mode 100644 website/themes/book/static/fonts/roboto-v19-latin-700.woff delete mode 100644 website/themes/book/static/fonts/roboto-v19-latin-700.woff2 delete mode 100644 website/themes/book/static/fonts/roboto-v19-latin-regular.woff delete mode 100644 website/themes/book/static/fonts/roboto-v19-latin-regular.woff2 delete mode 100644 website/themes/book/static/katex/auto-render.min.js delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_AMS-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_AMS-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_AMS-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Caligraphic-Bold.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Caligraphic-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Fraktur-Bold.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Fraktur-Bold.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Fraktur-Bold.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Fraktur-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Fraktur-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Fraktur-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Bold.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Bold.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Bold.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-BoldItalic.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-BoldItalic.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-BoldItalic.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Italic.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Italic.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Italic.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Main-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Math-BoldItalic.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Math-BoldItalic.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Math-Italic.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Math-Italic.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Math-Italic.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Bold.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Bold.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Bold.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Italic.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Italic.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Italic.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_SansSerif-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Script-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Script-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Script-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size1-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size1-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size1-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size2-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size2-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size2-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size3-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size3-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size3-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size4-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size4-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Size4-Regular.woff2 delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Typewriter-Regular.ttf delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Typewriter-Regular.woff delete mode 100644 website/themes/book/static/katex/fonts/KaTeX_Typewriter-Regular.woff2 delete mode 100644 website/themes/book/static/katex/katex.min.css delete mode 100644 website/themes/book/static/katex/katex.min.js delete mode 100644 website/themes/book/static/mermaid.min.js delete mode 100644 website/themes/book/static/prism.css delete mode 100755 website/themes/book/static/prism.js delete mode 100644 website/themes/book/static/svg/calendar.svg delete mode 100644 website/themes/book/static/svg/edit.svg delete mode 100644 website/themes/book/static/svg/menu.svg delete mode 100644 website/themes/book/static/svg/toc.svg delete mode 100644 website/themes/book/static/svg/translate.svg delete mode 100644 website/themes/book/theme.toml create mode 100644 website/themes/zdoc/LICENSE.md create mode 100644 website/themes/zdoc/README.md rename website/themes/{book/archetypes/posts.md => zdoc/archetypes/default.md} (50%) create mode 100644 website/themes/zdoc/assets/js/enquire.min.js create mode 100644 website/themes/zdoc/assets/js/fuse.min.js create mode 100644 website/themes/zdoc/assets/js/helper/closest.js create mode 100644 website/themes/zdoc/assets/js/helper/fadeinout.js create mode 100644 website/themes/zdoc/assets/js/helper/getParents.js create mode 100644 website/themes/zdoc/assets/js/helper/next.js create mode 100644 website/themes/zdoc/assets/js/helper/prev.js create mode 100644 website/themes/zdoc/assets/js/helper/prop.js create mode 100644 website/themes/zdoc/assets/js/lazysizes.min.js create mode 100644 website/themes/zdoc/assets/js/swipe.js create mode 100644 website/themes/zdoc/assets/sass/abstracts/_flexbox.scss create mode 100644 website/themes/zdoc/assets/sass/abstracts/_functions.scss create mode 100644 website/themes/zdoc/assets/sass/abstracts/_mixins.scss create mode 100644 website/themes/zdoc/assets/sass/abstracts/_variables.scss create mode 100644 website/themes/zdoc/assets/sass/base/_animation.scss create mode 100644 website/themes/zdoc/assets/sass/base/_fonts.scss create mode 100644 website/themes/zdoc/assets/sass/base/_helpers.scss create mode 100644 website/themes/zdoc/assets/sass/base/_reset.scss create mode 100644 website/themes/zdoc/assets/sass/base/_typography.scss create mode 100644 website/themes/zdoc/assets/sass/components/_alert.scss create mode 100644 website/themes/zdoc/assets/sass/components/_bgcolor.scss create mode 100644 website/themes/zdoc/assets/sass/components/_breadcrumb.scss create mode 100644 website/themes/zdoc/assets/sass/components/_button.scss create mode 100644 website/themes/zdoc/assets/sass/components/_drawer.scss create mode 100644 website/themes/zdoc/assets/sass/components/_dropdown.scss create mode 100644 website/themes/zdoc/assets/sass/components/_expand.scss create mode 100644 website/themes/zdoc/assets/sass/components/_language.scss create mode 100644 website/themes/zdoc/assets/sass/components/_lib.scss create mode 100644 website/themes/zdoc/assets/sass/components/_menu.scss create mode 100644 website/themes/zdoc/assets/sass/components/_modal.scss create mode 100644 website/themes/zdoc/assets/sass/components/_notice.scss create mode 100644 website/themes/zdoc/assets/sass/components/_pagination.scss create mode 100644 website/themes/zdoc/assets/sass/components/_search.scss create mode 100644 website/themes/zdoc/assets/sass/components/_section.scss create mode 100644 website/themes/zdoc/assets/sass/components/_summary.scss create mode 100644 website/themes/zdoc/assets/sass/components/_switch.scss create mode 100644 website/themes/zdoc/assets/sass/components/_tag.scss create mode 100644 website/themes/zdoc/assets/sass/components/_toc.scss create mode 100644 website/themes/zdoc/assets/sass/layout/_footer.scss create mode 100644 website/themes/zdoc/assets/sass/layout/_grid.scss create mode 100644 website/themes/zdoc/assets/sass/layout/_header.scss create mode 100644 website/themes/zdoc/assets/sass/layout/_main.scss create mode 100644 website/themes/zdoc/assets/sass/layout/_navbar.scss create mode 100644 website/themes/zdoc/assets/sass/main.scss create mode 100644 website/themes/zdoc/assets/sass/pages/_blog.scss create mode 100644 website/themes/zdoc/assets/sass/pages/_home.scss create mode 100644 website/themes/zdoc/assets/sass/pages/_list.scss create mode 100644 website/themes/zdoc/assets/sass/pages/_single.scss create mode 100644 website/themes/zdoc/assets/sass/syntax/_dracula.scss create mode 100644 website/themes/zdoc/assets/sass/syntax/_duotonelight.scss create mode 100644 website/themes/zdoc/assets/sass/syntax/_monokai.scss create mode 100644 website/themes/zdoc/assets/sass/syntax/_syntax.scss create mode 100644 website/themes/zdoc/assets/sass/themes/_dark.scss create mode 100644 website/themes/zdoc/assets/sass/themes/_darkcode.scss create mode 100644 website/themes/zdoc/assets/sass/themes/_light.scss create mode 100644 website/themes/zdoc/assets/sass/themes/_lightcode.scss create mode 100644 website/themes/zdoc/assets/sass/themes/_theme.scss create mode 100644 website/themes/zdoc/data/color.toml create mode 100644 website/themes/zdoc/data/flowchartjs.json create mode 100644 website/themes/zdoc/data/font.toml create mode 100644 website/themes/zdoc/data/lib.toml create mode 100644 website/themes/zdoc/exampleSite/config/_default/config.toml create mode 100644 website/themes/zdoc/exampleSite/config/_default/languages.toml create mode 100644 website/themes/zdoc/exampleSite/config/_default/menus.en.toml create mode 100644 website/themes/zdoc/exampleSite/config/_default/menus.ko.toml create mode 100644 website/themes/zdoc/exampleSite/config/_default/params.toml create mode 100644 website/themes/zdoc/exampleSite/content/en/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/blog/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/blog/emoji-support.md create mode 100644 website/themes/zdoc/exampleSite/content/en/blog/markdown-syntax.md create mode 100644 website/themes/zdoc/exampleSite/content/en/blog/placeholder-text.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/contentfortmats.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/contentmanagement/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/contentmanagement/frontmatter.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/contentmanagement/sections.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/contentmanagement/shortcodes.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/depth2/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/depth2/depth3/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/depth2/depth3/test3.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/depth2/test2.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/test1.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/depth1/ttttest.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/gettingstarted/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/gettingstarted/basicusage.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/gettingstarted/configuration.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/gettingstarted/installation.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/gettingstarted/quickstart.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/imageprocessing.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/pagebundles.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/pageresources.md create mode 100644 website/themes/zdoc/exampleSite/content/en/docs/relatedcontent.md create mode 100644 website/themes/zdoc/exampleSite/content/en/updates/2019_april.md create mode 100644 website/themes/zdoc/exampleSite/content/en/updates/2019_february.md create mode 100644 website/themes/zdoc/exampleSite/content/en/updates/2019_january.md create mode 100644 website/themes/zdoc/exampleSite/content/en/updates/2019_march.md create mode 100644 website/themes/zdoc/exampleSite/content/en/updates/2019_may.md create mode 100644 website/themes/zdoc/exampleSite/content/en/updates/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/blog/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/blog/emoji-support.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/blog/markdown-syntax.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/blog/placeholder-text.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/contentfortmats.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/contentmanagement/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/contentmanagement/frontmatter.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/contentmanagement/sections.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/contentmanagement/shortcodes.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/gettingstarted/_index.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/gettingstarted/basicusage.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/gettingstarted/configuration.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/gettingstarted/installation.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/gettingstarted/quickstart.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/imageprocessing.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/pagebundles.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/pageresources.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/docs/relatedcontent.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/updates/2019_april.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/updates/2019_february.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/updates/2019_january.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/updates/2019_march.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/updates/2019_may.md create mode 100644 website/themes/zdoc/exampleSite/content/ko/updates/_index.md create mode 100644 website/themes/zdoc/exampleSite/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.content create mode 100644 website/themes/zdoc/exampleSite/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.json create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-144x144.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-192x192.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-36x36.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-48x48.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-512x512.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-72x72.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/android-icon-96x96.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-114x114.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-120x120.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-144x144.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-152x152.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-180x180.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-57x57.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-60x60.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-72x72.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-76x76.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon-precomposed.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/apple-icon.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/favicon-16x16.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/favicon-32x32.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/favicon-96x96.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/favicon.ico create mode 100644 website/themes/zdoc/exampleSite/static/favicon/ms-icon-144x144.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/ms-icon-150x150.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/ms-icon-310x310.png create mode 100644 website/themes/zdoc/exampleSite/static/favicon/ms-icon-70x70.png create mode 100644 website/themes/zdoc/exampleSite/static/images/landscape.jpg create mode 100644 website/themes/zdoc/exampleSite/static/images/mountain.jpg create mode 100644 website/themes/zdoc/exampleSite/static/images/mountains.jpg create mode 100644 website/themes/zdoc/exampleSite/static/logo.png create mode 100644 website/themes/zdoc/exampleSite/static/manifest.json create mode 100644 website/themes/zdoc/i18n/en.toml create mode 100644 website/themes/zdoc/i18n/ko.toml create mode 100644 website/themes/zdoc/images/screenshot.png create mode 100644 website/themes/zdoc/images/tn.png create mode 100644 website/themes/zdoc/layouts/404.html create mode 100644 website/themes/zdoc/layouts/_default/_markup/render-image.html create mode 100644 website/themes/zdoc/layouts/_default/_markup/render-link.html create mode 100644 website/themes/zdoc/layouts/_default/baseof.html create mode 100644 website/themes/zdoc/layouts/_default/list.searchindex.json create mode 100644 website/themes/zdoc/layouts/_default/rss.xml create mode 100644 website/themes/zdoc/layouts/_default/section.html create mode 100644 website/themes/zdoc/layouts/_default/single.html create mode 100644 website/themes/zdoc/layouts/_default/single.searchindex.json create mode 100644 website/themes/zdoc/layouts/_default/sitemap.xml create mode 100644 website/themes/zdoc/layouts/_default/summary.html create mode 100644 website/themes/zdoc/layouts/_default/taxonomy.html create mode 100644 website/themes/zdoc/layouts/_default/terms.searchindex.json create mode 100644 website/themes/zdoc/layouts/blog/section.html create mode 100644 website/themes/zdoc/layouts/blog/single.html create mode 100644 website/themes/zdoc/layouts/index.html create mode 100644 website/themes/zdoc/layouts/index.json create mode 100644 website/themes/zdoc/layouts/partials/comments/changyan.html create mode 100644 website/themes/zdoc/layouts/partials/comments/commento.html create mode 100644 website/themes/zdoc/layouts/partials/comments/comments.html create mode 100644 website/themes/zdoc/layouts/partials/comments/disqus.html create mode 100644 website/themes/zdoc/layouts/partials/comments/gitalk.html create mode 100644 website/themes/zdoc/layouts/partials/comments/gitment.html create mode 100644 website/themes/zdoc/layouts/partials/comments/isso.html create mode 100644 website/themes/zdoc/layouts/partials/comments/livere.html create mode 100644 website/themes/zdoc/layouts/partials/comments/utterances.html create mode 100644 website/themes/zdoc/layouts/partials/comments/valine.html create mode 100644 website/themes/zdoc/layouts/partials/drawer/drawer-section.html create mode 100644 website/themes/zdoc/layouts/partials/drawer/drawer.html create mode 100644 website/themes/zdoc/layouts/partials/footer/footer.html create mode 100644 website/themes/zdoc/layouts/partials/head/meta.html create mode 100644 website/themes/zdoc/layouts/partials/head/meta_json_ld.html create mode 100644 website/themes/zdoc/layouts/partials/head/scripts.html create mode 100644 website/themes/zdoc/layouts/partials/head/services.html create mode 100644 website/themes/zdoc/layouts/partials/head/styles.html create mode 100644 website/themes/zdoc/layouts/partials/header/blog-header-img.html create mode 100644 website/themes/zdoc/layouts/partials/header/blog-header-text.html create mode 100644 website/themes/zdoc/layouts/partials/header/blog-header.html create mode 100644 website/themes/zdoc/layouts/partials/header/custom-header.html create mode 100644 website/themes/zdoc/layouts/partials/header/site-header.html create mode 100644 website/themes/zdoc/layouts/partials/header/taxo-header.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/article-meta.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/breadcrumb.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/edit-this-page.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/pagination-single.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/pagination.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/toc.html create mode 100644 website/themes/zdoc/layouts/partials/main/component/toggle-sidebar.html create mode 100644 website/themes/zdoc/layouts/partials/main/header.html create mode 100644 website/themes/zdoc/layouts/partials/main/home.html create mode 100644 website/themes/zdoc/layouts/partials/main/landing/home-landing.html create mode 100644 website/themes/zdoc/layouts/partials/main/landing/home-sections.html create mode 100644 website/themes/zdoc/layouts/partials/main/landing/home-social.html create mode 100644 website/themes/zdoc/layouts/partials/main/landing/section-card.html create mode 100644 website/themes/zdoc/layouts/partials/main/landing/section-normal.html create mode 100644 website/themes/zdoc/layouts/partials/main/list.html create mode 100644 website/themes/zdoc/layouts/partials/main/sections/list-main.html create mode 100644 website/themes/zdoc/layouts/partials/main/sections/list-menu.html create mode 100644 website/themes/zdoc/layouts/partials/main/sections/list-section.html create mode 100644 website/themes/zdoc/layouts/partials/main/sections/single-menu.html create mode 100644 website/themes/zdoc/layouts/partials/main/single.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/icons/light-dark-toggle.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/icons/navbar-icons.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/icons/select-lang.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/logo/navbar-logo-mobile.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/logo/navbar-logo-tablet.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/logo/navbar-logo.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/menu/navbar-menu-collapse.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/menu/navbar-menu-mobile.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/menu/navbar-menu.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/navbar.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/search/site-search-mobile.html create mode 100644 website/themes/zdoc/layouts/partials/navbar/search/site-search.html create mode 100644 website/themes/zdoc/layouts/partials/script/single-script.html create mode 100644 website/themes/zdoc/layouts/partials/side/toc.html create mode 100644 website/themes/zdoc/layouts/partials/svgs/arrow-back.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/arrow-down.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/arrow-forward.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/arrow-left.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/arrow-right.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/avatar.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/calendar.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/cancel.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/close.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/dark-mode.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/edit.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/github.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/hand-with-pen.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/home.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/invert-colors.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/light-mode.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/menu.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/search.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/time.svg create mode 100644 website/themes/zdoc/layouts/partials/svgs/translate.svg create mode 100644 website/themes/zdoc/layouts/robots.txt create mode 100644 website/themes/zdoc/layouts/shortcodes/alert.html create mode 100644 website/themes/zdoc/layouts/shortcodes/box.html create mode 100644 website/themes/zdoc/layouts/shortcodes/color.html create mode 100644 website/themes/zdoc/layouts/shortcodes/expand.html create mode 100644 website/themes/zdoc/layouts/shortcodes/img.html create mode 100644 website/themes/zdoc/layouts/shortcodes/notice.html create mode 100644 website/themes/zdoc/static/fonts/montserrat-black.woff create mode 100644 website/themes/zdoc/static/fonts/montserrat-black.woff2 create mode 100644 website/themes/zdoc/static/fonts/montserrat-bold.woff create mode 100644 website/themes/zdoc/static/fonts/montserrat-bold.woff2 create mode 100644 website/themes/zdoc/static/fonts/montserrat-regular.woff create mode 100644 website/themes/zdoc/static/fonts/montserrat-regular.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-200.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-200.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-200italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-200italic.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-300.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-300.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-300italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-300italic.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-400.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-400.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-400italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-400italic.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-600.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-600.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-600italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-600italic.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-700.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-700.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-700italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-700italic.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-800.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-800.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-800italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-800italic.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-900.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-900.woff2 create mode 100644 website/themes/zdoc/static/fonts/muli-latin-900italic.woff create mode 100644 website/themes/zdoc/static/fonts/muli-latin-900italic.woff2 create mode 100644 website/themes/zdoc/static/images/landscape.jpg create mode 100644 website/themes/zdoc/static/images/mountain.jpg create mode 100644 website/themes/zdoc/static/images/mountains.jpg create mode 100644 website/themes/zdoc/static/images/section/keyboard.png create mode 100644 website/themes/zdoc/static/images/section/processor.png create mode 100644 website/themes/zdoc/static/images/section/root-server.png create mode 100644 website/themes/zdoc/static/logo.png create mode 100644 website/themes/zdoc/static/manifest.json create mode 100644 website/themes/zdoc/theme.toml diff --git a/website/config.toml b/website/config.toml index ce6e14c27..eca601a1d 100644 --- a/website/config.toml +++ b/website/config.toml @@ -1,3 +1,4 @@ +<<<<<<< HEAD baseURL = "https://books.halfrost.com/leetcode" languageCode = "en-us" title = "LeetCode Cookbook" @@ -77,67 +78,58 @@ disablePathToLower = true # Start and end levels can be controlled with markup.tableOfContents setting. # You can also specify this parameter per page in front matter. BookToC = false +======= +baseURL = "http://example.org" +title = "Hugo Zzo Theme" +theme = "zzo" +>>>>>>> 0c736c4... Change to zdoc - # (Optional, default none) Set the path to a logo for the book. If the logo is - # /static/logo.png then the path would be logo.png - # BookLogo = 'logo.png' - - # (Optional, default none) Set leaf bundle to render as side menu - # When not specified file structure and weights will be used - BookMenuBundle = '/menu' - - # (Optional, default docs) Specify section of content to render as menu - # You can also set value to '*' to render all sections to menu - BookSection = 'docs' - - # Set source repository location. - # Used for 'Last Modified' and 'Edit this page' links. - BookRepo = 'https://github.com/halfrost/LeetCode-Go' - - # Enable "Edit this page" links for 'doc' page type. - # Disabled by default. Uncomment to enable. Requires 'BookRepo' param. - # Path must point to 'content' directory of repo. - BookEditPath = 'tree/master/website/content' - - # Configure the date format used on the pages - # - In git information - # - In blog posts - BookDateFormat = 'Jan 2, 2006' - - # (Optional, default true) Enables search function with flexsearch, - # Index is built on fly, therefore it might slowdown your website. - # Configuration for indexing can be adjusted in i18n folder per language. - BookSearch = true - - # (Optional, default true) Enables comments template on pages - # By default partals/docs/comments.html includes Disqus template - # See https://gohugo.io/content-management/comments/#configure-disqus - # Can be overwritten by same param in page frontmatter - BookComments = false - enableGitalk = true - - # /!\ This is an experimental feature, might be removed or changed at any time - # (Optional, experimental, default false) Enables portable links and link checks in markdown pages. - # Portable links meant to work with text editors and let you write markdown without {{< relref >}} shortcode - # Theme will print warning if page referenced in markdown does not exists. - BookPortableLinks = true - - # /!\ This is an experimental feature, might be removed or changed at any time - # (Optional, experimental, default false) Enables service worker that caches visited pages and resources for offline use. - BookServiceWorker = true - -[params.gitalk] - clientID = "75d9d747f200c623a0e6" # Your client ID - clientSecret = "e3cc2ff8d8f6ae3c894a827f226188de0d26f37e" # Your client secret - repo = "S2" # The repo to store comments - owner = "halfrost" # Your GitHub ID - admin= "halfrost" # Required. Github repository owner and collaborators. (Users who having write access to this repository) - id= "location.pathname" # The unique id of the page. - labels= "gitalk" # Github issue labels. If you used to use Gitment, you can change it - body= "location.href" # GitHub issue body. - perPage= 100 # Pagination size, with maximum 100. - pagerDirection= "last" # Comment sorting direction, available values are 'last' and 'first'. - createIssueManually= true # If it is 'false', it is auto to make a Github issue when the administrators login. - distractionFreeMode= true # Enable hot key (cmd|ctrl + enter) submit comment. +defaultContentLanguage = "en" +defaultContentLanguageInSubdir = true +hasCJKLanguage = true +summaryLength = 70 +buildFuture = true +copyright = "©{year}, All Rights Reserved" +timeout = 10000 +enableEmoji = true +paginate = 13 +rssLimit = 100 + +enableGitInfo = false +googleAnalytics = "" + +[markup] + [markup.goldmark] + [markup.goldmark.renderer] + hardWraps = true + unsafe = true + xHTML = true + [markup.highlight] + codeFences = true + lineNos = true + lineNumbersInTable = true + noClasses = false + [markup.tableOfContents] + endLevel = 4 + ordered = false + startLevel = 2 + +[outputs] + home = ["HTML", "RSS", "SearchIndex"] + section = ["HTML", "RSS", "SearchIndex"] + taxonomyTerm = ["HTML", "RSS", "SearchIndex"] + taxonomy = ["HTML", "RSS", "SearchIndex"] + +[outputFormats] + [outputFormats.SearchIndex] + mediaType = "application/json" + baseName = "index" + isPlainText = true + notAlternative = true + +[taxonomies] + category = "categories" + tag = "tags" + series = "series" \ No newline at end of file diff --git a/website/content/ChapterFour/0001.Two-Sum.md b/website/content/ChapterFour/0001.Two-Sum.md deleted file mode 100644 index 469d1d19f..000000000 --- a/website/content/ChapterFour/0001.Two-Sum.md +++ /dev/null @@ -1,50 +0,0 @@ -# [1. Two Sum](https://leetcode.com/problems/two-sum/) - -## 题目 - -Given an array of integers, return indices of the two numbers such that they add up to a specific target. - -You may assume that each input would have exactly one solution, and you may not use the same element twice. - -**Example**: - -``` - -Given nums = [2, 7, 11, 15], target = 9, - -Because nums[0] + nums[1] = 2 + 7 = 9, -return [0, 1] - -``` - - - -## 题目大意 - -在数组中找到 2 个数之和等于给定值的数字,结果返回 2 个数字在数组中的下标。 - -## 解题思路 - -这道题最优的做法时间复杂度是 O(n)。 - -顺序扫描数组,对每一个元素,在 map 中找能组合给定值的另一半数字,如果找到了,直接返回 2 个数字的下标即可。如果找不到,就把这个数字存入 map 中,等待扫到“另一半”数字的时候,再取出来返回结果。 - -## 代码 - -```go - -package leetcode - -func twoSum(nums []int, target int) []int { - m := make(map[int]int) - for i := 0; i < len(nums); i++ { - another := target - nums[i] - if _, ok := m[another]; ok { - return []int{m[another], i} - } - m[nums[i]] = i - } - return nil -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0002.Add-Two-Numbers.md b/website/content/ChapterFour/0002.Add-Two-Numbers.md deleted file mode 100644 index c30fb0ef0..000000000 --- a/website/content/ChapterFour/0002.Add-Two-Numbers.md +++ /dev/null @@ -1,78 +0,0 @@ -# [2. Add Two Numbers](https://leetcode.com/problems/add-two-numbers/) - -## 题目 - -You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. - -You may assume the two numbers do not contain any leading zero, except the number 0 itself. - -**Example**: - -``` - -Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) -Output: 7 -> 0 -> 8 -Explanation: 342 + 465 = 807. -``` - - - -## 题目大意 - -2 个逆序的链表,要求从低位开始相加,得出结果也逆序输出,返回值是逆序结果链表的头结点。 - -## 解题思路 - -需要注意的是各种进位问题。 - -极端情况,例如 - -``` - -Input: (9 -> 9 -> 9 -> 9 -> 9) + (1 -> ) -Output: 0 -> 0 -> 0 -> 0 -> 0 -> 1 - - -``` - -为了处理方法统一,可以先建立一个虚拟头结点,这个虚拟头结点的 Next 指向真正的 head,这样 head 不需要单独处理,直接 while 循环即可。另外判断循环终止的条件不用是 p.Next != nil,这样最后一位还需要额外计算,循环终止条件应该是 p != nil。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { - head := &ListNode{Val: 0} - n1, n2, carry, current := 0, 0, 0, head - for l1 != nil || l2 != nil || carry != 0 { - if l1 == nil { - n1 = 0 - } else { - n1 = l1.Val - l1 = l1.Next - } - if l2 == nil { - n2 = 0 - } else { - n2 = l2.Val - l2 = l2.Next - } - current.Next = &ListNode{Val: (n1 + n2 + carry) % 10} - current = current.Next - carry = (n1 + n2 + carry) / 10 - } - return head.Next -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md b/website/content/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md deleted file mode 100644 index 36e027da8..000000000 --- a/website/content/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md +++ /dev/null @@ -1,124 +0,0 @@ -# [3. Longest Substring Without Repeating Characters](https://leetcode.com/problems/longest-substring-without-repeating-characters/) - -## 题目 - -Given a string, find the length of the longest substring without repeating characters. - - - -**Example 1**: - -``` - -Input: "abcabcbb" -Output: 3 -Explanation: The answer is "abc", with the length of 3. - -``` - -**Example 2**: - -``` - -Input: "bbbbb" -Output: 1 -Explanation: The answer is "b", with the length of 1. - -``` - -**Example 3**: - -``` - -Input: "pwwkew" -Output: 3 -Explanation: The answer is "wke", with the length of 3. - Note that the answer must be a substring, "pwke" is a subsequence and not a substring. - -``` - -## 题目大意 - - -在一个字符串重寻找没有重复字母的最长子串。 - -## 解题思路 - -这一题和第 438 题,第 3 题,第 76 题,第 567 题类似,用的思想都是"滑动窗口"。 - -滑动窗口的右边界不断的右移,只要没有重复的字符,就持续向右扩大窗口边界。一旦出现了重复字符,就需要缩小左边界,直到重复的字符移出了左边界,然后继续移动滑动窗口的右边界。以此类推,每次移动需要计算当前长度,并判断是否需要更新最大长度,最终最大的值就是题目中的所求。 - - -## 代码 - -```go - -package leetcode - -// 解法一 位图 -func lengthOfLongestSubstring(s string) int { - if len(s) == 0 { - return 0 - } - var bitSet [256]bool - result, left, right := 0, 0, 0 - for left < len(s) { - // 右侧字符对应的 bitSet 被标记 true,说明此字符在 X 位置重复,需要左侧向前移动,直到将X标记为 false - if bitSet[s[right]] { - bitSet[s[left]] = false - left++ - } else { - bitSet[s[right]] = true - right++ - } - if result < right-left { - result = right - left - } - if left+result >= len(s) || right >= len(s) { - break - } - } - return result -} - -// 解法二 滑动窗口 -func lengthOfLongestSubstring_(s string) int { - if len(s) == 0 { - return 0 - } - var freq [256]int - result, left, right := 0, 0, -1 - - for left < len(s) { - if right+1 < len(s) && freq[s[right+1]-'a'] == 0 { - freq[s[right+1]-'a']++ - right++ - } else { - freq[s[left]-'a']-- - left++ - } - result = max(result, right-left+1) - } - return result -} - -func max(a int, b int) int { - if a > b { - return a - } - return b -} - - -``` - - - - - - - - - - - diff --git a/website/content/ChapterFour/0004.Median-of-Two-Sorted-Arrays.md b/website/content/ChapterFour/0004.Median-of-Two-Sorted-Arrays.md deleted file mode 100755 index 9ad0c55b0..000000000 --- a/website/content/ChapterFour/0004.Median-of-Two-Sorted-Arrays.md +++ /dev/null @@ -1,98 +0,0 @@ -# [4. Median of Two Sorted Arrays](https://leetcode.com/problems/median-of-two-sorted-arrays/) - - -## 题目 - -There are two sorted arrays **nums1** and **nums2** of size m and n respectively. - -Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). - -You may assume **nums1** and **nums2** cannot be both empty. - -**Example 1**: - - nums1 = [1, 3] - nums2 = [2] - - The median is 2.0 - -**Example 2**: - - nums1 = [1, 2] - nums2 = [3, 4] - - The median is (2 + 3)/2 = 2.5 - - - -## 题目大意 - - -给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。 - -请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 - -你可以假设 nums1 和 nums2 不会同时为空。 - - - -## 解题思路 - - -- 给出两个有序数组,要求找出这两个数组合并以后的有序数组中的中位数。要求时间复杂度为 O(log (m+n))。 -- 这一题最容易想到的办法是把两个数组合并,然后取出中位数。但是合并有序数组的操作是 `O(max(n,m))` 的,不符合题意。看到题目给的 `log` 的时间复杂度,很容易联想到二分搜索。 -- 由于要找到最终合并以后数组的中位数,两个数组的总大小也知道,所以中间这个位置也是知道的。只需要二分搜索一个数组中切分的位置,另一个数组中切分的位置也能得到。为了使得时间复杂度最小,所以二分搜索两个数组中长度较小的那个数组。 -- 关键的问题是如何切分数组 1 和数组 2 。其实就是如何切分数组 1 。先随便二分产生一个 `midA`,切分的线何时算满足了中位数的条件呢?即,线左边的数都小于右边的数,即,`nums1[midA-1] ≤ nums2[midB] && nums2[midB-1] ≤ nums1[midA]` 。如果这些条件都不满足,切分线就需要调整。如果 `nums1[midA] < nums2[midB-1]`,说明 `midA` 这条线划分出来左边的数小了,切分线应该右移;如果 `nums1[midA-1] > nums2[midB]`,说明 midA 这条线划分出来左边的数大了,切分线应该左移。经过多次调整以后,切分线总能找到满足条件的解。 -- 假设现在找到了切分的两条线了,`数组 1` 在切分线两边的下标分别是 `midA - 1` 和 `midA`。`数组 2` 在切分线两边的下标分别是 `midB - 1` 和 `midB`。最终合并成最终数组,如果数组长度是奇数,那么中位数就是 `max(nums1[midA-1], nums2[midB-1])`。如果数组长度是偶数,那么中间位置的两个数依次是:`max(nums1[midA-1], nums2[midB-1])` 和 `min(nums1[midA], nums2[midB])`,那么中位数就是 `(max(nums1[midA-1], nums2[midB-1]) + min(nums1[midA], nums2[midB])) / 2`。图示见下图: - - ![](https://img.halfrost.com/Leetcode/leetcode_4.png) - -## 代码 - -```go - -package leetcode - -func findMedianSortedArrays(nums1 []int, nums2 []int) float64 { - // 假设 nums1 的长度小 - if len(nums1) > len(nums2) { - return findMedianSortedArrays(nums2, nums1) - } - low, high, k, nums1Mid, nums2Mid := 0, len(nums1), (len(nums1)+len(nums2)+1)>>1, 0, 0 - for low <= high { - // nums1: ……………… nums1[nums1Mid-1] | nums1[nums1Mid] …………………… - // nums2: ……………… nums2[nums2Mid-1] | nums2[nums2Mid] …………………… - nums1Mid = low + (high-low)>>1 // 分界限右侧是 mid,分界线左侧是 mid - 1 - nums2Mid = k - nums1Mid - if nums1Mid > 0 && nums1[nums1Mid-1] > nums2[nums2Mid] { // nums1 中的分界线划多了,要向左边移动 - high = nums1Mid - 1 - } else if nums1Mid != len(nums1) && nums1[nums1Mid] < nums2[nums2Mid-1] { // nums1 中的分界线划少了,要向右边移动 - low = nums1Mid + 1 - } else { - // 找到合适的划分了,需要输出最终结果了 - // 分为奇数偶数 2 种情况 - break - } - } - midLeft, midRight := 0, 0 - if nums1Mid == 0 { - midLeft = nums2[nums2Mid-1] - } else if nums2Mid == 0 { - midLeft = nums1[nums1Mid-1] - } else { - midLeft = max(nums1[nums1Mid-1], nums2[nums2Mid-1]) - } - if (len(nums1)+len(nums2))&1 == 1 { - return float64(midLeft) - } - if nums1Mid == len(nums1) { - midRight = nums2[nums2Mid] - } else if nums2Mid == len(nums2) { - midRight = nums1[nums1Mid] - } else { - midRight = min(nums1[nums1Mid], nums2[nums2Mid]) - } - return float64(midLeft+midRight) / 2 -} - -``` diff --git a/website/content/ChapterFour/0007.Reverse-Integer.md b/website/content/ChapterFour/0007.Reverse-Integer.md deleted file mode 100755 index 801d50888..000000000 --- a/website/content/ChapterFour/0007.Reverse-Integer.md +++ /dev/null @@ -1,55 +0,0 @@ -# [7. Reverse Integer](https://leetcode.com/problems/reverse-integer/) - - -## 题目 - -Given a 32-bit signed integer, reverse digits of an integer. - -**Example 1**: - - Input: 123 - Output: 321 - -**Example 2**: - - Input: -123 - Output: -321 - -**Example 3**: - - Input: 120 - Output: 21 - -**Note**: Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows. - -## 题目大意 - -给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31,  2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。 - - - -## 解题思路 - - -- 这一题是简单题,要求反转 10 进制数。类似的题目有第 190 题。 -- 这一题只需要注意一点,反转以后的数字要求在 [−2^31, 2^31 − 1]范围内,超过这个范围的数字都要输出 0 。 - -## 代码 - -```go - -package leetcode - -func reverse7(x int) int { - tmp := 0 - for x != 0 { - tmp = tmp*10 + x%10 - x = x / 10 - } - if tmp > 1<<31-1 || tmp < -(1<<31) { - return 0 - } - return tmp -} - -``` diff --git a/website/content/ChapterFour/0009.Palindrome-Number.md b/website/content/ChapterFour/0009.Palindrome-Number.md deleted file mode 100644 index d01fc716d..000000000 --- a/website/content/ChapterFour/0009.Palindrome-Number.md +++ /dev/null @@ -1,69 +0,0 @@ -# [9. Palindrome Number](https://leetcode.com/problems/palindrome-number/) - - -## 题目 - -Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same backward as forward. - -**Example 1**: - -``` -Input: 121 -Output: true -``` - -**Example 2**: - -``` -Input: -121 -Output: false -Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome. -``` - -**Example 3**: - -``` -Input: 10 -Output: false -Explanation: Reads 01 from right to left. Therefore it is not a palindrome. -``` - -**Follow up**: - -Coud you solve it without converting the integer to a string? - -## 题目大意 - -判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 - -## 解题思路 - -- 判断一个整数是不是回文数。 -- 简单题。注意会有负数的情况,负数,个位数,10 都不是回文数。其他的整数再按照回文的规则判断。 - -## 代码 - -```go - -package leetcode - -import "strconv" - -func isPalindrome(x int) bool { - if x < 0 { - return false - } - if x < 10 { - return true - } - s := strconv.Itoa(x) - length := len(s) - for i := 0; i <= length/2; i++ { - if s[i] != s[length-1-i] { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0011.Container-With-Most-Water.md b/website/content/ChapterFour/0011.Container-With-Most-Water.md deleted file mode 100644 index c8d25a2ea..000000000 --- a/website/content/ChapterFour/0011.Container-With-Most-Water.md +++ /dev/null @@ -1,59 +0,0 @@ -# [11. Container With Most Water](https://leetcode.com/problems/container-with-most-water/) - -## 题目 - -Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water. - -**Note**: You may not slant the container and n is at least 2. - -![](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/07/17/question_11.jpg) - -The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49. - -**Example 1**: - -``` - -Input: [1,8,6,2,5,4,8,3,7] -Output: 49 - -``` - - -## 题目大意 - -给出一个非负整数数组 a1,a2,a3,…… an,每个整数标识一个竖立在坐标轴 x 位置的一堵高度为 ai 的墙,选择两堵墙,和 x 轴构成的容器可以容纳最多的水。 - -## 解题思路 - - -这一题也是对撞指针的思路。首尾分别 2 个指针,每次移动以后都分别判断长宽的乘积是否最大。 - -## 代码 - -```go - -package leetcode - -func maxArea(height []int) int { - max, start, end := 0, 0, len(height)-1 - for start < end { - width := end - start - high := 0 - if height[start] < height[end] { - high = height[start] - start++ - } else { - high = height[end] - end-- - } - - temp := width * high - if temp > max { - max = temp - } - } - return max -} - -``` diff --git a/website/content/ChapterFour/0013.Roman-to-Integer.md b/website/content/ChapterFour/0013.Roman-to-Integer.md deleted file mode 100644 index 44d758ebb..000000000 --- a/website/content/ChapterFour/0013.Roman-to-Integer.md +++ /dev/null @@ -1,132 +0,0 @@ -# [13. Roman to Integer](https://leetcode.com/problems/roman-to-integer/) - - -## 题目 - -Roman numerals are represented by seven different symbols: `I`, `V`, `X`, `L`, `C`, `D` and `M`. - -``` -Symbol Value -I 1 -V 5 -X 10 -L 50 -C 100 -D 500 -M 1000 -``` - -For example, two is written as `II` in Roman numeral, just two one's added together. Twelve is written as, `XII`, which is simply `X` + `II`. The number twenty seven is written as `XXVII`, which is `XX` + `V` + `II`. - -Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not `IIII`. Instead, the number four is written as `IV`. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as `IX`. There are six instances where subtraction is used: - -- `I` can be placed before `V` (5) and `X` (10) to make 4 and 9. -- `X` can be placed before `L` (50) and `C` (100) to make 40 and 90. -- `C` can be placed before `D` (500) and `M` (1000) to make 400 and 900. - -Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. - -**Example 1**: - -``` -Input: "III" -Output: 3 -``` - -**Example 2**: - -``` -Input: "IV" -Output: 4 -``` - -**Example 3**: - -``` -Input: "IX" -Output: 9 -``` - -**Example 4**: - -``` -Input: "LVIII" -Output: 58 -Explanation: L = 50, V= 5, III = 3. -``` - -**Example 5**: - -``` -Input: "MCMXCIV" -Output: 1994 -Explanation: M = 1000, CM = 900, XC = 90 and IV = 4. -``` - -## 题目大意 - -罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 - -```go - -字符 数值 -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 到 3999 的范围内。 - -## 解题思路 - -- 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。 -- 简单题。按照题目中罗马数字的字符数值,计算出对应罗马数字的十进制数即可。 - -## 代码 - -```go - -package leetcode - -var roman = map[string]int{ - "I": 1, - "V": 5, - "X": 10, - "L": 50, - "C": 100, - "D": 500, - "M": 1000, -} - -func romanToInt(s string) int { - if s == "" { - return 0 - } - num, lastint, total := 0, 0, 0 - for i := 0; i < len(s); i++ { - char := s[len(s)-(i+1) : len(s)-i] - num = roman[char] - if num < lastint { - total = total - num - } else { - total = total + num - } - lastint = num - } - return total -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0015.3Sum.md b/website/content/ChapterFour/0015.3Sum.md deleted file mode 100644 index 454f3aeec..000000000 --- a/website/content/ChapterFour/0015.3Sum.md +++ /dev/null @@ -1,83 +0,0 @@ -# [15. 3Sum](https://leetcode.com/problems/3sum/) - -## 题目 - -Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero. - -**Note**: - -The solution set must not contain duplicate triplets. - -**Example**: - -``` - -Given array nums = [-1, 0, 1, 2, -1, -4], - -A solution set is: -[ - [-1, 0, 1], - [-1, -1, 2] -] - -``` - -## 题目大意 - -给定一个数组,要求在这个数组中找出 3 个数之和为 0 的所有组合。 - -## 解题思路 - -用 map 提前计算好任意 2 个数字之和,保存起来,可以将时间复杂度降到 O(n^2)。这一题比较麻烦的一点在于,最后输出解的时候,要求输出不重复的解。数组中同一个数字可能出现多次,同一个数字也可能使用多次,但是最后输出解的时候,不能重复。例如 [-1,-1,2] 和 [2, -1, -1]、[-1, 2, -1] 这 3 个解是重复的,即使 -1 可能出现 100 次,每次使用的 -1 的数组下标都是不同的。 - -这里就需要去重和排序了。map 记录每个数字出现的次数,然后对 map 的 key 数组进行排序,最后在这个排序以后的数组里面扫,找到另外 2 个数字能和自己组成 0 的组合。 - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func threeSum(nums []int) [][]int { - res := [][]int{} - counter := map[int]int{} - for _, value := range nums { - counter[value]++ - } - - uniqNums := []int{} - for key := range counter { - uniqNums = append(uniqNums, key) - } - sort.Ints(uniqNums) - - for i := 0; i < len(uniqNums); i++ { - if (uniqNums[i]*3 == 0) && counter[uniqNums[i]] >= 3 { - res = append(res, []int{uniqNums[i], uniqNums[i], uniqNums[i]}) - } - for j := i + 1; j < len(uniqNums); j++ { - if (uniqNums[i]*2+uniqNums[j] == 0) && counter[uniqNums[i]] > 1 { - res = append(res, []int{uniqNums[i], uniqNums[i], uniqNums[j]}) - } - if (uniqNums[j]*2+uniqNums[i] == 0) && counter[uniqNums[j]] > 1 { - res = append(res, []int{uniqNums[i], uniqNums[j], uniqNums[j]}) - } - c := 0 - uniqNums[i] - uniqNums[j] - if c > uniqNums[j] && counter[c] > 0 { - res = append(res, []int{uniqNums[i], uniqNums[j], c}) - } - } - } - return res -} - - -``` - - - - diff --git a/website/content/ChapterFour/0016.3Sum-Closest.md b/website/content/ChapterFour/0016.3Sum-Closest.md deleted file mode 100644 index 19d44e56f..000000000 --- a/website/content/ChapterFour/0016.3Sum-Closest.md +++ /dev/null @@ -1,89 +0,0 @@ -# [16. 3Sum Closest](https://leetcode.com/problems/3sum-closest/) - -## 题目 - -Given an array nums of n integers and an integer target, find three integers in nums such that the sum is closest to target. Return the sum of the three integers. You may assume that each input would have exactly one solution. - -**Example**: - -``` - -Given array nums = [-1, 2, 1, -4], and target = 1. - -The sum that is closest to the target is 2. (-1 + 2 + 1 = 2). - -``` - -## 题目大意 - -给定一个数组,要求在这个数组中找出 3 个数之和离 target 最近。 - -## 解题思路 - -这一题看似和第 15 题和第 18 题很像,都是求 3 或者 4 个数之和的问题,但是这一题的做法和 15,18 题完全不同。 - -这一题的解法是用两个指针夹逼的方法。先对数组进行排序,i 从头开始往后面扫。这里同样需要注意数组中存在多个重复数字的问题。具体处理方法很多,可以用 map 计数去重。这里笔者简单的处理,i 在循环的时候和前一个数进行比较,如果相等,i 继续往后移,直到移到下一个和前一个数字不同的位置。j,k 两个指针开始一前一后夹逼。j 为 i 的下一个数字,k 为数组最后一个数字,由于经过排序,所以 k 的数字最大。j 往后移动,k 往前移动,逐渐夹逼出最接近 target 的值。 - - -这道题还可以用暴力解法,三层循环找到距离 target 最近的组合。具体见代码。 - -## 代码 - -```go - -package leetcode - -import ( - "math" - "sort" -) - -// 解法一 O(n^2) -func threeSumClosest(nums []int, target int) int { - n, res, diff := len(nums), 0, math.MaxInt32 - if n > 2 { - sort.Ints(nums) - for i := 0; i < n-2; i++ { - for j, k := i+1, n-1; j < k; { - sum := nums[i] + nums[j] + nums[k] - if abs(sum-target) < diff { - res, diff = sum, abs(sum-target) - } - if sum == target { - return res - } else if sum > target { - k-- - } else { - j++ - } - } - } - } - return res -} - -// 解法二 暴力解法 O(n^3) -func threeSumClosest1(nums []int, target int) int { - res, difference := 0, math.MaxInt16 - for i := 0; i < len(nums); i++ { - for j := i + 1; j < len(nums); j++ { - for k := j + 1; k < len(nums); k++ { - if abs(nums[i]+nums[j]+nums[k]-target) < difference { - difference = abs(nums[i] + nums[j] + nums[k] - target) - res = nums[i] + nums[j] + nums[k] - } - } - } - } - return res -} - -func abs(a int) int { - if a > 0 { - return a - } - return -a -} - - -``` diff --git a/website/content/ChapterFour/0018.4Sum.md b/website/content/ChapterFour/0018.4Sum.md deleted file mode 100644 index e0f70941f..000000000 --- a/website/content/ChapterFour/0018.4Sum.md +++ /dev/null @@ -1,97 +0,0 @@ -# [18. 4Sum](https://leetcode.com/problems/4sum/) - -## 题目 - -Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. - -**Note**: - -The solution set must not contain duplicate quadruplets. - -**Example**: - -``` - -Given array nums = [1, 0, -1, 0, -2, 2], and target = 0. - -A solution set is: -[ - [-1, 0, 0, 1], - [-2, -1, 1, 2], - [-2, 0, 0, 2] -] - -``` - -## 题目大意 - -给定一个数组,要求在这个数组中找出 4 个数之和为 0 的所有组合。 - - -## 解题思路 - -用 map 提前计算好任意 3 个数字之和,保存起来,可以将时间复杂度降到 O(n^3)。这一题比较麻烦的一点在于,最后输出解的时候,要求输出不重复的解。数组中同一个数字可能出现多次,同一个数字也可能使用多次,但是最后输出解的时候,不能重复。例如 [-1,1,2, -2] 和 [2, -1, -2, 1]、[-2, 2, -1, 1] 这 3 个解是重复的,即使 -1, -2 可能出现 100 次,每次使用的 -1, -2 的数组下标都是不同的。 - -这一题是第 15 题的升级版,思路都是完全一致的。这里就需要去重和排序了。map 记录每个数字出现的次数,然后对 map 的 key 数组进行排序,最后在这个排序以后的数组里面扫,找到另外 3 个数字能和自己组成 0 的组合。 - -第 15 题和第 18 题的解法一致。 - -## 代码 - -```go - -package leetcode - -import "sort" - -func fourSum(nums []int, target int) [][]int { - res := [][]int{} - counter := map[int]int{} - for _, value := range nums { - counter[value]++ - } - - uniqNums := []int{} - for key := range counter { - uniqNums = append(uniqNums, key) - } - sort.Ints(uniqNums) - - for i := 0; i < len(uniqNums); i++ { - if (uniqNums[i]*4 == target) && counter[uniqNums[i]] >= 4 { - res = append(res, []int{uniqNums[i], uniqNums[i], uniqNums[i], uniqNums[i]}) - } - for j := i + 1; j < len(uniqNums); j++ { - if (uniqNums[i]*3+uniqNums[j] == target) && counter[uniqNums[i]] > 2 { - res = append(res, []int{uniqNums[i], uniqNums[i], uniqNums[i], uniqNums[j]}) - } - if (uniqNums[j]*3+uniqNums[i] == target) && counter[uniqNums[j]] > 2 { - res = append(res, []int{uniqNums[i], uniqNums[j], uniqNums[j], uniqNums[j]}) - } - if (uniqNums[j]*2+uniqNums[i]*2 == target) && counter[uniqNums[j]] > 1 && counter[uniqNums[i]] > 1 { - res = append(res, []int{uniqNums[i], uniqNums[i], uniqNums[j], uniqNums[j]}) - } - for k := j + 1; k < len(uniqNums); k++ { - if (uniqNums[i]*2+uniqNums[j]+uniqNums[k] == target) && counter[uniqNums[i]] > 1 { - res = append(res, []int{uniqNums[i], uniqNums[i], uniqNums[j], uniqNums[k]}) - } - if (uniqNums[j]*2+uniqNums[i]+uniqNums[k] == target) && counter[uniqNums[j]] > 1 { - res = append(res, []int{uniqNums[i], uniqNums[j], uniqNums[j], uniqNums[k]}) - } - if (uniqNums[k]*2+uniqNums[i]+uniqNums[j] == target) && counter[uniqNums[k]] > 1 { - res = append(res, []int{uniqNums[i], uniqNums[j], uniqNums[k], uniqNums[k]}) - } - c := target - uniqNums[i] - uniqNums[j] - uniqNums[k] - if c > uniqNums[k] && counter[c] > 0 { - res = append(res, []int{uniqNums[i], uniqNums[j], uniqNums[k], c}) - } - } - } - } - return res -} - - -``` - - diff --git a/website/content/ChapterFour/0019.Remove-Nth-Node-From-End-of-List.md b/website/content/ChapterFour/0019.Remove-Nth-Node-From-End-of-List.md deleted file mode 100644 index 0cb4c9d0f..000000000 --- a/website/content/ChapterFour/0019.Remove-Nth-Node-From-End-of-List.md +++ /dev/null @@ -1,100 +0,0 @@ -# [19. Remove Nth Node From End of List](https://leetcode.com/problems/remove-nth-node-from-end-of-list/) - -## 题目 - -Given a linked list, remove the n-th node from the end of list and return its head. - -**Example**: - -``` - -Given linked list: 1->2->3->4->5, and n = 2. - -After removing the second node from the end, the linked list becomes 1->2->3->5. - -``` - -## 题目大意 - -删除链表中倒数第 n 个结点。 - -## 解题思路 - -这道题比较简单,先循环一次拿到链表的总长度,然后循环到要删除的结点的前一个结点开始删除操作。需要注意的一个特例是,有可能要删除头结点,要单独处理。 - -这道题有一种特别简单的解法。设置 2 个指针,一个指针距离前一个指针 n 个距离。同时移动 2 个指针,2 个指针都移动相同的距离。当一个指针移动到了终点,那么前一个指针就是倒数第 n 个节点了。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -// 解法一 -func removeNthFromEnd(head *ListNode, n int) *ListNode { - var fast, slow *ListNode - fast = head - slow = head - for i := 0; i < n; i++ { - fast = fast.Next - } - if fast == nil { - head = head.Next - return head - } - for fast.Next != nil { - fast = fast.Next - slow = slow.Next - } - slow.Next = slow.Next.Next - return head -} - -// 解法二 -func removeNthFromEnd1(head *ListNode, n int) *ListNode { - if head == nil { - return nil - } - if n <= 0 { - return head - } - current := head - len := 0 - for current != nil { - len++ - current = current.Next - } - if n > len { - return head - } - if n == len { - current := head - head = head.Next - current.Next = nil - return head - } - current = head - i := 0 - for current != nil { - if i == len-n-1 { - deleteNode := current.Next - current.Next = current.Next.Next - deleteNode.Next = nil - break - } - i++ - current = current.Next - } - return head -} - - -``` diff --git a/website/content/ChapterFour/0020.Valid-Parentheses.md b/website/content/ChapterFour/0020.Valid-Parentheses.md deleted file mode 100644 index 1df3ba11a..000000000 --- a/website/content/ChapterFour/0020.Valid-Parentheses.md +++ /dev/null @@ -1,96 +0,0 @@ -# [20. Valid Parentheses](https://leetcode.com/problems/valid-parentheses/description/) - -## 题目 - -Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. - -An input string is valid if: - -Open brackets must be closed by the same type of brackets. -Open brackets must be closed in the correct order. -Note that an empty string is also considered valid. - -**Example 1**: - -``` - -Input: "()" -Output: true - -``` - - -**Example 2**: - -``` - -Input: "()[]{}" -Output: true - -``` - -**Example 3**: - -``` - -Input: "(]" -Output: false - -``` - -**Example 4**: - -``` - -Input: "([)]" -Output: false - -``` - -**Example 5**: - -``` - -Input: "{[]}" -Output: true - -``` - -## 题目大意 - -括号匹配问题。 - -## 解题思路 - -遇到左括号就进栈push,遇到右括号并且栈顶为与之对应的左括号,就把栈顶元素出栈。最后看栈里面还有没有其他元素,如果为空,即匹配。 - -需要注意,空字符串是满足括号匹配的,即输出 true。 - -## 代码 - -```go - -package leetcode - -func isValid(s string) bool { - // 空字符串直接返回 true - if len(s) == 0 { - return true - } - stack := make([]rune, 0) - for _, v := range s { - if (v == '[') || (v == '(') || (v == '{') { - stack = append(stack, v) - } else if ((v == ']') && len(stack) > 0 && stack[len(stack)-1] == '[') || - ((v == ')') && len(stack) > 0 && stack[len(stack)-1] == '(') || - ((v == '}') && len(stack) > 0 && stack[len(stack)-1] == '{') { - stack = stack[:len(stack)-1] - } else { - return false - } - } - return len(stack) == 0 -} - - -``` diff --git a/website/content/ChapterFour/0021.Merge-Two-Sorted-Lists.md b/website/content/ChapterFour/0021.Merge-Two-Sorted-Lists.md deleted file mode 100644 index cc559bc3c..000000000 --- a/website/content/ChapterFour/0021.Merge-Two-Sorted-Lists.md +++ /dev/null @@ -1,53 +0,0 @@ -# [21. Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/) - -## 题目 - -Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists. - -**Example**: - -``` - -Input: 1->2->4, 1->3->4 -Output: 1->1->2->3->4->4 - -``` - -## 题目大意 - -合并 2 个有序链表 - -## 解题思路 - -按照题意做即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { - if l1 == nil { - return l2 - } - if l2 == nil { - return l1 - } - if l1.Val < l2.Val { - l1.Next = mergeTwoLists(l1.Next, l2) - return l1 - } - l2.Next = mergeTwoLists(l1, l2.Next) - return l2 -} - - -``` diff --git a/website/content/ChapterFour/0022.Generate-Parentheses.md b/website/content/ChapterFour/0022.Generate-Parentheses.md deleted file mode 100755 index 0e340b390..000000000 --- a/website/content/ChapterFour/0022.Generate-Parentheses.md +++ /dev/null @@ -1,60 +0,0 @@ -# [22. Generate Parentheses](https://leetcode.com/problems/generate-parentheses/) - - -## 题目 - -Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. - -For example, given n = 3, a solution set is: - - - [ - "((()))", - "(()())", - "(())()", - "()(())", - "()()()" - ] - - -## 题目大意 - -给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。 - - -## 解题思路 - -- 这道题乍一看需要判断括号是否匹配的问题,如果真的判断了,那时间复杂度就到 O(n * 2^n)了,虽然也可以 AC,但是时间复杂度巨高。 -- 这道题实际上不需要判断括号是否匹配的问题。因为在 DFS 回溯的过程中,会让 `(` 和 `)` 成对的匹配上的。 - - -## 代码 - -```go - -package leetcode - -func generateParenthesis(n int) []string { - if n == 0 { - return []string{} - } - res := []string{} - findGenerateParenthesis(n, n, "", &res) - return res -} - -func findGenerateParenthesis(lindex, rindex int, str string, res *[]string) { - if lindex == 0 && rindex == 0 { - *res = append(*res, str) - return - } - if lindex > 0 { - findGenerateParenthesis(lindex-1, rindex, str+"(", res) - } - if rindex > 0 && lindex < rindex { - findGenerateParenthesis(lindex, rindex-1, str+")", res) - } -} - - -``` diff --git a/website/content/ChapterFour/0023.Merge-k-Sorted-Lists.md b/website/content/ChapterFour/0023.Merge-k-Sorted-Lists.md deleted file mode 100644 index 3166c480b..000000000 --- a/website/content/ChapterFour/0023.Merge-k-Sorted-Lists.md +++ /dev/null @@ -1,74 +0,0 @@ -# [23. Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/) - -## 题目 - -Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. - - - -**Example**: - -``` - -Input: -[ - 1->4->5, - 1->3->4, - 2->6 -] -Output: 1->1->2->3->4->4->5->6 - -``` - -## 题目大意 - -合并 K 个有序链表 - -## 解题思路 - -借助分治的思想,把 K 个有序链表两两合并即可。相当于是第 21 题的加强版。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func mergeKLists(lists []*ListNode) *ListNode { - length := len(lists) - if length < 1 { - return nil - } - if length == 1 { - return lists[0] - } - num := length / 2 - left := mergeKLists(lists[:num]) - right := mergeKLists(lists[num:]) - return mergeTwoLists1(left, right) -} - -func mergeTwoLists1(l1 *ListNode, l2 *ListNode) *ListNode { - if l1 == nil { - return l2 - } - if l2 == nil { - return l1 - } - if l1.Val < l2.Val { - l1.Next = mergeTwoLists1(l1.Next, l2) - return l1 - } - l2.Next = mergeTwoLists1(l1, l2.Next) - return l2 -} - - -``` diff --git a/website/content/ChapterFour/0024.Swap-Nodes-in-Pairs.md b/website/content/ChapterFour/0024.Swap-Nodes-in-Pairs.md deleted file mode 100644 index 017a0eb43..000000000 --- a/website/content/ChapterFour/0024.Swap-Nodes-in-Pairs.md +++ /dev/null @@ -1,71 +0,0 @@ -# [24. Swap Nodes in Pairs](https://leetcode.com/problems/swap-nodes-in-pairs/description/) - -## 题目 - -Given a linked list, swap every two adjacent nodes and return its head. - -You may not modify the values in the list's nodes, only nodes itself may be changed. - - - -**Example**: - -``` - -Given 1->2->3->4, you should return the list as 2->1->4->3. - -``` - -## 题目大意 - -两两相邻的元素,翻转链表 - -## 解题思路 - -按照题意做即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func swapPairs(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head - } - s := head.Next - var behind *ListNode - for head.Next != nil { - headNext := head.Next - if behind != nil && behind.Next != nil { - behind.Next = headNext - } - var next *ListNode - if head.Next.Next != nil { - next = head.Next.Next - } - if head.Next.Next != nil { - head.Next = next - } else { - head.Next = nil - } - headNext.Next = head - behind = head - if head.Next != nil { - head = next - } - } - return s -} - - -``` diff --git a/website/content/ChapterFour/0025.Reverse-Nodes-in-k-Group.md b/website/content/ChapterFour/0025.Reverse-Nodes-in-k-Group.md deleted file mode 100644 index 8d6ba27ae..000000000 --- a/website/content/ChapterFour/0025.Reverse-Nodes-in-k-Group.md +++ /dev/null @@ -1,74 +0,0 @@ -# [25. Reverse Nodes in k-Group](https://leetcode.com/problems/reverse-nodes-in-k-group/description/) - -## 题目 - -Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. - -k is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of k then left-out nodes in the end should remain as it is. - -**Example**: - -``` - -Given this linked list: 1->2->3->4->5 - -For k = 2, you should return: 2->1->4->3->5 - -For k = 3, you should return: 3->2->1->4->5 - -``` - -**Note**: - -- Only constant extra memory is allowed. -- You may not alter the values in the list's nodes, only nodes itself may be changed. - - -## 题目大意 - -按照每 K 个元素翻转的方式翻转链表。如果不满足 K 个元素的就不翻转。 - -## 解题思路 - - -这一题是 problem 24 的加强版,problem 24 是两两相邻的元素,翻转链表。而 problem 25 要求的是 k 个相邻的元素,翻转链表,problem 相当于是 k = 2 的特殊情况。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func reverseKGroup(head *ListNode, k int) *ListNode { - node := head - for i := 0; i < k; i++ { - if node == nil { - return head - } - node = node.Next - } - newHead := reverse(head, node) - head.Next = reverseKGroup(node, k) - return newHead -} - -func reverse(first *ListNode, last *ListNode) *ListNode { - prev := last - for first != last { - tmp := first.Next - first.Next = prev - prev = first - first = tmp - } - return prev -} - - -``` diff --git a/website/content/ChapterFour/0026.Remove-Duplicates-from-Sorted-Array.md b/website/content/ChapterFour/0026.Remove-Duplicates-from-Sorted-Array.md deleted file mode 100644 index b7f1b4793..000000000 --- a/website/content/ChapterFour/0026.Remove-Duplicates-from-Sorted-Array.md +++ /dev/null @@ -1,128 +0,0 @@ -# [26. Remove Duplicates from Sorted Array](https://leetcode.com/problems/remove-duplicates-from-sorted-array/) - -## 题目 - -Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length. - -Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory. - -**Example 1**: - -``` - -Given nums = [1,1,2], - -Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. - -It doesn't matter what you leave beyond the returned length. - -``` - -**Example 2**: - -``` - -Given nums = [0,0,1,1,1,2,2,3,3,4], - -Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively. - -It doesn't matter what values are set beyond the returned length. - -``` - -**Clarification**: - -Confused why the returned value is an integer but your answer is an array? - -Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well. - -Internally you can think of this: - -``` - -// nums is passed in by reference. (i.e., without making a copy) -int len = removeElement(nums, val); - -// any modification to nums in your function would be known by the caller. -// using the length returned by your function, it prints the first len elements. -for (int i = 0; i < len; i++) { - print(nums[i]); -} - -``` - -## 题目大意 - -给定一个有序数组 nums,对数组中的元素进行去重,使得原数组中的每个元素只有一个。最后返回去重以后数组的长度值。 - -## 解题思路 - -这道题和第 27 题很像。这道题和第 283 题,第 27 题基本一致,283 题是删除 0,27 题是删除指定元素,这一题是删除重复元素,实质是一样的。 - -这里数组的删除并不是真的删除,只是将删除的元素移动到数组后面的空间内,然后返回数组实际剩余的元素个数,OJ 最终判断题目的时候会读取数组剩余个数的元素进行输出。 - -## 代码 - -```go - -package leetcode - -// 解法一 -func removeDuplicates(nums []int) int { - if len(nums) == 0 { - return 0 - } - last, finder := 0, 0 - for last < len(nums)-1 { - for nums[finder] == nums[last] { - finder++ - if finder == len(nums) { - return last + 1 - } - } - nums[last+1] = nums[finder] - last++ - } - return last + 1 -} - -// 解法二 -func removeDuplicates1(nums []int) int { - if len(nums) == 0 { - return 0 - } - length := len(nums) - lastNum := nums[length-1] - i := 0 - for i = 0; i < length-1; i++ { - if nums[i] == lastNum { - break - } - if nums[i+1] == nums[i] { - removeElement1(nums, i+1, nums[i]) - // fmt.Printf("此时 num = %v length = %v\n", nums, length) - } - } - return i + 1 -} - -func removeElement1(nums []int, start, val int) int { - if len(nums) == 0 { - return 0 - } - j := start - for i := start; i < len(nums); i++ { - if nums[i] != val { - if i != j { - nums[i], nums[j] = nums[j], nums[i] - j++ - } else { - j++ - } - } - } - return j -} - - -``` diff --git a/website/content/ChapterFour/0027.Remove-Element.md b/website/content/ChapterFour/0027.Remove-Element.md deleted file mode 100644 index d3ddc59dd..000000000 --- a/website/content/ChapterFour/0027.Remove-Element.md +++ /dev/null @@ -1,93 +0,0 @@ -# [27. Remove Element](https://leetcode.com/problems/remove-element/) - -## 题目 - -Given an array nums and a value val, remove all instances of that value in-place and return the new length. - -Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory. - -The order of elements can be changed. It doesn't matter what you leave beyond the new length. - -**Example 1**: - -``` - -Given nums = [3,2,2,3], val = 3, - -Your function should return length = 2, with the first two elements of nums being 2. - -It doesn't matter what you leave beyond the returned length. - -``` - -**Example 2**: - -``` - -Given nums = [0,1,2,2,3,0,4,2], val = 2, - -Your function should return length = 5, with the first five elements of nums containing 0, 1, 3, 0, and 4. - -Note that the order of those five elements can be arbitrary. - -It doesn't matter what values are set beyond the returned length. - -``` - -**Clarification**: - -Confused why the returned value is an integer but your answer is an array? - -Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well. - -Internally you can think of this: - -``` - -// nums is passed in by reference. (i.e., without making a copy) -int len = removeElement(nums, val); - -// any modification to nums in your function would be known by the caller. -// using the length returned by your function, it prints the first len elements. -for (int i = 0; i < len; i++) { - print(nums[i]); -} - -``` - -## 题目大意 - -给定一个数组 nums 和一个数值 val,将数组中所有等于 val 的元素删除,并返回剩余的元素个数。 - -## 解题思路 - -这道题和第 283 题很像。这道题和第 283 题基本一致,283 题是删除 0,这一题是给定的一个 val,实质是一样的。 - -这里数组的删除并不是真的删除,只是将删除的元素移动到数组后面的空间内,然后返回数组实际剩余的元素个数,OJ 最终判断题目的时候会读取数组剩余个数的元素进行输出。 - -## 代码 - -```go - -package leetcode - -func removeElement(nums []int, val int) int { - if len(nums) == 0 { - return 0 - } - j := 0 - for i := 0; i < len(nums); i++ { - if nums[i] != val { - if i != j { - nums[i], nums[j] = nums[j], nums[i] - j++ - } else { - j++ - } - } - } - return j -} - - -``` diff --git a/website/content/ChapterFour/0028.Implement-strStr.md b/website/content/ChapterFour/0028.Implement-strStr.md deleted file mode 100644 index 4bcbaebbf..000000000 --- a/website/content/ChapterFour/0028.Implement-strStr.md +++ /dev/null @@ -1,86 +0,0 @@ -# [28. Implement strStr()](https://leetcode.com/problems/implement-strstr/) - -## 题目 - -Implement strStr(). - -Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. - - -**Example 1**: - -``` - -Input: haystack = "hello", needle = "ll" -Output: 2 - -``` - -**Example 2**: - -``` - -Input: haystack = "aaaaa", needle = "bba" -Output: -1 - -``` - -**Clarification**: - -What should we return when needle is an empty string? This is a great question to ask during an interview. - -For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf(). - -## 题目大意 - - -实现一个查找 substring 的函数。如果在母串中找到了子串,返回子串在母串中出现的下标,如果没有找到,返回 -1,如果子串是空串,则返回 0 。 - -## 解题思路 - -这一题比较简单,直接写即可。 - -## 代码 - -```go - -package leetcode - -import "strings" - -// 解法一 -func strStr(haystack string, needle string) int { - for i := 0; ; i++ { - for j := 0; ; j++ { - if j == len(needle) { - return i - } - if i+j == len(haystack) { - return -1 - } - if needle[j] != haystack[i+j] { - break - } - } - } -} - -// 解法二 -func strStr1(haystack string, needle string) int { - return strings.Index(haystack, needle) -} - - -``` - - - - - - - - - - - - diff --git a/website/content/ChapterFour/0029.Divide-Two-Integers.md b/website/content/ChapterFour/0029.Divide-Two-Integers.md deleted file mode 100755 index c3f4a834d..000000000 --- a/website/content/ChapterFour/0029.Divide-Two-Integers.md +++ /dev/null @@ -1,148 +0,0 @@ -# [29. Divide Two Integers](https://leetcode.com/problems/divide-two-integers/) - - -## 题目 - -Given two integers `dividend` and `divisor`, divide two integers without using multiplication, division and mod operator. - -Return the quotient after dividing `dividend` by `divisor`. - -The integer division should truncate toward zero. - -**Example 1**: - - Input: dividend = 10, divisor = 3 - Output: 3 - -**Example 2**: - - Input: dividend = 7, divisor = -3 - Output: -2 - -**Note**: - -- Both dividend and divisor will be 32-bit signed integers. -- The divisor will never be 0. -- Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 2^31 − 1 when the division result overflows. - - -## 题目大意 - -给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。 - -说明: - -- 被除数和除数均为 32 位有符号整数。 -- 除数不为 0。 -- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。 - - -## 解题思路 - -- 给出除数和被除数,要求计算除法运算以后的商。注意值的取值范围在 [−2^31, 2^31 − 1] 之中。超过范围的都按边界计算。 -- 这一题可以用二分搜索来做。要求除法运算之后的商,把商作为要搜索的目标。商的取值范围是 [0, dividend],所以从 0 到被除数之间搜索。利用二分,找到(商 + 1 ) * 除数 > 被除数并且 商 * 除数 ≤ 被除数 或者 (商+1)* 除数 ≥ 被除数并且商 * 除数 < 被除数的时候,就算找到了商,其余情况继续二分即可。最后还要注意符号和题目规定的 Int32 取值范围。 -- 二分的写法常写错的 3 点: - 1. low ≤ high (注意二分循环退出的条件是小于等于) - 2. mid = low + (high-low)>>1 (防止溢出) - 3. low = mid + 1 ; high = mid - 1 (注意更新 low 和 high 的值,如果更新不对就会死循环) - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -// 解法一 递归版的二分搜索 -func divide(dividend int, divisor int) int { - sign, res := -1, 0 - // low, high := 0, abs(dividend) - if dividend == 0 { - return 0 - } - if divisor == 1 { - return dividend - } - if dividend == math.MinInt32 && divisor == -1 { - return math.MaxInt32 - } - if dividend > 0 && divisor > 0 || dividend < 0 && divisor < 0 { - sign = 1 - } - if dividend > math.MaxInt32 { - dividend = math.MaxInt32 - } - // 如果把递归改成非递归,可以改成下面这段代码 - // for low <= high { - // quotient := low + (high-low)>>1 - // if ((quotient+1)*abs(divisor) > abs(dividend) && quotient*abs(divisor) <= abs(dividend)) || ((quotient+1)*abs(divisor) >= abs(dividend) && quotient*abs(divisor) < abs(dividend)) { - // if (quotient+1)*abs(divisor) == abs(dividend) { - // res = quotient + 1 - // break - // } - // res = quotient - // break - // } - // if (quotient+1)*abs(divisor) > abs(dividend) && quotient*abs(divisor) > abs(dividend) { - // high = quotient - 1 - // } - // if (quotient+1)*abs(divisor) < abs(dividend) && quotient*abs(divisor) < abs(dividend) { - // low = quotient + 1 - // } - // } - res = binarySearchQuotient(0, abs(dividend), abs(divisor), abs(dividend)) - if res > math.MaxInt32 { - return sign * math.MaxInt32 - } - if res < math.MinInt32 { - return sign * math.MinInt32 - } - return sign * res -} - -func binarySearchQuotient(low, high, val, dividend int) int { - quotient := low + (high-low)>>1 - if ((quotient+1)*val > dividend && quotient*val <= dividend) || ((quotient+1)*val >= dividend && quotient*val < dividend) { - if (quotient+1)*val == dividend { - return quotient + 1 - } - return quotient - } - if (quotient+1)*val > dividend && quotient*val > dividend { - return binarySearchQuotient(low, quotient-1, val, dividend) - } - if (quotient+1)*val < dividend && quotient*val < dividend { - return binarySearchQuotient(quotient+1, high, val, dividend) - } - return 0 -} - -// 解法二 非递归版的二分搜索 -func divide1(divided int, divisor int) int { - if divided == math.MinInt32 && divisor == -1 { - return math.MaxInt32 - } - result := 0 - sign := -1 - if divided > 0 && divisor > 0 || divided < 0 && divisor < 0 { - sign = 1 - } - dvd, dvs := abs(divided), abs(divisor) - for dvd >= dvs { - temp := dvs - m := 1 - for temp<<1 <= dvd { - temp <<= 1 - m <<= 1 - } - dvd -= temp - result += m - } - return sign * result -} - - -``` diff --git a/website/content/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md b/website/content/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md deleted file mode 100644 index d4eb4ef05..000000000 --- a/website/content/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md +++ /dev/null @@ -1,98 +0,0 @@ -# [30. Substring with Concatenation of All Words](https://leetcode.com/problems/substring-with-concatenation-of-all-words/) - -## 题目 - -You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters. - -**Example 1**: - -``` - -Input: - s = "barfoothefoobarman", - words = ["foo","bar"] -Output: [0,9] -Explanation: Substrings starting at index 0 and 9 are "barfoor" and "foobar" respectively. -The output order does not matter, returning [9,0] is fine too. - -``` - -**Example 2**: - -``` - -Input: - s = "wordgoodgoodgoodbestword", - words = ["word","good","best","word"] -Output: [] - -``` - -## 题目大意 - -给定一个源字符串 s,再给一个字符串数组,要求在源字符串中找到由字符串数组各种组合组成的连续串的起始下标,如果存在多个,在结果中都需要输出。 - -## 解题思路 - -这一题看似很难,但是有 2 个限定条件也导致这题不是特别难。1. 字符串数组里面的字符串长度都是一样的。2. 要求字符串数组中的字符串都要连续连在一起的,前后顺序可以是任意排列组合。 - -解题思路,先将字符串数组里面的所有字符串都存到 map 中,并累计出现的次数。然后从源字符串从头开始扫,每次判断字符串数组里面的字符串时候全部都用完了(计数是否为 0),如果全部都用完了,并且长度正好是字符串数组任意排列组合的总长度,就记录下这个组合的起始下标。如果不符合,就继续考察源字符串的下一个字符,直到扫完整个源字符串。 - -## 代码 - -```go - -package leetcode - -func findSubstring(s string, words []string) []int { - if len(words) == 0 { - return []int{} - } - res := []int{} - counter := map[string]int{} - for _, w := range words { - counter[w]++ - } - length, totalLen, tmpCounter := len(words[0]), len(words[0])*len(words), copyMap(counter) - for i, start := 0, 0; i < len(s)-length+1 && start < len(s)-length+1; i++ { - //fmt.Printf("sub = %v i = %v lenght = %v start = %v tmpCounter = %v totalLen = %v\n", s[i:i+length], i, length, start, tmpCounter, totalLen) - if tmpCounter[s[i:i+length]] > 0 { - tmpCounter[s[i:i+length]]-- - //fmt.Printf("******sub = %v i = %v lenght = %v start = %v tmpCounter = %v totalLen = %v\n", s[i:i+length], i, length, start, tmpCounter, totalLen) - if checkWords(tmpCounter) && (i+length-start == totalLen) { - res = append(res, start) - continue - } - i = i + length - 1 - } else { - start++ - i = start - 1 - tmpCounter = copyMap(counter) - } - } - return res -} - -func checkWords(s map[string]int) bool { - flag := true - for _, v := range s { - if v > 0 { - flag = false - break - } - } - return flag -} - -func copyMap(s map[string]int) map[string]int { - c := map[string]int{} - for k, v := range s { - c[k] = v - } - return c -} - - -``` - - diff --git a/website/content/ChapterFour/0033.Search-in-Rotated-Sorted-Array.md b/website/content/ChapterFour/0033.Search-in-Rotated-Sorted-Array.md deleted file mode 100755 index ac935c4d7..000000000 --- a/website/content/ChapterFour/0033.Search-in-Rotated-Sorted-Array.md +++ /dev/null @@ -1,78 +0,0 @@ -# [33. Search in Rotated Sorted Array](https://leetcode.com/problems/search-in-rotated-sorted-array/) - -## 题目 - -Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. - -(i.e., `[0,1,2,4,5,6,7]` might become `[4,5,6,7,0,1,2]`). - -You are given a target value to search. If found in the array return its index, otherwise return `-1`. - -You may assume no duplicate exists in the array. - -Your algorithm's runtime complexity must be in the order of *O*(log *n*). - -**Example 1**: - - Input: nums = [4,5,6,7,0,1,2], target = 0 - Output: 4 - -**Example 2**: - - Input: nums = [4,5,6,7,0,1,2], target = 3 - Output: -1 - - -## 题目大意 - -假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。 - -你的算法时间复杂度必须是 O(log n) 级别。 - - -## 解题思路 - -- 给出一个数组,数组中本来是从小到大排列的,并且数组中没有重复数字。但是现在把后面随机一段有序的放到数组前面,这样形成了前后两端有序的子序列。在这样的一个数组里面查找一个数,设计一个 O(log n) 的算法。如果找到就输出数组的小标,如果没有找到,就输出 -1 。 -- 由于数组基本有序,虽然中间有一个“断开点”,还是可以使用二分搜索的算法来实现。现在数组前面一段是数值比较大的数,后面一段是数值偏小的数。如果 mid 落在了前一段数值比较大的区间内了,那么一定有 `nums[mid] > nums[low]`,如果是落在后面一段数值比较小的区间内,`nums[mid] ≤ nums[low]` 。如果 mid 落在了后一段数值比较小的区间内了,那么一定有 `nums[mid] < nums[high]`,如果是落在前面一段数值比较大的区间内,`nums[mid] ≤ nums[high]` 。还有 `nums[low] == nums[mid]` 和 `nums[high] == nums[mid]` 的情况,单独处理即可。最后找到则输出 mid,没有找到则输出 -1 。 - -## 代码 - -```go - -package leetcode - -func search33(nums []int, target int) int { - if len(nums) == 0 { - return -1 - } - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if nums[mid] == target { - return mid - } else if nums[mid] > nums[low] { // 在数值大的一部分区间里 - if nums[low] <= target && target < nums[mid] { - high = mid - 1 - } else { - low = mid + 1 - } - } else if nums[mid] < nums[high] { // 在数值小的一部分区间里 - if nums[mid] < target && target <= nums[high] { - low = mid + 1 - } else { - high = mid - 1 - } - } else { - if nums[low] == nums[mid] { - low++ - } - if nums[high] == nums[mid] { - high-- - } - } - } - return -1 -} - - -``` diff --git a/website/content/ChapterFour/0034.Find-First-and-Last-Position-of-Element-in-Sorted-Array.md b/website/content/ChapterFour/0034.Find-First-and-Last-Position-of-Element-in-Sorted-Array.md deleted file mode 100755 index 6d9912860..000000000 --- a/website/content/ChapterFour/0034.Find-First-and-Last-Position-of-Element-in-Sorted-Array.md +++ /dev/null @@ -1,121 +0,0 @@ -# [34. Find First and Last Position of Element in Sorted Array](https://leetcode.com/problems/find-first-and-last-position-of-element-in-sorted-array/) - - -## 题目 - -Given an array of integers `nums` sorted in ascending order, find the starting and ending position of a given `target` value. - -Your algorithm's runtime complexity must be in the order of *O*(log *n*). - -If the target is not found in the array, return `[-1, -1]`. - -**Example 1**: - - Input: nums = [5,7,7,8,8,10], target = 8 - Output: [3,4] - -**Example 2**: - - Input: nums = [5,7,7,8,8,10], target = 6 - Output: [-1,-1] - -## 题目大意 - -给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。 - - -## 解题思路 - -- 给出一个有序数组 `nums` 和一个数 `target`,要求在数组中找到第一个和这个元素相等的元素下标,最后一个和这个元素相等的元素下标。 -- 这一题是经典的二分搜索变种题。二分搜索有 4 大基础变种题: - 1. 查找第一个值等于给定值的元素 - 2. 查找最后一个值等于给定值的元素 - 3. 查找第一个大于等于给定值的元素 - 4. 查找最后一个小于等于给定值的元素 - - 这一题的解题思路可以分别利用变种 1 和变种 2 的解法就可以做出此题。或者用一次变种 1 的方法,然后循环往后找到最后一个与给定值相等的元素。不过后者这种方法可能会使时间复杂度下降到 O(n),因为有可能数组中 n 个元素都和给定元素相同。(4 大基础变种的实现见代码) - -## 代码 - -```go - -package leetcode - -func searchRange(nums []int, target int) []int { - return []int{searchFirstEqualElement(nums, target), searchLastEqualElement(nums, target)} - -} - -// 二分查找第一个与 target 相等的元素,时间复杂度 O(logn) -func searchFirstEqualElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] > target { - high = mid - 1 - } else if nums[mid] < target { - low = mid + 1 - } else { - if (mid == 0) || (nums[mid-1] != target) { // 找到第一个与 target 相等的元素 - return mid - } - high = mid - 1 - } - } - return -1 -} - -// 二分查找最后一个与 target 相等的元素,时间复杂度 O(logn) -func searchLastEqualElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] > target { - high = mid - 1 - } else if nums[mid] < target { - low = mid + 1 - } else { - if (mid == len(nums)-1) || (nums[mid+1] != target) { // 找到最后一个与 target 相等的元素 - return mid - } - low = mid + 1 - } - } - return -1 -} - -// 二分查找第一个大于等于 target 的元素,时间复杂度 O(logn) -func searchFirstGreaterElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] >= target { - if (mid == 0) || (nums[mid-1] < target) { // 找到第一个大于等于 target 的元素 - return mid - } - high = mid - 1 - } else { - low = mid + 1 - } - } - return -1 -} - -// 二分查找最后一个小于等于 target 的元素,时间复杂度 O(logn) -func searchLastLessElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] <= target { - if (mid == len(nums)-1) || (nums[mid+1] > target) { // 找到最后一个小于等于 target 的元素 - return mid - } - low = mid + 1 - } else { - high = mid - 1 - } - } - return -1 -} - -``` diff --git a/website/content/ChapterFour/0035.Search-Insert-Position.md b/website/content/ChapterFour/0035.Search-Insert-Position.md deleted file mode 100755 index 18339f1e9..000000000 --- a/website/content/ChapterFour/0035.Search-Insert-Position.md +++ /dev/null @@ -1,65 +0,0 @@ -# [35. Search Insert Position](https://leetcode.com/problems/search-insert-position/) - - -## 题目 - -Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order. - -You may assume no duplicates in the array. - -**Example 1**: - - Input: [1,3,5,6], 5 - Output: 2 - -**Example 2**: - - Input: [1,3,5,6], 2 - Output: 1 - -**Example 3**: - - Input: [1,3,5,6], 7 - Output: 4 - -**Example 4**: - - Input: [1,3,5,6], 0 - Output: 0 - - -## 题目大意 - -给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 - -你可以假设数组中无重复元素。 - -## 解题思路 - -- 给出一个已经从小到大排序后的数组,要求在数组中找到插入 target 元素的位置。 -- 这一题是经典的二分搜索的变种题,在有序数组中找到最后一个比 target 小的元素。 - -## 代码 - -```go - -package leetcode - -func searchInsert(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if nums[mid] >= target { - high = mid - 1 - } else { - if (mid == len(nums)-1) || (nums[mid+1] >= target) { - return mid + 1 - } - low = mid + 1 - } - } - return 0 -} - - -``` diff --git a/website/content/ChapterFour/0036.Valid-Sudoku.md b/website/content/ChapterFour/0036.Valid-Sudoku.md deleted file mode 100755 index 72e8ba470..000000000 --- a/website/content/ChapterFour/0036.Valid-Sudoku.md +++ /dev/null @@ -1,168 +0,0 @@ -# [36. Valid Sudoku](https://leetcode.com/problems/valid-sudoku/) - - -## 题目 - -Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated **according to the following rules**: - -1. Each row must contain the digits `1-9` without repetition. -2. Each column must contain the digits `1-9` without repetition. -3. Each of the 9 `3x3` sub-boxes of the grid must contain the digits `1-9` without repetition. - -![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png) - -A partially filled sudoku which is valid. - -The Sudoku board could be partially filled, where empty cells are filled with the character `'.'`. - -**Example 1**: - - - Input: - [ - ["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"] - ] - Output: true - - -**Example 2**: - - - Input: - [ - ["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"] - ] - Output: false - Explanation: Same as Example 1, except with the 5 in the top left corner being - modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid. - - -**Note**: - -- A Sudoku board (partially filled) could be valid but is not necessarily solvable. -- Only the filled cells need to be validated according to the mentioned rules. -- The given board contain only digits `1-9` and the character `'.'`. -- The given board size is always `9x9`. - -## 题目大意 - -判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 - -1. 数字 1-9 在每一行只能出现一次。 -2. 数字 1-9 在每一列只能出现一次。 -3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 - - -## 解题思路 - -- 给出一个数独的棋盘,要求判断这个棋盘当前是否满足数独的要求:即行列是否都只包含 1-9,每个九宫格里面是否也只包含 1-9 。 -- 注意这题和第 37 题是不同的,这一题是判断当前棋盘状态是否满足数独的要求,而第 37 题是要求求解数独。本题中的棋盘有些是无解的,但是棋盘状态是满足题意的。 - -## 代码 - -```go - -package leetcode - -import "strconv" - -// 解法一 暴力遍历,时间复杂度 O(n^3) -func isValidSudoku(board [][]byte) bool { - // 判断行 row - for i := 0; i < 9; i++ { - tmp := [10]int{} - for j := 0; j < 9; j++ { - cellVal := board[i][j : j+1] - if string(cellVal) != "." { - index, _ := strconv.Atoi(string(cellVal)) - if index > 9 || index < 1 { - return false - } - if tmp[index] == 1 { - return false - } - tmp[index] = 1 - } - } - } - // 判断列 column - for i := 0; i < 9; i++ { - tmp := [10]int{} - for j := 0; j < 9; j++ { - cellVal := board[j][i] - if string(cellVal) != "." { - index, _ := strconv.Atoi(string(cellVal)) - if index > 9 || index < 1 { - return false - } - if tmp[index] == 1 { - return false - } - tmp[index] = 1 - } - } - } - // 判断 9宫格 3X3 cell - for i := 0; i < 3; i++ { - for j := 0; j < 3; j++ { - tmp := [10]int{} - for ii := i * 3; ii < i*3+3; ii++ { - for jj := j * 3; jj < j*3+3; jj++ { - cellVal := board[ii][jj] - if string(cellVal) != "." { - index, _ := strconv.Atoi(string(cellVal)) - if tmp[index] == 1 { - return false - } - tmp[index] = 1 - } - } - } - } - } - return true -} - -// 解法二 添加缓存,时间复杂度 O(n^2) -func isValidSudoku1(board [][]byte) bool { - rowbuf, colbuf, boxbuf := make([][]bool, 9), make([][]bool, 9), make([][]bool, 9) - for i := 0; i < 9; i++ { - rowbuf[i] = make([]bool, 9) - colbuf[i] = make([]bool, 9) - boxbuf[i] = make([]bool, 9) - } - // 遍历一次,添加缓存 - for r := 0; r < 9; r++ { - for c := 0; c < 9; c++ { - if board[r][c] != '.' { - num := board[r][c] - '0' - byte(1) - if rowbuf[r][num] || colbuf[c][num] || boxbuf[r/3*3+c/3][num] { - return false - } - rowbuf[r][num] = true - colbuf[c][num] = true - boxbuf[r/3*3+c/3][num] = true // r,c 转换到box方格中 - } - } - } - return true -} - - -``` diff --git a/website/content/ChapterFour/0037.Sudoku-Solver.md b/website/content/ChapterFour/0037.Sudoku-Solver.md deleted file mode 100755 index 724076d32..000000000 --- a/website/content/ChapterFour/0037.Sudoku-Solver.md +++ /dev/null @@ -1,118 +0,0 @@ -# [37. Sudoku Solver](https://leetcode.com/problems/sudoku-solver/) - - - -## 题目 - -Write a program to solve a Sudoku puzzle by filling the empty cells. - -A sudoku solution must satisfy **all of the following rules**: - -1. Each of the digits `1-9` must occur exactly once in each row. -2. Each of the digits `1-9` must occur exactly once in each column. -3. Each of the the digits `1-9` must occur exactly once in each of the 9 `3x3` sub-boxes of the grid. - -Empty cells are indicated by the character `'.'`. - -![](https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Sudoku-by-L2G-20050714.svg/250px-Sudoku-by-L2G-20050714.svg.png) - -A sudoku puzzle... - -![](https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Sudoku-by-L2G-20050714_solution.svg/250px-Sudoku-by-L2G-20050714_solution.svg.png) - -...and its solution numbers marked in red. - -**Note**: - -- The given board contain only digits `1-9` and the character `'.'`. -- You may assume that the given Sudoku puzzle will have a single unique solution. -- The given board size is always `9x9`. - -## 题目大意 - - -编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则: - -1. 数字 1-9 在每一行只能出现一次。 -2. 数字 1-9 在每一列只能出现一次。 -3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 - -空白格用 '.' 表示。 - - -## 解题思路 - -- 给出一个数独谜题,要求解出这个数独 -- 解题思路 DFS 暴力回溯枚举。数独要求每横行,每竖行,每九宫格内,`1-9` 的数字不能重复,每次放下一个数字的时候,在这 3 个地方都需要判断一次。 -- 另外找到一组解以后就不需要再继续回溯了,直接返回即可。 - -## 代码 - -```go - -package leetcode - -type position struct { - x int - y int -} - -func solveSudoku(board [][]byte) { - pos, find := []position{}, false - for i := 0; i < len(board); i++ { - for j := 0; j < len(board[0]); j++ { - if board[i][j] == '.' { - pos = append(pos, position{x: i, y: j}) - } - } - } - putSudoku(&board, pos, 0, &find) -} - -func putSudoku(board *[][]byte, pos []position, index int, succ *bool) { - if *succ == true { - return - } - if index == len(pos) { - *succ = true - return - } - for i := 1; i < 10; i++ { - if checkSudoku(board, pos[index], i) && !*succ { - (*board)[pos[index].x][pos[index].y] = byte(i) + '0' - putSudoku(board, pos, index+1, succ) - if *succ == true { - return - } - (*board)[pos[index].x][pos[index].y] = '.' - } - } -} - -func checkSudoku(board *[][]byte, pos position, val int) bool { - // 判断横行是否有重复数字 - for i := 0; i < len((*board)[0]); i++ { - if (*board)[pos.x][i] != '.' && int((*board)[pos.x][i]-'0') == val { - return false - } - } - // 判断竖行是否有重复数字 - for i := 0; i < len((*board)); i++ { - if (*board)[i][pos.y] != '.' && int((*board)[i][pos.y]-'0') == val { - return false - } - } - // 判断九宫格是否有重复数字 - posx, posy := pos.x-pos.x%3, pos.y-pos.y%3 - for i := posx; i < posx+3; i++ { - for j := posy; j < posy+3; j++ { - if (*board)[i][j] != '.' && int((*board)[i][j]-'0') == val { - return false - } - } - } - return true -} - - -``` diff --git a/website/content/ChapterFour/0039.Combination-Sum.md b/website/content/ChapterFour/0039.Combination-Sum.md deleted file mode 100755 index 6167df458..000000000 --- a/website/content/ChapterFour/0039.Combination-Sum.md +++ /dev/null @@ -1,87 +0,0 @@ -# [39. Combination Sum](https://leetcode.com/problems/combination-sum/) - - -## 题目 - -Given a **set** of candidate numbers (`candidates`) **(without duplicates)** and a target number (`target`), find all unique combinations in `candidates` where the candidate numbers sums to `target`. - -The **same** repeated number may be chosen from `candidates` unlimited number of times. - -**Note**: - -- All numbers (including `target`) will be positive integers. -- The solution set must not contain duplicate combinations. - -**Example 1**: - - - Input: candidates = [2,3,6,7], target = 7, - A solution set is: - [ - [7], - [2,2,3] - ] - - -**Example 2**: - - - Input: candidates = [2,3,5], target = 8, - A solution set is: - [ - [2,2,2,2], - [2,3,3], - [3,5] - ] - - -## 题目大意 - -给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 - -candidates 中的数字可以无限制重复被选取。 - - -## 解题思路 - -- 题目要求出总和为 sum 的所有组合,组合需要去重。 -- 这一题和第 47 题类似,只不过元素可以反复使用。 - -## 代码 - -```go - -package leetcode - -import "sort" - -func combinationSum(candidates []int, target int) [][]int { - if len(candidates) == 0 { - return [][]int{} - } - c, res := []int{}, [][]int{} - sort.Ints(candidates) - findcombinationSum(candidates, target, 0, c, &res) - return res -} - -func findcombinationSum(nums []int, target, index int, c []int, res *[][]int) { - if target <= 0 { - if target == 0 { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - } - return - } - for i := index; i < len(nums); i++ { - if nums[i] > target { // 这里可以剪枝优化 - break - } - c = append(c, nums[i]) - findcombinationSum(nums, target-nums[i], i, c, res) // 注意这里迭代的时候 index 依旧不变,因为一个元素可以取多次 - c = c[:len(c)-1] - } -} - -``` diff --git a/website/content/ChapterFour/0040.Combination-Sum-II.md b/website/content/ChapterFour/0040.Combination-Sum-II.md deleted file mode 100755 index 9d0188a33..000000000 --- a/website/content/ChapterFour/0040.Combination-Sum-II.md +++ /dev/null @@ -1,89 +0,0 @@ -# [40. Combination Sum II](https://leetcode.com/problems/combination-sum-ii/) - - -## 题目 - -Given a collection of candidate numbers (`candidates`) and a target number (`target`), find all unique combinations in `candidates` where the candidate numbers sums to `target`. - -Each number in `candidates` may only be used **once** in the combination. - -**Note**: - -- All numbers (including `target`) will be positive integers. -- The solution set must not contain duplicate combinations. - -**Example 1**: - - - Input: candidates = [10,1,2,7,6,1,5], target = 8, - A solution set is: - [ - [1, 7], - [1, 2, 5], - [2, 6], - [1, 1, 6] - ] - - -**Example 2**: - - - Input: candidates = [2,5,2,1,2], target = 5, - A solution set is: - [ - [1,2,2], - [5] - ] - -## 题目大意 - -给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 - -candidates 中的每个数字在每个组合中只能使用一次。 - - -## 解题思路 - -- 题目要求出总和为 sum 的所有组合,组合需要去重。这一题是第 39 题的加强版,第 39 题中元素可以重复利用(重复元素可无限次使用),这一题中元素只能有限次数的利用,因为存在重复元素,并且每个元素只能用一次(重复元素只能使用有限次) -- 这一题和第 47 题类似,只不过元素可以反复使用。 - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func combinationSum2(candidates []int, target int) [][]int { - if len(candidates) == 0 { - return [][]int{} - } - c, res := []int{}, [][]int{} - sort.Ints(candidates) // 这里是去重的关键逻辑 - findcombinationSum2(candidates, target, 0, c, &res) - return res -} - -func findcombinationSum2(nums []int, target, index int, c []int, res *[][]int) { - if target == 0 { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - return - } - for i := index; i < len(nums); i++ { - if i > index && nums[i] == nums[i-1] { // 这里是去重的关键逻辑,本次不取重复数字,下次循环可能会取重复数字 - continue - } - if target >= nums[i] { - c = append(c, nums[i]) - findcombinationSum2(nums, target-nums[i], i+1, c, res) - c = c[:len(c)-1] - } - } -} - -``` diff --git a/website/content/ChapterFour/0041.First-Missing-Positive.md b/website/content/ChapterFour/0041.First-Missing-Positive.md deleted file mode 100644 index 88564723e..000000000 --- a/website/content/ChapterFour/0041.First-Missing-Positive.md +++ /dev/null @@ -1,66 +0,0 @@ -# [41. First Missing Positive](https://leetcode.com/problems/first-missing-positive/description/) - -## 题目 - -Given an unsorted integer array, find the smallest missing positive integer. - -**Example 1**: - -``` - -Input: [1,2,0] -Output: 3 - -``` - -**Example 2**: - -``` - -Input: [3,4,-1,1] -Output: 2 - -``` - -**Example 3**: - -``` - -Input: [7,8,9,11,12] -Output: 1 - -``` - -**Note**: - -Your algorithm should run in O(n) time and uses constant extra space. - -## 题目大意 - -找到缺失的第一个正整数。 - -## 解题思路 - - -为了减少时间复杂度,可以把 input 数组都装到 map 中,然后 i 循环从 1 开始,依次比对 map 中是否存在 i,只要不存在 i 就立即返回结果,即所求。 - -## 代码 - -```go - -package leetcode - -func firstMissingPositive(nums []int) int { - numMap := make(map[int]int, len(nums)) - for _, v := range nums { - numMap[v] = v - } - for index := 1; index < len(nums)+1; index++ { - if _, ok := numMap[index]; !ok { - return index - } - } - return len(nums) + 1 -} - -``` diff --git a/website/content/ChapterFour/0042.Trapping-Rain-Water.md b/website/content/ChapterFour/0042.Trapping-Rain-Water.md deleted file mode 100644 index 1b0dd4b76..000000000 --- a/website/content/ChapterFour/0042.Trapping-Rain-Water.md +++ /dev/null @@ -1,61 +0,0 @@ -# [42. Trapping Rain Water](https://leetcode.com/problems/trapping-rain-water/) - -## 题目 - -Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. - -![](https://assets.leetcode.com/uploads/2018/10/22/rainwatertrap.png) - - -The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image! - - -**Example**: - -``` - -Input: [0,1,0,2,1,0,1,3,2,1,2,1] -Output: 6 - -``` - -## 题目大意 - -从 x 轴开始,给出一个数组,数组里面的数字代表从 (0,0) 点开始,宽度为 1 个单位,高度为数组元素的值。如果下雨了,问这样一个容器能装多少单位的水? - -## 解题思路 - - -![](https://image.ibb.co/d6A2ZU/IMG-0139.jpg) - -每个数组里面的元素值可以想象成一个左右都有壁的圆柱筒。例如上图中左边的第二个元素 1,当前左边最大的元素是 2 ,所以 2 高度的水会装到 1 的上面(因为想象成了左右都有筒壁)。这道题的思路就是左指针从 0 开始往右扫,右指针从最右边开始往左扫。额外还需要 2 个变量分别记住左边最大的高度和右边最大高度。遍历扫数组元素的过程中,如果左指针的高度比右指针的高度小,就不断的移动左指针,否则移动右指针。循环的终止条件就是左右指针碰上以后就结束。只要数组中元素的高度比保存的局部最大高度小,就累加 res 的值,否则更新局部最大高度。最终解就是 res 的值。 - -## 代码 - -```go - -package leetcode - -func trap(height []int) int { - res, left, right, maxLeft, maxRight := 0, 0, len(height)-1, 0, 0 - for left <= right { - if height[left] <= height[right] { - if height[left] > maxLeft { - maxLeft = height[left] - } else { - res += maxLeft - height[left] - } - left++ - } else { - if height[right] >= maxRight { - maxRight = height[right] - } else { - res += maxRight - height[right] - } - right-- - } - } - return res -} - -``` diff --git a/website/content/ChapterFour/0046.Permutations.md b/website/content/ChapterFour/0046.Permutations.md deleted file mode 100755 index 6ddd55f4d..000000000 --- a/website/content/ChapterFour/0046.Permutations.md +++ /dev/null @@ -1,66 +0,0 @@ -# [46. Permutations](https://leetcode.com/problems/permutations/) - - -## 题目 - -Given a collection of **distinct** integers, return all possible permutations. - -**Example**: - - - Input: [1,2,3] - Output: - [ - [1,2,3], - [1,3,2], - [2,1,3], - [2,3,1], - [3,1,2], - [3,2,1] - ] - - -## 题目大意 - -给定一个没有重复数字的序列,返回其所有可能的全排列。 - - -## 解题思路 - -- 求出一个数组的排列组合中的所有排列,用 DFS 深搜即可。 - -## 代码 - -```go - -package leetcode - -func permute(nums []int) [][]int { - if len(nums) == 0 { - return [][]int{} - } - used, p, res := make([]bool, len(nums)), []int{}, [][]int{} - generatePermutation(nums, 0, p, &res, &used) - return res -} - -func generatePermutation(nums []int, index int, p []int, res *[][]int, used *[]bool) { - if index == len(nums) { - temp := make([]int, len(p)) - copy(temp, p) - *res = append(*res, temp) - return - } - for i := 0; i < len(nums); i++ { - if !(*used)[i] { - (*used)[i] = true - p = append(p, nums[i]) - generatePermutation(nums, index+1, p, res, used) - p = p[:len(p)-1] - (*used)[i] = false - } - } - return -} - -``` diff --git a/website/content/ChapterFour/0047.Permutations-II.md b/website/content/ChapterFour/0047.Permutations-II.md deleted file mode 100755 index ff63b6876..000000000 --- a/website/content/ChapterFour/0047.Permutations-II.md +++ /dev/null @@ -1,70 +0,0 @@ -# [47. Permutations II](https://leetcode.com/problems/permutations-ii/) - - -## 题目 - -Given a collection of numbers that might contain duplicates, return all possible unique permutations. - -**Example**: - - - Input: [1,1,2] - Output: - [ - [1,1,2], - [1,2,1], - [2,1,1] - ] - - -## 题目大意 - -给定一个可包含重复数字的序列,返回所有不重复的全排列。 - -## 解题思路 - -- 这一题是第 46 题的加强版,第 46 题中求数组的排列,数组中元素不重复,但是这一题中,数组元素会重复,所以需要最终排列出来的结果需要去重。 -- 去重的方法是经典逻辑,将数组排序以后,判断重复元素再做逻辑判断。 -- 其他思路和第 46 题完全一致,DFS 深搜即可。 - -## 代码 - -```go - -package leetcode - -import "sort" - -func permuteUnique(nums []int) [][]int { - if len(nums) == 0 { - return [][]int{} - } - used, p, res := make([]bool, len(nums)), []int{}, [][]int{} - sort.Ints(nums) // 这里是去重的关键逻辑 - generatePermutation47(nums, 0, p, &res, &used) - return res -} - -func generatePermutation47(nums []int, index int, p []int, res *[][]int, used *[]bool) { - if index == len(nums) { - temp := make([]int, len(p)) - copy(temp, p) - *res = append(*res, temp) - return - } - for i := 0; i < len(nums); i++ { - if !(*used)[i] { - if i > 0 && nums[i] == nums[i-1] && !(*used)[i-1] { // 这里是去重的关键逻辑 - continue - } - (*used)[i] = true - p = append(p, nums[i]) - generatePermutation47(nums, index+1, p, res, used) - p = p[:len(p)-1] - (*used)[i] = false - } - } - return -} - -``` diff --git a/website/content/ChapterFour/0048.Rotate-Image.md b/website/content/ChapterFour/0048.Rotate-Image.md deleted file mode 100755 index 48d11b65b..000000000 --- a/website/content/ChapterFour/0048.Rotate-Image.md +++ /dev/null @@ -1,127 +0,0 @@ -# [48. Rotate Image](https://leetcode.com/problems/rotate-image/) - -## 题目 - -You are given an *n* x *n* 2D matrix representing an image. - -Rotate the image by 90 degrees (clockwise). - -**Note**: - -You have to rotate the image **[in-place](https://en.wikipedia.org/wiki/In-place_algorithm)**, which means you have to modify the input 2D matrix directly. **DO NOT** allocate another 2D matrix and do the rotation. - -**Example 1**: - - - Given input matrix = - [ - [1,2,3], - [4,5,6], - [7,8,9] - ], - - rotate the input matrix in-place such that it becomes: - [ - [7,4,1], - [8,5,2], - [9,6,3] - ] - - -**Example 2**: - - - Given input matrix = - [ - [ 5, 1, 9,11], - [ 2, 4, 8,10], - [13, 3, 6, 7], - [15,14,12,16] - ], - - rotate the input matrix in-place such that it becomes: - [ - [15,13, 2, 5], - [14, 3, 4, 1], - [12, 6, 8, 9], - [16, 7,10,11] - ] - - -## 题目大意 - -给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 - - -## 解题思路 - -- 给出一个二维数组,要求顺时针旋转 90 度。 -- 这一题比较简单,按照题意做就可以。这里给出 2 种旋转方法的实现,顺时针旋转和逆时针旋转。 - -```c - - /* - * clockwise rotate 顺时针旋转 - * first reverse up to down, then swap the symmetry - * 1 2 3 7 8 9 7 4 1 - * 4 5 6 => 4 5 6 => 8 5 2 - * 7 8 9 1 2 3 9 6 3 - */ - void rotate(vector > &matrix) { - reverse(matrix.begin(), matrix.end()); - for (int i = 0; i < matrix.size(); ++i) { - for (int j = i + 1; j < matrix[i].size(); ++j) - swap(matrix[i][j], matrix[j][i]); - } - } - - /* - * anticlockwise rotate 逆时针旋转 - * first reverse left to right, then swap the symmetry - * 1 2 3 3 2 1 3 6 9 - * 4 5 6 => 6 5 4 => 2 5 8 - * 7 8 9 9 8 7 1 4 7 - */ - void anti_rotate(vector > &matrix) { - for (auto vi : matrix) reverse(vi.begin(), vi.end()); - for (int i = 0; i < matrix.size(); ++i) { - for (int j = i + 1; j < matrix[i].size(); ++j) - swap(matrix[i][j], matrix[j][i]); - } - } - -``` - -## 代码 - -```go - -package leetcode - -func rotate(matrix [][]int) { - row := len(matrix) - if row <= 0 { - return - } - column := len(matrix[0]) - // rotate by diagonal 对角线变换 - for i := 0; i < row; i++ { - for j := i + 1; j < column; j++ { - tmp := matrix[i][j] - matrix[i][j] = matrix[j][i] - matrix[j][i] = tmp - } - } - // rotate by vertical centerline 竖直轴对称翻转 - halfColumn := column / 2 - for i := 0; i < row; i++ { - for j := 0; j < halfColumn; j++ { - tmp := matrix[i][j] - matrix[i][j] = matrix[i][column-j-1] - matrix[i][column-j-1] = tmp - } - } -} - - -``` diff --git a/website/content/ChapterFour/0049.Group-Anagrams.md b/website/content/ChapterFour/0049.Group-Anagrams.md deleted file mode 100644 index 8eca6bea8..000000000 --- a/website/content/ChapterFour/0049.Group-Anagrams.md +++ /dev/null @@ -1,72 +0,0 @@ -# [49. Group Anagrams](https://leetcode.com/problems/group-anagrams/) - -## 题目 - -Given an array of strings, group anagrams together. - - -**Example**: - -``` - -Input: ["eat", "tea", "tan", "ate", "nat", "bat"], -Output: -[ - ["ate","eat","tea"], - ["nat","tan"], - ["bat"] -] - -``` - -**Note**: - -- All inputs will be in lowercase. -- The order of your output does not matter. - -## 题目大意 - -给出一个字符串数组,要求对字符串数组里面有 Anagrams 关系的字符串进行分组。Anagrams 关系是指两个字符串的字符完全相同,顺序不同,两者是由排列组合组成。 - -## 解题思路 - -这道题可以将每个字符串都排序,排序完成以后,相同 Anagrams 的字符串必然排序结果一样。把排序以后的字符串当做 key 存入到 map 中。遍历数组以后,就能得到一个 map,key 是排序以后的字符串,value 对应的是这个排序字符串以后的 Anagrams 字符串集合。最后再将这些 value 对应的字符串数组输出即可。 - -## 代码 - -```go - -package leetcode - -import "sort" - -type sortRunes []rune - -func (s sortRunes) Less(i, j int) bool { - return s[i] < s[j] -} - -func (s sortRunes) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func (s sortRunes) Len() int { - return len(s) -} - -func groupAnagrams(strs []string) [][]string { - record, res := map[string][]string{}, [][]string{} - for _, str := range strs { - sByte := []rune(str) - sort.Sort(sortRunes(sByte)) - sstrs := record[string(sByte)] - sstrs = append(sstrs, str) - record[string(sByte)] = sstrs - } - for _, v := range record { - res = append(res, v) - } - return res -} - -``` diff --git a/website/content/ChapterFour/0050.Powx-n.md b/website/content/ChapterFour/0050.Powx-n.md deleted file mode 100755 index 86ec74519..000000000 --- a/website/content/ChapterFour/0050.Powx-n.md +++ /dev/null @@ -1,69 +0,0 @@ -# [50. Pow(x, n)](https://leetcode.com/problems/powx-n/) - - -## 题目 - -Implement [pow(*x*, *n*)](http://www.cplusplus.com/reference/valarray/pow/), which calculates *x* raised to the power *n* (xn). - -**Example 1**: - - - Input: 2.00000, 10 - Output: 1024.00000 - - -**Example 2**: - - - Input: 2.10000, 3 - Output: 9.26100 - - -**Example 3**: - - - Input: 2.00000, -2 - Output: 0.25000 - Explanation: 2-2 = 1/22 = 1/4 = 0.25 - - -**Note**: - -- -100.0 < *x* < 100.0 -- *n* is a 32-bit signed integer, within the range [−2^31, 2^31− 1] - -## 题目大意 - -实现 pow(x, n) ,即计算 x 的 n 次幂函数。 - -## 解题思路 - -- 要求计算 Pow(x, n) -- 这一题用递归的方式,不断的将 n 2 分下去。注意 n 的正负数,n 的奇偶性。 - -## 代码 - -```go - -package leetcode - -// 时间复杂度 O(log n),空间复杂度 O(1) -func myPow(x float64, n int) float64 { - if n == 0 { - return 1 - } - if n == 1 { - return x - } - if n < 0 { - n = -n - x = 1 / x - } - tmp := myPow(x, n/2) - if n%2 == 0 { - return tmp * tmp - } - return tmp * tmp * x -} - -``` diff --git a/website/content/ChapterFour/0051.N-Queens.md b/website/content/ChapterFour/0051.N-Queens.md deleted file mode 100755 index 9c9b2ebae..000000000 --- a/website/content/ChapterFour/0051.N-Queens.md +++ /dev/null @@ -1,134 +0,0 @@ -# [51. N-Queens](https://leetcode.com/problems/n-queens/) - - -## 题目 - -The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. - -![](https://assets.leetcode.com/uploads/2018/10/12/8-queens.png) - -Given an integer *n*, return all distinct solutions to the *n*-queens puzzle. - -Each solution contains a distinct board configuration of the *n*-queens' placement, where `'Q'` and `'.'` both indicate a queen and an empty space respectively. - -**Example**: - - - Input: 4 - Output: [ - [".Q..", // Solution 1 - "...Q", - "Q...", - "..Q."], - - ["..Q.", // Solution 2 - "Q...", - "...Q", - ".Q.."] - ] - Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above. - - -## 题目大意 - -给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 - - -## 解题思路 - -- 求解 n 皇后问题 -- 利用 col 数组记录列信息,col 有 `n` 列。用 dia1,dia2 记录从左下到右上的对角线,从左上到右下的对角线的信息,dia1 和 dia2 分别都有 `2*n-1` 个。 -- dia1 对角线的规律是 `i + j 是定值`,例如[0,0],为 0;[1,0]、[0,1] 为 1;[2,0]、[1,1]、[0,2] 为 2; -- dia2 对角线的规律是 `i - j 是定值`,例如[0,7],为 -7;[0,6]、[1,7] 为 -6;[0,5]、[1,6]、[2,7] 为 -5;为了使他们从 0 开始,i - j + n - 1 偏移到 0 开始,所以 dia2 的规律是 `i - j + n - 1 为定值`。 - -## 代码 - -```go - -package leetcode - -// 解法一 DFS -func solveNQueens(n int) [][]string { - col, dia1, dia2, row, res := make([]bool, n), make([]bool, 2*n-1), make([]bool, 2*n-1), []int{}, [][]string{} - putQueen(n, 0, &col, &dia1, &dia2, &row, &res) - return res -} - -// 尝试在一个n皇后问题中, 摆放第index行的皇后位置 -func putQueen(n, index int, col, dia1, dia2 *[]bool, row *[]int, res *[][]string) { - if index == n { - *res = append(*res, generateBoard(n, row)) - return - } - for i := 0; i < n; i++ { - // 尝试将第index行的皇后摆放在第i列 - if !(*col)[i] && !(*dia1)[index+i] && !(*dia2)[index-i+n-1] { - *row = append(*row, i) - (*col)[i] = true - (*dia1)[index+i] = true - (*dia2)[index-i+n-1] = true - putQueen(n, index+1, col, dia1, dia2, row, res) - (*col)[i] = false - (*dia1)[index+i] = false - (*dia2)[index-i+n-1] = false - *row = (*row)[:len(*row)-1] - } - } - return -} - -func generateBoard(n int, row *[]int) []string { - board := []string{} - res := "" - for i := 0; i < n; i++ { - res += "." - } - for i := 0; i < n; i++ { - board = append(board, res) - } - for i := 0; i < n; i++ { - tmp := []byte(board[i]) - tmp[(*row)[i]] = 'Q' - board[i] = string(tmp) - } - return board -} - -// 解法二 二进制操作法 -// class Solution -// { -// int n; -// string getNq(int p) -// { -// string s(n, '.'); -// s[p] = 'Q'; -// return s; -// } -// void nQueens(int p, int l, int m, int r, vector> &res) -// { -// static vector ans; -// if (p >= n) -// { -// res.push_back(ans); -// return ; -// } -// int mask = l | m | r; -// for (int i = 0, b = 1; i < n; ++ i, b <<= 1) -// if (!(mask & b)) -// { -// ans.push_back(getNq(i)); -// nQueens(p + 1, (l | b) >> 1, m | b, (r | b) << 1, res); -// ans.pop_back(); -// } -// } -// public: -// vector > solveNQueens(int n) -// { -// this->n = n; -// vector> res; -// nQueens(0, 0, 0, 0, res); -// return res; -// } -// }; - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0052.N-Queens-II.md b/website/content/ChapterFour/0052.N-Queens-II.md deleted file mode 100755 index 36b5911b3..000000000 --- a/website/content/ChapterFour/0052.N-Queens-II.md +++ /dev/null @@ -1,107 +0,0 @@ -# [52. N-Queens II](https://leetcode.com/problems/n-queens-ii/) - - -## 题目 - -The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other. - -![](https://assets.leetcode.com/uploads/2018/10/12/8-queens.png) - -Given an integer n, return the number of distinct solutions to the n-queens puzzle. - -**Example**: - - - Input: 4 - Output: 2 - Explanation: There are two distinct solutions to the 4-queens puzzle as shown below. - [ - [".Q..", // Solution 1 - "...Q", - "Q...", - "..Q."], - - ["..Q.", // Solution 2 - "Q...", - "...Q", - ".Q.."] - ] - - -## 题目大意 - -给定一个整数 n,返回 n 皇后不同的解决方案的数量。 - -## 解题思路 - -- 这一题是第 51 题的加强版,在第 51 题的基础上累加记录解的个数即可。 -- 这一题也可以暴力打表法,时间复杂度为 O(1)。 - -## 代码 - -```go - -package leetcode - -// 解法一,暴力打表法 -func totalNQueens(n int) int { - res := []int{0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724} - return res[n] -} - -// 解法二,DFS 回溯法 -func totalNQueens1(n int) int { - col, dia1, dia2, row, res := make([]bool, n), make([]bool, 2*n-1), make([]bool, 2*n-1), []int{}, 0 - putQueen52(n, 0, &col, &dia1, &dia2, &row, &res) - return res -} - -// 尝试在一个n皇后问题中, 摆放第index行的皇后位置 -func putQueen52(n, index int, col, dia1, dia2 *[]bool, row *[]int, res *int) { - if index == n { - *res++ - return - } - for i := 0; i < n; i++ { - // 尝试将第index行的皇后摆放在第i列 - if !(*col)[i] && !(*dia1)[index+i] && !(*dia2)[index-i+n-1] { - *row = append(*row, i) - (*col)[i] = true - (*dia1)[index+i] = true - (*dia2)[index-i+n-1] = true - putQueen52(n, index+1, col, dia1, dia2, row, res) - (*col)[i] = false - (*dia1)[index+i] = false - (*dia2)[index-i+n-1] = false - *row = (*row)[:len(*row)-1] - } - } - return -} - -// 解法三 二进制位操作法 -// class Solution { -// public: -// int totalNQueens(int n) { -// int ans=0; -// int row=0,leftDiagonal=0,rightDiagonal=0; -// int bit=(1<>1)&bit,ans); -// cur-=curPos;//for next possible place -// row-=curPos;//reset row -// } -// } -// }; - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0053.Maximum-Subarray.md b/website/content/ChapterFour/0053.Maximum-Subarray.md deleted file mode 100755 index a5c3a0a5b..000000000 --- a/website/content/ChapterFour/0053.Maximum-Subarray.md +++ /dev/null @@ -1,75 +0,0 @@ -# [53. Maximum Subarray](https://leetcode.com/problems/maximum-subarray/) - - -## 题目 - -Given an integer array `nums`, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum. - -**Example**: - - - Input: [-2,1,-3,4,-1,2,1,-5,4], - Output: 6 - Explanation: [4,-1,2,1] has the largest sum = 6. - - -**Follow up**: - -If you have figured out the O(*n*) solution, try coding another solution using the divide and conquer approach, which is more subtle. - -## 题目大意 - -给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 - -## 解题思路 - -- 这一题可以用 DP 求解也可以不用 DP。 -- 题目要求输出数组中某个区间内数字之和最大的那个值。`dp[i]` 表示 `[0,i]` 区间内各个子区间和的最大值,状态转移方程是 `dp[i] = nums[i] + dp[i-1] (dp[i-1] > 0)`,`dp[i] = nums[i] (dp[i-1] ≤ 0)`。 - -## 代码 - -```go - -package leetcode - -// 解法一 DP -func maxSubArray(nums []int) int { - if len(nums) == 0 { - return 0 - } - if len(nums) == 1 { - return nums[0] - } - dp, res := make([]int, len(nums)), nums[0] - dp[0] = nums[0] - for i := 1; i < len(nums); i++ { - if dp[i-1] > 0 { - dp[i] = nums[i] + dp[i-1] - } else { - dp[i] = nums[i] - } - res = max(res, dp[i]) - } - return res -} - -// 解法二 模拟 -func maxSubArray1(nums []int) int { - if len(nums) == 1 { - return nums[0] - } - maxSum, res, p := nums[0], 0, 0 - for p < len(nums) { - res += nums[p] - if res > maxSum { - maxSum = res - } - if res < 0 { - res = 0 - } - p++ - } - return maxSum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0054.Spiral-Matrix.md b/website/content/ChapterFour/0054.Spiral-Matrix.md deleted file mode 100755 index 4fd81dc5c..000000000 --- a/website/content/ChapterFour/0054.Spiral-Matrix.md +++ /dev/null @@ -1,165 +0,0 @@ -# [54. Spiral Matrix](https://leetcode.com/problems/spiral-matrix/) - - -## 题目 - -Given a matrix of *m* x *n* elements (*m* rows, *n* columns), return all elements of the matrix in spiral order. - -**Example 1**: - - - Input: - [ - [ 1, 2, 3 ], - [ 4, 5, 6 ], - [ 7, 8, 9 ] - ] - Output: [1,2,3,6,9,8,7,4,5] - - -**Example 2**: - - - Input: - [ - [1, 2, 3, 4], - [5, 6, 7, 8], - [9,10,11,12] - ] - Output: [1,2,3,4,8,12,11,10,9,5,6,7] - - -## 题目大意 - -给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。 - -## 解题思路 - -- 给出一个二维数组,按照螺旋的方式输出 -- 解法一:需要注意的是特殊情况,比如二维数组退化成一维或者一列或者一个元素。注意了这些情况,基本就可以一次通过了。 -- 解法二:提前算出一共多少个元素,一圈一圈地遍历矩阵,停止条件就是遍历了所有元素(count == sum) - -## 代码 - -```go - -package leetcode - -// 解法 1 -func spiralOrder(matrix [][]int) []int { - if len(matrix) == 0 { - return []int{} - } - res := []int{} - if len(matrix) == 1 { - for i := 0; i < len(matrix[0]); i++ { - res = append(res, matrix[0][i]) - } - return res - } - if len(matrix[0]) == 1 { - for i := 0; i < len(matrix); i++ { - res = append(res, matrix[i][0]) - } - return res - } - visit, m, n, round, x, y, spDir := make([][]int, len(matrix)), len(matrix), len(matrix[0]), 0, 0, 0, [][]int{ - []int{0, 1}, // 朝右 - []int{1, 0}, // 朝下 - []int{0, -1}, // 朝左 - []int{-1, 0}, // 朝上 - } - for i := 0; i < m; i++ { - visit[i] = make([]int, n) - } - visit[x][y] = 1 - res = append(res, matrix[x][y]) - for i := 0; i < m*n; i++ { - x += spDir[round%4][0] - y += spDir[round%4][1] - if (x == 0 && y == n-1) || (x == m-1 && y == n-1) || (y == 0 && x == m-1) { - round++ - } - if x > m-1 || y > n-1 || x < 0 || y < 0 { - return res - } - if visit[x][y] == 0 { - visit[x][y] = 1 - res = append(res, matrix[x][y]) - } - switch round % 4 { - case 0: - if y+1 <= n-1 && visit[x][y+1] == 1 { - round++ - continue - } - case 1: - if x+1 <= m-1 && visit[x+1][y] == 1 { - round++ - continue - } - case 2: - if y-1 >= 0 && visit[x][y-1] == 1 { - round++ - continue - } - case 3: - if x-1 >= 0 && visit[x-1][y] == 1 { - round++ - continue - } - } - } - return res -} - -// 解法 2 -func spiralOrder2(matrix [][]int) []int { - m := len(matrix) - if m == 0 { - return nil - } - - n := len(matrix[0]) - if n == 0 { - return nil - } - - // top、left、right、bottom 分别是剩余区域的上、左、右、下的下标 - top, left, bottom, right := 0, 0, m-1, n-1 - count, sum := 0, m*n - res := []int{} - - // 外层循环每次遍历一圈 - for count < sum { - i, j := top, left - for j <= right && count < sum { - res = append(res, matrix[i][j]) - count++ - j++ - } - i, j = top + 1, right - for i <= bottom && count < sum { - res = append(res, matrix[i][j]) - count++ - i++ - } - i, j = bottom, right - 1 - for j >= left && count < sum { - res = append(res, matrix[i][j]) - count++ - j-- - } - i, j = bottom - 1, left - for i > top && count < sum { - res = append(res, matrix[i][j]) - count++ - i-- - } - // 进入到下一层 - top, left, bottom, right = top+1, left+1, bottom-1, right-1 - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0055.Jump-Game.md b/website/content/ChapterFour/0055.Jump-Game.md deleted file mode 100644 index 84b7ddaf1..000000000 --- a/website/content/ChapterFour/0055.Jump-Game.md +++ /dev/null @@ -1,58 +0,0 @@ -# [55. Jump Game](https://leetcode.com/problems/jump-game/) - - -## 题目 - -Given an array of non-negative integers, you are initially positioned at the first index of the array. - -Each element in the array represents your maximum jump length at that position. - -Determine if you are able to reach the last index. - -**Example 1**: - -``` -Input: [2,3,1,1,4] -Output: true -Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index. -``` - -**Example 2**: - -``` -Input: [3,2,1,0,4] -Output: false -Explanation: You will always arrive at index 3 no matter what. Its maximum - jump length is 0, which makes it impossible to reach the last index. -``` - -## 题目大意 - -给定一个非负整数数组,最初位于数组的第一个位置。数组中的每个元素代表在该位置可以跳跃的最大长度。判断是否能够到达最后一个位置。 - -## 解题思路 - -- 给出一个非负数组,要求判断从数组 0 下标开始,能否到达数组最后一个位置。 -- 这一题比较简单。如果某一个作为 `起跳点` 的格子可以跳跃的距离是 `n`,那么表示后面 `n` 个格子都可以作为 `起跳点`。可以对每一个能作为 `起跳点` 的格子都尝试跳一次,把 `能跳到最远的距离maxJump` 不断更新。如果可以一直跳到最后,就成功了。如果中间有一个点比 `maxJump` 还要大,说明在这个点和 maxJump 中间连不上了,有些点不能到达最后一个位置。 - -## 代码 - -```go -func canJump(nums []int) bool { - n := len(nums) - if n == 0 { - return false - } - if n == 1 { - return true - } - maxJump := 0 - for i, v := range nums { - if i > maxJump { - return false - } - maxJump = max(maxJump, i+v) - } - return true -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0056.Merge-Intervals.md b/website/content/ChapterFour/0056.Merge-Intervals.md deleted file mode 100644 index cfe7aecd0..000000000 --- a/website/content/ChapterFour/0056.Merge-Intervals.md +++ /dev/null @@ -1,109 +0,0 @@ -# [56. Merge Intervals](https://leetcode.com/problems/merge-intervals/) - -## 题目 - -Given a collection of intervals, merge all overlapping intervals. - -**Example 1**: - -``` - -Input: [[1,3],[2,6],[8,10],[15,18]] -Output: [[1,6],[8,10],[15,18]] -Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6]. - -``` - -**Example 2**: - -``` - -Input: [[1,4],[4,5]] -Output: [[1,5]] -Explanation: Intervals [1,4] and [4,5] are considered overlapping. - -``` - -## 题目大意 - -合并给的多个区间,区间有重叠的要进行区间合并。 - - -## 解题思路 - -先按照区间起点进行排序。然后从区间起点小的开始扫描,依次合并每个有重叠的区间。 -## 代码 - -```go - -package leetcode - -/** - * Definition for an interval. - * type Interval struct { - * Start int - * End int - * } - */ - -// Interval define -type Interval struct { - Start int - End int -} - -func merge56(intervals []Interval) []Interval { - if len(intervals) == 0 { - return intervals - } - quickSort(intervals, 0, len(intervals)-1) - res := make([]Interval, 0) - res = append(res, intervals[0]) - curIndex := 0 - for i := 1; i < len(intervals); i++ { - if intervals[i].Start > res[curIndex].End { - curIndex++ - res = append(res, intervals[i]) - } else { - res[curIndex].End = max(intervals[i].End, res[curIndex].End) - } - } - return res -} - -func max(a int, b int) int { - if a > b { - return a - } - return b -} - -func min(a int, b int) int { - if a > b { - return b - } - return a -} - -func partitionSort(a []Interval, lo, hi int) int { - pivot := a[hi] - i := lo - 1 - for j := lo; j < hi; j++ { - if (a[j].Start < pivot.Start) || (a[j].Start == pivot.Start && a[j].End < pivot.End) { - i++ - a[j], a[i] = a[i], a[j] - } - } - a[i+1], a[hi] = a[hi], a[i+1] - return i + 1 -} -func quickSort(a []Interval, lo, hi int) { - if lo >= hi { - return - } - p := partitionSort(a, lo, hi) - quickSort(a, lo, p-1) - quickSort(a, p+1, hi) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0057.Insert-Interval.md b/website/content/ChapterFour/0057.Insert-Interval.md deleted file mode 100644 index 63b6df7c3..000000000 --- a/website/content/ChapterFour/0057.Insert-Interval.md +++ /dev/null @@ -1,75 +0,0 @@ -# [57. Insert Interval](https://leetcode.com/problems/insert-interval/) - -## 题目 - -Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). - -You may assume that the intervals were initially sorted according to their start times. - -**Example 1**: - -``` - -Input: intervals = [[1,3],[6,9]], newInterval = [2,5] -Output: [[1,5],[6,9]] - -``` - -**Example 2**: - -``` - -Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] -Output: [[1,2],[3,10],[12,16]] -Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10]. - -``` - -## 题目大意 - -这一题是第 56 题的加强版。给出多个没有重叠的区间,然后再给一个区间,要求把如果有重叠的区间进行合并。 - -## 解题思路 - -可以分 3 段处理,先添加原来的区间,即在给的 newInterval 之前的区间。然后添加 newInterval ,注意这里可能需要合并多个区间。最后把原来剩下的部分添加到最终结果中即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for an interval. - * type Interval struct { - * Start int - * End int - * } - */ - -func insert(intervals []Interval, newInterval Interval) []Interval { - res := make([]Interval, 0) - if len(intervals) == 0 { - res = append(res, newInterval) - return res - } - curIndex := 0 - for curIndex < len(intervals) && intervals[curIndex].End < newInterval.Start { - res = append(res, intervals[curIndex]) - curIndex++ - } - - for curIndex < len(intervals) && intervals[curIndex].Start <= newInterval.End { - newInterval = Interval{Start: min(newInterval.Start, intervals[curIndex].Start), End: max(newInterval.End, intervals[curIndex].End)} - curIndex++ - } - res = append(res, newInterval) - - for curIndex < len(intervals) { - res = append(res, intervals[curIndex]) - curIndex++ - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0059.Spiral-Matrix-II.md b/website/content/ChapterFour/0059.Spiral-Matrix-II.md deleted file mode 100755 index 201b80f3f..000000000 --- a/website/content/ChapterFour/0059.Spiral-Matrix-II.md +++ /dev/null @@ -1,94 +0,0 @@ -# [59. Spiral Matrix II](https://leetcode.com/problems/spiral-matrix-ii/) - - -## 题目 - -Given a positive integer *n*, generate a square matrix filled with elements from 1 to *n*2 in spiral order. - -**Example**: - - - Input: 3 - Output: - [ - [ 1, 2, 3 ], - [ 8, 9, 4 ], - [ 7, 6, 5 ] - ] - - -## 题目大意 - -给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 - - -## 解题思路 - -- 给出一个数组 n,要求输出一个 n * n 的二维数组,里面元素是 1 - n*n,且数组排列顺序是螺旋排列的 -- 这一题是第 54 题的加强版,没有需要注意的特殊情况,直接模拟即可。 - -## 代码 - -```go - -package leetcode - -func generateMatrix(n int) [][]int { - if n == 0 { - return [][]int{} - } - if n == 1 { - return [][]int{[]int{1}} - } - res, visit, round, x, y, spDir := make([][]int, n), make([][]int, n), 0, 0, 0, [][]int{ - []int{0, 1}, // 朝右 - []int{1, 0}, // 朝下 - []int{0, -1}, // 朝左 - []int{-1, 0}, // 朝上 - } - for i := 0; i < n; i++ { - visit[i] = make([]int, n) - res[i] = make([]int, n) - } - visit[x][y] = 1 - res[x][y] = 1 - for i := 0; i < n*n; i++ { - x += spDir[round%4][0] - y += spDir[round%4][1] - if (x == 0 && y == n-1) || (x == n-1 && y == n-1) || (y == 0 && x == n-1) { - round++ - } - if x > n-1 || y > n-1 || x < 0 || y < 0 { - return res - } - if visit[x][y] == 0 { - visit[x][y] = 1 - res[x][y] = i + 2 - } - switch round % 4 { - case 0: - if y+1 <= n-1 && visit[x][y+1] == 1 { - round++ - continue - } - case 1: - if x+1 <= n-1 && visit[x+1][y] == 1 { - round++ - continue - } - case 2: - if y-1 >= 0 && visit[x][y-1] == 1 { - round++ - continue - } - case 3: - if x-1 >= 0 && visit[x-1][y] == 1 { - round++ - continue - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0060.Permutation-Sequence.md b/website/content/ChapterFour/0060.Permutation-Sequence.md deleted file mode 100755 index e762d748f..000000000 --- a/website/content/ChapterFour/0060.Permutation-Sequence.md +++ /dev/null @@ -1,96 +0,0 @@ -# [60. Permutation Sequence](https://leetcode.com/problems/permutation-sequence/) - - -## 题目 - -The set `[1,2,3,...,*n*]` contains a total of *n*! unique permutations. - -By listing and labeling all of the permutations in order, we get the following sequence for *n* = 3: - -1. `"123"` -2. `"132"` -3. `"213"` -4. `"231"` -5. `"312"` -6. `"321"` - -Given *n* and *k*, return the *k*th permutation sequence. - -**Note**: - -- Given *n* will be between 1 and 9 inclusive. -- Given *k* will be between 1 and *n*! inclusive. - -**Example 1**: - -``` - -Input: n = 3, k = 3 -Output: "213" - -``` - -**Example 2**: - -``` - -Input: n = 4, k = 9 -Output: "2314" - -``` - -## 题目大意 - -给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 - -按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:"123","132","213","231","312","321",给定 n 和 k,返回第 k 个排列。 - - -## 解题思路 - -- 用 DFS 暴力枚举,这种做法时间复杂度特别高,想想更优的解法。 - -## 代码 - -```go - -package leetcode - -import ( - "fmt" - "strconv" -) - -func getPermutation(n int, k int) string { - if k == 0 { - return "" - } - used, p, res := make([]bool, n), []int{}, "" - findPermutation(n, 0, &k, p, &res, &used) - return res -} - -func findPermutation(n, index int, k *int, p []int, res *string, used *[]bool) { - fmt.Printf("n = %v index = %v k = %v p = %v res = %v user = %v\n", n, index, *k, p, *res, *used) - if index == n { - *k-- - if *k == 0 { - for _, v := range p { - *res += strconv.Itoa(v + 1) - } - } - return - } - for i := 0; i < n; i++ { - if !(*used)[i] { - (*used)[i] = true - p = append(p, i) - findPermutation(n, index+1, k, p, res, used) - p = p[:len(p)-1] - (*used)[i] = false - } - } - return -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0061.Rotate-List.md b/website/content/ChapterFour/0061.Rotate-List.md deleted file mode 100644 index 6bef2616a..000000000 --- a/website/content/ChapterFour/0061.Rotate-List.md +++ /dev/null @@ -1,81 +0,0 @@ -# [61. Rotate List](https://leetcode.com/problems/rotate-list/description/) - -## 题目 - -Given a linked list, rotate the list to the right by k places, where k is non-negative. - -**Example 1**: - -``` - -Input: 1->2->3->4->5->NULL, k = 2 -Output: 4->5->1->2->3->NULL -Explanation: -rotate 1 steps to the right: 5->1->2->3->4->NULL -rotate 2 steps to the right: 4->5->1->2->3->NULL - -``` - -**Example 2**: - -``` - -Input: 0->1->2->NULL, k = 4 -Output: 2->0->1->NULL -Explanation: -rotate 1 steps to the right: 2->0->1->NULL -rotate 2 steps to the right: 1->2->0->NULL -rotate 3 steps to the right: 0->1->2->NULL -rotate 4 steps to the right: 2->0->1->NULL - -``` - -## 题目大意 - -旋转链表 K 次。 - - -## 解题思路 - -这道题需要注意的点是,K 可能很大,K = 2000000000 ,如果是循环肯定会超时。应该找出 O(n) 的复杂度的算法才行。由于是循环旋转,最终状态其实是确定的,利用链表的长度取余可以得到链表的最终旋转结果。 - -这道题也不能用递归,递归解法会超时。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func rotateRight(head *ListNode, k int) *ListNode { - if head == nil || head.Next == nil || k == 0 { - return head - } - newHead := &ListNode{Val: 0, Next: head} - len := 0 - cur := newHead - for cur.Next != nil { - len++ - cur = cur.Next - } - if (k % len) == 0 { - return head - } - cur.Next = head - cur = newHead - for i := len - k%len; i > 0; i-- { - cur = cur.Next - } - res := &ListNode{Val: 0, Next: cur.Next} - cur.Next = nil - return res.Next -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0062.Unique-Paths.md b/website/content/ChapterFour/0062.Unique-Paths.md deleted file mode 100755 index 9a67bbb91..000000000 --- a/website/content/ChapterFour/0062.Unique-Paths.md +++ /dev/null @@ -1,69 +0,0 @@ -# [62. Unique Paths](https://leetcode.com/problems/unique-paths/) - - -## 题目 - -A robot is located at the top-left corner of a *m* x *n* grid (marked 'Start' in the diagram below). - -The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below). - -How many possible unique paths are there? - -![](https://assets.leetcode.com/uploads/2018/10/22/robot_maze.png) - -Above is a 7 x 3 grid. How many possible unique paths are there? - -**Note**: *m* and *n* will be at most 100. - -**Example 1**: - - Input: m = 3, n = 2 - Output: 3 - Explanation: - From the top-left corner, there are a total of 3 ways to reach the bottom-right corner: - 1. Right -> Right -> Down - 2. Right -> Down -> Right - 3. Down -> Right -> Right - -**Example 2**: - - Input: m = 7, n = 3 - Output: 28 - - -## 题目大意 - -一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径? - - -## 解题思路 - -- 这是一道简单的 DP 题。输出地图上从左上角走到右下角的走法数。 -- 由于机器人只能向右走和向下走,所以地图的第一行和第一列的走法数都是 1,地图中任意一点的走法数是 `dp[i][j] = dp[i-1][j] + dp[i][j-1]` - -## 代码 - -```go - -package leetcode - -func uniquePaths(m int, n int) int { - dp := make([][]int, n) - for i := 0; i < n; i++ { - dp[i] = make([]int, m) - } - for i := 0; i < m; i++ { - dp[0][i] = 1 - } - for i := 0; i < n; i++ { - dp[i][0] = 1 - } - for i := 1; i < n; i++ { - for j := 1; j < m; j++ { - dp[i][j] = dp[i-1][j] + dp[i][j-1] - } - } - return dp[n-1][m-1] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0063.Unique-Paths-II.md b/website/content/ChapterFour/0063.Unique-Paths-II.md deleted file mode 100755 index 7ab37659c..000000000 --- a/website/content/ChapterFour/0063.Unique-Paths-II.md +++ /dev/null @@ -1,80 +0,0 @@ -# [63. Unique Paths II](https://leetcode.com/problems/unique-paths-ii/) - - -## 题目 - -A robot is located at the top-left corner of a *m* x *n* grid (marked 'Start' in the diagram below). - -The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below). - -Now consider if some obstacles are added to the grids. How many unique paths would there be? - -![](https://assets.leetcode.com/uploads/2018/10/22/robot_maze.png) - -An obstacle and empty space is marked as `1` and `0` respectively in the grid. - -**Note**: *m* and *n* will be at most 100. - -**Example 1**: - - Input: - [ - [0,0,0], - [0,1,0], - [0,0,0] - ] - Output: 2 - Explanation: - There is one obstacle in the middle of the 3x3 grid above. - There are two ways to reach the bottom-right corner: - 1. Right -> Right -> Down -> Down - 2. Down -> Down -> Right -> Right - -## 题目大意 - -一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? - - -## 解题思路 - -- 这一题是第 62 题的加强版。也是一道考察 DP 的简单题。 -- 这一题比第 62 题增加的条件是地图中会出现障碍物,障碍物的处理方法是 `dp[i][j]=0`。 -- 需要注意的一种情况是,起点就是障碍物,那么这种情况直接输出 0 。 - -## 代码 - -```go - -package leetcode - -func uniquePathsWithObstacles(obstacleGrid [][]int) int { - if len(obstacleGrid) == 0 || obstacleGrid[0][0] == 1 { - return 0 - } - m, n := len(obstacleGrid), len(obstacleGrid[0]) - dp := make([][]int, m) - for i := 0; i < m; i++ { - dp[i] = make([]int, n) - } - dp[0][0] = 1 - for i := 1; i < n; i++ { - if dp[0][i-1] != 0 && obstacleGrid[0][i] != 1 { - dp[0][i] = 1 - } - } - for i := 1; i < m; i++ { - if dp[i-1][0] != 0 && obstacleGrid[i][0] != 1 { - dp[i][0] = 1 - } - } - for i := 1; i < m; i++ { - for j := 1; j < n; j++ { - if obstacleGrid[i][j] != 1 { - dp[i][j] = dp[i-1][j] + dp[i][j-1] - } - } - } - return dp[m-1][n-1] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0064.Minimum-Path-Sum.md b/website/content/ChapterFour/0064.Minimum-Path-Sum.md deleted file mode 100755 index 8ae24ab1c..000000000 --- a/website/content/ChapterFour/0064.Minimum-Path-Sum.md +++ /dev/null @@ -1,93 +0,0 @@ -# [64. Minimum Path Sum](https://leetcode.com/problems/minimum-path-sum/) - - -## 题目 - -Given a *m* x *n* grid filled with non-negative numbers, find a path from top left to bottom right which *minimizes* the sum of all numbers along its path. - -**Note**: You can only move either down or right at any point in time. - -**Example**: - - Input: - [ - [1,3,1], - [1,5,1], - [4,2,1] - ] - Output: 7 - Explanation: Because the path 1→3→1→1→1 minimizes the sum. - -## 题目大意 - -给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。 - - -## 解题思路 - -- 在地图上求出从左上角到右下角的路径中,数字之和最小的一个,输出数字和。 -- 这一题最简单的想法就是用一个二维数组来 DP,当然这是最原始的做法。由于只能往下和往右走,只需要维护 2 列信息就可以了,从左边推到最右边即可得到最小的解。更近一步,可以直接在原来的数组中做原地 DP,空间复杂度为 0 。 - -## 代码 - -```go - -package leetcode - -// 解法一 原地 DP,无辅助空间 -func minPathSum(grid [][]int) int { - m, n := len(grid), len(grid[0]) - for i := 1; i < m; i++ { - grid[i][0] += grid[i-1][0] - } - for j := 1; j < n; j++ { - grid[0][j] += grid[0][j-1] - } - for i := 1; i < m; i++ { - for j := 1; j < n; j++ { - grid[i][j] += min(grid[i-1][j], grid[i][j-1]) - } - } - return grid[m-1][n-1] - -} - -// 解法二 最原始的方法,辅助空间 O(n^2) -func minPathSum1(grid [][]int) int { - if len(grid) == 0 { - return 0 - } - m, n := len(grid), len(grid[0]) - if m == 0 || n == 0 { - return 0 - } - - dp := make([][]int, m) - for i := 0; i < m; i++ { - dp[i] = make([]int, n) - } - // initFirstCol - for i := 0; i < len(dp); i++ { - if i == 0 { - dp[i][0] = grid[i][0] - } else { - dp[i][0] = grid[i][0] + dp[i-1][0] - } - } - // initFirstRow - for i := 0; i < len(dp[0]); i++ { - if i == 0 { - dp[0][i] = grid[0][i] - } else { - dp[0][i] = grid[0][i] + dp[0][i-1] - } - } - for i := 1; i < m; i++ { - for j := 1; j < n; j++ { - dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j] - } - } - return dp[m-1][n-1] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0066.Plus-One.md b/website/content/ChapterFour/0066.Plus-One.md deleted file mode 100755 index 441789f9b..000000000 --- a/website/content/ChapterFour/0066.Plus-One.md +++ /dev/null @@ -1,63 +0,0 @@ -# [66. Plus One](https://leetcode.com/problems/plus-one/) - - -## 题目 - -Given a **non-empty** array of digits representing a non-negative integer, plus one to the integer. - -The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit. - -You may assume the integer does not contain any leading zero, except the number 0 itself. - -**Example 1**: - - Input: [1,2,3] - Output: [1,2,4] - Explanation: The array represents the integer 123. - -**Example 2**: - - Input: [4,3,2,1] - Output: [4,3,2,2] - Explanation: The array represents the integer 4321. - - -## 题目大意 - - -给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。 - - - -## 解题思路 - -- 给出一个数组,代表一个十进制数,数组的 0 下标是十进制数的高位。要求计算这个十进制数加一以后的结果。 -- 简单的模拟题。从数组尾部开始往前扫,逐位进位即可。最高位如果还有进位需要在数组里面第 0 位再插入一个 1 。 - -## 代码 - -```go - -package leetcode - -func plusOne(digits []int) []int { - if len(digits) == 0 { - return []int{} - } - carry := 1 - for i := len(digits) - 1; i >= 0; i-- { - if digits[i]+carry > 9 { - digits[i] = 0 - carry = 1 - } else { - digits[i] += carry - carry = 0 - } - } - if digits[0] == 0 && carry == 1 { - digits = append([]int{1}, digits...) - } - return digits -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0067.Add-Binary.md b/website/content/ChapterFour/0067.Add-Binary.md deleted file mode 100644 index 91d977e58..000000000 --- a/website/content/ChapterFour/0067.Add-Binary.md +++ /dev/null @@ -1,76 +0,0 @@ -# [67. Add Binary](https://leetcode.com/problems/add-binary/) - - -## 题目 - -Given two binary strings, return their sum (also a binary string). - -The input strings are both **non-empty** and contains only characters `1` or `0`. - -**Example 1**: - -``` -Input: a = "11", b = "1" -Output: "100" -``` - -**Example 2**: - -``` -Input: a = "1010", b = "1011" -Output: "10101" -``` - -## 题目大意 - -给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。 - -## 解题思路 - -- 要求输出 2 个二进制数的和,结果也用二进制表示。 -- 简单题。按照二进制的加法规则做加法即可。 - -## 代码 - -```go - -package leetcode - -import ( - "strconv" - "strings" -) - -func addBinary(a string, b string) string { - if len(b) > len(a) { - a, b = b, a - } - - res := make([]string, len(a)+1) - i, j, k, c := len(a)-1, len(b)-1, len(a), 0 - for i >= 0 && j >= 0 { - ai, _ := strconv.Atoi(string(a[i])) - bj, _ := strconv.Atoi(string(b[j])) - res[k] = strconv.Itoa((ai + bj + c) % 2) - c = (ai + bj + c) / 2 - i-- - j-- - k-- - } - - for i >= 0 { - ai, _ := strconv.Atoi(string(a[i])) - res[k] = strconv.Itoa((ai + c) % 2) - c = (ai + c) / 2 - i-- - k-- - } - - if c > 0 { - res[k] = strconv.Itoa(c) - } - - return strings.Join(res, "") -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0069.Sqrtx.md b/website/content/ChapterFour/0069.Sqrtx.md deleted file mode 100755 index 3b4397dee..000000000 --- a/website/content/ChapterFour/0069.Sqrtx.md +++ /dev/null @@ -1,91 +0,0 @@ -# [69. Sqrt(x)](https://leetcode.com/problems/sqrtx/) - - -## 题目 - -Implement `int sqrt(int x)`. - -Compute and return the square root of *x*, where *x* is guaranteed to be a non-negative integer. - -Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned. - -**Example 1**: - - Input: 4 - Output: 2 - -**Example 2**: - - Input: 8 - Output: 2 - Explanation: The square root of 8 is 2.82842..., and since - the decimal part is truncated, 2 is returned. - - -## 题目大意 - -实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 - - - -## 解题思路 - -- 题目要求求出根号 x -- 根据题意,根号 x 的取值范围一定在 `[0,x]` 之间,这个区间内的值是递增有序的,有边界的,可以用下标访问的,满足这三点正好也就满足了二分搜索的 3 大条件。所以解题思路一,二分搜索。 -- 解题思路二,牛顿迭代法。求根号 x,即求满足 `x^2 - n = 0` 方程的所有解。 - - ![](https://img-blog.csdn.net/20171019164040871?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnJlbnhpYW5n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) - -## 代码 - -```go - -package leetcode - -// 解法一 二分 -func mySqrt(x int) int { - if x == 0 { - return 0 - } - left, right, res := 1, x, 0 - for left <= right { - mid := left + ((right - left) >> 1) - if mid < x/mid { - left = mid + 1 - res = mid - } else if mid == x/mid { - return mid - } else { - right = mid - 1 - } - } - return res -} - -// 解法二 牛顿迭代法 https://en.wikipedia.org/wiki/Integer_square_root -func mySqrt1(x int) int { - r := x - for r*r > x { - r = (r + x/r) / 2 - } - return r -} - -// 解法三 Quake III 游戏引擎中有一种比 STL 的 sqrt 快 4 倍的实现 https://en.wikipedia.org/wiki/Fast_inverse_square_root -// float Q_rsqrt( float number ) -// { -// long i; -// float x2, y; -// const float threehalfs = 1.5F; - -// x2 = number * 0.5F; -// y = number; -// i = * ( long * ) &y; // evil floating point bit level hacking -// i = 0x5f3759df - ( i >> 1 ); // what the fuck? -// y = * ( float * ) &i; -// y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration -// // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed -// return y; -// } - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0070.Climbing-Stairs.md b/website/content/ChapterFour/0070.Climbing-Stairs.md deleted file mode 100755 index 5eda8e5ca..000000000 --- a/website/content/ChapterFour/0070.Climbing-Stairs.md +++ /dev/null @@ -1,55 +0,0 @@ -# [70. Climbing Stairs](https://leetcode.com/problems/climbing-stairs/) - - -## 题目 - -You are climbing a stair case. It takes *n* steps to reach to the top. - -Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? - -**Note**: Given *n* will be a positive integer. - -**Example 1**: - - Input: 2 - Output: 2 - Explanation: There are two ways to climb to the top. - 1. 1 step + 1 step - 2. 2 steps - -**Example 2**: - - Input: 3 - Output: 3 - Explanation: There are three ways to climb to the top. - 1. 1 step + 1 step + 1 step - 2. 1 step + 2 steps - 3. 2 steps + 1 step - - -## 题目大意 - -假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数 - - -## 解题思路 - -- 简单的 DP,经典的爬楼梯问题。一个楼梯可以由 `n-1` 和 `n-2` 的楼梯爬上来。 -- 这一题求解的值就是斐波那契数列。 - -## 代码 - -```go - -package leetcode - -func climbStairs(n int) int { - dp := make([]int, n+1) - dp[0], dp[1] = 1, 1 - for i := 2; i <= n; i++ { - dp[i] = dp[i-1] + dp[i-2] - } - return dp[n] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0071.Simplify-Path.md b/website/content/ChapterFour/0071.Simplify-Path.md deleted file mode 100644 index b4a7c4cf0..000000000 --- a/website/content/ChapterFour/0071.Simplify-Path.md +++ /dev/null @@ -1,117 +0,0 @@ -# [71. Simplify Path](https://leetcode.com/problems/simplify-path/) - -## 题目 - -Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path. - -In a UNIX-style file system, a period . refers to the current directory. Furthermore, a double period .. moves the directory up a level. For more information, see: Absolute path vs relative path in Linux/Unix - -Note that the returned canonical path must always begin with a slash /, and there must be only a single slash / between two directory names. The last directory name (if it exists) must not end with a trailing /. Also, the canonical path must be the shortest string representing the absolute path. - - - -**Example 1**: - -``` - -Input: "/home/" -Output: "/home" -Explanation: Note that there is no trailing slash after the last directory name. - -``` - -**Example 2**: - -``` - -Input: "/../" -Output: "/" -Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go. - -``` -**Example 3**: - -``` - -Input: "/home//foo/" -Output: "/home/foo" -Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one. - -``` - -**Example 4**: - -``` - -Input: "/a/./b/../../c/" -Output: "/c" - -``` - - -**Example 5**: - -``` - -Input: "/a/../../b/../c//.//" -Output: "/c" - -``` - -**Example 6**: - -``` - -Input: "/a//b////c/d//././/.." -Output: "/a/b/c" - -``` - -## 题目大意 - -给出一个 Unix 的文件路径,要求简化这个路径。这道题也是考察栈的题目。 - -## 解题思路 - -这道题笔者提交了好多次才通过,并不是题目难,而是边界条件很多,没考虑全一种情况就会出错。有哪些边界情况就看笔者的 test 文件吧。 - -## 代码 - -```go - -package leetcode - -import ( - "path/filepath" - "strings" -) - -// 解法一 -func simplifyPath(path string) string { - arr := strings.Split(path, "/") - stack := make([]string, 0) - var res string - for i := 0; i < len(arr); i++ { - cur := arr[i] - //cur := strings.TrimSpace(arr[i]) 更加严谨的做法应该还要去掉末尾的空格 - if cur == ".." { - if len(stack) > 0 { - stack = stack[:len(stack)-1] - } - } else if cur != "." && len(cur) > 0 { - stack = append(stack, arr[i]) - } - } - if len(stack) == 0 { - return "/" - } - res = strings.Join(stack, "/") - return "/" + res -} - -// 解法二 golang 的官方库 API -func simplifyPath1(path string) string { - return filepath.Clean(path) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0074.Search-a-2D-Matrix.md b/website/content/ChapterFour/0074.Search-a-2D-Matrix.md deleted file mode 100755 index 072908621..000000000 --- a/website/content/ChapterFour/0074.Search-a-2D-Matrix.md +++ /dev/null @@ -1,72 +0,0 @@ -# [74. Search a 2D Matrix](https://leetcode.com/problems/search-a-2d-matrix/) - - -## 题目 - -Write an efficient algorithm that searches for a value in an *m* x *n* matrix. This matrix has the following properties: - -- Integers in each row are sorted from left to right. -- The first integer of each row is greater than the last integer of the previous row. - -**Example 1**: - - Input: - matrix = [ - [1, 3, 5, 7], - [10, 11, 16, 20], - [23, 30, 34, 50] - ] - target = 3 - Output: true - -**Example 2**: - - Input: - matrix = [ - [1, 3, 5, 7], - [10, 11, 16, 20], - [23, 30, 34, 50] - ] - target = 13 - Output: false - - -## 题目大意 - -编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性: - -- 每行中的整数从左到右按升序排列。 -- 每行的第一个整数大于前一行的最后一个整数。 - - -## 解题思路 - - -- 给出一个二维矩阵,矩阵的特点是随着矩阵的下标增大而增大。要求设计一个算法能在这个矩阵中高效的找到一个数,如果找到就输出 true,找不到就输出 false。 -- 虽然是一个二维矩阵,但是由于它特殊的有序性,所以完全可以按照下标把它看成一个一维矩阵,只不过需要行列坐标转换。最后利用二分搜索直接搜索即可。 - -## 代码 - -```go - -package leetcode - -func searchMatrix(matrix [][]int, target int) bool { - if len(matrix) == 0 { - return false - } - m, low, high := len(matrix[0]), 0, len(matrix[0])*len(matrix)-1 - for low <= high { - mid := low + (high-low)>>1 - if matrix[mid/m][mid%m] == target { - return true - } else if matrix[mid/m][mid%m] > target { - high = mid - 1 - } else { - low = mid + 1 - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0075.Sort-Colors.md b/website/content/ChapterFour/0075.Sort-Colors.md deleted file mode 100644 index 127d74c04..000000000 --- a/website/content/ChapterFour/0075.Sort-Colors.md +++ /dev/null @@ -1,72 +0,0 @@ -# [75. Sort Colors](https://leetcode.com/problems/sort-colors/) - -## 题目 - -Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue. - -Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively. - -**Note**: You are not suppose to use the library's sort function for this problem. - -**Example 1**: - -``` - -Input: [2,0,2,1,1,0] -Output: [0,0,1,1,2,2] - -``` - -**Follow up**: - -- A rather straight forward solution is a two-pass algorithm using counting sort. -First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's. -- Could you come up with a one-pass algorithm using only constant space? - - -## 题目大意 - -抽象题意其实就是排序。这题可以用快排一次通过。 - -## 解题思路 - -题目末尾的 Follow up 提出了一个更高的要求,能否用一次循环解决问题?这题由于数字只会出现 0,1,2 这三个数字,所以用游标移动来控制顺序也是可以的。具体做法:0 是排在最前面的,所以只要添加一个 0,就需要放置 1 和 2。1 排在 2 前面,所以添加 1 的时候也需要放置 2 。至于最后的 2,只用移动游标即可。 - -这道题可以用计数排序,适合待排序数字很少的题目。用一个 3 个容量的数组分别计数,记录 0,1,2 出现的个数。然后再根据个数排列 0,1,2 即可。时间复杂度 O(n),空间复杂度 O(K)。这一题 K = 3。 - -这道题也可以用一次三路快排。数组分为 3 部分,第一个部分都是 0,中间部分都是 1,最后部分都是 2 。 - -## 代码 - -```go - -package leetcode - -func sortColors(nums []int) { - if len(nums) == 0 { - return - } - - r := 0 - w := 0 - b := 0 // label the end of different colors; - for _, num := range nums { - if num == 0 { - nums[b] = 2 - b++ - nums[w] = 1 - w++ - nums[r] = 0 - r++ - } else if num == 1 { - nums[b] = 2 - b++ - nums[w] = 1 - w++ - } else if num == 2 { - b++ - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0076.Minimum-Window-Substring.md b/website/content/ChapterFour/0076.Minimum-Window-Substring.md deleted file mode 100644 index a13affa38..000000000 --- a/website/content/ChapterFour/0076.Minimum-Window-Substring.md +++ /dev/null @@ -1,76 +0,0 @@ -# [76. Minimum Window Substring](https://leetcode.com/problems/minimum-window-substring/) - -## 题目 - -Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). - -**Example**: - -``` - -Input: S = "ADOBECODEBANC", T = "ABC" -Output: "BANC" - -``` - -**Note**: - -- If there is no such window in S that covers all characters in T, return the empty string "". -- If there is such window, you are guaranteed that there will always be only one unique minimum window in S. - -## 题目大意 - -给定一个源字符串 s,再给一个字符串 T,要求在源字符串中找到一个窗口,这个窗口包含由字符串各种排列组合组成的,窗口中可以包含 T 中没有的字符,如果存在多个,在结果中输出最小的窗口,如果找不到这样的窗口,输出空字符串。 - -## 解题思路 - -这一题是滑动窗口的题目,在窗口滑动的过程中不断的包含字符串 T,直到完全包含字符串 T 的字符以后,记下左右窗口的位置和窗口大小。每次都不断更新这个符合条件的窗口和窗口大小的最小值。最后输出结果即可。 - - -## 代码 - -```go - -package leetcode - -func minWindow(s string, t string) string { - if s == "" || t == "" { - return "" - } - var tFreq, sFreq [256]int - result, left, right, finalLeft, finalRight, minW, count := "", 0, -1, -1, -1, len(s)+1, 0 - - for i := 0; i < len(t); i++ { - tFreq[t[i]-'a']++ - } - - for left < len(s) { - if right+1 < len(s) && count < len(t) { - sFreq[s[right+1]-'a']++ - if sFreq[s[right+1]-'a'] <= tFreq[s[right+1]-'a'] { - count++ - } - right++ - } else { - if right-left+1 < minW && count == len(t) { - minW = right - left + 1 - finalLeft = left - finalRight = right - } - if sFreq[s[left]-'a'] == tFreq[s[left]-'a'] { - count-- - } - sFreq[s[left]-'a']-- - left++ - } - } - if finalLeft != -1 { - for i := finalLeft; i < finalRight+1; i++ { - result += string(s[i]) - } - } - return result -} - -``` - diff --git a/website/content/ChapterFour/0077.Combinations.md b/website/content/ChapterFour/0077.Combinations.md deleted file mode 100755 index 74a6bf26b..000000000 --- a/website/content/ChapterFour/0077.Combinations.md +++ /dev/null @@ -1,60 +0,0 @@ -# [77. Combinations](https://leetcode.com/problems/combinations/) - - -## 题目 - -Given two integers *n* and *k*, return all possible combinations of *k* numbers out of 1 ... *n*. - -**Example**: - - Input: n = 4, k = 2 - Output: - [ - [2,4], - [3,4], - [2,3], - [1,2], - [1,3], - [1,4], - ] - -## 题目大意 - -给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 - -## 解题思路 - -- 计算排列组合中的组合,用 DFS 深搜即可,注意剪枝 - -## 代码 - -``` - -package leetcode - -func combine(n int, k int) [][]int { - if n <= 0 || k <= 0 || k > n { - return [][]int{} - } - c, res := []int{}, [][]int{} - generateCombinations(n, k, 1, c, &res) - return res -} - -func generateCombinations(n, k, start int, c []int, res *[][]int) { - if len(c) == k { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - return - } - // i will at most be n - (k - c.size()) + 1 - for i := start; i <= n-(k-len(c))+1; i++ { - c = append(c, i) - generateCombinations(n, k, i+1, c, res) - c = c[:len(c)-1] - } - return -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0078.Subsets.md b/website/content/ChapterFour/0078.Subsets.md deleted file mode 100755 index 3173014e1..000000000 --- a/website/content/ChapterFour/0078.Subsets.md +++ /dev/null @@ -1,105 +0,0 @@ -# [78. Subsets](https://leetcode.com/problems/subsets/) - - -## 题目 - -Given a set of **distinct** integers, *nums*, return all possible subsets (the power set). - -**Note**: The solution set must not contain duplicate subsets. - -**Example**: - - Input: nums = [1,2,3] - Output: - [ - [3], - [1], - [2], - [1,2,3], - [1,3], - [2,3], - [1,2], - [] - ] - - -## 题目大意 - -给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。 - - -## 解题思路 - -- 找出一个集合中的所有子集,空集也算是子集。且数组中的数字不会出现重复。用 DFS 暴力枚举即可。 -- 这一题和第 90 题,第 491 题类似,可以一起解答和复习。 - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 -func subsets(nums []int) [][]int { - c, res := []int{}, [][]int{} - for k := 0; k <= len(nums); k++ { - generateSubsets(nums, k, 0, c, &res) - } - return res -} - -func generateSubsets(nums []int, k, start int, c []int, res *[][]int) { - if len(c) == k { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - return - } - // i will at most be n - (k - c.size()) + 1 - for i := start; i < len(nums)-(k-len(c))+1; i++ { - c = append(c, nums[i]) - generateSubsets(nums, k, i+1, c, res) - c = c[:len(c)-1] - } - return -} - -// 解法二 -func subsets1(nums []int) [][]int { - res := make([][]int, 1) - sort.Ints(nums) - for i := range nums { - for _, org := range res { - clone := make([]int, len(org), len(org)+1) - copy(clone, org) - clone = append(clone, nums[i]) - res = append(res, clone) - } - } - return res -} - -// 解法三:位运算的方法 -func subsets2(nums []int) [][]int { - if len(nums) == 0 { - return nil - } - res := [][]int{} - sum := 1 << uint(len(nums)) - for i := 0; i < sum; i++ { - stack := []int{} - tmp := i // i 从 000...000 到 111...111 - for j := len(nums) - 1; j >= 0; j-- { // 遍历 i 的每一位 - if tmp & 1 == 1 { - stack = append([]int{nums[j]}, stack...) - } - tmp >>= 1 - } - res = append(res, stack) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0079.Word-Search.md b/website/content/ChapterFour/0079.Word-Search.md deleted file mode 100755 index b38e63baf..000000000 --- a/website/content/ChapterFour/0079.Word-Search.md +++ /dev/null @@ -1,83 +0,0 @@ -# [79. Word Search](https://leetcode.com/problems/word-search/) - - -## 题目 - -Given a 2D board and a word, find if the word exists in the grid. - -The word can be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once. - -**Example**: - - board = - [ - ['A','B','C','E'], - ['S','F','C','S'], - ['A','D','E','E'] - ] - - Given word = "ABCCED", return true. - Given word = "SEE", return true. - Given word = "ABCB", return false. - -## 题目大意 - -给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 - - - -## 解题思路 - -- 在地图上的任意一个起点开始,向 4 个方向分别 DFS 搜索,直到所有的单词字母都找到了就输出 true,否则输出 false。 - -## 代码 - -```go - -package leetcode - -var dir = [][]int{ - []int{-1, 0}, - []int{0, 1}, - []int{1, 0}, - []int{0, -1}, -} - -func exist(board [][]byte, word string) bool { - visited := make([][]bool, len(board)) - for i := 0; i < len(visited); i++ { - visited[i] = make([]bool, len(board[0])) - } - for i, v := range board { - for j := range v { - if searchWord(board, visited, word, 0, i, j) { - return true - } - } - } - return false -} - -func isInBoard(board [][]byte, x, y int) bool { - return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) -} - -func searchWord(board [][]byte, visited [][]bool, word string, index, x, y int) bool { - if index == len(word)-1 { - return board[x][y] == word[index] - } - if board[x][y] == word[index] { - visited[x][y] = true - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - if isInBoard(board, nx, ny) && !visited[nx][ny] && searchWord(board, visited, word, index+1, nx, ny) { - return true - } - } - visited[x][y] = false - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0081.Search-in-Rotated-Sorted-Array-II.md b/website/content/ChapterFour/0081.Search-in-Rotated-Sorted-Array-II.md deleted file mode 100755 index e9b9a8800..000000000 --- a/website/content/ChapterFour/0081.Search-in-Rotated-Sorted-Array-II.md +++ /dev/null @@ -1,85 +0,0 @@ -# [81. Search in Rotated Sorted Array II](https://leetcode.com/problems/search-in-rotated-sorted-array-ii/) - - -## 题目 - -Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. - -(i.e., `[0,0,1,2,2,5,6]` might become `[2,5,6,0,0,1,2]`). - -You are given a target value to search. If found in the array return `true`, otherwise return `false`. - -**Example 1**: - - Input: nums = [2,5,6,0,0,1,2], target = 0 - Output: true - -**Example 2**: - - Input: nums = [2,5,6,0,0,1,2], target = 3 - Output: false - -**Follow up**: - -- This is a follow up problem to [Search in Rotated Sorted Array](https://leetcode.com/problems/search-in-rotated-sorted-array/description/), where `nums` may contain duplicates. -- Would this affect the run-time complexity? How and why? - - -## 题目大意 - -假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 - -编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。 - -进阶: - -- 这是搜索旋转排序数组 的延伸题目,本题中的 nums 可能包含重复元素。 -- 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么? - - -## 解题思路 - - -- 给出一个数组,数组中本来是从小到大排列的,并且数组中有重复数字。但是现在把后面随机一段有序的放到数组前面,这样形成了前后两端有序的子序列。在这样的一个数组里面查找一个数,设计一个 O(log n) 的算法。如果找到就输出 `true`,如果没有找到,就输出 `false` 。 -- 这一题是第 33 题的加强版,实现代码完全一样,只不过输出变了。这一题输出 `true` 和 `false` 了。具体思路见第 33 题。 - -## 代码 - -```go - -package leetcode - -func search(nums []int, target int) bool { - if len(nums) == 0 { - return false - } - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if nums[mid] == target { - return true - } else if nums[mid] > nums[low] { // 在数值大的一部分区间里 - if nums[low] <= target && target < nums[mid] { - high = mid - 1 - } else { - low = mid + 1 - } - } else if nums[mid] < nums[high] { // 在数值小的一部分区间里 - if nums[mid] < target && target <= nums[high] { - low = mid + 1 - } else { - high = mid - 1 - } - } else { - if nums[low] == nums[mid] { - low++ - } - if nums[high] == nums[mid] { - high-- - } - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0083.Remove-Duplicates-from-Sorted-List.md b/website/content/ChapterFour/0083.Remove-Duplicates-from-Sorted-List.md deleted file mode 100644 index 07d1654e7..000000000 --- a/website/content/ChapterFour/0083.Remove-Duplicates-from-Sorted-List.md +++ /dev/null @@ -1,66 +0,0 @@ -# [83. Remove Duplicates from Sorted List](https://leetcode.com/problems/remove-duplicates-from-sorted-list/) - -## 题目 - -Given a sorted linked list, delete all duplicates such that each element appear only once. - -**Example 1**: - -``` - -Input: 1->1->2 -Output: 1->2 - -``` - -**Example 2**: - -``` - -Input: 1->1->2->3->3 -Output: 1->2->3 - -``` - -## 题目大意 - -删除链表中重复的结点,以保障每个结点只出现一次。 - - -## 解题思路 - -按照题意做即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func deleteDuplicates(head *ListNode) *ListNode { - cur := head - if head == nil { - return nil - } - if head.Next == nil { - return head - } - for cur.Next != nil { - if cur.Next.Val == cur.Val { - cur.Next = cur.Next.Next - } else { - cur = cur.Next - } - } - return head -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0084.Largest-Rectangle-in-Histogram.md b/website/content/ChapterFour/0084.Largest-Rectangle-in-Histogram.md deleted file mode 100644 index 7b22b2200..000000000 --- a/website/content/ChapterFour/0084.Largest-Rectangle-in-Histogram.md +++ /dev/null @@ -1,75 +0,0 @@ -# [84. Largest Rectangle in Histogram](https://leetcode.com/problems/largest-rectangle-in-histogram/) - -## 题目 - -Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. - - ![](https://assets.leetcode.com/uploads/2018/10/12/histogram.png) - - -Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]. - -![](https://assets.leetcode.com/uploads/2018/10/12/histogram_area.png) - - -The largest rectangle is shown in the shaded area, which has area = 10 unit. - - - -**Example**: - -``` - -Input: [2,1,5,6,2,3] -Output: 10 - -``` - - -## 题目大意 - -给出每个直方图的高度,要求在这些直方图之中找到面积最大的矩形,输出矩形的面积。 - - -## 解题思路 - -用单调栈依次保存直方图的高度下标,一旦出现高度比栈顶元素小的情况就取出栈顶元素,单独计算一下这个栈顶元素的矩形的高度。然后停在这里(外层循环中的 i--,再 ++,就相当于停在这里了),继续取出当前最大栈顶的前一个元素,即连续弹出 2 个最大的,以稍小的一个作为矩形的边,宽就是 2 计算面积…………如果停在这里的下标代表的高度一直比栈里面的元素小,就一直弹出,取出最后一个比当前下标大的高度作为矩形的边。宽就是最后一个比当前下标大的高度和当前下标 i 的差值。计算出面积以后不断的更新 maxArea 即可。 - -## 代码 - -```go - -package leetcode - -import "fmt" - -func largestRectangleArea(heights []int) int { - maxArea, stack, height := 0, []int{}, 0 - for i := 0; i <= len(heights); i++ { - if i == len(heights) { - height = 0 - } else { - height = heights[i] - } - if len(stack) == 0 || height >= heights[stack[len(stack)-1]] { - stack = append(stack, i) - } else { - tmp := stack[len(stack)-1] - fmt.Printf("1. tmp = %v stack = %v\n", tmp, stack) - stack = stack[:len(stack)-1] - length := 0 - if len(stack) == 0 { - length = i - } else { - length = i - 1 - stack[len(stack)-1] - fmt.Printf("2. length = %v stack = %v i = %v\n", length, stack, i) - } - maxArea = max(maxArea, heights[tmp]*length) - fmt.Printf("3. maxArea = %v heights[tmp]*length = %v\n", maxArea, heights[tmp]*length) - i-- - } - } - return maxArea -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0086.Partition-List.md b/website/content/ChapterFour/0086.Partition-List.md deleted file mode 100644 index d261700df..000000000 --- a/website/content/ChapterFour/0086.Partition-List.md +++ /dev/null @@ -1,148 +0,0 @@ -# [86. Partition List](https://leetcode.com/problems/partition-list/) - -## 题目 - -Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. - -You should preserve the original relative order of the nodes in each of the two partitions. - -**Example**: - -``` - -Input: head = 1->4->3->2->5->2, x = 3 -Output: 1->2->2->4->3->5 - -``` - - -## 题目大意 - -给定一个数 x,比 x 大或等于的数字都要排列在比 x 小的数字后面,并且相对位置不能发生变化。由于相对位置不能发生变化,所以不能用类似冒泡排序的思想。 - -## 解题思路 - -这道题最简单的做法是构造双向链表,不过时间复杂度是 O(n^2)。 - -(以下描述定义,大于等于 x 的都属于比 x 大) - -更优的方法是新构造 2 个链表,一个链表专门存储比 x 小的结点,另一个专门存储比 x 大的结点。在原链表头部开始扫描一边,依次把这两类点归类到 2 个新建链表中,有点入栈的意思。由于是从头开始扫描的原链表,所以原链表中的原有顺序会依旧被保存下来。最后 2 个新链表里面会存储好各自的结果,把这两个链表,比 x 小的链表拼接到 比 x 大的链表的前面,就能得到最后的答案了。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -// 解法一 单链表 -func partition(head *ListNode, x int) *ListNode { - beforeHead := &ListNode{Val: 0, Next: nil} - before := beforeHead - afterHead := &ListNode{Val: 0, Next: nil} - after := afterHead - - for head != nil { - if head.Val < x { - before.Next = head - before = before.Next - } else { - after.Next = head - after = after.Next - } - head = head.Next - } - after.Next = nil - before.Next = afterHead.Next - return beforeHead.Next -} - -// DoublyListNode define -type DoublyListNode struct { - Val int - Prev *DoublyListNode - Next *DoublyListNode -} - -// 解法二 双链表 -func partition1(head *ListNode, x int) *ListNode { - if head == nil || head.Next == nil { - return head - } - DLNHead := genDoublyListNode(head) - cur := DLNHead - for cur != nil { - if cur.Val < x { - tmp := &DoublyListNode{Val: cur.Val, Prev: nil, Next: nil} - compareNode := cur - for compareNode.Prev != nil { - if compareNode.Val >= x && compareNode.Prev.Val < x { - break - } - compareNode = compareNode.Prev - } - if compareNode == DLNHead { - if compareNode.Val < x { - cur = cur.Next - continue - } else { - tmp.Next = DLNHead - DLNHead.Prev = tmp - DLNHead = tmp - } - } else { - tmp.Next = compareNode - tmp.Prev = compareNode.Prev - compareNode.Prev.Next = tmp - compareNode.Prev = tmp - } - deleteNode := cur - if cur.Prev != nil { - deleteNode.Prev.Next = deleteNode.Next - } - if cur.Next != nil { - deleteNode.Next.Prev = deleteNode.Prev - } - } - cur = cur.Next - } - return genListNode(DLNHead) -} - -func genDoublyListNode(head *ListNode) *DoublyListNode { - cur := head.Next - DLNHead := &DoublyListNode{Val: head.Val, Prev: nil, Next: nil} - curDLN := DLNHead - for cur != nil { - tmp := &DoublyListNode{Val: cur.Val, Prev: curDLN, Next: nil} - curDLN.Next = tmp - curDLN = tmp - cur = cur.Next - } - return DLNHead -} - -func genListNode(head *DoublyListNode) *ListNode { - cur := head.Next - LNHead := &ListNode{Val: head.Val, Next: nil} - curLN := LNHead - for cur != nil { - tmp := &ListNode{Val: cur.Val, Next: nil} - curLN.Next = tmp - curLN = tmp - cur = cur.Next - } - return LNHead -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0088.Merge-Sorted-Array.md b/website/content/ChapterFour/0088.Merge-Sorted-Array.md deleted file mode 100644 index 42d50a53a..000000000 --- a/website/content/ChapterFour/0088.Merge-Sorted-Array.md +++ /dev/null @@ -1,69 +0,0 @@ -# [88. Merge Sorted Array](https://leetcode.com/problems/merge-sorted-array/description/) - -## 题目 - -Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. - -**Note**: - -- The number of elements initialized in nums1 and nums2 are m and n respectively. -- You may assume that nums1 has enough space (size that is equal to m + n) to hold additional elements from nums2. - -**Example**: - - Input: - nums1 = [1,2,3,0,0,0], m = 3 - nums2 = [2,5,6], n = 3 - - Output: [1,2,2,3,5,6] - - -**Constraints**: - -- -10^9 <= nums1[i], nums2[i] <= 10^9 -- nums1.length == m + n -- nums2.length == n - -## 题目大意 - -合并两个已经有序的数组,结果放在第一个数组中,第一个数组假设空间足够大。要求算法时间复杂度足够低。 - -## 解题思路 - -为了不大量移动元素,就要从2个数组长度之和的最后一个位置开始,依次选取两个数组中大的数,从第一个数组的尾巴开始往头放,只要循环一次以后,就生成了合并以后的数组了。 - -## 代码 - -```go - -package leetcode - -func merge(nums1 []int, m int, nums2 []int, n int) { - if m == 0 { - copy(nums1, nums2) - return - } - // 这里不需要,因为测试数据考虑到了第一个数组的空间问题 - // for index := 0; index < n; index++ { - // nums1 = append(nums1, nums2[index]) - // } - i := m - 1 - j := n - 1 - k := m + n - 1 - // 从后面往前放,只需要循环一次即可 - for ; i >= 0 && j >= 0; k-- { - if nums1[i] > nums2[j] { - nums1[k] = nums1[i] - i-- - } else { - nums1[k] = nums2[j] - j-- - } - } - for ; j >= 0; k-- { - nums1[k] = nums2[j] - j-- - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0089.Gray-Code.md b/website/content/ChapterFour/0089.Gray-Code.md deleted file mode 100755 index cb3d5df92..000000000 --- a/website/content/ChapterFour/0089.Gray-Code.md +++ /dev/null @@ -1,117 +0,0 @@ -# [89. Gray Code](https://leetcode.com/problems/gray-code/) - -## 题目 - -The gray code is a binary numeral system where two successive values differ in only one bit. - -Given a non-negative integer *n* representing the total number of bits in the code, print the sequence of gray code. A gray code sequence must begin with 0. - -**Example 1**: - - Input: 2 - Output: [0,1,3,2] - Explanation: - 00 - 0 - 01 - 1 - 11 - 3 - 10 - 2 - - For a given n, a gray code sequence may not be uniquely defined. - For example, [0,2,3,1] is also a valid gray code sequence. - - 00 - 0 - 10 - 2 - 11 - 3 - 01 - 1 - -**Example 2**: - - Input: 0 - Output: [0] - Explanation: We define the gray code sequence to begin with 0. - A gray code sequence of n has size = 2n, which for n = 0 the size is 20 = 1. - Therefore, for n = 0 the gray code sequence is [0]. - - -## 题目大意 - -格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异。给定一个代表编码总位数的非负整数 n,打印其格雷编码序列。格雷编码序列必须以 0 开头。 - - - -## 解题思路 - -- 输出 n 位格雷码 -- 格雷码生成规则:以二进制为0值的格雷码为第零项,第一次改变最右边的位元,第二次改变右起第一个为1的位元的左边位元,第三、四次方法同第一、二次,如此反复,即可排列出 n 个位元的格雷码。 -- 可以直接模拟,也可以用递归求解。 - - -## 代码 - -```go - -package leetcode - -// 解法一 递归方法,时间复杂度和空间复杂度都较优 -func grayCode(n int) []int { - if n == 0 { - return []int{0} - } - res := []int{} - num := make([]int, n) - generateGrayCode(int(1<= 0; index-- { - if (*num)[index] == 1 { - break - } - } - if index == 0 { - (*num)[len(*num)-1] = flipGrayCode((*num)[len(*num)-1]) - } else { - (*num)[index-1] = flipGrayCode((*num)[index-1]) - } - } - generateGrayCode(n-1, step+1, num, res) - return -} - -func convertBinary(num []int) int { - res, rad := 0, 1 - for i := len(num) - 1; i >= 0; i-- { - res += num[i] * rad - rad *= 2 - } - return res -} - -func flipGrayCode(num int) int { - if num == 0 { - return 1 - } - return 0 -} - -// 解法二 直译 -func grayCode1(n int) []int { - var l uint = 1 << uint(n) - out := make([]int, l) - for i := uint(0); i < l; i++ { - out[i] = int((i >> 1) ^ i) - } - return out -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0090.Subsets-II.md b/website/content/ChapterFour/0090.Subsets-II.md deleted file mode 100755 index 53e156115..000000000 --- a/website/content/ChapterFour/0090.Subsets-II.md +++ /dev/null @@ -1,76 +0,0 @@ -# [90. Subsets II](https://leetcode.com/problems/subsets-ii/) - - -## 题目 - -Given a collection of integers that might contain duplicates, ***nums***, return all possible subsets (the power set). - -**Note**: The solution set must not contain duplicate subsets. - -**Example**: - - Input: [1,2,2] - Output: - [ - [2], - [1], - [1,2,2], - [2,2], - [1,2], - [] - ] - -## 题目大意 - -给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。 - - -## 解题思路 - -- 这一题是第 78 题的加强版,比第 78 题多了一个条件,数组中的数字会出现重复。 -- 解题方法依旧是 DFS,需要在回溯的过程中加上一些判断。 -- 这一题和第 78 题,第 491 题类似,可以一起解答和复习。 - - - -## 代码 - -```go - -package leetcode - -import ( - "fmt" - "sort" -) - -func subsetsWithDup(nums []int) [][]int { - c, res := []int{}, [][]int{} - sort.Ints(nums) // 这里是去重的关键逻辑 - for k := 0; k <= len(nums); k++ { - generateSubsetsWithDup(nums, k, 0, c, &res) - } - return res -} - -func generateSubsetsWithDup(nums []int, k, start int, c []int, res *[][]int) { - if len(c) == k { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - return - } - // i will at most be n - (k - c.size()) + 1 - for i := start; i < len(nums)-(k-len(c))+1; i++ { - fmt.Printf("i = %v start = %v c = %v\n", i, start, c) - if i > start && nums[i] == nums[i-1] { // 这里是去重的关键逻辑,本次不取重复数字,下次循环可能会取重复数字 - continue - } - c = append(c, nums[i]) - generateSubsetsWithDup(nums, k, i+1, c, res) - c = c[:len(c)-1] - } - return -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0091.Decode-Ways.md b/website/content/ChapterFour/0091.Decode-Ways.md deleted file mode 100755 index 11dc54166..000000000 --- a/website/content/ChapterFour/0091.Decode-Ways.md +++ /dev/null @@ -1,82 +0,0 @@ -# [91. Decode Ways](https://leetcode.com/problems/decode-ways/) - - -## 题目 - -A message containing letters from `A-Z` is being encoded to numbers using the following mapping: - - 'A' -> 1 - 'B' -> 2 - ... - 'Z' -> 26 - -Given a **non-empty** string containing only digits, determine the total number of ways to decode it. - -**Example 1**: - - Input: "12" - Output: 2 - Explanation: It could be decoded as "AB" (1 2) or "L" (12). - -**Example 2**: - - Input: "226" - Output: 3 - Explanation: It could be decoded as "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6). - -## 题目大意 - -一条包含字母 A-Z 的消息通过以下方式进行了编码: - -```go -'A' -> 1 -'B' -> 2 -... -'Z' -> 26 -``` - -给定一个只包含数字的非空字符串,请计算解码方法的总数。 - - - -## 解题思路 - -- 给出一个数字字符串,题目要求把数字映射成 26 个字母,映射以后问有多少种可能的翻译方法。 -- 这题思路也是 DP。`dp[n]` 代表翻译长度为 n 个字符的字符串的方法总数。由于题目中的数字可能出现 0,0 不能翻译成任何字母,所以出现 0 要跳过。dp[0] 代表空字符串,只有一种翻译方法,`dp[0] = 1`。dp[1] 需要考虑原字符串是否是 0 开头的,如果是 0 开头的,`dp[1] = 0`,如果不是 0 开头的,`dp[1] = 1`。状态转移方程是 `dp[i] += dp[i-1] (当 1 ≤ s[i-1 : i] ≤ 9);dp[i] += dp[i-2] (当 10 ≤ s[i-2 : i] ≤ 26)`。最终结果是 `dp[n]`。 - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -func numDecodings(s string) int { - if len(s) == 0 { - return 0 - } - dp := make([]int, len(s)+1) - dp[0] = 1 - if s[:1] == "0" { - dp[1] = 0 - } else { - dp[1] = 1 - } - for i := 2; i <= len(s); i++ { - lastNum, _ := strconv.Atoi(s[i-1 : i]) - if lastNum >= 1 && lastNum <= 9 { - dp[i] += dp[i-1] - } - lastNum, _ = strconv.Atoi(s[i-2 : i]) - if lastNum >= 10 && lastNum <= 26 { - dp[i] += dp[i-2] - } - } - return dp[len(s)] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0092.Reverse-Linked-List-II.md b/website/content/ChapterFour/0092.Reverse-Linked-List-II.md deleted file mode 100644 index 59cd5d573..000000000 --- a/website/content/ChapterFour/0092.Reverse-Linked-List-II.md +++ /dev/null @@ -1,65 +0,0 @@ -# [92. Reverse Linked List II](https://leetcode.com/problems/reverse-linked-list-ii/) - -## 题目 - -Reverse a linked list from position m to n. Do it in one-pass. - -**Note**: 1 ≤ m ≤ n ≤ length of list. - -**Example**: - -``` - -Input: 1->2->3->4->5->NULL, m = 2, n = 4 -Output: 1->4->3->2->5->NULL - -``` - - -## 题目大意 - -给定 2 个链表中结点的位置 m, n,反转这个两个位置区间内的所有结点。 - -## 解题思路 - -由于有可能整个链表都被反转,所以构造一个新的头结点指向当前的头。之后的处理方法是:找到第一个需要反转的结点的前一个结点 p,从这个结点开始,依次把后面的结点用“头插”法,插入到 p 结点的后面。循环次数用 n-m 来控制。 - -这一题结点可以原地变化,更改各个结点的 next 指针就可以。不需要游标 p 指针。因为每次逆序以后,原有结点的相对位置就发生了变化,相当于游标指针已经移动了,所以不需要再有游标 p = p.Next 的操作了。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func reverseBetween(head *ListNode, m int, n int) *ListNode { - if head == nil || m >= n { - return head - } - newHead := &ListNode{Val: 0, Next: head} - pre := newHead - for count := 0; pre.Next != nil && count < m-1; count++ { - pre = pre.Next - } - if pre.Next == nil { - return head - } - cur := pre.Next - for i := 0; i < n-m; i++ { - tmp := pre.Next - pre.Next = cur.Next - cur.Next = cur.Next.Next - pre.Next.Next = tmp - } - return newHead.Next -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0093.Restore-IP-Addresses.md b/website/content/ChapterFour/0093.Restore-IP-Addresses.md deleted file mode 100755 index 1ef2120d0..000000000 --- a/website/content/ChapterFour/0093.Restore-IP-Addresses.md +++ /dev/null @@ -1,78 +0,0 @@ -# [93. Restore IP Addresses](https://leetcode.com/problems/restore-ip-addresses/) - - -## 题目 - -Given a string containing only digits, restore it by returning all possible valid IP address combinations. - -**Example**: - - Input: "25525511135" - Output: ["255.255.11.135", "255.255.111.35"] - -## 题目大意 - -给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 - -## 解题思路 - -- DFS 深搜 -- 需要注意的点是 IP 的规则,以 0 开头的数字和超过 255 的数字都为非法的。 - - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -func restoreIPAddresses(s string) []string { - if s == "" { - return []string{} - } - res, ip := []string{}, []int{} - dfs(s, 0, ip, &res) - return res -} - -func dfs(s string, index int, ip []int, res *[]string) { - if index == len(s) { - if len(ip) == 4 { - *res = append(*res, getString(ip)) - } - return - } - if index == 0 { - num, _ := strconv.Atoi(string(s[0])) - ip = append(ip, num) - dfs(s, index+1, ip, res) - } else { - num, _ := strconv.Atoi(string(s[index])) - next := ip[len(ip)-1]*10 + num - if next <= 255 && ip[len(ip)-1] != 0 { - ip[len(ip)-1] = next - dfs(s, index+1, ip, res) - ip[len(ip)-1] /= 10 - } - if len(ip) < 4 { - ip = append(ip, num) - dfs(s, index+1, ip, res) - ip = ip[:len(ip)-1] - } - } -} - -func getString(ip []int) string { - res := strconv.Itoa(ip[0]) - for i := 1; i < len(ip); i++ { - res += "." + strconv.Itoa(ip[i]) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md b/website/content/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md deleted file mode 100644 index 1161f1584..000000000 --- a/website/content/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md +++ /dev/null @@ -1,73 +0,0 @@ -# [94. Binary Tree Inorder Traversal](https://leetcode.com/problems/binary-tree-inorder-traversal/) - -## 题目 - - -Given a binary tree, return the inorder traversal of its nodes' values. - - - -**Example**: - -``` - -Input: [1,null,2,3] - 1 - \ - 2 - / - 3 - -Output: [1,3,2] - -``` - - -**Follow up**: Recursive solution is trivial, could you do it iteratively? - - - - - - -## 题目大意 - -中根遍历一颗树。 - -## 解题思路 - -递归的实现方法,见代码。 - - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func inorderTraversal(root *TreeNode) []int { - var result []int - inorder(root, &result) - return result -} - -func inorder(root *TreeNode, output *[]int) { - if root != nil { - inorder(root.Left, output) - *output = append(*output, root.Val) - inorder(root.Right, output) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0096.Unique-Binary-Search-Trees.md b/website/content/ChapterFour/0096.Unique-Binary-Search-Trees.md deleted file mode 100755 index a3fca5ef1..000000000 --- a/website/content/ChapterFour/0096.Unique-Binary-Search-Trees.md +++ /dev/null @@ -1,53 +0,0 @@ -# [96. Unique Binary Search Trees](https://leetcode.com/problems/unique-binary-search-trees/) - - -## 题目 - -Given *n*, how many structurally unique **BST's** (binary search trees) that store values 1 ... *n*? - -**Example**: - - Input: 3 - Output: 5 - Explanation: - Given n = 3, there are a total of 5 unique BST's: - - 1 3 3 2 1 - \ / / / \ \ - 3 2 1 1 3 2 - / / \ \ - 2 1 2 3 - -## 题目大意 - -给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? - - -## 解题思路 - -- 给出 n,要求利用 1-n 这些数字组成二叉排序树,有多少种不同的树的形态,输出这个个数。 -- 这题的解题思路是 DP。`dp[n]` 代表 1-n 个数能组成多少个不同的二叉排序树,`F(i,n)` 代表以 `i` 为根节点,1-n 个数组成的二叉排序树的不同的个数。由于题意,我们可以得到这个等式:`dp[n] = F(1,n) + F(2,n) + F(3,n) + …… + F(n,n)` 。初始值 `dp[0] = 1`,`dp[1] = 1`。分析 `dp` 和 `F(i,n)` 的关系又可以得到下面这个等式 `F(i,n) = dp[i-1] * dp[n-i]` 。举例,[1,2,3,4,…, i ,…,n-1,n],以 `i` 为 根节点,那么左半边 [1,2,3,……,i-1] 和 右半边 [i+1,i+2,……,n-1,n] 分别能组成二叉排序树的不同个数`相乘`,即为以 `i` 为根节点,1-n 个数组成的二叉排序树的不同的个数,也即 `F(i,n)`。 - -> 注意,由于二叉排序树本身的性质,右边的子树一定比左边的子树,值都要大。所以这里只需要根节点把树分成左右,不需要再关心左右两边数字的大小,只需要关心数字的个数。 - -- 所以状态转移方程是 `dp[i] = dp[0] * dp[n-1] + dp[1] * dp[n-2] + …… + dp[n-1] * dp[0]`,最终要求的结果是 `dp[n]` 。 - - -## 代码 - -```go - -package leetcode - -func numTrees(n int) int { - dp := make([]int, n+1) - dp[0], dp[1] = 1, 1 - for i := 2; i <= n; i++ { - for j := 1; j <= i; j++ { - dp[i] += dp[j-1] * dp[i-j] - } - } - return dp[n] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0098.Validate-Binary-Search-Tree.md b/website/content/ChapterFour/0098.Validate-Binary-Search-Tree.md deleted file mode 100755 index 870f35989..000000000 --- a/website/content/ChapterFour/0098.Validate-Binary-Search-Tree.md +++ /dev/null @@ -1,99 +0,0 @@ -# [98. Validate Binary Search Tree](https://leetcode.com/problems/validate-binary-search-tree/) - - -## 题目 - -Given a binary tree, determine if it is a valid binary search tree (BST). - -Assume a BST is defined as follows: - -- The left subtree of a node contains only nodes with keys **less than** the node's key. -- The right subtree of a node contains only nodes with keys **greater than** the node's key. -- Both the left and right subtrees must also be binary search trees. - -**xample 1:** - - 2 - / \ - 1 3 - - Input: [2,1,3] - Output: true - -**Example 2**: - - 5 - / \ - 1 4 - / \ - 3 6 - - Input: [5,1,4,null,null,3,6] - Output: false - Explanation: The root node's value is 5 but its right child's value is 4. - -## 题目大意 - -给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征: - -- 节点的左子树只包含小于当前节点的数。 -- 节点的右子树只包含大于当前节点的数。 -- 所有左子树和右子树自身必须也是二叉搜索树。 - - -## 解题思路 - -- 判断一个树是否是 BST,按照定义递归判断即可 - - -## 代码 - -```go - -package leetcode - -import "math" - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一,直接按照定义比较大小,比 root 节点小的都在左边,比 root 节点大的都在右边 -func isValidBST(root *TreeNode) bool { - return isValidbst(root, math.Inf(-1), math.Inf(1)) -} -func isValidbst(root *TreeNode, min, max float64) bool { - if root == nil { - return true - } - v := float64(root.Val) - return v < max && v > min && isValidbst(root.Left, min, v) && isValidbst(root.Right, v, max) -} - -// 解法二,把 BST 按照左中右的顺序输出到数组中,如果是 BST,则数组中的数字是从小到大有序的,如果出现逆序就不是 BST -func isValidBST1(root *TreeNode) bool { - arr := []int{} - inOrder(root, &arr) - for i := 1; i < len(arr); i++ { - if arr[i-1] >= arr[i] { - return false - } - } - return true -} - -func inOrder(root *TreeNode, arr *[]int) { - if root == nil { - return - } - inOrder(root.Left, arr) - *arr = append(*arr, root.Val) - inOrder(root.Right, arr) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0099.Recover-Binary-Search-Tree.md b/website/content/ChapterFour/0099.Recover-Binary-Search-Tree.md deleted file mode 100755 index 0a0e86e98..000000000 --- a/website/content/ChapterFour/0099.Recover-Binary-Search-Tree.md +++ /dev/null @@ -1,101 +0,0 @@ -# [99. Recover Binary Search Tree](https://leetcode.com/problems/recover-binary-search-tree/) - - -## 题目 - -Two elements of a binary search tree (BST) are swapped by mistake. - -Recover the tree without changing its structure. - -**Example 1**: - - Input: [1,3,null,null,2] - - 1 - / - 3 - \ - 2 - - Output: [3,1,null,null,2] - - 3 - / - 1 - \ - 2 - -**Example 2**: - - Input: [3,1,4,null,null,2] - - 3 - / \ - 1 4 - / - 2 - - Output: [2,1,4,null,null,3] - - 2 - / \ - 1 4 - / - 3 - -**Follow up**: - -- A solution using O(*n*) space is pretty straight forward. -- Could you devise a constant space solution? - -## 题目大意 - -二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。 - - -## 解题思路 - -- 在二叉搜索树中,有 2 个结点的值出错了,要求修复这两个结点。 -- 这一题按照先根遍历 1 次就可以找到这两个出问题的结点,因为先访问根节点,然后左孩子,右孩子。用先根遍历二叉搜索树的时候,根结点比左子树都要大,根结点比右子树都要小。所以`左子树比根结点大的话,就是出现了乱序`;`根节点比右子树大的话,就是出现了乱序`。遍历过程中在左子树中如果出现了前一次遍历的结点的值大于此次根节点的值,这就出现了出错结点了,记录下来。继续遍历直到找到第二个这样的结点。最后交换这两个结点的时候,只是交换他们的值就可以了,而不是交换这两个结点相应的指针指向。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func recoverTree(root *TreeNode) { - var prev, target1, target2 *TreeNode - _, target1, target2 = inOrderTraverse(root, prev, target1, target2) - if target1 != nil && target2 != nil { - target1.Val, target2.Val = target2.Val, target1.Val - } - -} - -func inOrderTraverse(root, prev, target1, target2 *TreeNode) (*TreeNode, *TreeNode, *TreeNode) { - if root == nil { - return prev, target1, target2 - } - prev, target1, target2 = inOrderTraverse(root.Left, prev, target1, target2) - if prev != nil && prev.Val > root.Val { - if target1 == nil { - target1 = prev - } - target2 = root - } - prev = root - prev, target1, target2 = inOrderTraverse(root.Right, prev, target1, target2) - return prev, target1, target2 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0100.Same-Tree.md b/website/content/ChapterFour/0100.Same-Tree.md deleted file mode 100644 index 6c12131bf..000000000 --- a/website/content/ChapterFour/0100.Same-Tree.md +++ /dev/null @@ -1,92 +0,0 @@ -# [100. Same Tree](https://leetcode.com/problems/same-tree/) - -## 题目 - - -Given two binary trees, write a function to check if they are the same or not. - -Two binary trees are considered the same if they are structurally identical and the nodes have the same value. - -**Example 1**: - - -``` - -Input: 1 1 - / \ / \ - 2 3 2 3 - - [1,2,3], [1,2,3] - -Output: true - -``` - -**Example 2**: - -``` - -Input: 1 1 - / \ - 2 2 - - [1,2], [1,null,2] - -Output: false - -``` - -**Example 3**: - -``` - -Input: 1 1 - / \ / \ - 2 1 1 2 - - [1,2,1], [1,1,2] - -Output: false - -``` - -## 题目大意 - -这一题要求判断 2 颗树是否是完全相等的。 - - -## 解题思路 - -递归判断即可。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func isSameTree(p *TreeNode, q *TreeNode) bool { - if p == nil && q == nil { - return true - } else if p != nil && q != nil { - if p.Val != q.Val { - return false - } - return isSameTree(p.Left, q.Left) && isSameTree(p.Right, q.Right) - } else { - return false - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0101.Symmetric-Tree.md b/website/content/ChapterFour/0101.Symmetric-Tree.md deleted file mode 100644 index b3f2ea189..000000000 --- a/website/content/ChapterFour/0101.Symmetric-Tree.md +++ /dev/null @@ -1,71 +0,0 @@ -# [101. Symmetric Tree](https://leetcode.com/problems/symmetric-tree/) - -## 题目 - - -Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). - -For example, this binary tree [1,2,2,3,4,4,3] is symmetric: - - -``` - - 1 - / \ - 2 2 - / \ / \ -3 4 4 3 - -``` - -But the following [1,2,2,null,3,null,3] is not: - -``` - - 1 - / \ - 2 2 - \ \ - 3 3 - -``` - -**Note**: - -Bonus points if you could solve it both recursively and iteratively. - -## 题目大意 - -这一题要求判断 2 颗树是否是左右对称的。 - - -## 解题思路 - -- 这道题是几道题的综合题。将根节点的左字数反转二叉树,然后再和根节点的右节点进行比较,是否完全相等。 -- 反转二叉树是第 226 题。判断 2 颗树是否完全相等是第 100 题。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func isSymmetric(root *TreeNode) bool { - if root == nil { - return true - } - return isSameTree(invertTree(root.Left), root.Right) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0102.Binary-Tree-Level-Order-Traversal.md b/website/content/ChapterFour/0102.Binary-Tree-Level-Order-Traversal.md deleted file mode 100644 index 6848f2caf..000000000 --- a/website/content/ChapterFour/0102.Binary-Tree-Level-Order-Traversal.md +++ /dev/null @@ -1,115 +0,0 @@ -# [102. Binary Tree Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/) - -## 题目 - - -Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). - -**For Example**: - -Given binary tree [3,9,20,null,null,15,7], - -``` - - 3 - / \ - 9 20 - / \ - 15 7 - -``` - -return its level order traversal as: - -``` - -[ - [3], - [9,20], - [15,7] -] - -``` - - -## 题目大意 - -按层序从上到下遍历一颗树。 - -## 解题思路 - -用一个队列即可实现。 - - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 BFS -func levelOrder(root *TreeNode) [][]int { - if root == nil { - return [][]int{} - } - queue := []*TreeNode{} - queue = append(queue, root) - curNum, nextLevelNum, res, tmp := 1, 0, [][]int{}, []int{} - for len(queue) != 0 { - if curNum > 0 { - node := queue[0] - if node.Left != nil { - queue = append(queue, node.Left) - nextLevelNum++ - } - if node.Right != nil { - queue = append(queue, node.Right) - nextLevelNum++ - } - curNum-- - tmp = append(tmp, node.Val) - queue = queue[1:] - } - if curNum == 0 { - res = append(res, tmp) - curNum = nextLevelNum - nextLevelNum = 0 - tmp = []int{} - } - } - return res -} - -// 解法二 DFS -func levelOrder1(root *TreeNode) [][]int { - levels := [][]int{} - dfsLevel(root, -1, &levels) - return levels -} - -func dfsLevel(node *TreeNode, level int, res *[][]int) { - if node == nil { - return - } - currLevel := level + 1 - for len(*res) <= currLevel { - *res = append(*res, []int{}) - } - (*res)[currLevel] = append((*res)[currLevel], node.Val) - dfsLevel(node.Left, currLevel, res) - dfsLevel(node.Right, currLevel, res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0104.Maximum-Depth-of-Binary-Tree.md b/website/content/ChapterFour/0104.Maximum-Depth-of-Binary-Tree.md deleted file mode 100644 index 3502cb855..000000000 --- a/website/content/ChapterFour/0104.Maximum-Depth-of-Binary-Tree.md +++ /dev/null @@ -1,60 +0,0 @@ -# [104. Maximum Depth of Binary Tree](https://leetcode.com/problems/maximum-depth-of-binary-tree/) - -## 题目 - -Given a binary tree, find its maximum depth. - -The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. - -**Note**: A leaf is a node with no children. - -**Example**: - -Given binary tree [3,9,20,null,null,15,7], - -``` - - 3 - / \ - 9 20 - / \ - 15 7 - -``` - -return its depth = 3. - - -## 题目大意 - -要求输出一棵树的最大高度。 - -## 解题思路 - -这一题递归遍历就可,遍历根节点的左孩子的高度和根节点右孩子的高度,取出两者的最大值再加一即为总高度。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func maxDepth(root *TreeNode) int { - if root == nil { - return 0 - } - return max(maxDepth(root.Left), maxDepth(root.Right)) + 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0105.Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal.md b/website/content/ChapterFour/0105.Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal.md deleted file mode 100755 index 0d6259c05..000000000 --- a/website/content/ChapterFour/0105.Construct-Binary-Tree-from-Preorder-and-Inorder-Traversal.md +++ /dev/null @@ -1,73 +0,0 @@ -# [105. Construct Binary Tree from Preorder and Inorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/) - - -## 题目 - -Given preorder and inorder traversal of a tree, construct the binary tree. - -**Note**:You may assume that duplicates do not exist in the tree. - -For example, given - - preorder = [3,9,20,15,7] - inorder = [9,3,15,20,7] - -Return the following binary tree: - - 3 - / \ - 9 20 - / \ - 15 7 - - - -## 题目大意 - -根据一棵树的前序遍历与中序遍历构造二叉树。 - -注意: -你可以假设树中没有重复的元素。 - - -## 解题思路 - -- 给出 2 个数组,根据 preorder 和 inorder 数组构造一颗树。 -- 利用递归思想,从 preorder 可以得到根节点,从 inorder 中得到左子树和右子树。只剩一个节点的时候即为根节点。不断的递归直到所有的树都生成完成。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func buildTree(preorder []int, inorder []int) *TreeNode { - inPos := make(map[int]int) - for i := 0; i < len(inorder); i++ { - inPos[inorder[i]] = i - } - return buildPreIn2TreeDFS(preorder, 0, len(preorder)-1, 0, inPos) -} - -func buildPreIn2TreeDFS(pre []int, preStart int, preEnd int, inStart int, inPos map[int]int) *TreeNode { - if preStart > preEnd { - return nil - } - root := &TreeNode{Val: pre[preStart]} - rootIdx := inPos[pre[preStart]] - leftLen := rootIdx - inStart - root.Left = buildPreIn2TreeDFS(pre, preStart+1, preStart+leftLen, inStart, inPos) - root.Right = buildPreIn2TreeDFS(pre, preStart+leftLen+1, preEnd, rootIdx+1, inPos) - return root -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md b/website/content/ChapterFour/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md deleted file mode 100755 index 62ea1c8a6..000000000 --- a/website/content/ChapterFour/0106.Construct-Binary-Tree-from-Inorder-and-Postorder-Traversal.md +++ /dev/null @@ -1,71 +0,0 @@ -# [106. Construct Binary Tree from Inorder and Postorder Traversal](https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/) - -## 题目 - -Given inorder and postorder traversal of a tree, construct the binary tree. - -**Note**: You may assume that duplicates do not exist in the tree. - -For example, given - - inorder = [9,3,15,20,7] - postorder = [9,15,7,20,3] - -Return the following binary tree: - - 3 - / \ - 9 20 - / \ - 15 7 - - -## 题目大意 - -根据一棵树的中序遍历与后序遍历构造二叉树。 - -注意: -你可以假设树中没有重复的元素。 - - -## 解题思路 - -- 给出 2 个数组,根据 inorder 和 postorder 数组构造一颗树。 -- 利用递归思想,从 postorder 可以得到根节点,从 inorder 中得到左子树和右子树。只剩一个节点的时候即为根节点。不断的递归直到所有的树都生成完成。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func buildTree106(inorder []int, postorder []int) *TreeNode { - inPos := make(map[int]int) - for i := 0; i < len(inorder); i++ { - inPos[inorder[i]] = i - } - return buildInPos2TreeDFS(postorder, 0, len(postorder)-1, 0, inPos) -} - -func buildInPos2TreeDFS(post []int, postStart int, postEnd int, inStart int, inPos map[int]int) *TreeNode { - if postStart > postEnd { - return nil - } - root := &TreeNode{Val: post[postEnd]} - rootIdx := inPos[post[postEnd]] - leftLen := rootIdx - inStart - root.Left = buildInPos2TreeDFS(post, postStart, postStart+leftLen-1, inStart, inPos) - root.Right = buildInPos2TreeDFS(post, postStart+leftLen, postEnd-1, rootIdx+1, inPos) - return root -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0107.Binary-Tree-Level-Order-Traversal-II.md b/website/content/ChapterFour/0107.Binary-Tree-Level-Order-Traversal-II.md deleted file mode 100644 index 5054e26fa..000000000 --- a/website/content/ChapterFour/0107.Binary-Tree-Level-Order-Traversal-II.md +++ /dev/null @@ -1,70 +0,0 @@ -# [107. Binary Tree Level Order Traversal II](https://leetcode.com/problems/binary-tree-level-order-traversal-ii/) - -## 题目 - -Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). - -**For Example**: - -Given binary tree [3,9,20,null,null,15,7], - -``` - - 3 - / \ - 9 20 - / \ - 15 7 - -``` - -return its bottom-up level order traversal as: - - -``` - -[ - [15,7], - [9,20], - [3] -] - -``` - - -## 题目大意 - -按层序从下到上遍历一颗树。 - -## 解题思路 - -用一个队列即可实现。 - - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func levelOrderBottom(root *TreeNode) [][]int { - tmp := levelOrder(root) - res := [][]int{} - for i := len(tmp) - 1; i >= 0; i-- { - res = append(res, tmp[i]) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0108.Convert-Sorted-Array-to-Binary-Search-Tree.md b/website/content/ChapterFour/0108.Convert-Sorted-Array-to-Binary-Search-Tree.md deleted file mode 100755 index b888c624c..000000000 --- a/website/content/ChapterFour/0108.Convert-Sorted-Array-to-Binary-Search-Tree.md +++ /dev/null @@ -1,52 +0,0 @@ -# [108. Convert Sorted Array to Binary Search Tree](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/) - - -## 题目 - -Given an array where elements are sorted in ascending order, convert it to a height balanced BST. - -For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of *every* node never differ by more than 1. - -**Example**: - - Given the sorted array: [-10,-3,0,5,9], - - One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: - - 0 - / \ - -3 9 - / / - -10 5 - -## 题目大意 - -将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 - -## 解题思路 - -- 把一个有序数组转换成高度平衡的二叉搜索数,按照定义即可 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func sortedArrayToBST(nums []int) *TreeNode { - if len(nums) == 0 { - return nil - } - return &TreeNode{Val: nums[len(nums)/2], Left: sortedArrayToBST(nums[:len(nums)/2]), Right: sortedArrayToBST(nums[len(nums)/2+1:])} -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0109.Convert-Sorted-List-to-Binary-Search-Tree.md b/website/content/ChapterFour/0109.Convert-Sorted-List-to-Binary-Search-Tree.md deleted file mode 100644 index 5ddfce296..000000000 --- a/website/content/ChapterFour/0109.Convert-Sorted-List-to-Binary-Search-Tree.md +++ /dev/null @@ -1,97 +0,0 @@ -# [109. Convert Sorted List to Binary Search Tree](https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/) - -## 题目 - -Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. - -For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. - -**Example**: - -``` - -Given the sorted linked list: [-10,-3,0,5,9], - -One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: - - 0 - / \ - -3 9 - / / - -10 5 - -``` - - -## 题目大意 - -将链表转化为高度平衡的二叉搜索树。高度平衡的定义:每个结点的 2 个子结点的深度不能相差超过 1 。 - -## 解题思路 - -思路比较简单,依次把链表的中间点作为根结点,类似二分的思想,递归排列所有结点即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// TreeNode define -type TreeNode struct { - Val int - Left *TreeNode - Right *TreeNode -} - -func sortedListToBST(head *ListNode) *TreeNode { - if head == nil { - return nil - } - if head != nil && head.Next == nil { - return &TreeNode{Val: head.Val, Left: nil, Right: nil} - } - middleNode, preNode := middleNodeAndPreNode(head) - if middleNode == nil { - return nil - } - if preNode != nil { - preNode.Next = nil - } - if middleNode == head { - head = nil - } - return &TreeNode{Val: middleNode.Val, Left: sortedListToBST(head), Right: sortedListToBST(middleNode.Next)} -} - -func middleNodeAndPreNode(head *ListNode) (middle *ListNode, pre *ListNode) { - if head == nil || head.Next == nil { - return nil, head - } - p1 := head - p2 := head - for p2.Next != nil && p2.Next.Next != nil { - pre = p1 - p1 = p1.Next - p2 = p2.Next.Next - } - return p1, pre -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0110.Balanced-Binary-Tree.md b/website/content/ChapterFour/0110.Balanced-Binary-Tree.md deleted file mode 100644 index 9417fd714..000000000 --- a/website/content/ChapterFour/0110.Balanced-Binary-Tree.md +++ /dev/null @@ -1,90 +0,0 @@ -# [110. Balanced Binary Tree](https://leetcode.com/problems/balanced-binary-tree/) - -## 题目 - - -Given a binary tree, determine if it is height-balanced. - -For this problem, a height-balanced binary tree is defined as: - -a binary tree in which the depth of the two subtrees of every node never differ by more than 1. - -**Example 1**: - -Given the following tree [3,9,20,null,null,15,7]: - -``` - - 3 - / \ - 9 20 - / \ - 15 7 - -``` - -Return true. - -**Example 2**: - -Given the following tree [1,2,2,3,3,null,null,4,4]: - - -``` - - 1 - / \ - 2 2 - / \ - 3 3 - / \ - 4 4 - -``` - -Return false. - - -## 题目大意 - -判断一棵树是不是平衡二叉树。平衡二叉树的定义是:树中每个节点都满足左右两个子树的高度差 <= 1 的这个条件。 - - -## 解题思路 - -根据定义判断即可,计算树的高度是第 104 题。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func isBalanced(root *TreeNode) bool { - if root == nil { - return true - } - leftHight := depth(root.Left) - rightHight := depth(root.Right) - return abs(leftHight-rightHight) <= 1 && isBalanced(root.Left) && isBalanced(root.Right) -} - -func depth(root *TreeNode) int { - if root == nil { - return 0 - } - return max(depth(root.Left), depth(root.Right)) + 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md b/website/content/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md deleted file mode 100755 index 12019aedc..000000000 --- a/website/content/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md +++ /dev/null @@ -1,62 +0,0 @@ -# [111. Minimum Depth of Binary Tree](https://leetcode.com/problems/minimum-depth-of-binary-tree/) - - -## 题目 - -Given a binary tree, find its minimum depth. - -The minimum depth is the number of nodes along the shortest path from the root node down to the nearest leaf node. - -**Note**: A leaf is a node with no children. - -**Example**: - -Given binary tree `[3,9,20,null,null,15,7]`, - - 3 - / \ - 9 20 - / \ - 15 7 - -return its minimum depth = 2. - -## 题目大意 - -给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。 - - -## 解题思路 - -- 递归求出根节点到叶子节点的深度,输出最小值即可 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func minDepth(root *TreeNode) int { - if root == nil { - return 0 - } - if root.Left == nil { - return minDepth(root.Right) + 1 - } - if root.Right == nil { - return minDepth(root.Left) + 1 - } - return min(minDepth(root.Left), minDepth(root.Right)) + 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0112.Path-Sum.md b/website/content/ChapterFour/0112.Path-Sum.md deleted file mode 100755 index 19a226319..000000000 --- a/website/content/ChapterFour/0112.Path-Sum.md +++ /dev/null @@ -1,59 +0,0 @@ -# [112. Path Sum](https://leetcode.com/problems/path-sum/) - - -## 题目 - -Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. - -**Note**: A leaf is a node with no children. - -**Example**: - -Given the below binary tree and `sum = 22`, - - 5 - / \ - 4 8 - / / \ - 11 13 4 - / \ \ - 7 2 1 - -return true, as there exist a root-to-leaf path `5->4->11->2` which sum is 22. - -## 题目大意 - -给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。 - - -## 解题思路 - -- 递归求解即可 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func hasPathSum(root *TreeNode, sum int) bool { - if root == nil { - return false - } - if root.Left == nil && root.Right == nil { - return sum == root.Val - } - return hasPathSum(root.Left, sum-root.Val) || hasPathSum(root.Right, sum-root.Val) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0113.Path-Sum-II.md b/website/content/ChapterFour/0113.Path-Sum-II.md deleted file mode 100755 index ac592ca89..000000000 --- a/website/content/ChapterFour/0113.Path-Sum-II.md +++ /dev/null @@ -1,108 +0,0 @@ -# [113. Path Sum II](https://leetcode.com/problems/path-sum-ii/) - - -## 题目 - -Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. - -**Note**: A leaf is a node with no children. - -**Example**: - -Given the below binary tree and `sum = 22`, - - 5 - / \ - 4 8 - / / \ - 11 13 4 - / \ / \ - 7 2 5 1 - -Return: - - [ - [5,4,11,2], - [5,8,4,5] - ] - -## 题目大意 - -给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。 - -## 解题思路 - -- 这一题是第 257 题和第 112 题的组合增强版 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 -func pathSum(root *TreeNode, sum int) [][]int { - var slice [][]int - slice = findPath(root, sum, slice, []int(nil)) - return slice -} - -func findPath(n *TreeNode, sum int, slice [][]int, stack []int) [][]int { - if n == nil { - return slice - } - sum -= n.Val - stack = append(stack, n.Val) - if sum == 0 && n.Left == nil && n.Right == nil { - slice = append(slice, append([]int{}, stack...)) - stack = stack[:len(stack)-1] - } - slice = findPath(n.Left, sum, slice, stack) - slice = findPath(n.Right, sum, slice, stack) - return slice -} - -// 解法二 -func pathSum1(root *TreeNode, sum int) [][]int { - if root == nil { - return [][]int{} - } - if root.Left == nil && root.Right == nil { - if sum == root.Val { - return [][]int{[]int{root.Val}} - } - } - path, res := []int{}, [][]int{} - tmpLeft := pathSum(root.Left, sum-root.Val) - path = append(path, root.Val) - if len(tmpLeft) > 0 { - for i := 0; i < len(tmpLeft); i++ { - tmpLeft[i] = append(path, tmpLeft[i]...) - } - res = append(res, tmpLeft...) - } - path = []int{} - tmpRight := pathSum(root.Right, sum-root.Val) - path = append(path, root.Val) - - if len(tmpRight) > 0 { - for i := 0; i < len(tmpRight); i++ { - tmpRight[i] = append(path, tmpRight[i]...) - } - res = append(res, tmpRight...) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0114.Flatten-Binary-Tree-to-Linked-List.md b/website/content/ChapterFour/0114.Flatten-Binary-Tree-to-Linked-List.md deleted file mode 100755 index 4cfc5452b..000000000 --- a/website/content/ChapterFour/0114.Flatten-Binary-Tree-to-Linked-List.md +++ /dev/null @@ -1,191 +0,0 @@ -# [114. Flatten Binary Tree to Linked List](https://leetcode.com/problems/flatten-binary-tree-to-linked-list/) - - -## 题目 - -Given a binary tree, flatten it to a linked list in-place. - -For example, given the following tree: - - 1 - / \ - 2 5 - / \ \ - 3 4 6 - -The flattened tree should look like: - - 1 - \ - 2 - \ - 3 - \ - 4 - \ - 5 - \ - 6 - -## 题目大意 - -给定一个二叉树,原地将它展开为链表。 - -## 解题思路 - -- 要求把二叉树“打平”,按照先根遍历的顺序,把树的结点都放在右结点中。 -- 按照递归和非递归思路实现即可。 -- 递归的思路可以这么想:倒序遍历一颗树,即是先遍历右孩子,然后遍历左孩子,最后再遍历根节点。 - - 1 - / \ - 2 5 - / \ \ - 3 4 6 - ----------- - pre = 5 - cur = 4 - - 1 - / - 2 - / \ - 3 4 - \ - 5 - \ - 6 - ----------- - pre = 4 - cur = 3 - - 1 - / - 2 - / - 3 - \ - 4 - \ - 5 - \ - 6 - ----------- - cur = 2 - pre = 3 - - 1 - / - 2 - \ - 3 - \ - 4 - \ - 5 - \ - 6 - ----------- - cur = 1 - pre = 2 - - 1 - \ - 2 - \ - 3 - \ - 4 - \ - 5 - \ - 6 - -- 可以先仿造先根遍历的代码,写出这个倒序遍历的逻辑: - - public void flatten(TreeNode root) { - if (root == null) - return; - flatten(root.right); - flatten(root.left); - } - -- 实现了倒序遍历的逻辑以后,再进行结点之间的拼接: - - private TreeNode prev = null; - - public void flatten(TreeNode root) { - if (root == null) - return; - flatten(root.right); - flatten(root.left); - root.right = prev; - root.left = null; - prev = root; - } - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 非递归 -func flatten(root *TreeNode) { - list, cur := []int{}, &TreeNode{} - preorder(root, &list) - cur = root - for i := 1; i < len(list); i++ { - cur.Left = nil - cur.Right = &TreeNode{Val: list[i], Left: nil, Right: nil} - cur = cur.Right - } - return -} - -// 解法二 递归 -func flatten1(root *TreeNode) { - if root == nil || (root.Left == nil && root.Right == nil) { - return - } - flatten(root.Left) - flatten(root.Right) - currRight := root.Right - root.Right = root.Left - root.Left = nil - for root.Right != nil { - root = root.Right - } - root.Right = currRight -} - -// 解法三 递归 -func flatten2(root *TreeNode) { - if root == nil { - return - } - flatten(root.Right) - if root.Left == nil { - return - } - flatten(root.Left) - p := root.Left - for p.Right != nil { - p = p.Right - } - p.Right = root.Right - root.Right = root.Left - root.Left = nil -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0118.Pascals-Triangle.md b/website/content/ChapterFour/0118.Pascals-Triangle.md deleted file mode 100644 index b74f58fab..000000000 --- a/website/content/ChapterFour/0118.Pascals-Triangle.md +++ /dev/null @@ -1,60 +0,0 @@ -# [118. Pascal's Triangle](https://leetcode.com/problems/pascals-triangle/) - - -## 题目 - -Given a non-negative integer numRows, generate the first numRows of Pascal's triangle. - -![](https://upload.wikimedia.org/wikipedia/commons/0/0d/PascalTriangleAnimated2.gif) - -**Note**: In Pascal's triangle, each number is the sum of the two numbers directly above it. - -**Example**: - -``` -Input: 5 -Output: -[ - [1], - [1,1], - [1,2,1], - [1,3,3,1], - [1,4,6,4,1] -] -``` - -## 题目大意 - -给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。 - - -## 解题思路 - -- 给定一个 n,要求打印杨辉三角的前 n 行。 -- 简单题。按照杨辉三角的生成规则循环打印即可。 - - -## 代码 - -```go - -package leetcode - -func generate(numRows int) [][]int { - result := [][]int{} - for i := 0; i < numRows; i++ { - row := []int{} - for j := 0; j < i+1; j++ { - if j == 0 || j == i { - row = append(row, 1) - } else if i > 1 { - row = append(row, result[i-1][j-1]+result[i-1][j]) - } - } - result = append(result, row) - } - return result -} - -``` - diff --git a/website/content/ChapterFour/0120.Triangle.md b/website/content/ChapterFour/0120.Triangle.md deleted file mode 100755 index d3ec11128..000000000 --- a/website/content/ChapterFour/0120.Triangle.md +++ /dev/null @@ -1,89 +0,0 @@ -# [120. Triangle](https://leetcode.com/problems/triangle/) - - -## 题目 - -Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. - -For example, given the following triangle - - [ - [2], - [3,4], - [6,5,7], - [4,1,8,3] - ] - -The minimum path sum from top to bottom is `11` (i.e., **2** + **3** + **5** + **1** = 11). - -**Note**: - -Bonus point if you are able to do this using only *O*(*n*) extra space, where *n* is the total number of rows in the triangle. - - -## 题目大意 - -给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。 - - -## 解题思路 - -- 求出从三角形顶端到底端的最小和。要求最好用 O(n) 的时间复杂度。 -- 这一题最优解是不用辅助空间,直接从下层往上层推。普通解法是用二维数组 DP,稍微优化的解法是一维数组 DP。解法如下: - - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -// 解法一 倒序 DP,无辅助空间 -func minimumTotal(triangle [][]int) int { - if triangle == nil { - return 0 - } - for row := len(triangle) - 2; row >= 0; row-- { - for col := 0; col < len(triangle[row]); col++ { - triangle[row][col] += min(triangle[row+1][col], triangle[row+1][col+1]) - } - } - return triangle[0][0] -} - -// 解法二 正常 DP,空间复杂度 O(n) -func minimumTotal1(triangle [][]int) int { - if len(triangle) == 0 { - return 0 - } - dp, minNum, index := make([]int, len(triangle[len(triangle)-1])), math.MaxInt64, 0 - for ; index < len(triangle[0]); index++ { - dp[index] = triangle[0][index] - } - for i := 1; i < len(triangle); i++ { - for j := len(triangle[i]) - 1; j >= 0; j-- { - if j == 0 { - // 最左边 - dp[j] += triangle[i][0] - } else if j == len(triangle[i])-1 { - // 最右边 - dp[j] += dp[j-1] + triangle[i][j] - } else { - // 中间 - dp[j] = min(dp[j-1]+triangle[i][j], dp[j]+triangle[i][j]) - } - } - } - for i := 0; i < len(dp); i++ { - if dp[i] < minNum { - minNum = dp[i] - } - } - return minNum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0121.Best-Time-to-Buy-and-Sell-Stock.md b/website/content/ChapterFour/0121.Best-Time-to-Buy-and-Sell-Stock.md deleted file mode 100755 index 5a39f8cc8..000000000 --- a/website/content/ChapterFour/0121.Best-Time-to-Buy-and-Sell-Stock.md +++ /dev/null @@ -1,82 +0,0 @@ -# [121. Best Time to Buy and Sell Stock](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/) - - -## 题目 - -Say you have an array for which the *i*th element is the price of a given stock on day *i*. - -If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit. - -Note that you cannot sell a stock before you buy one. - -**Example 1**: - - Input: [7,1,5,3,6,4] - Output: 5 - Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5. - Not 7-1 = 6, as selling price needs to be larger than buying price. - -**Example 2**: - - Input: [7,6,4,3,1] - Output: 0 - Explanation: In this case, no transaction is done, i.e. max profit = 0. - -## 题目大意 - -给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。注意你不能在买入股票前卖出股票。 - -## 解题思路 - -- 题目要求找出股票中能赚的钱最多的差价 -- 这一题也有多个解法,可以用 DP,也可以用单调栈 - - -## 代码 - -```go - -package leetcode - -// 解法一 模拟 DP -func maxProfit(prices []int) int { - if len(prices) < 1 { - return 0 - } - min, maxProfit := prices[0], 0 - for i := 1; i < len(prices); i++ { - if prices[i]-min > maxProfit { - maxProfit = prices[i] - min - } - if prices[i] < min { - min = prices[i] - } - } - return maxProfit -} - -// 解法二 单调栈 -func maxProfit1(prices []int) int { - if len(prices) == 0 { - return 0 - } - stack, res := []int{prices[0]}, 0 - for i := 1; i < len(prices); i++ { - if prices[i] > stack[len(stack)-1] { - stack = append(stack, prices[i]) - } else { - index := len(stack) - 1 - for ; index >= 0; index-- { - if stack[index] < prices[i] { - break - } - } - stack = stack[:index+1] - stack = append(stack, prices[i]) - } - res = max(res, stack[len(stack)-1]-stack[0]) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0122.Best-Time-to-Buy-and-Sell-Stock-II.md b/website/content/ChapterFour/0122.Best-Time-to-Buy-and-Sell-Stock-II.md deleted file mode 100755 index 5029cbf82..000000000 --- a/website/content/ChapterFour/0122.Best-Time-to-Buy-and-Sell-Stock-II.md +++ /dev/null @@ -1,60 +0,0 @@ -# [122. Best Time to Buy and Sell Stock II](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/) - - -## 题目 - -Say you have an array for which the *i*th element is the price of a given stock on day *i*. - -Design an algorithm to find the maximum profit. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times). - -**Note**: You may not engage in multiple transactions at the same time (i.e., you must sell the stock before you buy again). - -**Example 1**: - - Input: [7,1,5,3,6,4] - Output: 7 - Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4. - Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3. - -**Example 2**: - - Input: [1,2,3,4,5] - Output: 4 - Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4. - Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are - engaging multiple transactions at the same time. You must sell before buying again. - -**Example 3**: - - Input: [7,6,4,3,1] - Output: 0 - Explanation: In this case, no transaction is done, i.e. max profit = 0. - -## 题目大意 - -给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 - - -## 解题思路 - -- 这一题是第 121 题的加强版。要求输出最大收益,这一题不止买卖一次,可以买卖多次,买卖不能在同一天内操作。 -- 最大收益来源,必然是每次跌了就买入,涨到顶峰的时候就抛出。只要有涨峰就开始计算赚的钱,连续涨可以用两两相减累加来计算,两两相减累加,相当于涨到波峰的最大值减去谷底的值。这一点看通以后,题目非常简单。 - - -## 代码 - -```go - -package leetcode - -func maxProfit122(prices []int) int { - profit := 0 - for i := 0; i < len(prices)-1; i++ { - if prices[i+1] > prices[i] { - profit += prices[i+1] - prices[i] - } - } - return profit -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0124.Binary-Tree-Maximum-Path-Sum.md b/website/content/ChapterFour/0124.Binary-Tree-Maximum-Path-Sum.md deleted file mode 100755 index b8fdab715..000000000 --- a/website/content/ChapterFour/0124.Binary-Tree-Maximum-Path-Sum.md +++ /dev/null @@ -1,80 +0,0 @@ -# [124. Binary Tree Maximum Path Sum](https://leetcode.com/problems/binary-tree-maximum-path-sum/) - - -## 题目 - -Given a **non-empty** binary tree, find the maximum path sum. - -For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain **at least one node** and does not need to go through the root. - -**Example 1**: - - Input: [1,2,3] - - 1 - / \ - 2 3 - - Output: 6 - -**Example 2**: - - Input: [-10,9,20,null,null,15,7] - - -10 - / \ - 9 20 - / \ - 15 7 - - Output: 42 - -## 题目大意 - -给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。 - -## 解题思路 - -- 给出一个二叉树,要求找一条路径使得路径的和是最大的。 -- 这一题思路比较简单,递归维护最大值即可。不过需要比较的对象比较多。`maxPathSum(root) = max(maxPathSum(root.Left), maxPathSum(root.Right), maxPathSumFrom(root.Left) (if>0) + maxPathSumFrom(root.Right) (if>0) + root.Val)` ,其中,`maxPathSumFrom(root) = max(maxPathSumFrom(root.Left), maxPathSumFrom(root.Right)) + root.Val` - - - -## 代码 - -```go - -package leetcode - -import "math" - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func maxPathSum(root *TreeNode) int { - if root == nil { - return 0 - } - max := math.MinInt32 - getPathSum(root, &max) - return max -} - -func getPathSum(root *TreeNode, maxSum *int) int { - if root == nil { - return math.MinInt32 - } - left := getPathSum(root.Left, maxSum) - right := getPathSum(root.Right, maxSum) - - currMax := max(max(left+root.Val, right+root.Val), root.Val) - *maxSum = max(*maxSum, max(currMax, left+right+root.Val)) - return currMax -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0125.Valid-Palindrome.md b/website/content/ChapterFour/0125.Valid-Palindrome.md deleted file mode 100644 index 552c02c97..000000000 --- a/website/content/ChapterFour/0125.Valid-Palindrome.md +++ /dev/null @@ -1,70 +0,0 @@ -# [125. Valid Palindrome](https://leetcode.com/problems/valid-palindrome/description/) - -## 题目 - -Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. - -For example, - -``` - -"A man, a plan, a canal: Panama" is a palindrome. -"race a car" is not a palindrome. - -``` - -**Note**: - -Have you consider that the string might be empty? This is a good question to ask during an interview. - -For the purpose of this problem, we define empty string as valid palindrome. - -## 题目大意 - -判断所给的字符串是否是有效的回文串。 - -## 解题思路 - -简单题,按照题意做即可。 - -## 代码 - -```go - -package leetcode - -import ( - "strings" -) - -func isPalindrome(s string) bool { - - s = strings.ToLower(s) - - i, j := 0, len(s)-1 - for i < j { - for i < j && !isChar(s[i]) { - i++ - } - for i < j && !isChar(s[j]) { - j-- - } - if s[i] != s[j] { - return false - } - i++ - j-- - } - - return true -} - -// 判断 c 是否是字符或者数字 -func isChar(c byte) bool { - if ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0126.Word-Ladder-II.md b/website/content/ChapterFour/0126.Word-Ladder-II.md deleted file mode 100755 index 687124c7b..000000000 --- a/website/content/ChapterFour/0126.Word-Ladder-II.md +++ /dev/null @@ -1,130 +0,0 @@ -# [126. Word Ladder II](https://leetcode.com/problems/word-ladder-ii/) - - -## 题目 - -Given two words (*beginWord* and *endWord*), and a dictionary's word list, find all shortest transformation sequence(s) from *beginWord* to *endWord*, such that: - -1. Only one letter can be changed at a time -2. Each transformed word must exist in the word list. Note that *beginWord* is *not* a transformed word. - -**Note**: - -- Return an empty list if there is no such transformation sequence. -- All words have the same length. -- All words contain only lowercase alphabetic characters. -- You may assume no duplicates in the word list. -- You may assume *beginWord* and *endWord* are non-empty and are not the same. - -**Example 1**: - - Input: - beginWord = "hit", - endWord = "cog", - wordList = ["hot","dot","dog","lot","log","cog"] - - Output: - [ - ["hit","hot","dot","dog","cog"], - ["hit","hot","lot","log","cog"] - ] - -**Example 2**: - - Input: - beginWord = "hit" - endWord = "cog" - wordList = ["hot","dot","dog","lot","log"] - - Output: [] - - Explanation: The endWord "cog" is not in wordList, therefore no possible transformation. - -## 题目大意 - -给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则: - -1. 每次转换只能改变一个字母。 -2. 转换过程中的中间单词必须是字典中的单词。 - -说明: - -- 如果不存在这样的转换序列,返回一个空列表。 -- 所有单词具有相同的长度。 -- 所有单词只由小写字母组成。 -- 字典中不存在重复的单词。 -- 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。 - - - -## 解题思路 - -- 这一题是第 127 题的加强版,除了找到路径的长度,还进一步要求输出所有路径。解题思路同第 127 题一样,也是用 BFS 遍历。 -- 当前做法不是最优解,是否可以考虑双端 BFS 优化,或者迪杰斯塔拉算法? - - -## 代码 - -```go - -package leetcode - -func findLadders(beginWord string, endWord string, wordList []string) [][]string { - result, wordMap := make([][]string, 0), make(map[string]bool) - for _, w := range wordList { - wordMap[w] = true - } - if !wordMap[endWord] { - return result - } - // create a queue, track the path - queue := make([][]string, 0) - queue = append(queue, []string{beginWord}) - // queueLen is used to track how many slices in queue are in the same level - // if found a result, I still need to finish checking current level cause I need to return all possible paths - queueLen := 1 - // use to track strings that this level has visited - // when queueLen == 0, remove levelMap keys in wordMap - levelMap := make(map[string]bool) - for len(queue) > 0 { - path := queue[0] - queue = queue[1:] - lastWord := path[len(path)-1] - for i := 0; i < len(lastWord); i++ { - for c := 'a'; c <= 'z'; c++ { - nextWord := lastWord[:i] + string(c) + lastWord[i+1:] - if nextWord == endWord { - path = append(path, endWord) - result = append(result, path) - continue - } - if wordMap[nextWord] { - // different from word ladder, don't remove the word from wordMap immediately - // same level could reuse the key. - // delete from wordMap only when currently level is done. - levelMap[nextWord] = true - newPath := make([]string, len(path)) - copy(newPath, path) - newPath = append(newPath, nextWord) - queue = append(queue, newPath) - } - } - } - queueLen-- - // if queueLen is 0, means finish traversing current level. if result is not empty, return result - if queueLen == 0 { - if len(result) > 0 { - return result - } - for k := range levelMap { - delete(wordMap, k) - } - // clear levelMap - levelMap = make(map[string]bool) - queueLen = len(queue) - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0128.Longest-Consecutive-Sequence.md b/website/content/ChapterFour/0128.Longest-Consecutive-Sequence.md deleted file mode 100755 index 80d7a5f47..000000000 --- a/website/content/ChapterFour/0128.Longest-Consecutive-Sequence.md +++ /dev/null @@ -1,139 +0,0 @@ -# [128. Longest Consecutive Sequence](https://leetcode.com/problems/longest-consecutive-sequence/) - - -## 题目 - -Given an unsorted array of integers, find the length of the longest consecutive elements sequence. - -Your algorithm should run in O(*n*) complexity. - -**Example**: - - Input: [100, 4, 200, 1, 3, 2] - Output: 4 - Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4. - - -## 题目大意 - - -给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。 - - - - -## 解题思路 - - -- 给出一个数组,要求找出最长连续序列,输出这个最长的长度。要求时间复杂度为 `O(n)`。 -- 这一题可以先用暴力解决解决,代码见解法三。思路是把每个数都存在 `map` 中,先删去 `map` 中没有前一个数 `nums[i]-1` 也没有后一个数 `nums[i]+1` 的数 `nums[i]`,这种数前后都不连续。然后在 `map` 中找到前一个数 `nums[i]-1` 不存在,但是后一个数 `nums[i]+1` 存在的数,这种数是连续序列的起点,那么不断的往后搜,直到序列“断”了。最后输出最长序列的长度。 -- 这一题最优的解法是解法一,针对每一个 `map` 中不存在的数 `n`,插入进去都做 2 件事情。第一件事,先查看 `n - 1` 和 `n + 1` 是否都存在于 `map` 中,如果都存在,代表存在连续的序列,那么就更新 `left`,`right` 边界。那么 `n` 对应的这个小的子连续序列长度为 `sum = left + right + 1`。第二件事就是更新 `left` 和 `right` 左右边界对应的 `length = sum`。 -- 这一题还可以用并查集解决,见解法二。利用每个数在 `nums` 中的下标,把下标和下标进行 `union()`,具体做法是看前一个数 `nums[i]-1` 和后一个数 `nums[i]+1` 在 `map` 中是否存在,如果存在就 `union()`,最终输出整个并查集中包含最多元素的那个集合的元素总数。 - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 map,时间复杂度 O(n) -func longestConsecutive(nums []int) int { - res, numMap := 0, map[int]int{} - for _, num := range nums { - if numMap[num] == 0 { - left, right, sum := 0, 0, 0 - if numMap[num-1] > 0 { - left = numMap[num-1] - } else { - left = 0 - } - if numMap[num+1] > 0 { - right = numMap[num+1] - } else { - right = 0 - } - // sum: length of the sequence n is in - sum = left + right + 1 - numMap[num] = sum - // keep track of the max length - res = max(res, sum) - // extend the length to the boundary(s) of the sequence - // will do nothing if n has no neighbors - numMap[num-left] = sum - numMap[num+right] = sum - } else { - continue - } - } - return res -} - -// 解法二 并查集 -func longestConsecutive1(nums []int) int { - if len(nums) == 0 { - return 0 - } - numMap, countMap, lcs, uf := map[int]int{}, map[int]int{}, 0, template.UnionFind{} - uf.Init(len(nums)) - for i := 0; i < len(nums); i++ { - countMap[i] = 1 - } - for i := 0; i < len(nums); i++ { - if _, ok := numMap[nums[i]]; ok { - continue - } - numMap[nums[i]] = i - if _, ok := numMap[nums[i]+1]; ok { - uf.Union(i, numMap[nums[i]+1]) - } - if _, ok := numMap[nums[i]-1]; ok { - uf.Union(i, numMap[nums[i]-1]) - } - } - for key := range countMap { - parent := uf.Find(key) - if parent != key { - countMap[parent]++ - } - if countMap[parent] > lcs { - lcs = countMap[parent] - } - } - return lcs -} - -// 解法三 暴力解法,时间复杂度 O(n^2) -func longestConsecutive2(nums []int) int { - if len(nums) == 0 { - return 0 - } - numMap, length, tmp, lcs := map[int]bool{}, 0, 0, 0 - for i := 0; i < len(nums); i++ { - numMap[nums[i]] = true - } - for key := range numMap { - if !numMap[key-1] && !numMap[key+1] { - delete(numMap, key) - } - } - if len(numMap) == 0 { - return 1 - } - for key := range numMap { - if !numMap[key-1] && numMap[key+1] { - length, tmp = 1, key+1 - for numMap[tmp] { - length++ - tmp++ - } - lcs = max(lcs, length) - } - } - return max(lcs, length) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0129.Sum-Root-to-Leaf-Numbers.md b/website/content/ChapterFour/0129.Sum-Root-to-Leaf-Numbers.md deleted file mode 100755 index 261b8ebd1..000000000 --- a/website/content/ChapterFour/0129.Sum-Root-to-Leaf-Numbers.md +++ /dev/null @@ -1,97 +0,0 @@ -# [129. Sum Root to Leaf Numbers](https://leetcode.com/problems/sum-root-to-leaf-numbers/) - - -## 题目 - -Given a binary tree containing digits from `0-9` only, each root-to-leaf path could represent a number. - -An example is the root-to-leaf path `1->2->3` which represents the number `123`. - -Find the total sum of all root-to-leaf numbers. - -**Note**: A leaf is a node with no children. - -**Example**: - - Input: [1,2,3] - 1 - / \ - 2 3 - Output: 25 - Explanation: - The root-to-leaf path 1->2 represents the number 12. - The root-to-leaf path 1->3 represents the number 13. - Therefore, sum = 12 + 13 = 25. - -**Example 2**: - - Input: [4,9,0,5,1] - 4 - / \ - 9 0 - / \ - 5 1 - Output: 1026 - Explanation: - The root-to-leaf path 4->9->5 represents the number 495. - The root-to-leaf path 4->9->1 represents the number 491. - The root-to-leaf path 4->0 represents the number 40. - Therefore, sum = 495 + 491 + 40 = 1026. - -## 题目大意 - -给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。 - - -## 解题思路 - -- 这一题是第 257 题的变形题,第 257 题要求输出每条从根节点到叶子节点的路径,这一题变成了把每一个从根节点到叶子节点的数字都串联起来,再累加每条路径,求出最后的总和。实际做题思路基本没变 - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func sumNumbers(root *TreeNode) int { - res, nums := 0, binaryTreeNums(root) - for _, n := range nums { - num, _ := strconv.Atoi(n) - res += num - } - return res -} - -func binaryTreeNums(root *TreeNode) []string { - if root == nil { - return []string{} - } - res := []string{} - if root.Left == nil && root.Right == nil { - return []string{strconv.Itoa(root.Val)} - } - tmpLeft := binaryTreeNums(root.Left) - for i := 0; i < len(tmpLeft); i++ { - res = append(res, strconv.Itoa(root.Val)+tmpLeft[i]) - } - tmpRight := binaryTreeNums(root.Right) - for i := 0; i < len(tmpRight); i++ { - res = append(res, strconv.Itoa(root.Val)+tmpRight[i]) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0130.Surrounded-Regions.md b/website/content/ChapterFour/0130.Surrounded-Regions.md deleted file mode 100755 index 4ba381974..000000000 --- a/website/content/ChapterFour/0130.Surrounded-Regions.md +++ /dev/null @@ -1,126 +0,0 @@ -# [130. Surrounded Regions](https://leetcode.com/problems/surrounded-regions/) - - - -## 题目 - -Given a 2D board containing `'X'` and `'O'` (**the letter O**), capture all regions surrounded by `'X'`. - -A region is captured by flipping all `'O'`s into `'X'`s in that surrounded region. - -**Example**: - - X X X X - X O O X - X X O X - X O X X - -After running your function, the board should be: - - X X X X - X X X X - X X X X - X O X X - -**Explanation:** - -Surrounded regions shouldn’t be on the border, which means that any `'O'` on the border of the board are not flipped to `'X'`. Any `'O'` that is not on the border and it is not connected to an `'O'` on the border will be flipped to `'X'`. Two cells are connected if they are adjacent cells connected horizontally or vertically. - -## 题目大意 - -给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。 - - -## 解题思路 - - -- 给出一张二维地图,要求把地图上非边缘上的 'O' 都用 'X' 覆盖掉。 -- 这一题有多种解法。第一种解法是并查集。先将边缘上的 'O' 全部都和一个特殊的点进行 `union()` 。然后再把地图中间的 'O' 都进行 `union()`,最后把和特殊点不是同一个集合的点都标记成 'X'。第二种解法是 DFS 或者 BFS,可以先将边缘上的 'O' 先标记成另外一个字符,然后在递归遍历过程中,把剩下的 'O' 都标记成 'X'。 - - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 并查集 -func solve(board [][]byte) { - if len(board) == 0 { - return - } - m, n := len(board[0]), len(board) - uf := template.UnionFind{} - uf.Init(n*m + 1) // 特意多一个特殊点用来标记 - - for i := 0; i < n; i++ { - for j := 0; j < m; j++ { - if (i == 0 || i == n-1 || j == 0 || j == m-1) && board[i][j] == 'O' { //棋盘边缘上的 'O' 点 - uf.Union(i*m+j, n*m) - } else if board[i][j] == 'O' { //棋盘非边缘上的内部的 'O' 点 - if board[i-1][j] == 'O' { - uf.Union(i*m+j, (i-1)*m+j) - } - if board[i+1][j] == 'O' { - uf.Union(i*m+j, (i+1)*m+j) - } - if board[i][j-1] == 'O' { - uf.Union(i*m+j, i*m+j-1) - } - if board[i][j+1] == 'O' { - uf.Union(i*m+j, i*m+j+1) - } - - } - } - } - for i := 0; i < n; i++ { - for j := 0; j < m; j++ { - if uf.Find(i*m+j) != uf.Find(n*m) { - board[i][j] = 'X' - } - } - } -} - -// 解法二 DFS -func solve1(board [][]byte) { - for i := range board { - for j := range board[i] { - if i == 0 || i == len(board)-1 || j == 0 || j == len(board[i])-1 { - if board[i][j] == 'O' { - dfs130(i, j, board) - } - } - } - } - - for i := range board { - for j := range board[i] { - if board[i][j] == '*' { - board[i][j] = 'O' - } else if board[i][j] == 'O' { - board[i][j] = 'X' - } - } - } -} - -func dfs130(i, j int, board [][]byte) { - if i < 0 || i > len(board)-1 || j < 0 || j > len(board[i])-1 { - return - } - if board[i][j] == 'O' { - board[i][j] = '*' - for k := 0; k < 4; k++ { - dfs130(i+dir[k][0], j+dir[k][1], board) - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0131.Palindrome-Partitioning.md b/website/content/ChapterFour/0131.Palindrome-Partitioning.md deleted file mode 100755 index 29b17bff6..000000000 --- a/website/content/ChapterFour/0131.Palindrome-Partitioning.md +++ /dev/null @@ -1,121 +0,0 @@ -# [131. Palindrome Partitioning](https://leetcode.com/problems/palindrome-partitioning/) - - -## 题目 - -Given a string *s*, partition *s* such that every substring of the partition is a palindrome. - -Return all possible palindrome partitioning of *s*. - -**Example**: - - Input: "aab" - Output: - [ - ["aa","b"], - ["a","a","b"] - ] - -## 题目大意 - -给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。 - -## 解题思路 - -- 要求输出一个字符串可以被拆成回文串的所有解,DFS 递归求解即可。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func partition131(s string) [][]string { - if s == "" { - return [][]string{} - } - res, pal := [][]string{}, []string{} - findPalindrome(s, 0, "", true, pal, &res) - return res -} - -func findPalindrome(str string, index int, s string, isPal bool, pal []string, res *[][]string) { - if index == len(str) { - if isPal { - tmp := make([]string, len(pal)) - copy(tmp, pal) - *res = append(*res, tmp) - } - return - } - if index == 0 { - s = string(str[index]) - pal = append(pal, s) - findPalindrome(str, index+1, s, isPal && isPalindrome131(s), pal, res) - } else { - temp := pal[len(pal)-1] - s = pal[len(pal)-1] + string(str[index]) - pal[len(pal)-1] = s - findPalindrome(str, index+1, s, isPalindrome131(s), pal, res) - pal[len(pal)-1] = temp - if isPalindrome131(temp) { - pal = append(pal, string(str[index])) - findPalindrome(str, index+1, temp, isPal && isPalindrome131(temp), pal, res) - pal = pal[:len(pal)-1] - - } - } - return -} - -func isPalindrome131(s string) bool { - slen := len(s) - for i, j := 0, slen-1; i < j; i, j = i+1, j-1 { - if s[i] != s[j] { - return false - } - } - return true -} - -// 解法二 -func partition131_1(s string) [][]string { - result := [][]string{} - size := len(s) - if size == 0 { - return result - } - current := make([]string, 0, size) - dfs131(s, 0, current, &result) - return result -} - -func dfs131(s string, idx int, cur []string, result *[][]string) { - start, end := idx, len(s) - if start == end { - temp := make([]string, len(cur)) - copy(temp, cur) - *result = append(*result, temp) - return - } - for i := start; i < end; i++ { - if isPal(s, start, i) { - dfs131(s, i+1, append(cur, s[start:i+1]), result) - } - } -} - -func isPal(str string, s, e int) bool { - for s < e { - if str[s] != str[e] { - return false - } - s++ - e-- - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0136.Single-Number.md b/website/content/ChapterFour/0136.Single-Number.md deleted file mode 100755 index e3d24d83e..000000000 --- a/website/content/ChapterFour/0136.Single-Number.md +++ /dev/null @@ -1,46 +0,0 @@ -# [136. Single Number](https://leetcode.com/problems/single-number/) - -## 题目 - -Given a **non-empty** array of integers, every element appears *twice* except for one. Find that single one. - -**Note**: - -Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? - -**Example 1**: - - Input: [2,2,1] - Output: 1 - -**Example 2**: - - Input: [4,1,2,1,2] - Output: 4 - -## 题目大意 - -给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。要求算法时间复杂度是线性的,并且不使用额外的辅助空间。 - - -## 解题思路 - -- 题目要求不能使用辅助空间,并且时间复杂度只能是线性的。 -- 题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现依次的数字,因为那些出现两次的数字全部在异或中抵消掉了。于是最终做法是从头到尾依次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果。因为其他数字都出现了两次,在异或中全部抵消掉了。**利用的性质是 x^x = 0**。 - - -## 代码 - -```go - -package leetcode - -func singleNumber(nums []int) int { - result := 0 - for i := 0; i < len(nums); i++ { - result ^= nums[i] - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0137.Single-Number-II.md b/website/content/ChapterFour/0137.Single-Number-II.md deleted file mode 100755 index 5e82a6b73..000000000 --- a/website/content/ChapterFour/0137.Single-Number-II.md +++ /dev/null @@ -1,109 +0,0 @@ -# [137. Single Number II](https://leetcode.com/problems/single-number-ii/) - - -## 题目 - -Given a **non-empty** array of integers, every element appears *three* times except for one, which appears exactly once. Find that single one. - -**Note**: - -Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? - -**Example 1**: - - Input: [2,2,3,2] - Output: 3 - -**Example 2**: - - Input: [0,1,0,1,0,1,99] - Output: 99 - - -## 题目大意 - -给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。要求算法时间复杂度是线性的,并且不使用额外的辅助空间。 - - - - -## 解题思路 - -- 这一题是第 136 题的加强版。这类题也可以扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。 -- 本题中要求找出只出现 1 次的数,出现 3 次的数都要被消除。第 136 题是消除出现 2 次的数。这一题也会相当相同的解法,出现 3 次的数也要被消除。定义状态,00、10、01,这 3 个状态。当一个数出现 3 次,那么它每个位置上的 1 出现的次数肯定是 3 的倍数,所以当 1 出现 3 次以后,就归零清除。如何能做到这点呢?仿造`三进制(00,10,01)` 就可以做到。 -- 变量 ones 中记录遍历中每个位上出现 1 的个数。将它与 A[i] 进行异或,目的是: - - 每位上两者都是 1 的,表示历史统计结果 ones 出现1次、A[i]中又出现1次,则是出现 2 次,需要进位到 twos 变量中。 - - 每位上两者分别为 0、1 的,加入到 ones 统计结果中。 - - 最后还要 & ^twos ,是为了能做到三进制,出现 3 次就清零。例如 ones = x,那么 twos = 0,当 twos = x,那么 ones = 0; -- 变量 twos 中记录遍历中每个位上出现 1 ,2次 的个数。与 A[i] 进行异或的目的和上述描述相同,不再赘述。 - -> 在 golang 中,&^ 表示 AND NOT 的意思。这里的 ^ 作为一元操作符,表示按位取反 (^0001 0100 = 1110 1011),X &^ Y 的意思是将 X 中与 Y 相异的位保留,相同的位清零。 - -> 在 golang 中没有 Java 中的 ~ 位操作运算符,Java 中的 ~ 运算符代表按位取反。这个操作就想当于 golang 中的 ^ 运算符当做一元运算符使用的效果。 - -这一题还可以继续扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。那该怎么做呢?思路还是一样的,模拟一个五进制,5 次就会消除。代码如下: - - // 解法一 - func singleNumberIII(nums []int) int { - na, nb, nc := 0, 0, 0 - for i := 0; i < len(nums); i++ { - nb = nb ^ (nums[i] & na) - na = (na ^ nums[i]) & ^nc - nc = nc ^ (nums[i] & ^na & ^nb) - } - return na & ^nb & ^nc - } - - // 解法二 - func singleNumberIIII(nums []int) int { - twos, threes, ones := 0xffffffff, 0xffffffff, 0 - for i := 0; i < len(nums); i++ { - threes = threes ^ (nums[i] & twos) - twos = (twos ^ nums[i]) & ^ones - ones = ones ^ (nums[i] & ^twos & ^threes) - } - return ones - } - - -## 代码 - -```go - -package leetcode - -func singleNumberII(nums []int) int { - ones, twos := 0, 0 - for i := 0; i < len(nums); i++ { - ones = (ones ^ nums[i]) & ^twos - twos = (twos ^ nums[i]) & ^ones - } - return ones -} - -// 以下是拓展题 -// 在数组中每个元素都出现 5 次,找出只出现 1 次的数。 - -// 解法一 -func singleNumberIIIII(nums []int) int { - na, nb, nc := 0, 0, 0 - for i := 0; i < len(nums); i++ { - nb = nb ^ (nums[i] & na) - na = (na ^ nums[i]) & ^nc - nc = nc ^ (nums[i] & ^na & ^nb) - } - return na & ^nb & ^nc -} - -// 解法二 -func singleNumberIIIII1(nums []int) int { - twos, threes, ones := 0xffffffff, 0xffffffff, 0 - for i := 0; i < len(nums); i++ { - threes = threes ^ (nums[i] & twos) - twos = (twos ^ nums[i]) & ^ones - ones = ones ^ (nums[i] & ^twos & ^threes) - } - return ones -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0141.Linked-List-Cycle.md b/website/content/ChapterFour/0141.Linked-List-Cycle.md deleted file mode 100644 index ac0553c60..000000000 --- a/website/content/ChapterFour/0141.Linked-List-Cycle.md +++ /dev/null @@ -1,48 +0,0 @@ -# [141. Linked List Cycle](https://leetcode.com/problems/linked-list-cycle/description/) - -## 题目 - -Given a linked list, determine if it has a cycle in it. - -**Follow up**: -Can you solve it without using extra space? - - - -## 题目大意 - -判断链表是否有环,不能使用额外的空间。 - -## 解题思路 - -给 2 个指针,一个指针是另外一个指针的下一个指针。快指针一次走 2 格,慢指针一次走 1 格。如果存在环,那么前一个指针一定会经过若干圈之后追上慢的指针。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * struct ListNode { - * int val; - * ListNode *next; - * ListNode(int x) : val(x), next(NULL) {} - * }; - */ - -func hasCycle(head *ListNode) bool { - fast := head - slow := head - for slow != nil && fast != nil && fast.Next != nil { - fast = fast.Next.Next - slow = slow.Next - if fast == slow { - return true - } - } - return false -} - -```w \ No newline at end of file diff --git a/website/content/ChapterFour/0142.Linked-List-Cycle-II.md b/website/content/ChapterFour/0142.Linked-List-Cycle-II.md deleted file mode 100644 index f598045a2..000000000 --- a/website/content/ChapterFour/0142.Linked-List-Cycle-II.md +++ /dev/null @@ -1,109 +0,0 @@ -# [142. Linked List Cycle II](https://leetcode.com/problems/linked-list-cycle-ii/) - -## 题目 - -Given a linked list, return the node where the cycle begins. If there is no cycle, return null. - -To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list. - -**Note**: Do not modify the linked list. - -**Example 1**: - -``` - -Input: head = [3,2,0,-4], pos = 1 -Output: tail connects to node index 1 -Explanation: There is a cycle in the linked list, where tail connects to the second node. - -``` - -**Example 2**: - -``` - -Input: head = [1,2], pos = 0 -Output: tail connects to node index 0 -Explanation: There is a cycle in the linked list, where tail connects to the first node. - -``` - -**Example 3**: - -``` - -Input: head = [1], pos = -1 -Output: no cycle -Explanation: There is no cycle in the linked list. - -``` - - -## 题目大意 - -判断链表是否有环,不能使用额外的空间。如果有环,输出环的起点指针,如果没有环,则输出空。 - -## 解题思路 - -这道题是第 141 题的加强版。在判断是否有环的基础上,还需要输出环的第一个点。 - -分析一下判断环的原理。fast 指针一次都 2 步,slow 指针一次走 1 步。令链表 head 到环的一个点需要 x1 步,从环的第一个点到相遇点需要 x2 步,从环中相遇点回到环的第一个点需要 x3 步。那么环的总长度是 x2 + x3 步。 - -fast 和 slow 会相遇,说明他们走的时间是相同的,可以知道他们走的路程有以下的关系: - -```c -fast 的 t = (x1 + x2 + x3 + x2) / 2 -slow 的 t = (x1 + x2) / 1 - -x1 + x2 + x3 + x2 = 2 * (x1 + x2) - -所以 x1 = x3 -``` - -所以 2 个指针相遇以后,如果 slow 继续往前走,fast 指针回到起点 head,两者都每次走一步,那么必定会在环的起点相遇,相遇以后输出这个点即是结果。 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func detectCycle(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return nil - } - isCycle, slow := hasCycle142(head) - if !isCycle { - return nil - } - fast := head - for fast != slow { - fast = fast.Next - slow = slow.Next - } - return fast -} - -func hasCycle142(head *ListNode) (bool, *ListNode) { - fast := head - slow := head - for slow != nil && fast != nil && fast.Next != nil { - fast = fast.Next.Next - slow = slow.Next - if fast == slow { - return true, slow - } - } - return false, nil -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0143.Reorder-List.md b/website/content/ChapterFour/0143.Reorder-List.md deleted file mode 100644 index 9383f56ea..000000000 --- a/website/content/ChapterFour/0143.Reorder-List.md +++ /dev/null @@ -1,127 +0,0 @@ -# [143. Reorder List](https://leetcode.com/problems/reorder-list/) - -## 题目 - -Given a singly linked list L: L0→L1→…→Ln-1→Ln, -reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… - -You may not modify the values in the list's nodes, only nodes itself may be changed. - -**Example 1**: - -``` - -Given 1->2->3->4, reorder it to 1->4->2->3. - -``` - -**Example 2**: - -``` - -Given 1->2->3->4->5, reorder it to 1->5->2->4->3. - -``` - -## 题目大意 - -按照指定规则重新排序链表:第一个元素和最后一个元素排列在一起,接着第二个元素和倒数第二个元素排在一起,接着第三个元素和倒数第三个元素排在一起。 - - -## 解题思路 - - -最近简单的方法是先把链表存储到数组里,然后找到链表中间的结点,按照规则拼接即可。这样时间复杂度是 O(n),空间复杂度是 O(n)。 - -更好的做法是结合之前几道题的操作:链表逆序,找中间结点。 - -先找到链表的中间结点,然后利用逆序区间的操作,如 [第 92 题](https://github.com/halfrost/LeetCode-Go/tree/master/leetcode/0092.Reverse-Linked-List-II) 里的 reverseBetween() 操作,只不过这里的反转区间是从中点一直到末尾。最后利用 2 个指针,一个指向头结点,一个指向中间结点,开始拼接最终的结果。这种做法的时间复杂度是 O(n),空间复杂度是 O(1)。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -// 解法一 单链表 -func reorderList(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head - } - - // 寻找中间结点 - p1 := head - p2 := head - for p2.Next != nil && p2.Next.Next != nil { - p1 = p1.Next - p2 = p2.Next.Next - } - - // 反转链表后半部分 1->2->3->4->5->6 to 1->2->3->6->5->4 - preMiddle := p1 - preCurrent := p1.Next - for preCurrent.Next != nil { - current := preCurrent.Next - preCurrent.Next = current.Next - current.Next = preMiddle.Next - preMiddle.Next = current - } - - // 重新拼接链表 1->2->3->6->5->4 to 1->6->2->5->3->4 - p1 = head - p2 = preMiddle.Next - for p1 != preMiddle { - preMiddle.Next = p2.Next - p2.Next = p1.Next - p1.Next = p2 - p1 = p2.Next - p2 = preMiddle.Next - } - return head -} - -// 解法二 数组 -func reorderList1(head *ListNode) *ListNode { - array := listToArray(head) - length := len(array) - if length == 0 { - return head - } - cur := head - last := head - for i := 0; i < len(array)/2; i++ { - tmp := &ListNode{Val: array[length-1-i], Next: cur.Next} - cur.Next = tmp - cur = tmp.Next - last = tmp - } - if length%2 == 0 { - last.Next = nil - } else { - cur.Next = nil - } - return head -} - -func listToArray(head *ListNode) []int { - array := []int{} - if head == nil { - return array - } - cur := head - for cur != nil { - array = append(array, cur.Val) - cur = cur.Next - } - return array -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0144.Binary-Tree-Preorder-Traversal.md b/website/content/ChapterFour/0144.Binary-Tree-Preorder-Traversal.md deleted file mode 100644 index 408ccb75d..000000000 --- a/website/content/ChapterFour/0144.Binary-Tree-Preorder-Traversal.md +++ /dev/null @@ -1,112 +0,0 @@ -# [144. Binary Tree Preorder Traversal](https://leetcode.com/problems/binary-tree-preorder-traversal/) - -## 题目 - -Given a binary tree, return the preorder traversal of its nodes' values. - - - -**Example**: - -``` - -Input: [1,null,2,3] - 1 - \ - 2 - / - 3 - -Output: [1,2,3] - -``` - - -**Follow up**: Recursive solution is trivial, could you do it iteratively? - - - - -## 题目大意 - -先根遍历一颗树。 - -## 解题思路 - -两种递归的实现方法,见代码。 - - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 递归 -func preorderTraversal(root *TreeNode) []int { - res := []int{} - if root != nil { - res = append(res, root.Val) - tmp := preorderTraversal(root.Left) - for _, t := range tmp { - res = append(res, t) - } - tmp = preorderTraversal(root.Right) - for _, t := range tmp { - res = append(res, t) - } - } - return res -} - -// 解法二 递归 -func preorderTraversal1(root *TreeNode) []int { - var result []int - preorder(root, &result) - return result -} - -func preorder(root *TreeNode, output *[]int) { - if root != nil { - *output = append(*output, root.Val) - preorder(root.Left, output) - preorder(root.Right, output) - } -} - -// 解法三 非递归,用栈模拟递归过程 -func preorderTraversal2(root *TreeNode) []int { - if root == nil { - return []int{} - } - stack, res := []*TreeNode{}, []int{} - stack = append(stack, root) - for len(stack) != 0 { - node := stack[len(stack)-1] - stack = stack[:len(stack)-1] - if node != nil { - res = append(res, node.Val) - } - if node.Right != nil { - stack = append(stack, node.Right) - } - if node.Left != nil { - stack = append(stack, node.Left) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0145.Binary-Tree-Postorder-Traversal.md b/website/content/ChapterFour/0145.Binary-Tree-Postorder-Traversal.md deleted file mode 100644 index a78a7465e..000000000 --- a/website/content/ChapterFour/0145.Binary-Tree-Postorder-Traversal.md +++ /dev/null @@ -1,71 +0,0 @@ -# [145. Binary Tree Postorder Traversal](https://leetcode.com/problems/binary-tree-postorder-traversal/) - -## 题目 - - -Given a binary tree, return the postorder traversal of its nodes' values. - - - -**Example**: - -``` - -Input: [1,null,2,3] - 1 - \ - 2 - / - 3 - -Output: [3,2,1] - -``` - - -**Follow up**: Recursive solution is trivial, could you do it iteratively? - - - - -## 题目大意 - -后根遍历一颗树。 - -## 解题思路 - -递归的实现方法,见代码。 - - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func postorderTraversal(root *TreeNode) []int { - var result []int - postorder(root, &result) - return result -} - -func postorder(root *TreeNode, output *[]int) { - if root != nil { - postorder(root.Left, output) - postorder(root.Right, output) - *output = append(*output, root.Val) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0148.Sort-List.md b/website/content/ChapterFour/0148.Sort-List.md deleted file mode 100644 index 0cf29b929..000000000 --- a/website/content/ChapterFour/0148.Sort-List.md +++ /dev/null @@ -1,95 +0,0 @@ -# [148. Sort List](https://leetcode.com/problems/sort-list/) - -## 题目 - -Sort a linked list in O(n log n) time using constant space complexity. - -**Example 1**: - -``` - -Input: 4->2->1->3 -Output: 1->2->3->4 - -``` - -**Example 2**: - -``` - -Input: -1->5->3->4->0 -Output: -1->0->3->4->5 - -``` - -## 题目大意 - -链表的排序,要求时间复杂度必须是 O(n log n),空间复杂度是 O(1) - -## 解题思路 - -这道题只能用归并排序才能符合要求。归并排序需要的 2 个操作在其他题目已经出现过了,取中间点是第 876 题,合并 2 个有序链表是第 21 题。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func sortList(head *ListNode) *ListNode { - length := 0 - cur := head - for cur != nil { - length++ - cur = cur.Next - } - if length <= 1 { - return head - } - - middleNode := middleNode1(head) - cur = middleNode.Next - middleNode.Next = nil - middleNode = cur - - left := sortList(head) - right := sortList(middleNode) - return mergeTwoLists148(left, right) -} - -func middleNode1(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head - } - p1 := head - p2 := head - for p2.Next != nil && p2.Next.Next != nil { - p1 = p1.Next - p2 = p2.Next.Next - } - return p1 -} - -func mergeTwoLists148(l1 *ListNode, l2 *ListNode) *ListNode { - if l1 == nil { - return l2 - } - if l2 == nil { - return l1 - } - if l1.Val < l2.Val { - l1.Next = mergeTwoLists(l1.Next, l2) - return l1 - } - l2.Next = mergeTwoLists(l1, l2.Next) - return l2 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0150.Evaluate-Reverse-Polish-Notation.md b/website/content/ChapterFour/0150.Evaluate-Reverse-Polish-Notation.md deleted file mode 100644 index 0cb6b4725..000000000 --- a/website/content/ChapterFour/0150.Evaluate-Reverse-Polish-Notation.md +++ /dev/null @@ -1,115 +0,0 @@ -# [150. Evaluate Reverse Polish Notation](https://leetcode.com/problems/evaluate-reverse-polish-notation/) - -## 题目 - -Evaluate the value of an arithmetic expression in Reverse Polish Notation. - -Valid operators are +, -, *, /. Each operand may be an integer or another expression. - -**Note**: - -- Division between two integers should truncate toward zero. -- The given RPN expression is always valid. That means the expression would always evaluate to a result and there won't be any divide by zero operation. - -**Example 1**: - -``` - -Input: ["2", "1", "+", "3", "*"] -Output: 9 -Explanation: ((2 + 1) * 3) = 9 - -``` - -**Example 2**: - -``` - -Input: ["4", "13", "5", "/", "+"] -Output: 6 -Explanation: (4 + (13 / 5)) = 6 - -``` -**Example 3**: - -``` - -Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"] -Output: 22 -Explanation: - ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 -= ((10 * (6 / (12 * -11))) + 17) + 5 -= ((10 * (6 / -132)) + 17) + 5 -= ((10 * 0) + 17) + 5 -= (0 + 17) + 5 -= 17 + 5 -= 22 - -``` - -## 题目大意 - -计算逆波兰表达式。 - -## 解题思路 - -这道题就是经典的考察栈的知识的题目。 - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -func evalRPN(tokens []string) int { - if len(tokens) == 1 { - i, _ := strconv.Atoi(tokens[0]) - return i - } - stack, top := []int{}, 0 - for _, v := range tokens { - switch v { - case "+": - { - sum := stack[top-2] + stack[top-1] - stack = stack[:top-2] - stack = append(stack, sum) - top-- - } - case "-": - { - sub := stack[top-2] - stack[top-1] - stack = stack[:top-2] - stack = append(stack, sub) - top-- - } - case "*": - { - mul := stack[top-2] * stack[top-1] - stack = stack[:top-2] - stack = append(stack, mul) - top-- - } - case "/": - { - div := stack[top-2] / stack[top-1] - stack = stack[:top-2] - stack = append(stack, div) - top-- - } - default: - { - i, _ := strconv.Atoi(v) - stack = append(stack, i) - top++ - } - } - } - return stack[0] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0151.Reverse-Words-in-a-String.md b/website/content/ChapterFour/0151.Reverse-Words-in-a-String.md deleted file mode 100755 index e7d47d727..000000000 --- a/website/content/ChapterFour/0151.Reverse-Words-in-a-String.md +++ /dev/null @@ -1,82 +0,0 @@ -# [151. Reverse Words in a String](https://leetcode.com/problems/reverse-words-in-a-string/) - - - -## 题目 - -Given an input string, reverse the string word by word. - -**Example 1**: - - Input: "the sky is blue" - Output: "blue is sky the" - -**Example 2**: - - Input: " hello world! " - Output: "world! hello" - Explanation: Your reversed string should not contain leading or trailing spaces. - -**Example 3**: - - Input: "a good example" - Output: "example good a" - Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string. - -**Note**: - -- A word is defined as a sequence of non-space characters. -- Input string may contain leading or trailing spaces. However, your reversed string should not contain leading or trailing spaces. -- You need to reduce multiple spaces between two words to a single space in the reversed string. - -**Follow up**: - -For C programmers, try to solve it *in-place* in *O*(1) extra space. - - -## 题目大意 - -给定一个字符串,逐个翻转字符串中的每个单词。 - -说明: - -- 无空格字符构成一个单词。 -- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 -- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 -  - -进阶: - -- 请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。 - - -## 解题思路 - - -- 给出一个中间有空格分隔的字符串,要求把这个字符串按照单词的维度前后翻转。 -- 依照题意,先把字符串按照空格分隔成每个小单词,然后把单词前后翻转,最后再把每个单词中间添加空格。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func reverseWords151(s string) string { - ss := strings.Fields(s) - reverse151(&ss, 0, len(ss)-1) - return strings.Join(ss, " ") -} - -func reverse151(m *[]string, i int, j int) { - for i <= j { - (*m)[i], (*m)[j] = (*m)[j], (*m)[i] - i++ - j-- - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0152.Maximum-Product-Subarray.md b/website/content/ChapterFour/0152.Maximum-Product-Subarray.md deleted file mode 100755 index a09a12968..000000000 --- a/website/content/ChapterFour/0152.Maximum-Product-Subarray.md +++ /dev/null @@ -1,52 +0,0 @@ -# [152. Maximum Product Subarray](https://leetcode.com/problems/maximum-product-subarray/) - - -## 题目 - -Given an integer array `nums`, find the contiguous subarray within an array (containing at least one number) which has the largest product. - -**Example 1**: - - Input: [2,3,-2,4] - Output: 6 - Explanation: [2,3] has the largest product 6. - -**Example 2**: - - Input: [-2,0,-1] - Output: 0 - Explanation: The result cannot be 2, because [-2,-1] is not a subarray. - - -## 题目大意 - -给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 - - -## 解题思路 - -- 给出一个数组,要求找出这个数组中连续元素乘积最大的值。 -- 这一题是 DP 的题,状态转移方程是:最大值是 `Max(f(n)) = Max( Max(f(n-1)) * n, Min(f(n-1)) * n)`;最小值是 `Min(f(n)) = Min( Max(f(n-1)) * n, Min(f(n-1)) * n)`。只要动态维护这两个值,如果最后一个数是负数,最大值就在负数 * 最小值中产生,如果最后一个数是正数,最大值就在正数 * 最大值中产生。 - - - -## 代码 - -```go - -package leetcode - -func maxProduct(nums []int) int { - minimum, maximum, res := nums[0], nums[0], nums[0] - for i := 1; i < len(nums); i++ { - if nums[i] < 0 { - maximum, minimum = minimum, maximum - } - maximum = max(nums[i], maximum*nums[i]) - minimum = min(nums[i], minimum*nums[i]) - res = max(res, maximum) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0153.Find-Minimum-in-Rotated-Sorted-Array.md b/website/content/ChapterFour/0153.Find-Minimum-in-Rotated-Sorted-Array.md deleted file mode 100755 index b2a6d6e6b..000000000 --- a/website/content/ChapterFour/0153.Find-Minimum-in-Rotated-Sorted-Array.md +++ /dev/null @@ -1,108 +0,0 @@ -# [153. Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/) - - -## 题目 - -Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. - -(i.e., `[0,1,2,4,5,6,7]` might become `[4,5,6,7,0,1,2]`). - -Find the minimum element. - -You may assume no duplicate exists in the array. - -**Example 1**: - - Input: [3,4,5,1,2] - Output: 1 - -**Example 2**: - - Input: [4,5,6,7,0,1,2] - Output: 0 - - -## 题目大意 - -假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。 - -你可以假设数组中不存在重复元素。 - - -## 解题思路 - -- 给出一个原本从小到大排序过的数组,但是在某一个分割点上,把数组切分后的两部分对调位置,数值偏大的放到了数组的前部。求这个数组中最小的元素。 -- 求数组最小的元素其实就是找分割点,前一个数比当前数大,后一个数比当前数也要大。可以用二分搜索查找,需要查找的两个有序区间。时间复杂度 O(log n)。这一题也可以用暴力解法,从头开始遍历,动态维护一个最小值即可,时间复杂度 O(n)。 - - -## 代码 - -```go - -package leetcode - -// 解法一 二分 -func findMin(nums []int) int { - low, high := 0, len(nums)-1 - for low < high { - if nums[low] < nums[high] { - return nums[low] - } - mid := low + (high-low)>>1 - if nums[mid] >= nums[low] { - low = mid + 1 - } else { - high = mid - } - } - return nums[low] -} - -// 解法二 二分 -func findMin1(nums []int) int { - if len(nums) == 0 { - return 0 - } - if len(nums) == 1 { - return nums[0] - } - if nums[len(nums)-1] > nums[0] { - return nums[0] - } - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if nums[low] < nums[high] { - return nums[low] - } - if (mid == len(nums)-1 && nums[mid-1] > nums[mid]) || (mid < len(nums)-1 && mid > 0 && nums[mid-1] > nums[mid] && nums[mid] < nums[mid+1]) { - return nums[mid] - } - if nums[mid] > nums[low] && nums[low] > nums[high] { // mid 在数值大的一部分区间里 - low = mid + 1 - } else if nums[mid] < nums[low] && nums[low] > nums[high] { // mid 在数值小的一部分区间里 - high = mid - 1 - } else { - if nums[low] == nums[mid] { - low++ - } - if nums[high] == nums[mid] { - high-- - } - } - } - return -1 -} - -// 解法三 暴力 -func findMin2(nums []int) int { - min := nums[0] - for _, num := range nums[1:] { - if min > num { - min = num - } - } - return min -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0154.Find-Minimum-in-Rotated-Sorted-Array-II.md b/website/content/ChapterFour/0154.Find-Minimum-in-Rotated-Sorted-Array-II.md deleted file mode 100755 index 4ddfaa71a..000000000 --- a/website/content/ChapterFour/0154.Find-Minimum-in-Rotated-Sorted-Array-II.md +++ /dev/null @@ -1,67 +0,0 @@ -# [154. Find Minimum in Rotated Sorted Array II](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/) - - -## 题目 - -Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. - -(i.e., `[0,1,2,4,5,6,7]` might become `[4,5,6,7,0,1,2]`). - -Find the minimum element. - -The array may contain duplicates. - -**Example 1**: - - Input: [1,3,5] - Output: 1 - -**Example 2**: - - Input: [2,2,2,0,1] - Output: 0 - -**Note**: - -- This is a follow up problem to [Find Minimum in Rotated Sorted Array](https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/). -- Would allow duplicates affect the run-time complexity? How and why? - - -## 题目大意 - -假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。 - -注意数组中可能存在重复的元素。 - -## 解题思路 - - -- 给出一个原本从小到大排序过的数组,注意数组中有重复的元素。但是在某一个分割点上,把数组切分后的两部分对调位置,数值偏大的放到了数组的前部。求这个数组中最小的元素。 -- 这一题是第 153 题的加强版,增加了重复元素的条件。但是实际做法还是没有变,还是用二分搜索,只不过在相等元素上多增加一个判断即可。时间复杂度 O(log n)。 - - -## 代码 - -```go - -package leetcode - -func findMin154(nums []int) int { - low, high := 0, len(nums)-1 - for low < high { - if nums[low] < nums[high] { - return nums[low] - } - mid := low + (high-low)>>1 - if nums[mid] > nums[low] { - low = mid + 1 - } else if nums[mid] == nums[low] { - low++ - } else { - high = mid - } - } - return nums[low] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0155.Min-Stack.md b/website/content/ChapterFour/0155.Min-Stack.md deleted file mode 100644 index 5d811c4e4..000000000 --- a/website/content/ChapterFour/0155.Min-Stack.md +++ /dev/null @@ -1,87 +0,0 @@ -# [155. Min Stack](https://leetcode.com/problems/min-stack/) - -## 题目 - -Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. - -push(x) -- Push element x onto stack. -pop() -- Removes the element on top of the stack. -top() -- Get the top element. -getMin() -- Retrieve the minimum element in the stack. - - - -**Example**: - -``` - -MinStack minStack = new MinStack(); -minStack.push(-2); -minStack.push(0); -minStack.push(-3); -minStack.getMin(); --> Returns -3. -minStack.pop(); -minStack.top(); --> Returns 0. -minStack.getMin(); --> Returns -2. - -``` - -## 题目大意 - -这道题是一个数据结构实现题。要求实现一个栈的类,实现 push()、pop()、top()、getMin()。 - - -## 解题思路 - -按照题目要求实现即可。 - -## 代码 - -```go - -package leetcode - -// MinStack define -type MinStack struct { - elements, min []int - l int -} - -/** initialize your data structure here. */ - -// Constructor155 define -func Constructor155() MinStack { - return MinStack{make([]int, 0), make([]int, 0), 0} -} - -// Push define -func (this *MinStack) Push(x int) { - this.elements = append(this.elements, x) - if this.l == 0 { - this.min = append(this.min, x) - } else { - min := this.GetMin() - if x < min { - this.min = append(this.min, x) - } else { - this.min = append(this.min, min) - } - } - this.l++ -} - -func (this *MinStack) Pop() { - this.l-- - this.min = this.min[:this.l] - this.elements = this.elements[:this.l] -} - -func (this *MinStack) Top() int { - return this.elements[this.l-1] -} - -func (this *MinStack) GetMin() int { - return this.min[this.l-1] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0160.Intersection-of-Two-Linked-Lists.md b/website/content/ChapterFour/0160.Intersection-of-Two-Linked-Lists.md deleted file mode 100644 index 6a450ebac..000000000 --- a/website/content/ChapterFour/0160.Intersection-of-Two-Linked-Lists.md +++ /dev/null @@ -1,116 +0,0 @@ -# [160. Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/) - -## 题目 - -Write a program to find the node at which the intersection of two singly linked lists begins. - -For example, the following two linked lists: - -![](https://assets.leetcode.com/uploads/2018/12/13/160_statement.png) - -begin to intersect at node c1. - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2018/12/13/160_example_1.png) - -``` - -Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 -Output: Reference of the node with value = 8 -Input Explanation: The intersected node's value is 8 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [4,1,8,4,5]. From the head of B, it reads as [5,0,1,8,4,5]. There are 2 nodes before the intersected node in A; There are 3 nodes before the intersected node in B. - -``` - -**Example 2**: - -![](https://assets.leetcode.com/uploads/2018/12/13/160_example_2.png) - -``` - -Input: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 -Output: Reference of the node with value = 2 -Input Explanation: The intersected node's value is 2 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [0,9,1,2,4]. From the head of B, it reads as [3,2,4]. There are 3 nodes before the intersected node in A; There are 1 node before the intersected node in B. - -``` - - -**Example 3**: - -![](https://assets.leetcode.com/uploads/2018/12/13/160_example_3.png) - -``` - -Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 -Output: null -Input Explanation: From the head of A, it reads as [2,6,4]. From the head of B, it reads as [1,5]. Since the two lists do not intersect, intersectVal must be 0, while skipA and skipB can be arbitrary values. -Explanation: The two lists do not intersect, so return null. - -``` - -**Notes**: - -- If the two linked lists have no intersection at all, return null. -- The linked lists must retain their original structure after the function returns. -- You may assume there are no cycles anywhere in the entire linked structure. -- Your code should preferably run in O(n) time and use only O(1) memory. - -## 题目大意 - -找到 2 个链表的交叉点。 - - -## 解题思路 - -这道题的思路其实类似链表找环。 - - -给定的 2 个链表的长度如果一样长,都从头往后扫即可。如果不一样长,需要先“拼成”一样长。把 B 拼接到 A 后面,把 A 拼接到 B 后面。这样 2 个链表的长度都是 A + B。再依次扫描比较 2 个链表的结点是否相同。 - - - - -## 代码 - -```go - -package leetcode - -import "fmt" - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func getIntersectionNode(headA, headB *ListNode) *ListNode { - //boundary check - if headA == nil || headB == nil { - return nil - } - - a := headA - b := headB - - //if a & b have different len, then we will stop the loop after second iteration - for a != b { - //for the end of first iteration, we just reset the pointer to the head of another linkedlist - if a == nil { - a = headB - } else { - a = a.Next - } - - if b == nil { - b = headA - } else { - b = b.Next - } - fmt.Printf("a = %v b = %v\n", a, b) - } - return a -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0162.Find-Peak-Element.md b/website/content/ChapterFour/0162.Find-Peak-Element.md deleted file mode 100755 index 2b69dbdbe..000000000 --- a/website/content/ChapterFour/0162.Find-Peak-Element.md +++ /dev/null @@ -1,94 +0,0 @@ -# [162. Find Peak Element](https://leetcode.com/problems/find-peak-element/) - - -## 题目 - -A peak element is an element that is greater than its neighbors. - -Given an input array `nums`, where `nums[i] ≠ nums[i+1]`, find a peak element and return its index. - -The array may contain multiple peaks, in that case return the index to any one of the peaks is fine. - -You may imagine that `nums[-1] = nums[n] = -∞`. - -**Example 1**: - - Input: nums = [1,2,3,1] - Output: 2 - Explanation: 3 is a peak element and your function should return the index number 2. - -**Example 2**: - - Input: nums = [1,2,1,3,5,6,4] - Output: 1 or 5 - Explanation: Your function can return either index number 1 where the peak element is 2, - or index number 5 where the peak element is 6. - -**Note**: - -Your solution should be in logarithmic complexity. - -## 题目大意 - -峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。 - -说明: - -- 你的解法应该是 O(logN) 时间复杂度的。 - - -## 解题思路 - -- 给出一个数组,数组里面存在多个“山峰”,(山峰的定义是,下标 `i` 比 `i-1`、`i+1` 位置上的元素都要大),找到这个“山峰”,并输出其中一个山峰的下标。 -- 这一题是第 852 题的伪加强版,第 852 题中只存在一个山峰,这一题存在多个山峰。但是实际上搜索的代码是一样的,因为此题只要求随便输出一个山峰的下标即可。思路同第 852 题。 - - -## 代码 - -```go - -package leetcode - -// 解法一 二分 -func findPeakElement(nums []int) int { - if len(nums) == 0 || len(nums) == 1 { - return 0 - } - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if (mid == len(nums)-1 && nums[mid-1] < nums[mid]) || (mid > 0 && nums[mid-1] < nums[mid] && (mid <= len(nums)-2 && nums[mid+1] < nums[mid])) || (mid == 0 && nums[1] < nums[0]) { - return mid - } - if mid > 0 && nums[mid-1] < nums[mid] { - low = mid + 1 - } - if mid > 0 && nums[mid-1] > nums[mid] { - high = mid - 1 - } - if mid == low { - low++ - } - if mid == high { - high-- - } - } - return -1 -} - -// 解法二 二分 -func findPeakElement1(nums []int) int { - low, high := 0, len(nums)-1 - for low < high { - mid := low + (high-low)>>1 - // 如果 mid 较大,则左侧存在峰值,high = m,如果 mid + 1 较大,则右侧存在峰值,low = mid + 1 - if nums[mid] > nums[mid+1] { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0164.Maximum-Gap.md b/website/content/ChapterFour/0164.Maximum-Gap.md deleted file mode 100644 index e1579e679..000000000 --- a/website/content/ChapterFour/0164.Maximum-Gap.md +++ /dev/null @@ -1,140 +0,0 @@ -# [164. Maximum Gap](https://leetcode.com/problems/maximum-gap/) - -## 题目 - -Given an unsorted array, find the maximum difference between the successive elements in its sorted form. - -Return 0 if the array contains less than 2 elements. - -**Example 1**: - -``` - -Input: [3,6,9,1] -Output: 3 -Explanation: The sorted form of the array is [1,3,6,9], either - (3,6) or (6,9) has the maximum difference 3. - -``` - -**Example 2**: - -``` - -Input: [10] -Output: 0 -Explanation: The array contains less than 2 elements, therefore return 0. - -``` - - -**Note**: - -- You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range. -- Try to solve it in linear time/space. - - -## 题目大意 - -在数组中找到 2 个数字之间最大的间隔。要求尽量用 O(1) 的时间复杂度和空间复杂度。 - -## 解题思路 - -虽然使用排序算法可以 AC 这道题。先排序,然后依次计算数组中两两数字之间的间隔,找到最大的一个间隔输出即可。 - -这道题满足要求的做法是基数排序。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func maximumGap(nums []int) int { - if len(nums) < 2 { - return 0 - } - quickSort164(nums, 0, len(nums)-1) - - res := 0 - for i := 0; i < len(nums)-1; i++ { - if (nums[i+1] - nums[i]) > res { - res = nums[i+1] - nums[i] - } - } - return res -} - -func partition164(a []int, lo, hi int) int { - pivot := a[hi] - i := lo - 1 - for j := lo; j < hi; j++ { - if a[j] < pivot { - i++ - a[j], a[i] = a[i], a[j] - } - } - a[i+1], a[hi] = a[hi], a[i+1] - return i + 1 -} -func quickSort164(a []int, lo, hi int) { - if lo >= hi { - return - } - p := partition164(a, lo, hi) - quickSort164(a, lo, p-1) - quickSort164(a, p+1, hi) -} - -// 解法二 -func maximumGap1(nums []int) int { - - if nums == nil || len(nums) < 2 { - return 0 - } - - // m is the maximal number in nums - m := nums[0] - for i := 1; i < len(nums); i++ { - m = max(m, nums[i]) - } - - exp := 1 // 1, 10, 100, 1000 ... - R := 10 // 10 digits - - aux := make([]int, len(nums)) - - for (m / exp) > 0 { // Go through all digits from LSB to MSB - count := make([]int, R) - - for i := 0; i < len(nums); i++ { - count[(nums[i]/exp)%10]++ - } - - for i := 1; i < len(count); i++ { - count[i] += count[i-1] - } - - for i := len(nums) - 1; i >= 0; i-- { - tmp := count[(nums[i]/exp)%10] - tmp-- - aux[tmp] = nums[i] - } - - for i := 0; i < len(nums); i++ { - nums[i] = aux[i] - } - exp *= 10 - } - - maxValue := 0 - for i := 1; i < len(aux); i++ { - maxValue = max(maxValue, aux[i]-aux[i-1]) - } - - return maxValue -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md b/website/content/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md deleted file mode 100644 index b4a1dd226..000000000 --- a/website/content/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md +++ /dev/null @@ -1,68 +0,0 @@ -# [167. Two Sum II - Input array is sorted](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/) - -## 题目 - -Given an array of integers that is already sorted in ascending order, find two numbers such that they add up to a specific target number. - -The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. - -**Note**: - -- Your returned answers (both index1 and index2) are not zero-based. -- You may assume that each input would have exactly one solution and you may not use the same element twice. - -**Example**: - -``` - -Input: numbers = [2,7,11,15], target = 9 -Output: [1,2] -Explanation: The sum of 2 and 7 is 9. Therefore index1 = 1, index2 = 2. - -``` - -## 题目大意 - -找出两个数之和等于 target 的两个数字,要求输出它们的下标。注意一个数字不能使用 2 次。下标从小到大输出。假定题目一定有一个解。 - -## 解题思路 - -这一题比第 1 题 Two Sum 的问题还要简单,因为这里数组是有序的。可以直接用第一题的解法解决这道题。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 这一题可以利用数组有序的特性 -func twoSum167(numbers []int, target int) []int { - i, j := 0, len(numbers)-1 - for i < j { - if numbers[i]+numbers[j] == target { - return []int{i + 1, j + 1} - } else if numbers[i]+numbers[j] < target { - i++ - } else { - j-- - } - } - return []int{-1, -1} -} - -// 解法二 不管数组是否有序,空间复杂度比上一种解法要多 O(n) -func twoSum167_1(numbers []int, target int) []int { - m := make(map[int]int) - for i := 0; i < len(numbers); i++ { - another := target - numbers[i] - if _, ok := m[another]; ok { - return []int{m[another] + 1, i + 1} - } - m[numbers[i]] = i - } - return nil -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0168.Excel-Sheet-Column-Title.md b/website/content/ChapterFour/0168.Excel-Sheet-Column-Title.md deleted file mode 100644 index c1ecdd583..000000000 --- a/website/content/ChapterFour/0168.Excel-Sheet-Column-Title.md +++ /dev/null @@ -1,80 +0,0 @@ -# [168. Excel Sheet Column Title](https://leetcode.com/problems/excel-sheet-column-title/) - -## 题目 - -Given a positive integer, return its corresponding column title as appear in an Excel sheet. - -For example: - -``` - 1 -> A - 2 -> B - 3 -> C - ... - 26 -> Z - 27 -> AA - 28 -> AB - ... -``` - -**Example 1**: - -``` -Input: 1 -Output: "A" -``` - -**Example 2**: - -``` -Input: 28 -Output: "AB" -``` - -**Example 3**: - -``` -Input: 701 -Output: "ZY" -``` - -## 题目大意 - -给定一个正整数,返回它在 Excel 表中相对应的列名称。 - -例如, - - 1 -> A - 2 -> B - 3 -> C - ... - 26 -> Z - 27 -> AA - 28 -> AB - ... - - -## 解题思路 - -- 给定一个正整数,返回它在 Excel 表中的对应的列名称 -- 简单题。这一题就类似短除法的计算过程。以 26 进制的字母编码。按照短除法先除,然后余数逆序输出即可。 - -## 代码 - -```go - -package leetcode - -func convertToTitle(n int) string { - result := []byte{} - for n > 0 { - result = append(result, 'A'+byte((n-1)%26)) - n = (n - 1) / 26 - } - for i, j := 0, len(result)-1; i < j; i, j = i+1, j-1 { - result[i], result[j] = result[j], result[i] - } - return string(result) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0169.Majority-Element.md b/website/content/ChapterFour/0169.Majority-Element.md deleted file mode 100755 index 548fb3ed3..000000000 --- a/website/content/ChapterFour/0169.Majority-Element.md +++ /dev/null @@ -1,66 +0,0 @@ -# [169. Majority Element](https://leetcode.com/problems/majority-element/) - - -## 题目 - -Given an array of size n, find the majority element. The majority element is the element that appears **more than** `⌊ n/2 ⌋` times. - -You may assume that the array is non-empty and the majority element always exist in the array. - -**Example 1**: - - Input: [3,2,3] - Output: 3 - -**Example 2**: - - Input: [2,2,1,1,1,2,2] - Output: 2 - -## 题目大意 - - -给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在众数。 - - -## 解题思路 - -- 题目要求找出数组中出现次数大于 `⌊ n/2 ⌋` 次的数。要求空间复杂度为 O(1)。简单题。 -- 这一题利用的算法是 Boyer-Moore Majority Vote Algorithm。[https://www.zhihu.com/question/49973163/answer/235921864](https://www.zhihu.com/question/49973163/answer/235921864) - -## 代码 - -```go - -package leetcode - -// 解法一 时间复杂度 O(n) 空间复杂度 O(1) -func majorityElement(nums []int) int { - res, count := nums[0], 0 - for i := 0; i < len(nums); i++ { - if count == 0 { - res, count = nums[i], 1 - } else { - if nums[i] == res { - count++ - } else { - count-- - } - } - } - return res -} - -// 解法二 时间复杂度 O(n) 空间复杂度 O(n) -func majorityElement1(nums []int) int { - m := make(map[int]int) - for _, v := range nums { - m[v]++ - if m[v] > len(nums)/2 { - return v - } - } - return 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0171.Excel-Sheet-Column-Number.md b/website/content/ChapterFour/0171.Excel-Sheet-Column-Number.md deleted file mode 100644 index 8c9f6651d..000000000 --- a/website/content/ChapterFour/0171.Excel-Sheet-Column-Number.md +++ /dev/null @@ -1,67 +0,0 @@ -# [171. Excel Sheet Column Number](https://leetcode.com/problems/excel-sheet-column-number/) - - -## 题目 - -Given a column title as appear in an Excel sheet, return its corresponding column number. - -For example: - -``` - A -> 1 - B -> 2 - C -> 3 - ... - Z -> 26 - AA -> 27 - AB -> 28 - ... -``` - -**Example 1**: - -``` -Input: "A" -Output: 1 -``` - -**Example 2**: - -``` -Input: "AB" -Output: 28 -``` - -**Example 3**: - -``` -Input: "ZY" -Output: 701 -``` - -## 题目大意 - -给定一个 Excel 表格中的列名称,返回其相应的列序号。 - - -## 解题思路 - -- 给出 Excel 中列的名称,输出其对应的列序号。 -- 简单题。这一题是第 168 题的逆序题。按照 26 进制还原成十进制即可。 - -## 代码 - -```go - -package leetcode - -func titleToNumber(s string) int { - val, res := 0, 0 - for i := 0; i < len(s); i++ { - val = int(s[i] - 'A' + 1) - res = res*26 + val - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0172.Factorial-Trailing-Zeroes.md b/website/content/ChapterFour/0172.Factorial-Trailing-Zeroes.md deleted file mode 100755 index 4c6db6329..000000000 --- a/website/content/ChapterFour/0172.Factorial-Trailing-Zeroes.md +++ /dev/null @@ -1,51 +0,0 @@ -# [172. Factorial Trailing Zeroes](https://leetcode.com/problems/factorial-trailing-zeroes/) - - -## 题目 - -Given an integer n, return the number of trailing zeroes in n!. - -**Example 1**: - - Input: 3 - Output: 0 - Explanation: 3! = 6, no trailing zero. - -**Example 2**: - - Input: 5 - Output: 1 - Explanation: 5! = 120, one trailing zero. - -**Note**: Your solution should be in logarithmic time complexity. - - -## 题目大意 - - -给定一个整数 n,返回 n! 结果尾数中零的数量。说明: 你算法的时间复杂度应为 O(log n) 。 - - - - -## 解题思路 - -- 给出一个数 n,要求 n!末尾 0 的个数。 -- 这是一道数学题。计算 N 的阶乘有多少个后缀 0,即计算 N! 里有多少个 10,也是计算 N! 里有多少个 2 和 5(分解质因数),最后结果即 2 的个数和 5 的个数取较小值。每两个数字就会多一个质因数 2,而每五个数字才多一个质因数 5。每 5 个数字就会多一个质因数 5。0~4 的阶乘里没有质因数 5,5~9 的阶乘里有 1 个质因数 5,10~14 的阶乘里有 2 个质因数 5,依此类推。所以 0 的个数即为 `min(阶乘中 5 的个数和 2 的个数)`。 -- N! 有多少个后缀 0,即 N! 有多少个质因数 5。N! 有多少个质因数 5,即 N 可以划分成多少组 5个数字一组,加上划分成多少组 25 个数字一组,加上划分多少组成 125 个数字一组,等等。即 `res = N/5 + N/(5^2) + N/(5^3) + ... = ((N / 5) / 5) / 5 /...` 。最终算法复杂度为 O(logN)。 - - -## 代码 - -```go - -package leetcode - -func trailingZeroes(n int) int { - if n/5 == 0 { - return 0 - } - return n/5 + trailingZeroes(n/5) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0173.Binary-Search-Tree-Iterator.md b/website/content/ChapterFour/0173.Binary-Search-Tree-Iterator.md deleted file mode 100755 index 8521ef5b5..000000000 --- a/website/content/ChapterFour/0173.Binary-Search-Tree-Iterator.md +++ /dev/null @@ -1,118 +0,0 @@ -# [173. Binary Search Tree Iterator](https://leetcode.com/problems/binary-search-tree-iterator/) - - -## 题目 - -Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST. - -Calling `next()` will return the next smallest number in the BST. - -**Example**: - -![](https://assets.leetcode.com/uploads/2018/12/25/bst-tree.png) - - BSTIterator iterator = new BSTIterator(root); - iterator.next(); // return 3 - iterator.next(); // return 7 - iterator.hasNext(); // return true - iterator.next(); // return 9 - iterator.hasNext(); // return true - iterator.next(); // return 15 - iterator.hasNext(); // return true - iterator.next(); // return 20 - iterator.hasNext(); // return false - -**Note**: - -- `next()` and `hasNext()` should run in average O(1) time and uses O(h) memory, where h is the height of the tree. -- You may assume that `next()` call will always be valid, that is, there will be at least a next smallest number in the BST when `next()` is called. - - -## 题目大意 - -实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。调用 next() 将返回二叉搜索树中的下一个最小的数。 - -## 解题思路 - -- 用优先队列解决即可 - - - -## 代码 - -```go - -package leetcode - -import "container/heap" - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// BSTIterator define -type BSTIterator struct { - pq PriorityQueueOfInt - count int -} - -// Constructor173 define -func Constructor173(root *TreeNode) BSTIterator { - result, pq := []int{}, PriorityQueueOfInt{} - postorder(root, &result) - for _, v := range result { - heap.Push(&pq, v) - } - bs := BSTIterator{pq: pq, count: len(result)} - return bs -} - -/** @return the next smallest number */ -func (this *BSTIterator) Next() int { - this.count-- - return heap.Pop(&this.pq).(int) -} - -/** @return whether we have a next smallest number */ -func (this *BSTIterator) HasNext() bool { - return this.count != 0 -} - -/** - * Your BSTIterator object will be instantiated and called as such: - * obj := Constructor(root); - * param_1 := obj.Next(); - * param_2 := obj.HasNext(); - */ -type PriorityQueueOfInt []int - -func (pq PriorityQueueOfInt) Len() int { - return len(pq) -} - -func (pq PriorityQueueOfInt) Less(i, j int) bool { - return pq[i] < pq[j] -} - -func (pq PriorityQueueOfInt) Swap(i, j int) { - pq[i], pq[j] = pq[j], pq[i] -} - -func (pq *PriorityQueueOfInt) Push(x interface{}) { - item := x.(int) - *pq = append(*pq, item) -} - -func (pq *PriorityQueueOfInt) Pop() interface{} { - n := len(*pq) - item := (*pq)[n-1] - *pq = (*pq)[:n-1] - return item -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0174.Dungeon-Game.md b/website/content/ChapterFour/0174.Dungeon-Game.md deleted file mode 100755 index d95cc1acb..000000000 --- a/website/content/ChapterFour/0174.Dungeon-Game.md +++ /dev/null @@ -1,124 +0,0 @@ -# [174. Dungeon Game](https://leetcode.com/problems/dungeon-game/) - -## 题目 - -The demons had captured the princess (**P**) and imprisoned her in the bottom-right corner of a dungeon. The dungeon consists of M x N rooms laid out in a 2D grid. Our valiant knight (**K**) was initially positioned in the top-left room and must fight his way through the dungeon to rescue the princess. - -The knight has an initial health point represented by a positive integer. If at any point his health point drops to 0 or below, he dies immediately. - -Some of the rooms are guarded by demons, so the knight loses health (*negative* integers) upon entering these rooms; other rooms are either empty (*0's*) or contain magic orbs that increase the knight's health (*positive* integers). - -In order to reach the princess as quickly as possible, the knight decides to move only rightward or downward in each step. - -**Write a function to determine the knight's minimum initial health so that he is able to rescue the princess.** - -For example, given the dungeon below, the initial health of the knight must be at least **7** if he follows the optimal path `RIGHT-> RIGHT -> DOWN -> DOWN`. - - -![](https://img.halfrost.com/Leetcode/leetcode_174_0.png) - -**Note**: - -- The knight's health has no upper bound. -- Any room can contain threats or power-ups, even the first room the knight enters and the bottom-right room where the princess is imprisoned. - - -## 题目大意 - -一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 - -骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。 - -有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。 - -为了尽快到达公主,骑士决定每次只向右或向下移动一步。编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。 - -说明: - -- 骑士的健康点数没有上限。 -- 任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。 - -## 解题思路 - -- 在二维地图上给出每个格子扣血数,负数代表扣血,正数代表补血。左上角第一个格子是起点,右下角最后一个格子是终点。问骑士初始最少多少血才能走完迷宫,顺利营救位于终点的公主。需要注意的是,起点和终点都会对血量进行影响。每到一个格子,骑士的血都不能少于 1,一旦少于 1 点血,骑士就会死去。 -- 这一题首先想到的解题思路是动态规划。从终点逆推回起点。`dp[i][j]` 代表骑士进入坐标为 `(i,j)` 的格子之前最少的血量值。 那么 `dp[m-1][n-1]` 应该同时满足两个条件,`dp[m-1][n-1] + dungeon[m-1][n-1] ≥ 1` 并且 `dp[m-1][n-1] ≥ 1`,由于这两个不等式的方向是相同的,取交集以后,起决定作用的是数轴最右边的数,即 `max(1-dungeon[m-1][n-1] , 1)`。算出 `dp[m-1][n-1]` 以后,接着可以推出 `dp[m-1][i]` 这一行和 `dp[i][n-1]` 这一列的值。因为骑士只能往右走和往下走。往回推,即只能往上走和往左走。到这里,DP 的初始条件都准备好了。那么状态转移方程是什么呢?分析一般的情况,`dp[i][j]` 这个值应该是和 `dp[i+1][j]` 和 `dp[i][j+1]` 这两者有关系。即 `dp[i][j]` 经过自己本格子的扣血以后,要能至少满足下一行和右一列格子血量的最少要求。并且自己的血量也应该 `≥1`。即需要满足下面这两组不等式。 - ![](https://img.halfrost.com/Leetcode/leetcode_174_1.png) - ![](https://img.halfrost.com/Leetcode/leetcode_174_2.png) - 上面不等式中第一组不等式是满足下一行格子的最低血量要求,第二组不等式是满足右一列格子的最低血量要求。第一个式子化简即 `dp[i][j] = max(1, dp[i+1][j]-dungeon[i][j])`,第二个式子化简即 `dp[i][j] = max(1, dp[i][j+1]-dungeon[i][j])`。求得了这两种走法的最低血量值,从这两个值里面取最小,即是当前格子所需的最低血量,所以状态转移方程为 `dp[i][j] = min(max(1, dp[i][j+1]-dungeon[i][j]), max(1, dp[i+1][j]-dungeon[i][j]))`。DP 完成以后,`dp[0][0]` 中记录的就是骑士初始最低血量值。时间复杂度 O(m\*n),空间复杂度 O(m\*n)。 - -- 这一题还可以用二分搜索来求解。骑士的血量取值范围一定是在 `[1,+∞)` 这个区间内。那么二分这个区间,每次二分的中间值,再用 dp 在地图中去判断是否能到达终点,如果能,就缩小搜索空间至 `[1,mid]`,否则搜索空间为 `[mid + 1,+∞)` 。时间复杂度 O(m\*n\* log math.MaxInt64),空间复杂度 O(m\*n)。 - - -## 代码 - -```go - -package leetcode - -import "math" - -// 解法一 动态规划 -func calculateMinimumHP(dungeon [][]int) int { - if len(dungeon) == 0 { - return 0 - } - m, n := len(dungeon), len(dungeon[0]) - dp := make([][]int, m) - for i := 0; i < m; i++ { - dp[i] = make([]int, n) - } - dp[m-1][n-1] = max(1-dungeon[m-1][n-1], 1) - for i := n - 2; i >= 0; i-- { - dp[m-1][i] = max(1, dp[m-1][i+1]-dungeon[m-1][i]) - } - for i := m - 2; i >= 0; i-- { - dp[i][n-1] = max(1, dp[i+1][n-1]-dungeon[i][n-1]) - } - for i := m - 2; i >= 0; i-- { - for j := n - 2; j >= 0; j-- { - dp[i][j] = min(max(1, dp[i][j+1]-dungeon[i][j]), max(1, dp[i+1][j]-dungeon[i][j])) - } - } - return dp[0][0] -} - -// 解法二 二分搜索 -func calculateMinimumHP1(dungeon [][]int) int { - low, high := 1, math.MaxInt64 - for low < high { - mid := low + (high-low)>>1 - if canCross(dungeon, mid) { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -func canCross(dungeon [][]int, start int) bool { - m, n := len(dungeon), len(dungeon[0]) - dp := make([][]int, m) - for i := 0; i < m; i++ { - dp[i] = make([]int, n) - } - for i := 0; i < len(dp); i++ { - for j := 0; j < len(dp[i]); j++ { - if i == 0 && j == 0 { - dp[i][j] = start + dungeon[0][0] - } else { - a, b := math.MinInt64, math.MinInt64 - if i > 0 && dp[i-1][j] > 0 { - a = dp[i-1][j] + dungeon[i][j] - } - if j > 0 && dp[i][j-1] > 0 { - b = dp[i][j-1] + dungeon[i][j] - } - dp[i][j] = max(a, b) - } - } - } - return dp[m-1][n-1] > 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0179.Largest-Number.md b/website/content/ChapterFour/0179.Largest-Number.md deleted file mode 100644 index de1677858..000000000 --- a/website/content/ChapterFour/0179.Largest-Number.md +++ /dev/null @@ -1,122 +0,0 @@ -# [179. Largest Number](https://leetcode.com/problems/largest-number/) - -## 题目 - -Given a list of non negative integers, arrange them such that they form the largest number. - - - -**Example 1**: - -``` - -Input: [10,2] -Output: "210" - -``` - - -**Example 2**: - -``` - -Input: [3,30,34,5,9] -Output: "9534330" - -``` - -**Note**: - -The result may be very large, so you need to return a string instead of an integer. - - - -## 题目大意 - -给出一个数组,要求排列这些数组里的元素,使得最终排列出来的数字是最大的。 - - -## 解题思路 - -这一题很容易想到把数字都转化为字符串,利用字符串比较,来排序,这样 9 开头的一定排在最前面。不过这样做有一个地方是错误的,比如:"3" 和 "30" 比较,"30" 比 "3" 的字符序要大,这样排序以后就出错了。实际上就这道题而言, "3" 应该排在 "30" 前面。 - -在比较 2 个字符串大小的时候,不单纯的只用字符串顺序进行比较,还加入一个顺序。 - -```go -aStr := a + b -bStr := b + a -``` - -通过比较 aStr 和 bStr 的大小来得出是 a 大还是 b 大。 - -举个例子,还是 "3" 和 "30" 的例子,比较这 2 个字符串的大小。 - - -```go -aStr := "3" + "30" = "330" -bStr := "30" + "3" = "303" -``` - -通过互相补齐位数之后再进行比较,就没有问题了。很显然这里 "3" 比 "30" 要大。 - - - - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -func largestNumber(nums []int) string { - if len(nums) == 0 { - return "" - } - numStrs := toStringArray(nums) - quickSortString(numStrs, 0, len(numStrs)-1) - res := "" - for _, str := range numStrs { - if res == "0" && str == "0" { - continue - } - res = res + str - } - return res -} - -func toStringArray(nums []int) []string { - strs := make([]string, 0) - for _, num := range nums { - strs = append(strs, strconv.Itoa(num)) - } - return strs -} -func partitionString(a []string, lo, hi int) int { - pivot := a[hi] - i := lo - 1 - for j := lo; j < hi; j++ { - ajStr := a[j] + pivot - pivotStr := pivot + a[j] - if ajStr > pivotStr { // 这里的判断条件是关键 - i++ - a[j], a[i] = a[i], a[j] - } - } - a[i+1], a[hi] = a[hi], a[i+1] - return i + 1 -} -func quickSortString(a []string, lo, hi int) { - if lo >= hi { - return - } - p := partitionString(a, lo, hi) - quickSortString(a, lo, p-1) - quickSortString(a, p+1, hi) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0187.Repeated-DNA-Sequences.md b/website/content/ChapterFour/0187.Repeated-DNA-Sequences.md deleted file mode 100755 index 5f917e03e..000000000 --- a/website/content/ChapterFour/0187.Repeated-DNA-Sequences.md +++ /dev/null @@ -1,71 +0,0 @@ -# [187. Repeated DNA Sequences](https://leetcode.com/problems/repeated-dna-sequences/) - - -## 题目 - -All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for Example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA. - -Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule. - -**Example**: - - Input: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" - - Output: ["AAAAACCCCC", "CCCCCAAAAA"] - - -## 题目大意 - -所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来查找 DNA 分子中所有出现超多一次的10个字母长的序列(子串)。 - -## 解题思路 - -- 这一题不用位运算比较好做,维护一个长度为 10 的字符串,在 map 中出现次数 > 1 就输出。 -- 用位运算想做这一题,需要动态的维护长度为 10 的 hashkey,先计算开头长度为 9 的 hash,在往后面扫描的过程中,如果长度超过了 10 ,就移除 hash 开头的一个字符,加入后面一个字符。具体做法是先将 ATCG 变成 00,01,10,11 的编码,那么长度为 10 ,hashkey 就需要维护在 20 位。mask = 0xFFFFF 就是 20 位的。维护了 hashkey 以后,根据这个 hashkey 进行去重和统计频次。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func findRepeatedDnaSequences(s string) []string { - if len(s) < 10 { - return nil - } - charMap, mp, result := map[uint8]uint32{'A': 0, 'C': 1, 'G': 2, 'T': 3}, make(map[uint32]int, 0), []string{} - var cur uint32 - for i := 0; i < 9; i++ { // 前9位,忽略 - cur = cur<<2 | charMap[s[i]] - } - for i := 9; i < len(s); i++ { - cur = ((cur << 2) & 0xFFFFF) | charMap[s[i]] - if mp[cur] == 0 { - mp[cur] = 1 - } else if mp[cur] == 1 { // >2,重复 - mp[cur] = 2 - result = append(result, s[i-9:i+1]) - } - } - return result -} - -// 解法二 -func findRepeatedDnaSequences1(s string) []string { - if len(s) < 10 { - return []string{} - } - ans, cache := make([]string, 0), make(map[string]int) - for i := 0; i <= len(s)-10; i++ { - curr := string(s[i : i+10]) - if cache[curr] == 1 { - ans = append(ans, curr) - } - cache[curr]++ - } - return ans -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0190.Reverse-Bits.md b/website/content/ChapterFour/0190.Reverse-Bits.md deleted file mode 100755 index 47b9b939b..000000000 --- a/website/content/ChapterFour/0190.Reverse-Bits.md +++ /dev/null @@ -1,53 +0,0 @@ -# [190. Reverse Bits](https://leetcode.com/problems/reverse-bits/) - - -## 题目 - -Reverse bits of a given 32 bits unsigned integer. - -**Example 1**: - - Input: 00000010100101000001111010011100 - Output: 00111001011110000010100101000000 - Explanation: The input binary string 00000010100101000001111010011100 represents the unsigned integer 43261596, so return 964176192 which its binary representation is 00111001011110000010100101000000. - -**Example 2**: - - Input: 11111111111111111111111111111101 - Output: 10111111111111111111111111111111 - Explanation: The input binary string 11111111111111111111111111111101 represents the unsigned integer 4294967293, so return 3221225471 which its binary representation is 10101111110010110010011101101001. - -**Note**: - -- Note that in some languages such as Java, there is no unsigned integer type. In this case, both input and output will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned. -- In Java, the compiler represents the signed integers using [2's complement notation](https://en.wikipedia.org/wiki/Two%27s_complement). Therefore, in **Example 2** above the input represents the signed integer `-3` and the output represents the signed integer `-1073741825`. - -## 题目大意 - -颠倒给定的 32 位无符号整数的二进制位。提示: - -- 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 -- 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。 - -## 解题思路 - -- 简单题,要求反转 32 位的二进制位。 -- 把 num 往右移动,不断的消灭右边最低位的 1,将这个 1 给 res,res 不断的左移即可实现反转二进制位的目的。 - - -## 代码 - -```go - -package leetcode - -func reverseBits(num uint32) uint32 { - var res uint32 - for i := 0; i < 32; i++ { - res = res<<1 | num&1 - num >>= 1 - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0191.Number-of-1-Bits.md b/website/content/ChapterFour/0191.Number-of-1-Bits.md deleted file mode 100755 index 2723d2a03..000000000 --- a/website/content/ChapterFour/0191.Number-of-1-Bits.md +++ /dev/null @@ -1,65 +0,0 @@ -# [191. Number of 1 Bits](https://leetcode.com/problems/number-of-1-bits/) - -## 题目 - -Write a function that takes an unsigned integer and return the number of '1' bits it has (also known as the [Hamming weight](http://en.wikipedia.org/wiki/Hamming_weight)). - -**Example 1**: - - Input: 00000000000000000000000000001011 - Output: 3 - Explanation: The input binary string 00000000000000000000000000001011 has a total of three '1' bits. - -**Example 2**: - - Input: 00000000000000000000000010000000 - Output: 1 - Explanation: The input binary string 00000000000000000000000010000000 has a total of one '1' bit. - -**Example 3**: - - Input: 11111111111111111111111111111101 - Output: 31 - Explanation: The input binary string 11111111111111111111111111111101 has a total of thirty one '1' bits. - -**Note**: - -- Note that in some languages such as Java, there is no unsigned integer type. In this case, the input will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned. -- In Java, the compiler represents the signed integers using [2's complement notation](https://en.wikipedia.org/wiki/Two%27s_complement). Therefore, in **Example 3** above the input represents the signed integer `-3`. - - -## 题目大意 - -编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 - -## 解题思路 - -- 求 uint32 数的二进制位中 1 的个数。 -- 这一题的解题思路就是利用二进制位操作。`X = X & ( X -1 )` 这个操作可以清除最低位的二进制位 1,利用这个操作,直至把数清零。操作了几次即为有几个二进制位 1 。 -- 最简单的方法即是直接调用库函数 `bits.OnesCount(uint(num))` 。 - - -## 代码 - -```go - -package leetcode - -import "math/bits" - -// 解法一 -func hammingWeight(num uint32) int { - return bits.OnesCount(uint(num)) -} - -// 解法二 -func hammingWeight1(num uint32) int { - count := 0 - for num != 0 { - num = num & (num - 1) - count++ - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0198.House-Robber.md b/website/content/ChapterFour/0198.House-Robber.md deleted file mode 100755 index 4ad33a623..000000000 --- a/website/content/ChapterFour/0198.House-Robber.md +++ /dev/null @@ -1,94 +0,0 @@ -# [198. House Robber](https://leetcode.com/problems/house-robber/) - - -## 题目 - -You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and **it will automatically contact the police if two adjacent houses were broken into on the same night**. - -Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight **without alerting the police**. - -**Example 1**: - - Input: [1,2,3,1] - Output: 4 - Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3). - Total amount you can rob = 1 + 3 = 4. - -**Example 2**: - - Input: [2,7,9,3,1] - Output: 12 - Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1). - Total amount you can rob = 2 + 9 + 1 = 12. - - -## 题目大意 - -你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,**如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警**。 - -给定一个代表每个房屋存放金额的非负整数数组,计算你**在不触动警报装置的情况下**,能够偷窃到的最高金额。 - - -## 解题思路 - -- 你是一个专业的小偷,打算洗劫一条街的所有房子。每个房子里面有不同价值的宝物,但是如果你选择偷窃连续的 2 栋房子,就会触发警报系统,编程求出你最多可以偷窃价值多少的宝物? -- 这一题可以用 DP 来解答,也可以用找规律的方法来解答。 -- DP 的状态定义是:`dp[i]` 代表抢 `nums[0,i]` 这个区间内房子的最大值,状态转移方程是 `dp[i] = max(dp[i-1], nums[i]+dp[i-2])` 。可以优化迭代的过程,用两个临时变量来存储中间结果,以节约辅助空间。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 DP -func rob198(nums []int) int { - n := len(nums) - if n == 0 { - return 0 - } - if n == 1 { - return nums[0] - } - // dp[i] 代表抢 nums[0...i] 房子的最大价值 - dp := make([]int, n) - dp[0], dp[1] = nums[0], max(nums[1], nums[0]) - for i := 2; i < n; i++ { - dp[i] = max(dp[i-1], nums[i]+dp[i-2]) - } - return dp[n-1] -} - -// 解法二 DP 优化辅助空间,把迭代的值保存在 2 个变量中 -func rob198_1(nums []int) int { - n := len(nums) - if n == 0 { - return 0 - } - curMax, preMax := 0, 0 - for i := 0; i < n; i++ { - tmp := curMax - curMax = max(curMax, nums[i]+preMax) - preMax = tmp - } - return curMax -} - -// 解法三 模拟 -func rob(nums []int) int { - // a 对于偶数位上的最大值的记录 - // b 对于奇数位上的最大值的记录 - a, b := 0, 0 - for i := 0; i < len(nums); i++ { - if i%2 == 0 { - a = max(a+nums[i], b) - } else { - b = max(a, b+nums[i]) - } - } - return max(a, b) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0199.Binary-Tree-Right-Side-View.md b/website/content/ChapterFour/0199.Binary-Tree-Right-Side-View.md deleted file mode 100644 index 621d23338..000000000 --- a/website/content/ChapterFour/0199.Binary-Tree-Right-Side-View.md +++ /dev/null @@ -1,84 +0,0 @@ -# [199. Binary Tree Right Side View](https://leetcode.com/problems/binary-tree-right-side-view/) - -## 题目 - -Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom. - -**Example**: - -``` - -Input: [1,2,3,null,5,null,4] -Output: [1, 3, 4] -Explanation: - - 1 <--- - / \ -2 3 <--- - \ \ - 5 4 <--- - -``` - - - -## 题目大意 - -从右边看一个树,输出看到的数字。注意有遮挡。 - - -## 解题思路 - -- 这一题是按层序遍历的变种题。按照层序把每层的元素都遍历出来,然后依次取每一层的最右边的元素即可。用一个队列即可实现。 -- 第 102 题和第 107 题都是按层序遍历的。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func rightSideView(root *TreeNode) []int { - if root == nil { - return []int{} - } - queue := []*TreeNode{} - queue = append(queue, root) - curNum, nextLevelNum, res, tmp := 1, 0, []int{}, []int{} - for len(queue) != 0 { - if curNum > 0 { - node := queue[0] - if node.Left != nil { - queue = append(queue, node.Left) - nextLevelNum++ - } - if node.Right != nil { - queue = append(queue, node.Right) - nextLevelNum++ - } - curNum-- - tmp = append(tmp, node.Val) - queue = queue[1:] - } - if curNum == 0 { - res = append(res, tmp[len(tmp)-1]) - curNum = nextLevelNum - nextLevelNum = 0 - tmp = []int{} - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0200.Number-of-Islands.md b/website/content/ChapterFour/0200.Number-of-Islands.md deleted file mode 100755 index 3fe5a2f26..000000000 --- a/website/content/ChapterFour/0200.Number-of-Islands.md +++ /dev/null @@ -1,81 +0,0 @@ -# [200. Number of Islands](https://leetcode.com/problems/number-of-islands/) - - -## 题目 - -Given a 2d grid map of `'1'`s (land) and `'0'`s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water. - -**Example 1**: - - Input: - 11110 - 11010 - 11000 - 00000 - - Output: 1 - -**Example 2**: - - Input: - 11000 - 11000 - 00100 - 00011 - - Output: 3 - -## 题目大意 - -给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。 - - -## 解题思路 - -- 要求找出地图中的孤岛。孤岛的含义是四周被海水包围的岛。 -- 这一题可以按照第 79 题的思路进行搜索,只要找到为 "1" 的岛以后,从这里开始搜索这周连通的陆地,也都标识上访问过。每次遇到新的 "1" 且没有访问过,就相当于遇到了新的岛屿了。 - - - -## 代码 - -```go - -package leetcode - -func numIslands(grid [][]byte) int { - m := len(grid) - if m == 0 { - return 0 - } - n := len(grid[0]) - if n == 0 { - return 0 - } - res, visited := 0, make([][]bool, m) - for i := 0; i < m; i++ { - visited[i] = make([]bool, n) - } - for i := 0; i < m; i++ { - for j := 0; j < n; j++ { - if grid[i][j] == '1' && !visited[i][j] { - searchIslands(grid, &visited, i, j) - res++ - } - } - } - return res -} - -func searchIslands(grid [][]byte, visited *[][]bool, x, y int) { - (*visited)[x][y] = true - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - if isInBoard(grid, nx, ny) && !(*visited)[nx][ny] && grid[nx][ny] == '1' { - searchIslands(grid, visited, nx, ny) - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0201.Bitwise-AND-of-Numbers-Range.md b/website/content/ChapterFour/0201.Bitwise-AND-of-Numbers-Range.md deleted file mode 100755 index cccdb75b8..000000000 --- a/website/content/ChapterFour/0201.Bitwise-AND-of-Numbers-Range.md +++ /dev/null @@ -1,66 +0,0 @@ -# [201. Bitwise AND of Numbers Range](https://leetcode.com/problems/bitwise-and-of-numbers-range/) - - -## 题目 - -Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive. - -**Example 1**: - - Input: [5,7] - Output: 4 - -**Example 2**: - - Input: [0,1] - Output: 0 - -## 题目大意 - -给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。 - - -## 解题思路 - -- 这一题要求输出 [m,n] 区间内所有数的 AND 与操作之后的结果。 -- 举个例子,假设区间是 [26,30],那么这个区间内的数用二进制表示出来为: - - 11010 - 11011 - 11100 - 11101 - 11110 - -- 可以观察到,把这些数都 AND 起来,只要有 0 的位,最终结果都是 0,所以需要从右往前找到某一位上不为 0 的。不断的右移左边界和右边界,把右边的 0 都移走,直到它们俩相等,就找到了某一位上开始都不为 0 的了。在右移的过程中记录下右移了多少位,最后把 m 或者 n 的右边添上 0 即可。按照上面这个例子来看,11000 是最终的结果。 -- 这一题还有解法二,还是以 [26,30] 这个区间为例。这个区间内的数末尾 3 位不断的 0,1 变化着。那么如果把末尾的 1 都打掉,就是最终要求的结果了。当 n == m 或者 n < m 的时候就退出循环,说明后面不同的位数已经都被抹平了,1 都被打掉为 0 了。所以关键的操作为 `n &= (n - 1)` ,清除最低位的 1 。这个算法名叫 `Brian Kernighan` 算法。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func rangeBitwiseAnd1(m int, n int) int { - if m == 0 { - return 0 - } - moved := 0 - for m != n { - m >>= 1 - n >>= 1 - moved++ - } - return m << uint32(moved) -} - -// 解法二 Brian Kernighan's algorithm -func rangeBitwiseAnd(m int, n int) int { - for n > m { - n &= (n - 1) // 清除最低位的 1 - } - return n -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0202.Happy-Number.md b/website/content/ChapterFour/0202.Happy-Number.md deleted file mode 100644 index 673c90cbc..000000000 --- a/website/content/ChapterFour/0202.Happy-Number.md +++ /dev/null @@ -1,65 +0,0 @@ -# [202. Happy Number](https://leetcode.com/problems/happy-number/) - -## 题目 - -Write an algorithm to determine if a number is "happy". - -A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers. - -**Example 1**: - -``` - -Input: 19 -Output: true -Explanation: -12 + 92 = 82 -82 + 22 = 68 -62 + 82 = 100 -12 + 02 + 02 = 1 - -``` - -## 题目大意 - -判断一个数字是否是“快乐数字”,“快乐数字”的定义是,不断的把这个数字的每个数字的平方和加起来,反复的加,最终如果能有结果是 1,则是“快乐数字”,如果不能得到一,出现了循环,则输出 false。 - -## 解题思路 - -按照题意要求做即可。 - - - -## 代码 - -```go - -package leetcode - -func isHappy(n int) bool { - if n == 0 { - return false - } - res := 0 - num := n - record := map[int]int{} - for { - for num != 0 { - res += (num % 10) * (num % 10) - num = num / 10 - } - if _, ok := record[res]; !ok { - if res == 1 { - return true - } - record[res] = res - num = res - res = 0 - continue - } else { - return false - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0203.Remove-Linked-List-Elements.md b/website/content/ChapterFour/0203.Remove-Linked-List-Elements.md deleted file mode 100644 index 049e25615..000000000 --- a/website/content/ChapterFour/0203.Remove-Linked-List-Elements.md +++ /dev/null @@ -1,56 +0,0 @@ -# [203. Remove Linked List Elements](https://leetcode.com/problems/remove-linked-list-elements/) - -## 题目 - -Remove all elements from a linked list of integers that have value val. - -**Example**: - -``` - -Input: 1->2->6->3->4->5->6, val = 6 -Output: 1->2->3->4->5 - -``` - - -## 题目大意 - -删除链表中所有指定值的结点。 - -## 解题思路 - -按照题意做即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func removeElements(head *ListNode, val int) *ListNode { - if head == nil { - return head - } - newHead := &ListNode{Val: 0, Next: head} - pre := newHead - cur := head - for cur != nil { - if cur.Val == val { - pre.Next = cur.Next - } else { - pre = cur - } - cur = cur.Next - } - return newHead.Next -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0204.Count-Primes.md b/website/content/ChapterFour/0204.Count-Primes.md deleted file mode 100755 index 81f49cdc5..000000000 --- a/website/content/ChapterFour/0204.Count-Primes.md +++ /dev/null @@ -1,50 +0,0 @@ -# [204. Count Primes](https://leetcode.com/problems/count-primes/) - - -## 题目 - -Count the number of prime numbers less than a non-negative number, **n**. - -**Example**: - - Input: 10 - Output: 4 - Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7. - - -## 题目大意 - -统计所有小于非负整数 n 的质数的数量。 - - -## 解题思路 - -- 给出一个数字 n,要求输出小于 n 的所有素数的个数总和。简单题。 - - -## 代码 - -```go - -package leetcode - -func countPrimes(n int) int { - isNotPrime := make([]bool, n) - for i := 2; i*i < n; i++ { - if isNotPrime[i] { - continue - } - for j := i * i; j < n; j = j + i { - isNotPrime[j] = true - } - } - count := 0 - for i := 2; i < n; i++ { - if !isNotPrime[i] { - count++ - } - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0205.Isomorphic-Strings.md b/website/content/ChapterFour/0205.Isomorphic-Strings.md deleted file mode 100644 index 31a2b620d..000000000 --- a/website/content/ChapterFour/0205.Isomorphic-Strings.md +++ /dev/null @@ -1,90 +0,0 @@ -# [205. Isomorphic Strings](https://leetcode.com/problems/isomorphic-strings/) - -## 题目 - -Given two strings s and t, determine if they are isomorphic. - -Two strings are isomorphic if the characters in s can be replaced to get t. - -All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself. - -**Example 1**: - -``` - -Input: s = "egg", t = "add" -Output: true - -``` - -**Example 2**: - -``` - -Input: s = "foo", t = "bar" -Output: false - -``` - -**Example 3**: - -``` - -Input: s = "paper", t = "title" -Output: true - -``` - -**Note**: - -You may assume both s and t have the same length. - - - - -## 题目大意 - -这道题和第 290 题基本是一样的。第 290 题是模式匹配,这道题的题意是字符串映射,实质是一样的。 - -给定一个初始字符串串,判断初始字符串是否可以通过字符映射的方式,映射到目标字符串,如果可以映射,则输出 true,反之输出 false。 - -## 解题思路 - -这道题做法和第 290 题基本一致。 - - -## 代码 - -```go - -package leetcode - -func isIsomorphic(s string, t string) bool { - strList := []byte(t) - patternByte := []byte(s) - if (s == "" && t != "") || (len(patternByte) != len(strList)) { - return false - } - - pMap := map[byte]byte{} - sMap := map[byte]byte{} - for index, b := range patternByte { - if _, ok := pMap[b]; !ok { - if _, ok = sMap[strList[index]]; !ok { - pMap[b] = strList[index] - sMap[strList[index]] = b - } else { - if sMap[strList[index]] != b { - return false - } - } - } else { - if pMap[b] != strList[index] { - return false - } - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0206.Reverse-Linked-List.md b/website/content/ChapterFour/0206.Reverse-Linked-List.md deleted file mode 100644 index 28f4d7e6f..000000000 --- a/website/content/ChapterFour/0206.Reverse-Linked-List.md +++ /dev/null @@ -1,47 +0,0 @@ -# [206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/description/) - -## 题目 - -Reverse a singly linked list. - -## 题目大意 - -翻转单链表 - - -## 解题思路 - -按照题意做即可。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -// ListNode define -type ListNode struct { - Val int - Next *ListNode -} - -func reverseList(head *ListNode) *ListNode { - var behind *ListNode - for head != nil { - next := head.Next - head.Next = behind - behind = head - head = next - } - return behind -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0207.Course-Schedule.md b/website/content/ChapterFour/0207.Course-Schedule.md deleted file mode 100755 index 7d2e8401a..000000000 --- a/website/content/ChapterFour/0207.Course-Schedule.md +++ /dev/null @@ -1,82 +0,0 @@ -# [207. Course Schedule](https://leetcode.com/problems/course-schedule/) - -## 题目 - -There are a total of n courses you have to take, labeled from `0` to `n-1`. - -Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: `[0,1]` - -Given the total number of courses and a list of prerequisite **pairs**, is it possible for you to finish all courses? - -**Example 1**: - - Input: 2, [[1,0]] - Output: true - Explanation: There are a total of 2 courses to take. - To take course 1 you should have finished course 0. So it is possible. - -**Example 2**: - - Input: 2, [[1,0],[0,1]] - Output: false - Explanation: There are a total of 2 courses to take. - To take course 1 you should have finished course 0, and to take course 0 you should - also have finished course 1. So it is impossible. - -**Note**: - -1. The input prerequisites is a graph represented by **a list of edges**, not adjacency matrices. Read more about [how a graph is represented](https://www.khanacademy.org/computing/computer-science/algorithms/graph-representation/a/representing-graphs). -2. You may assume that there are no duplicate edges in the input prerequisites. - - -## 题目大意 - -现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? - - - -## 解题思路 - -- 给出 n 个任务,每两个任务之间有相互依赖关系,比如 A 任务一定要在 B 任务之前完成才行。问是否可以完成所有任务。 -- 这一题就是标准的 AOV 网的拓扑排序问题。拓扑排序问题的解决办法是主要是循环执行以下两步,直到不存在入度为0的顶点为止。 - - 1. 选择一个入度为0的顶点并输出之; - - 2. 从网中删除此顶点及所有出边。 - - 循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,即无法完成所有任务;否则输出的顶点序列就是一种拓扑序列,即可以完成所有任务。 - - - -## 代码 - -```go - -package leetcode - -// AOV 网的拓扑排序 -func canFinish(n int, pre [][]int) bool { - in := make([]int, n) - frees := make([][]int, n) - next := make([]int, 0, n) - for _, v := range pre { - in[v[0]]++ - frees[v[1]] = append(frees[v[1]], v[0]) - } - for i := 0; i < n; i++ { - if in[i] == 0 { - next = append(next, i) - } - } - for i := 0; i != len(next); i++ { - c := next[i] - v := frees[c] - for _, vv := range v { - in[vv]-- - if in[vv] == 0 { - next = append(next, vv) - } - } - } - return len(next) == n -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0208.Implement-Trie-Prefix-Tree.md b/website/content/ChapterFour/0208.Implement-Trie-Prefix-Tree.md deleted file mode 100755 index 42d6500bd..000000000 --- a/website/content/ChapterFour/0208.Implement-Trie-Prefix-Tree.md +++ /dev/null @@ -1,99 +0,0 @@ -# [208. Implement Trie (Prefix Tree)](https://leetcode.com/problems/implement-trie-prefix-tree/) - - -## 题目 - -Implement a trie with `insert`, `search`, and `startsWith` methods. - -**Example**: - - Trie trie = new Trie(); - - trie.insert("apple"); - trie.search("apple"); // returns true - trie.search("app"); // returns false - trie.startsWith("app"); // returns true - trie.insert("app"); - trie.search("app"); // returns true - -**Note**: - -- You may assume that all inputs are consist of lowercase letters `a-z`. -- All inputs are guaranteed to be non-empty strings. - -## 题目大意 - -实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。 - -## 解题思路 - -- 要求实现一个 Trie 的数据结构,具有 `insert`, `search`, `startsWith` 三种操作 -- 这一题就是经典的 Trie 实现。本题的实现可以作为 Trie 的模板。 - - -## 代码 - -```go - -package leetcode - -type Trie struct { - isWord bool - children map[rune]*Trie -} - -/** Initialize your data structure here. */ -func Constructor208() Trie { - return Trie{isWord: false, children: make(map[rune]*Trie)} -} - -/** Inserts a word into the trie. */ -func (this *Trie) Insert(word string) { - parent := this - for _, ch := range word { - if child, ok := parent.children[ch]; ok { - parent = child - } else { - newChild := &Trie{children: make(map[rune]*Trie)} - parent.children[ch] = newChild - parent = newChild - } - } - parent.isWord = true -} - -/** Returns if the word is in the trie. */ -func (this *Trie) Search(word string) bool { - parent := this - for _, ch := range word { - if child, ok := parent.children[ch]; ok { - parent = child - continue - } - return false - } - return parent.isWord -} - -/** Returns if there is any word in the trie that starts with the given prefix. */ -func (this *Trie) StartsWith(prefix string) bool { - parent := this - for _, ch := range prefix { - if child, ok := parent.children[ch]; ok { - parent = child - continue - } - return false - } - return true -} - -/** - * Your Trie object will be instantiated and called as such: - * obj := Constructor(); - * obj.Insert(word); - * param_2 := obj.Search(word); - * param_3 := obj.StartsWith(prefix); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0209.Minimum-Size-Subarray-Sum.md b/website/content/ChapterFour/0209.Minimum-Size-Subarray-Sum.md deleted file mode 100644 index c2fd8a75b..000000000 --- a/website/content/ChapterFour/0209.Minimum-Size-Subarray-Sum.md +++ /dev/null @@ -1,61 +0,0 @@ -# [209. Minimum Size Subarray Sum](https://leetcode.com/problems/minimum-size-subarray-sum/) - -## 题目 - -Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead. - -**Example 1**: - -``` - -Input: s = 7, nums = [2,3,1,2,4,3] -Output: 2 -Explanation: the subarray [4,3] has the minimal length under the problem constraint. - -``` - -**Follow up**: - -If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n). - -## 题目大意 - -给定一个整型数组和一个数字 s,找到数组中最短的一个连续子数组,使得连续子数组的数字之和 sum>=s,返回最短的连续子数组的返回值。 - -## 解题思路 - -这一题的解题思路是用滑动窗口。在滑动窗口 [i,j]之间不断往后移动,如果总和小于 s,就扩大右边界 j,不断加入右边的值,直到 sum > s,之和再缩小 i 的左边界,不断缩小直到 sum < s,这时候右边界又可以往右移动。以此类推。 - - - -## 代码 - -```go - -package leetcode - -func minSubArrayLen(s int, nums []int) int { - n := len(nums) - if n == 0 { - return 0 - } - left, right, res, sum := 0, -1, n+1, 0 - for left < n { - if (right+1) < n && sum < s { - right++ - sum += nums[right] - } else { - sum -= nums[left] - left++ - } - if sum >= s { - res = min(res, right-left+1) - } - } - if res == n+1 { - return 0 - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0210.Course-Schedule-II.md b/website/content/ChapterFour/0210.Course-Schedule-II.md deleted file mode 100755 index 735d260e1..000000000 --- a/website/content/ChapterFour/0210.Course-Schedule-II.md +++ /dev/null @@ -1,80 +0,0 @@ -# [210. Course Schedule II](https://leetcode.com/problems/course-schedule-ii/) - - -## 题目 - -There are a total of *n* courses you have to take, labeled from `0` to `n-1`. - -Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: `[0,1]` - -Given the total number of courses and a list of prerequisite **pairs**, return the ordering of courses you should take to finish all courses. - -There may be multiple correct orders, you just need to return one of them. If it is impossible to finish all courses, return an empty array. - -**Example 1**: - - Input: 2, [[1,0]] - Output: [0,1] - Explanation: There are a total of 2 courses to take. To take course 1 you should have finished - course 0. So the correct course order is [0,1] . - -**Example 2**: - - Input: 4, [[1,0],[2,0],[3,1],[3,2]] - Output: [0,1,2,3] or [0,2,1,3] - Explanation: There are a total of 4 courses to take. To take course 3 you should have finished both - courses 1 and 2. Both courses 1 and 2 should be taken after you finished course 0. - So one correct course order is [0,1,2,3]. Another correct ordering is [0,2,1,3] . - -**Note**: - -1. The input prerequisites is a graph represented by **a list of edges**, not adjacency matrices. Read more about [how a graph is represented](https://www.khanacademy.org/computing/computer-science/algorithms/graph-representation/a/representing-graphs). -2. You may assume that there are no duplicate edges in the input prerequisites. - -## 题目大意 - -现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]。给定课程总量以及它们的先决条件,返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回一种就可以了。如果不可能完成所有课程,返回一个空数组。 - - -## 解题思路 - -- 给出 n 个任务,每两个任务之间有相互依赖关系,比如 A 任务一定要在 B 任务之前完成才行。问是否可以完成所有任务,如果可以完成任务,就输出完成任务的顺序,如果不能完成,输出空数组。 -- 这一题是第 207 题的加强版。解题思路是 AOV 网的拓扑排序。最后输出数组即可。代码和第 207 题基本不变。具体解题思路见第 207 题。 - - -## 代码 - -```go - -package leetcode - -func findOrder(numCourses int, prerequisites [][]int) []int { - in := make([]int, numCourses) - frees := make([][]int, numCourses) - next := make([]int, 0, numCourses) - for _, v := range prerequisites { - in[v[0]]++ - frees[v[1]] = append(frees[v[1]], v[0]) - } - for i := 0; i < numCourses; i++ { - if in[i] == 0 { - next = append(next, i) - } - } - for i := 0; i != len(next); i++ { - c := next[i] - v := frees[c] - for _, vv := range v { - in[vv]-- - if in[vv] == 0 { - next = append(next, vv) - } - } - } - if len(next) == numCourses { - return next - } - return []int{} -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0211.Add-and-Search-Word---Data-structure-design.md b/website/content/ChapterFour/0211.Add-and-Search-Word---Data-structure-design.md deleted file mode 100755 index ba8502f7f..000000000 --- a/website/content/ChapterFour/0211.Add-and-Search-Word---Data-structure-design.md +++ /dev/null @@ -1,95 +0,0 @@ -# [211. Add and Search Word - Data structure design](https://leetcode.com/problems/add-and-search-word-data-structure-design/) - - -## 题目 - -Design a data structure that supports the following two operations: - - void addWord(word) - bool search(word) - -search(word) can search a literal word or a regular expression string containing only letters `a-z` or `.`. A `.` means it can represent any one letter. - -**Example**: - - addWord("bad") - addWord("dad") - addWord("mad") - search("pad") -> false - search("bad") -> true - search(".ad") -> true - search("b..") -> true - -**Note**: You may assume that all words are consist of lowercase letters `a-z`. - -## 题目大意 - -设计一个支持以下两种操作的数据结构:`void addWord(word)`、`bool search(word)`。`search(word)` 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 "." 可以表示任何一个字母。 - - - -## 解题思路 - -- 设计一个 `WordDictionary` 的数据结构,要求具有 `addWord(word)` 和 `search(word)` 的操作,并且具有模糊查找的功能。 -- 这一题是第 208 题的加强版,在第 208 题经典的 Trie 上加上了模糊查找的功能。其他实现一模一样。 - - -## 代码 - -```go - -package leetcode - -type WordDictionary struct { - children map[rune]*WordDictionary - isWord bool -} - -/** Initialize your data structure here. */ -func Constructor211() WordDictionary { - return WordDictionary{children: make(map[rune]*WordDictionary)} -} - -/** Adds a word into the data structure. */ -func (this *WordDictionary) AddWord(word string) { - parent := this - for _, ch := range word { - if child, ok := parent.children[ch]; ok { - parent = child - } else { - newChild := &WordDictionary{children: make(map[rune]*WordDictionary)} - parent.children[ch] = newChild - parent = newChild - } - } - parent.isWord = true -} - -/** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */ -func (this *WordDictionary) Search(word string) bool { - parent := this - for i, ch := range word { - if rune(ch) == '.' { - isMatched := false - for _, v := range parent.children { - if v.Search(word[i+1:]) { - isMatched = true - } - } - return isMatched - } else if _, ok := parent.children[rune(ch)]; !ok { - return false - } - parent = parent.children[rune(ch)] - } - return len(parent.children) == 0 || parent.isWord -} - -/** - * Your WordDictionary object will be instantiated and called as such: - * obj := Constructor(); - * obj.AddWord(word); - * param_2 := obj.Search(word); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0212.Word-Search-II.md b/website/content/ChapterFour/0212.Word-Search-II.md deleted file mode 100755 index b277984b1..000000000 --- a/website/content/ChapterFour/0212.Word-Search-II.md +++ /dev/null @@ -1,57 +0,0 @@ -# [212. Word Search II](https://leetcode.com/problems/word-search-ii/) - - -## 题目 - -Given a 2D board and a list of words from the dictionary, find all words in the board. - -Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word. - -**Example**: - - Input: - board = [ - ['o','a','a','n'], - ['e','t','a','e'], - ['i','h','k','r'], - ['i','f','l','v'] - ] - words = ["oath","pea","eat","rain"] - - Output: ["eat","oath"] - -**Note**: - -1. All inputs are consist of lowercase letters `a-z`. -2. The values of `words` are distinct. - -## 题目大意 - -给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 - -单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 - - -## 解题思路 - -- 这一题是第 79 题的加强版,在第 79 题的基础上增加了一个 word 数组,要求找出所有出现在地图中的单词。思路还是可以按照第 79 题 DFS 搜索,不过时间复杂度特别高! -- 想想更优的解法。 - - -## 代码 - -```go - -package leetcode - -func findWords(board [][]byte, words []string) []string { - res := []string{} - for _, v := range words { - if exist(board, v) { - res = append(res, v) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0213.House-Robber-II.md b/website/content/ChapterFour/0213.House-Robber-II.md deleted file mode 100755 index b53c02f67..000000000 --- a/website/content/ChapterFour/0213.House-Robber-II.md +++ /dev/null @@ -1,70 +0,0 @@ -# [213. House Robber II](https://leetcode.com/problems/house-robber-ii/) - - -## 题目 - -You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are **arranged in a circle.** That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have security system connected and **it will automatically contact the police if two adjacent houses were broken into on the same night**. - -Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight **without alerting the police**. - -**Example 1**: - - Input: [2,3,2] - Output: 3 - Explanation: You cannot rob house 1 (money = 2) and then rob house 3 (money = 2), - because they are adjacent houses. - -**Example 2**: - - Input: [1,2,3,1] - Output: 4 - Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3). - Total amount you can rob = 1 + 3 = 4. - -## 题目大意 - -你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都**围成一圈**,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,**如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警**。 - -给定一个代表每个房屋存放金额的非负整数数组,计算你**在不触动警报装置的情况下**,能够偷窃到的最高金额。 - - -## 解题思路 - -- 这一题是第 198 题的加强版。不过这次是在一个环形的街道中,即最后一个元素和第一个元素是邻居,在不触碰警报的情况下,问能够窃取的财产的最大值是多少? -- 解题思路和第 198 完全一致,只需要增加额外的一个转换。由于首尾是相邻的,所以在取了第一个房子以后就不能取第 n 个房子,那么就在 [0,n - 1] 的区间内找出总价值最多的解,然后再 [1,n] 的区间内找出总价值最多的解,两者取最大值即可。 - - - -## 代码 - -```go - -package leetcode - -func rob213(nums []int) int { - n := len(nums) - if n == 0 { - return 0 - } - if n == 1 { - return nums[0] - } - if n == 2 { - return max(nums[0], nums[1]) - } - // 由于首尾是相邻的,所以需要对比 [0,n-1]、[1,n] 这两个区间的最大值 - return max(rob213_1(nums, 0, n-2), rob213_1(nums, 1, n-1)) -} - -func rob213_1(nums []int, start, end int) int { - preMax := nums[start] - curMax := max(preMax, nums[start+1]) - for i := start + 2; i <= end; i++ { - tmp := curMax - curMax = max(curMax, nums[i]+preMax) - preMax = tmp - } - return curMax -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0215.Kth-Largest-Element-in-an-Array.md b/website/content/ChapterFour/0215.Kth-Largest-Element-in-an-Array.md deleted file mode 100644 index babad9e9c..000000000 --- a/website/content/ChapterFour/0215.Kth-Largest-Element-in-an-Array.md +++ /dev/null @@ -1,76 +0,0 @@ -# [215. Kth Largest Element in an Array](https://leetcode.com/problems/kth-largest-element-in-an-array/) - -## 题目 - -Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. - -**Example 1**: - -``` - -Input: [3,2,1,5,6,4] and k = 2 -Output: 5 - -``` - -**Example 2**: - -``` - -Input: [3,2,3,1,2,4,5,5,6] and k = 4 -Output: 4 - -``` - -**Note**: - -You may assume k is always valid, 1 ≤ k ≤ array's length. - - -## 题目大意 - -找出数组中第 K 大的元素。这一题非常经典。可以用 O(n) 的时间复杂度实现。 - -## 解题思路 - -在快排的 partition 操作中,每次 partition 操作结束都会返回一个点,这个标定点的下标和最终排序之后有序数组中这个元素所在的下标是一致的。利用这个特性,我们可以不断的划分数组区间,最终找到第 K 大的元素。执行一次 partition 操作以后,如果这个元素的下标比 K 小,那么接着就在后边的区间继续执行 partition 操作;如果这个元素的下标比 K 大,那么就在左边的区间继续执行 partition 操作;如果相等就直接输出这个下标对应的数组元素即可。 - - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 排序,排序的方法反而速度是最快的 -func findKthLargest1(nums []int, k int) int { - sort.Ints(nums) - return nums[len(nums)-k] -} - -// 解法二 这个方法的理论依据是 partition 得到的点的下标就是最终排序之后的下标,根据这个下标,我们可以判断第 K 大的数在哪里 -func findKthLargest(nums []int, k int) int { - if len(nums) == 0 { - return 0 - } - return selection(nums, 0, len(nums)-1, len(nums)-k) -} - -func selection(arr []int, l, r, k int) int { - if l == r { - return arr[l] - } - p := partition164(arr, l, r) - if k == p { - return arr[p] - } else if k < p { - return selection(arr, l, p-1, k) - } else { - return selection(arr, p+1, r, k) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0216.Combination-Sum-III.md b/website/content/ChapterFour/0216.Combination-Sum-III.md deleted file mode 100755 index 8aadea35d..000000000 --- a/website/content/ChapterFour/0216.Combination-Sum-III.md +++ /dev/null @@ -1,73 +0,0 @@ -# [216. Combination Sum III](https://leetcode.com/problems/combination-sum-iii/) - - -## 题目 - -Find all possible combinations of **k** numbers that add up to a number **n**, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers. - -**Note**: - -- All numbers will be positive integers. -- The solution set must not contain duplicate combinations. - -**Example 1**: - - Input: k = 3, n = 7 - Output: [[1,2,4]] - -**Example 2**: - - Input: k = 3, n = 9 - Output: [[1,2,6], [1,3,5], [2,3,4]] - -## 题目大意 - -找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 - -说明: - -- 所有数字都是正整数。 -- 解集不能包含重复的组合。 - - -## 解题思路 - -- 这一题比第 39 题还要简单一些,在第 39 题上稍加改动就可以解出这一道题。 -- 第 39 题是给出数组,这一道题数组是固定死的 [1,2,3,4,5,6,7,8,9],并且数字不能重复使用。 - - - -## 代码 - -```go - -package leetcode - -func combinationSum3(k int, n int) [][]int { - if k == 0 { - return [][]int{} - } - c, res := []int{}, [][]int{} - findcombinationSum3(k, n, 1, c, &res) - return res -} - -func findcombinationSum3(k, target, index int, c []int, res *[][]int) { - if target == 0 { - if len(c) == k { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - } - return - } - for i := index; i < 10; i++ { - if target >= i { - c = append(c, i) - findcombinationSum3(k, target-i, i+1, c, res) - c = c[:len(c)-1] - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0217.Contains-Duplicate.md b/website/content/ChapterFour/0217.Contains-Duplicate.md deleted file mode 100644 index c9ce8b435..000000000 --- a/website/content/ChapterFour/0217.Contains-Duplicate.md +++ /dev/null @@ -1,62 +0,0 @@ -# [217. Contains Duplicate](https://leetcode.com/problems/contains-duplicate/) - -## 题目 - -Given an array of integers, find if the array contains any duplicates. - -Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct. - - -**Example 1**: - -``` - -Input: [1,2,3,1] -Output: true - -``` -**Example 2**: - -``` - -Input: [1,2,3,4] -Output: false - -``` - -**Example 3**: - -``` - -Input: [1,1,1,3,3,4,3,2,4,2] -Output: true - -``` - -## 题目大意 - -这是一道简单题,如果数组里面有重复数字就输出 true,否则输出 flase。 - -## 解题思路 - -用 map 判断即可。 - - -## 代码 - -```go - -package leetcode - -func containsDuplicate(nums []int) bool { - record := make(map[int]bool, len(nums)) - for _, n := range nums { - if _, found := record[n]; found { - return true - } - record[n] = true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0218.The-Skyline-Problem.md b/website/content/ChapterFour/0218.The-Skyline-Problem.md deleted file mode 100755 index 0a4f2bc69..000000000 --- a/website/content/ChapterFour/0218.The-Skyline-Problem.md +++ /dev/null @@ -1,287 +0,0 @@ -# [218. The Skyline Problem](https://leetcode.com/problems/the-skyline-problem/) - -## 题目 - -A city's skyline is the outer contour of the silhouette formed by all the buildings in that city when viewed from a distance. Now suppose you are **given the locations and height of all the buildings** as shown on a cityscape photo (Figure A), write a program to **output the skyline** formed by these buildings collectively (Figure B). - -![](https://img.halfrost.com/Leetcode/leetcode_218_0.png) - -![](https://img.halfrost.com/Leetcode/leetcode_218_1.png) - -The geometric information of each building is represented by a triplet of integers `[Li, Ri, Hi]`, where `Li` and `Ri` are the x coordinates of the left and right edge of the ith building, respectively, and `Hi` is its height. It is guaranteed that `0 ≤ Li, Ri ≤ INT_MAX`, `0 < Hi ≤ INT_MAX`, and `Ri - Li > 0`. You may assume all buildings are perfect rectangles grounded on an absolutely flat surface at height 0. - -For instance, the dimensions of all buildings in Figure A are recorded as: `[ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ]` . - -The output is a list of "**key points**" (red dots in Figure B) in the format of `[ [x1,y1], [x2, y2], [x3, y3], ... ]` that uniquely defines a skyline. **A key point is the left endpoint of a horizontal line segment**. Note that the last key point, where the rightmost building ends, is merely used to mark the termination of the skyline, and always has zero height. Also, the ground in between any two adjacent buildings should be considered part of the skyline contour. - -For instance, the skyline in Figure B should be represented as:`[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8], [24, 0] ]`. - -**Notes**: - -- The number of buildings in any input list is guaranteed to be in the range `[0, 10000]`. -- The input list is already sorted in ascending order by the left x position `Li`. -- The output list must be sorted by the x position. -- There must be no consecutive horizontal lines of equal height in the output skyline. For instance, `[...[2 3], [4 5], [7 5], [11 5], [12 7]...]` is not acceptable; the three lines of height 5 should be merged into one in the final output as such: `[...[2 3], [4 5], [12 7], ...]` - - -## 题目大意 - -城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B)。 - -每个建筑物的几何信息用三元组 [Li,Ri,Hi] 表示,其中 Li 和 Ri 分别是第 i 座建筑物左右边缘的 x 坐标,Hi 是其高度。可以保证 0 ≤ Li, Ri ≤ INT\_MAX, 0 < Hi ≤ INT\_MAX 和 Ri - Li > 0。您可以假设所有建筑物都是在绝对平坦且高度为 0 的表面上的完美矩形。 - -例如,图 A 中所有建筑物的尺寸记录为:[ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ] 。 - -输出是以 [ [x1,y1], [x2, y2], [x3, y3], ... ] 格式的“关键点”(图 B 中的红点)的列表,它们唯一地定义了天际线。关键点是水平线段的左端点。请注意,最右侧建筑物的最后一个关键点仅用于标记天际线的终点,并始终为零高度。此外,任何两个相邻建筑物之间的地面都应被视为天际线轮廓的一部分。 - -例如,图 B 中的天际线应该表示为:[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8], [24, 0] ]。 - -说明: - -- 任何输入列表中的建筑物数量保证在 [0, 10000] 范围内。 -- 输入列表已经按左 x 坐标 Li 进行升序排列。 -- 输出列表必须按 x 位排序。 -- 输出天际线中不得有连续的相同高度的水平线。例如 [...[2 3], [4 5], [7 5], [11 5], [12 7]...] 是不正确的答案;三条高度为 5 的线应该在最终输出中合并为一个:[...[2 3], [4 5], [12 7], ...] - - -## 解题思路 - - -- 给出一个二维数组,每个子数组里面代表一个高楼的信息,一个高楼的信息包含 3 个信息,高楼起始坐标,高楼终止坐标,高楼高度。要求找到这些高楼的边际点,并输出这些边际点的高度信息。 -- 这一题可以用线段树来解。用线段树来解答,可以不用关心“楼挡住楼”的情况。由于楼的坐标是离散的,所以先把楼在 X 轴上两个坐标离散化。同第 699 题一样,楼的宽度是一个区间,但是离散的过程中,楼的宽度右边界需要减一,不然查询一个区间会包含两个点,导致错误的结果,例如,第一个楼是 [1,3),楼高 10,第二个楼是 [3,6),楼高 20 。第一个楼如果算上右边界 3,查询 [1,3] 的结果是 20,因为 [3,3] 这个点会查询到第二个楼上面去。所以每个楼的右边界应该减一。但是每个楼的右边界也要加入到 query 中,因为最终 query 的结果需要包含这些边界。将离散的数据排序以后,按照楼的信息,每个区间依次 update。最后统计的时候依次统计每个区间,如果当前区间的高度和前一个区间的高度一样,就算是等高的楼。当高度与前一个高度不相同的时候就算是天际线的边缘,就要添加到最后输出数组中。 -- 类似的线段树的题目有:第 715 题,第 732 题,第 699 题。第 715 题是区间更新定值(**不是增减**),第 218 题可以用扫描线,第 732 题和第 699 题类似,也是俄罗斯方块的题目,但是第 732 题的俄罗斯方块的方块会“断裂”。 -- 这一题用线段树做时间复杂度有点高,可以用扫描线解题。扫描线的思路很简单,用一根根垂直于 X 轴的竖线,从最左边依次扫到最右边,扫描每一条大楼的边界,当进入大楼的左边界的时候,如果没有比这个左边界最高点更高的点,就记录下这个最高点 keyPoint,状态是进入状态。如果扫到一个大楼的左边界,有比它更高的高度,就不记录,因为它不是天际线,它被楼挡楼,挡在其他楼后面了。当扫到一个大楼的右边界的时候,如果是最高点,那么记录下它的状态是离开状态,此时还需要记录下第二高的点。在扫描线扫描的过程中,动态的维护大楼的高度,同时维护最高的高度和第二高的高度。其实只需要维护最高的高度这一个高度,因为当离开状态到来的时候,移除掉当前最高的,剩下的高度里面最高的就是第二高的高度。描述的伪代码如下: - - // 扫描线伪代码 - events = {{x: L , height: H , type: entering}, - {x: R , height: H , type: leaving}} - event.SortByX() - ds = new DS() - - for e in events: - if entering(e): - if e.height > ds.max(): ans += [e.height] - ds.add(e.height) - if leaving(e): - ds.remove(e.height) - if e.height > ds.max(): ans += [ds.max()] - -- 动态插入,查找最大值可以选用的数据结构有,最大堆和二叉搜索树。最大堆找最大值 O(1),插入 O(log n),但是 remove_by_key 需要 O(n) 的时间复杂度,并且需要自己实现。二叉搜索树,查找 max,添加和删除元素都是 O(log n) 的时间复杂度。 -- 排序的时候也需要注意几个问题:如果大楼的边界相等,并且是进入状态,那么再按照高度从大到小进行排序;如果大楼的边界相等,并且是离开状态,那么高度按照从小到大进行排序。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 线段树 Segment Tree,时间复杂度 O(n log n) -func getSkyline(buildings [][]int) [][]int { - st, ans, lastHeight, check := template.SegmentTree{}, [][]int{}, 0, false - posMap, pos := discretization218(buildings) - tmp := make([]int, len(posMap)) - st.Init(tmp, func(i, j int) int { - return max(i, j) - }) - for _, b := range buildings { - st.UpdateLazy(posMap[b[0]], posMap[b[1]-1], b[2]) - } - for i := 0; i < len(pos); i++ { - h := st.QueryLazy(posMap[pos[i]], posMap[pos[i]]) - if check == false && h != 0 { - ans = append(ans, []int{pos[i], h}) - check = true - } else if i > 0 && h != lastHeight { - ans = append(ans, []int{pos[i], h}) - } - lastHeight = h - } - return ans -} - -func discretization218(positions [][]int) (map[int]int, []int) { - tmpMap, posArray, posMap := map[int]int{}, []int{}, map[int]int{} - for _, pos := range positions { - tmpMap[pos[0]]++ - tmpMap[pos[1]-1]++ - tmpMap[pos[1]]++ - } - for k := range tmpMap { - posArray = append(posArray, k) - } - sort.Ints(posArray) - for i, pos := range posArray { - posMap[pos] = i - } - return posMap, posArray -} - -// 解法二 扫描线 Sweep Line,时间复杂度 O(n log n) -func getSkyline1(buildings [][]int) [][]int { - size := len(buildings) - es := make([]E, 0) - for i, b := range buildings { - l := b[0] - r := b[1] - h := b[2] - // 1-- enter - el := NewE(i, l, h, 0) - es = append(es, el) - // 0 -- leave - er := NewE(i, r, h, 1) - es = append(es, er) - } - skyline := make([][]int, 0) - sort.Slice(es, func(i, j int) bool { - if es[i].X == es[j].X { - if es[i].T == es[j].T { - if es[i].T == 0 { - return es[i].H > es[j].H - } - return es[i].H < es[j].H - } - return es[i].T < es[j].T - } - return es[i].X < es[j].X - }) - pq := NewIndexMaxPQ(size) - for _, e := range es { - curH := pq.Front() - if e.T == 0 { - if e.H > curH { - skyline = append(skyline, []int{e.X, e.H}) - } - pq.Enque(e.N, e.H) - } else { - pq.Remove(e.N) - h := pq.Front() - if curH > h { - skyline = append(skyline, []int{e.X, h}) - } - } - } - return skyline -} - -// 扫面线伪代码 -// events = {{x: L , height: H , type: entering}, -// {x: R , height: H , type: leaving}} -// event.SortByX() -// ds = new DS() - -// for e in events: -// if entering(e): -// if e.height > ds.max(): ans += [e.height] -// ds.add(e.height) -// if leaving(e): -// ds.remove(e.height) -// if e.height > ds.max(): ans += [ds.max()] - -// E define -type E struct { // 定义一个 event 事件 - N int // number 编号 - X int // x 坐标 - H int // height 高度 - T int // type 0-进入 1-离开 -} - -// NewE define -func NewE(n, x, h, t int) E { - return E{ - N: n, - X: x, - H: h, - T: t, - } -} - -// IndexMaxPQ define -type IndexMaxPQ struct { - items []int - pq []int - qp []int - total int -} - -// NewIndexMaxPQ define -func NewIndexMaxPQ(n int) IndexMaxPQ { - qp := make([]int, n) - for i := 0; i < n; i++ { - qp[i] = -1 - } - return IndexMaxPQ{ - items: make([]int, n), - pq: make([]int, n+1), - qp: qp, - } -} - -// Enque define -func (q *IndexMaxPQ) Enque(key, val int) { - q.total++ - q.items[key] = val - q.pq[q.total] = key - q.qp[key] = q.total - q.swim(q.total) -} - -// Front define -func (q *IndexMaxPQ) Front() int { - if q.total < 1 { - return 0 - } - return q.items[q.pq[1]] -} - -// Remove define -func (q *IndexMaxPQ) Remove(key int) { - rank := q.qp[key] - q.exch(rank, q.total) - q.total-- - q.qp[key] = -1 - q.sink(rank) -} - -func (q *IndexMaxPQ) sink(n int) { - for 2*n <= q.total { - k := 2 * n - if k < q.total && q.less(k, k+1) { - k++ - } - if q.less(k, n) { - break - } - q.exch(k, n) - n = k - } -} - -func (q *IndexMaxPQ) swim(n int) { - for n > 1 { - k := n / 2 - if q.less(n, k) { - break - } - q.exch(n, k) - n = k - } -} - -func (q *IndexMaxPQ) exch(i, j int) { - q.pq[i], q.pq[j] = q.pq[j], q.pq[i] - q.qp[q.pq[i]] = i - q.qp[q.pq[j]] = j -} - -func (q *IndexMaxPQ) less(i, j int) bool { - return q.items[q.pq[i]] < q.items[q.pq[j]] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0219.Contains-Duplicate-II.md b/website/content/ChapterFour/0219.Contains-Duplicate-II.md deleted file mode 100644 index 8cf856a37..000000000 --- a/website/content/ChapterFour/0219.Contains-Duplicate-II.md +++ /dev/null @@ -1,69 +0,0 @@ -# [219. Contains Duplicate II](https://leetcode.com/problems/contains-duplicate-ii/) - -## 题目 - -Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k. - - -**Example 1**: - -``` - -Input: nums = [1,2,3,1], k = 3 -Output: true - -``` -**Example 2**: - -``` - -Input: nums = [1,0,1,1], k = 1 -Output: true - -``` - -**Example 3**: - -``` - -Input: nums = [1,2,3,1,2,3], k = 2 -Output: false - -``` - -## 题目大意 - -这是一道简单题,如果数组里面有重复数字,并且重复数字的下标差值小于等于 K 就输出 true,如果没有重复数字或者下标差值超过了 K ,则输出 flase。 - -## 解题思路 - -这道题可以维护一个只有 K 个元素的 map,每次只需要判断这个 map 里面是否存在这个元素即可。如果存在就代表重复数字的下标差值在 K 以内。map 的长度如果超过了 K 以后就删除掉 i-k 的那个元素,这样一直维护 map 里面只有 K 个元素。 - - -## 代码 - -```go - -package leetcode - -func containsNearbyDuplicate(nums []int, k int) bool { - if len(nums) <= 1 { - return false - } - if k <= 0 { - return false - } - record := make(map[int]bool, len(nums)) - for i, n := range nums { - if _, found := record[n]; found { - return true - } - record[n] = true - if len(record) == k+1 { - delete(record, nums[i-k]) - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0220.Contains-Duplicate-III.md b/website/content/ChapterFour/0220.Contains-Duplicate-III.md deleted file mode 100644 index 9dcd3f1ba..000000000 --- a/website/content/ChapterFour/0220.Contains-Duplicate-III.md +++ /dev/null @@ -1,103 +0,0 @@ -# [220. Contains Duplicate III](https://leetcode.com/problems/contains-duplicate-iii/) - -## 题目 - -Given an array of integers, find out whether there are two distinct indices i and j in the array such that the **absolute** difference between **nums[i]** and **nums[j]** is at most t and the **absolute** difference between i and j is at most k. - -**Example 1**: - - Input: nums = [1,2,3,1], k = 3, t = 0 - Output: true - -**Example 2**: - - Input: nums = [1,0,1,1], k = 1, t = 2 - Output: true - -**Example 3**: - - Input: nums = [1,5,9,1,5,9], k = 2, t = 3 - Output: false - - - - -## 题目大意 - -给出一个数组 num,再给 K 和 t。问在 num 中能否找到一组 i 和 j,使得 num[i] 和 num[j] 的绝对差值最大为 t,并且 i 和 j 之前的绝对差值最大为 k。 - -## 解题思路 - - -- 给出一个数组,要求在数组里面找到 2 个索引,`i` 和 `j`,使得 `| nums[i] - nums[j] | ≤ t` ,并且 `| i - j | ≤ k` 。 -- 这是一道滑动窗口的题目。第一想法就是用 `i` 和 `j` 两个指针,针对每个 `i` ,都从 `i + 1` 往后扫完整个数组,判断每个 `i` 和 `j` ,判断是否满足题意。`j` 在循环的过程中注意判断剪枝条件 `| i - j | ≤ k`。这个做法的时间复杂度是 O(n^2)。这个做法慢的原因在于滑动窗口的左边界和右边界在滑动过程中不是联动滑动的。 -- 于是考虑,如果数组是有序的呢?把数组按照元素值从小到大进行排序,如果元素值相等,就按照 index 从小到大进行排序。在这样有序的数组中找满足题意的 `i` 和 `j`,滑动窗口左边界和右边界就是联动的了。窗口的右边界滑到与左边界元素值的差值 ≤ t 的地方,满足了这个条件再判断 `| i - j | ≤ k`,如果右边界与左边界元素值的差值 > t 了,说明该把左边界往右移动了(能这样移动的原因就是因为我们将数组元素大小排序了,右移是增大元素的方向)。移动左边界的时候需要注意左边界不能超过右边界。这样滑动窗口一次滑过整个排序后的数组,就可以判断是否存在满足题意的 `i` 和 `j` 。这个做法的时间主要花在排序上了,时间复杂度是 O(n log n)。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 排序 + 滑动窗口 -func containsNearbyAlmostDuplicate(nums []int, k int, t int) bool { - if len(nums) < 2 { - return false - } - elemList := make([]*elem, len(nums)) - for i, num := range nums { - elemList[i] = &elem{num, i} - } - sort.SliceStable(elemList, func(i, j int) bool { - if elemList[i].val != elemList[j].val { - return elemList[i].val < elemList[j].val - } - return elemList[i].idx < elemList[j].idx - }) - i, j := 0, 1 - for j < len(elemList) { - if elemList[j].val-elemList[i].val <= t { - if abs(elemList[j].idx-elemList[i].idx) <= k { - return true - } - j++ - } else { - i++ - if j <= i { - j++ - } - } - } - return false -} - -type elem struct { - val int - idx int -} - -// 解法二 滑动窗口 + 剪枝 -func containsNearbyAlmostDuplicate1(nums []int, k int, t int) bool { - if len(nums) <= 1 { - return false - } - if k <= 0 { - return false - } - n := len(nums) - for i := 0; i < n; i++ { - count := 0 - for j := i + 1; j < n && count < k; j++ { - if abs(nums[i]-nums[j]) <= t { - return true - } - count++ - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0222.Count-Complete-Tree-Nodes.md b/website/content/ChapterFour/0222.Count-Complete-Tree-Nodes.md deleted file mode 100644 index b2a21ebeb..000000000 --- a/website/content/ChapterFour/0222.Count-Complete-Tree-Nodes.md +++ /dev/null @@ -1,82 +0,0 @@ -# [222. Count Complete Tree Nodes](https://leetcode.com/problems/count-complete-tree-nodes/) - -## 题目 - - -Given a complete binary tree, count the number of nodes. - -**Note**: - -Definition of a complete binary tree from Wikipedia: -In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h. - - -**Example**: - -``` - -Input: - 1 - / \ - 2 3 - / \ / -4 5 6 - -Output: 6 - -``` - -## 题目大意 - -输出一颗完全二叉树的结点个数。 - -## 解题思路 - -这道题其实按照层序遍历一次树,然后把每一层的结点个数相加即可。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func countNodes(root *TreeNode) int { - if root == nil { - return 0 - } - queue := []*TreeNode{} - queue = append(queue, root) - curNum, nextLevelNum, res := 1, 0, 1 - for len(queue) != 0 { - if curNum > 0 { - node := queue[0] - if node.Left != nil { - queue = append(queue, node.Left) - nextLevelNum++ - } - if node.Right != nil { - queue = append(queue, node.Right) - nextLevelNum++ - } - curNum-- - queue = queue[1:] - } - if curNum == 0 { - res += nextLevelNum - curNum = nextLevelNum - nextLevelNum = 0 - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0223.Rectangle-Area.md b/website/content/ChapterFour/0223.Rectangle-Area.md deleted file mode 100755 index 08d9c64dd..000000000 --- a/website/content/ChapterFour/0223.Rectangle-Area.md +++ /dev/null @@ -1,53 +0,0 @@ -# [223. Rectangle Area](https://leetcode.com/problems/rectangle-area/) - - -## 题目 - -Find the total area covered by two **rectilinear** rectangles in a **2D** plane. - -Each rectangle is defined by its bottom left corner and top right corner as shown in the figure. - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/22/rectangle_area.png) - -**Example**: - - Input: A = -3, B = 0, C = 3, D = 4, E = 0, F = -1, G = 9, H = 2 - Output: 45 - -**Note**: - -Assume that the total area is never beyond the maximum possible value of **int**. - - - -## 题目大意 - -在二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。每个矩形由其左下顶点和右上顶点坐标表示,如图所示。说明: 假设矩形面积不会超出 int 的范围。 - -## 解题思路 - - -- 给出两个矩形的坐标,求这两个矩形在坐标轴上覆盖的总面积。 -- 几何题,由于只有 2 个矩形,所以按照题意做即可。先分别求两个矩形的面积,加起来再减去两个矩形重叠的面积。 - - -## 代码 - -```go - -package leetcode - -func computeArea(A int, B int, C int, D int, E int, F int, G int, H int) int { - X0, Y0, X1, Y1 := max(A, E), max(B, F), min(C, G), min(D, H) - return area(A, B, C, D) + area(E, F, G, H) - area(X0, Y0, X1, Y1) -} - -func area(x0, y0, x1, y1 int) int { - l, h := x1-x0, y1-y0 - if l <= 0 || h <= 0 { - return 0 - } - return l * h -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0225.Implement-Stack-using-Queues.md b/website/content/ChapterFour/0225.Implement-Stack-using-Queues.md deleted file mode 100644 index 11ef48664..000000000 --- a/website/content/ChapterFour/0225.Implement-Stack-using-Queues.md +++ /dev/null @@ -1,95 +0,0 @@ -# [225. Implement Stack using Queues](https://leetcode.com/problems/implement-stack-using-queues/) - -## 题目 - -Implement the following operations of a stack using queues. - -- push(x) -- Push element x onto stack. -- pop() -- Removes the element on top of the stack. -- top() -- Get the top element. -- empty() -- Return whether the stack is empty. - -**Example**: - -``` - -MyStack stack = new MyStack(); - -stack.push(1); -stack.push(2); -stack.top(); // returns 2 -stack.pop(); // returns 2 -stack.empty(); // returns false - -``` - -**Note**: - -- You must use only standard operations of a queue -- which means only push to back, peek/pop from front, size, and is empty operations are valid. -- Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue. -- You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack). - - -## 题目大意 - -题目要求用队列实现一个栈的基本操作:push(x)、pop()、top()、empty()。 - - -## 解题思路 - -按照题目要求实现即可。 - - -## 代码 - -```go - -package leetcode - -type MyStack struct { - enque []int - deque []int -} - -/** Initialize your data structure here. */ -func Constructor225() MyStack { - return MyStack{[]int{}, []int{}} -} - -/** Push element x onto stack. */ -func (this *MyStack) Push(x int) { - this.enque = append(this.enque, x) -} - -/** Removes the element on top of the stack and returns that element. */ -func (this *MyStack) Pop() int { - length := len(this.enque) - for i := 0; i < length-1; i++ { - this.deque = append(this.deque, this.enque[0]) - this.enque = this.enque[1:] - } - topEle := this.enque[0] - this.enque = this.deque - this.deque = nil - - return topEle -} - -/** Get the top element. */ -func (this *MyStack) Top() int { - topEle := this.Pop() - this.enque = append(this.enque, topEle) - - return topEle -} - -/** Returns whether the stack is empty. */ -func (this *MyStack) Empty() bool { - if len(this.enque) == 0 { - return true - } - - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0226.Invert-Binary-Tree.md b/website/content/ChapterFour/0226.Invert-Binary-Tree.md deleted file mode 100644 index 8fae9dff0..000000000 --- a/website/content/ChapterFour/0226.Invert-Binary-Tree.md +++ /dev/null @@ -1,76 +0,0 @@ -# [226. Invert Binary Tree](https://leetcode.com/problems/invert-binary-tree/) - -## 题目 - -Invert a binary tree. - -**Example**: - -Input: - -``` - - 4 - / \ - 2 7 - / \ / \ -1 3 6 9 - -``` - -Output: - -``` - - 4 - / \ - 7 2 - / \ / \ -9 6 3 1 - -``` - -Trivia: - -This problem was inspired by this original tweet by Max Howell: - ->Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so f*** off. - - -## 题目大意 - -"经典"的反转二叉树的问题。 - - -## 解题思路 - -还是用递归来解决,先递归调用反转根节点的左孩子,然后递归调用反转根节点的右孩子,然后左右交换根节点的左孩子和右孩子。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func invertTree(root *TreeNode) *TreeNode { - if root == nil { - return nil - } - invertTree(root.Left) - invertTree(root.Right) - root.Left, root.Right = root.Right, root.Left - return root -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0229.Majority-Element-II.md b/website/content/ChapterFour/0229.Majority-Element-II.md deleted file mode 100755 index ce9260581..000000000 --- a/website/content/ChapterFour/0229.Majority-Element-II.md +++ /dev/null @@ -1,100 +0,0 @@ -# [229. Majority Element II](https://leetcode.com/problems/majority-element-ii/) - - -## 题目 - -Given an integer array of size n, find all elements that appear more than `⌊ n/3 ⌋` times. - -**Note**: The algorithm should run in linear time and in O(1) space. - -**Example 1**: - - Input: [3,2,3] - Output: [3] - -**Example 2**: - - Input: [1,1,1,3,3,2,2,2] - Output: [1,2] - - -## 题目大意 - -给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。 - -## 解题思路 - -- 这一题是第 169 题的加强版。Boyer-Moore Majority Vote algorithm 算法的扩展版。 -- 题目要求找出数组中出现次数大于 `⌊ n/3 ⌋` 次的数。要求空间复杂度为 O(1)。简单题。 -- 这篇文章写的不错,可参考:[https://gregable.com/2013/10/majority-vote-algorithm-find-majority.html](https://gregable.com/2013/10/majority-vote-algorithm-find-majority.html) - -## 代码 - -```go - -package leetcode - -// 解法一 时间复杂度 O(n) 空间复杂度 O(1) -func majorityElement229(nums []int) []int { - // since we are checking if a num appears more than 1/3 of the time - // it is only possible to have at most 2 nums (>1/3 + >1/3 = >2/3) - count1, count2, candidate1, candidate2 := 0, 0, 0, 1 - // Select Candidates - for _, num := range nums { - if num == candidate1 { - count1++ - } else if num == candidate2 { - count2++ - } else if count1 <= 0 { - // We have a bad first candidate, replace! - candidate1, count1 = num, 1 - } else if count2 <= 0 { - // We have a bad second candidate, replace! - candidate2, count2 = num, 1 - } else { - // Both candidates suck, boo! - count1-- - count2-- - } - } - // Recount! - count1, count2 = 0, 0 - for _, num := range nums { - if num == candidate1 { - count1++ - } else if num == candidate2 { - count2++ - } - } - length := len(nums) - if count1 > length/3 && count2 > length/3 { - return []int{candidate1, candidate2} - } - if count1 > length/3 { - return []int{candidate1} - } - if count2 > length/3 { - return []int{candidate2} - } - return []int{} -} - -// 解法二 时间复杂度 O(n) 空间复杂度 O(n) -func majorityElement229_1(nums []int) []int { - result, m := make([]int, 0), make(map[int]int) - for _, val := range nums { - if v, ok := m[val]; ok { - m[val] = v + 1 - } else { - m[val] = 1 - } - } - for k, v := range m { - if v > len(nums)/3 { - result = append(result, k) - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0230.Kth-Smallest-Element-in-a-BST.md b/website/content/ChapterFour/0230.Kth-Smallest-Element-in-a-BST.md deleted file mode 100755 index b874e616b..000000000 --- a/website/content/ChapterFour/0230.Kth-Smallest-Element-in-a-BST.md +++ /dev/null @@ -1,78 +0,0 @@ -# [230. Kth Smallest Element in a BST](https://leetcode.com/problems/kth-smallest-element-in-a-bst/) - - -## 题目 - -Given a binary search tree, write a function `kthSmallest` to find the **k**th smallest element in it. - -**Note**: You may assume k is always valid, 1 ≤ k ≤ BST's total elements. - -**Example 1**: - - Input: root = [3,1,4,null,2], k = 1 - 3 - / \ - 1 4 - \ - 2 - Output: 1 - -**Example 2**: - - Input: root = [5,3,6,2,4,null,null,1], k = 3 - 5 - / \ - 3 6 - / \ - 2 4 - / - 1 - Output: 3 - -**Follow up**:What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine? - - -## 题目大意 - -给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 - - -## 解题思路 - -- 由于二叉搜索树有序的特性,所以中根遍历它,遍历到第 K 个数的时候就是结果 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func kthSmallest(root *TreeNode, k int) int { - res, count := 0, 0 - inorder230(root, k, &count, &res) - return res -} - -func inorder230(node *TreeNode, k int, count *int, ans *int) { - if node != nil { - inorder230(node.Left, k, count, ans) - *count++ - if *count == k { - *ans = node.Val - return - } - inorder230(node.Right, k, count, ans) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0231.Power-of-Two.md b/website/content/ChapterFour/0231.Power-of-Two.md deleted file mode 100755 index d2b3d4926..000000000 --- a/website/content/ChapterFour/0231.Power-of-Two.md +++ /dev/null @@ -1,70 +0,0 @@ -# [231. Power of Two](https://leetcode.com/problems/power-of-two/) - -## 题目 - -Given an integer, write a function to determine if it is a power of two. - -**Example 1**: - - Input: 1 - Output: true - Explanation: 2^0 = 1 - -**Example 2**: - - Input: 16 - Output: true - Explanation: 2^4 = 16 - -**Example 3**: - - Input: 218 - Output: false - -## 题目大意 - -给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 - - -## 解题思路 - -- 判断一个数是不是 2 的 n 次方。 -- 这一题最简单的思路是循环,可以通过。但是题目要求不循环就要判断,这就需要用到数论的知识了。这一题和第 326 题是一样的思路。 - - -## 代码 - -```go - -package leetcode - -// 解法一 二进制位操作法 -func isPowerOfTwo(num int) bool { - return (num > 0 && ((num & (num - 1)) == 0)) -} - -// 解法二 数论 -func isPowerOfTwo1(num int) bool { - return num > 0 && (1073741824%num == 0) -} - -// 解法三 打表法 -func isPowerOfTwo2(num int) bool { - allPowerOfTwoMap := map[int]int{1: 1, 2: 2, 4: 4, 8: 8, 16: 16, 32: 32, 64: 64, 128: 128, 256: 256, 512: 512, 1024: 1024, 2048: 2048, 4096: 4096, 8192: 8192, 16384: 16384, 32768: 32768, 65536: 65536, 131072: 131072, 262144: 262144, 524288: 524288, 1048576: 1048576, 2097152: 2097152, 4194304: 4194304, 8388608: 8388608, 16777216: 16777216, 33554432: 33554432, 67108864: 67108864, 134217728: 134217728, 268435456: 268435456, 536870912: 536870912, 1073741824: 1073741824} - _, ok := allPowerOfTwoMap[num] - return ok -} - -// 解法四 循环 -func isPowerOfTwo3(num int) bool { - for num >= 2 { - if num%2 == 0 { - num = num / 2 - } else { - return false - } - } - return num == 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0232.Implement-Queue-using-Stacks.md b/website/content/ChapterFour/0232.Implement-Queue-using-Stacks.md deleted file mode 100644 index fded5d37d..000000000 --- a/website/content/ChapterFour/0232.Implement-Queue-using-Stacks.md +++ /dev/null @@ -1,99 +0,0 @@ -# [232. Implement Queue using Stacks](https://leetcode.com/problems/implement-queue-using-stacks/) - -## 题目 - -Implement the following operations of a queue using stacks. - -- push(x) -- Push element x to the back of queue. -- pop() -- Removes the element from in front of queue. -- peek() -- Get the front element. -- empty() -- Return whether the queue is empty. - -**Example**: - -``` - -MyQueue queue = new MyQueue(); - -queue.push(1); -queue.push(2); -queue.peek(); // returns 1 -queue.pop(); // returns 1 -queue.empty(); // returns false - -``` - -**Note**: - -- You must use only standard operations of a stack -- which means only push to top, peek/pop from top, size, and is empty operations are valid. -- Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack. -- You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue). - - -## 题目大意 - -题目要求用栈实现一个队列的基本操作:push(x)、pop()、peek()、empty()。 - -## 解题思路 - -按照题目要求实现即可。 - - - -## 代码 - -```go - -package leetcode - -type MyQueue struct { - Stack *[]int - Queue *[]int -} - -/** Initialize your data structure here. */ -func Constructor232() MyQueue { - tmp1, tmp2 := []int{}, []int{} - return MyQueue{Stack: &tmp1, Queue: &tmp2} -} - -/** Push element x to the back of queue. */ -func (this *MyQueue) Push(x int) { - *this.Stack = append(*this.Stack, x) -} - -/** Removes the element from in front of queue and returns that element. */ -func (this *MyQueue) Pop() int { - if len(*this.Queue) == 0 { - this.fromStackToQueue(this.Stack, this.Queue) - } - - popped := (*this.Queue)[len(*this.Queue)-1] - *this.Queue = (*this.Queue)[:len(*this.Queue)-1] - return popped -} - -/** Get the front element. */ -func (this *MyQueue) Peek() int { - if len(*this.Queue) == 0 { - this.fromStackToQueue(this.Stack, this.Queue) - } - - return (*this.Queue)[len(*this.Queue)-1] -} - -/** Returns whether the queue is empty. */ -func (this *MyQueue) Empty() bool { - return len(*this.Stack)+len(*this.Queue) == 0 -} - -func (this *MyQueue) fromStackToQueue(s, q *[]int) { - for len(*s) > 0 { - popped := (*s)[len(*s)-1] - *s = (*s)[:len(*s)-1] - - *q = append(*q, popped) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0234.Palindrome-Linked-List.md b/website/content/ChapterFour/0234.Palindrome-Linked-List.md deleted file mode 100644 index f883bea3c..000000000 --- a/website/content/ChapterFour/0234.Palindrome-Linked-List.md +++ /dev/null @@ -1,111 +0,0 @@ -# [234. Palindrome Linked List](https://leetcode.com/problems/palindrome-linked-list/) - -## 题目 - -Given a singly linked list, determine if it is a palindrome. - -**Example 1**: - -``` - -Input: 1->2 -Output: false - -``` - -**Example 2**: - -``` - -Input: 1->2->2->1 -Output: true - -``` - -**Follow up**: - -Could you do it in O(n) time and O(1) space? - -## 题目大意 - -判断一个链表是否是回文链表。要求时间复杂度 O(n),空间复杂度 O(1)。 - -## 解题思路 - -这道题只需要在第 143 题上面改改就可以了。思路是完全一致的。先找到中间结点,然后反转中间结点后面到结尾的所有结点。最后一一判断头结点开始的结点和中间结点往后开始的结点是否相等。如果一直相等,就是回文链表,如果有不相等的,直接返回不是回文链表。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -// 此题和 143 题 Reorder List 思路基本一致 -func isPalindrome234(head *ListNode) bool { - if head == nil || head.Next == nil { - return true - } - res := true - // 寻找中间结点 - p1 := head - p2 := head - for p2.Next != nil && p2.Next.Next != nil { - p1 = p1.Next - p2 = p2.Next.Next - } - - // 反转链表后半部分 1->2->3->4->5->6 to 1->2->3->6->5->4 - preMiddle := p1 - preCurrent := p1.Next - for preCurrent.Next != nil { - current := preCurrent.Next - preCurrent.Next = current.Next - current.Next = preMiddle.Next - preMiddle.Next = current - } - - // 扫描表,判断是否是回文 - p1 = head - p2 = preMiddle.Next - // fmt.Printf("p1 = %v p2 = %v preMiddle = %v head = %v\n", p1.Val, p2.Val, preMiddle.Val, L2ss(head)) - for p1 != preMiddle { - // fmt.Printf("*****p1 = %v p2 = %v preMiddle = %v head = %v\n", p1, p2, preMiddle, L2ss(head)) - if p1.Val == p2.Val { - p1 = p1.Next - p2 = p2.Next - // fmt.Printf("-------p1 = %v p2 = %v preMiddle = %v head = %v\n", p1, p2, preMiddle, L2ss(head)) - } else { - res = false - break - } - } - if p1 == preMiddle { - if p2 != nil && p1.Val != p2.Val { - return false - } - } - - return res -} - -// L2ss define -func L2ss(head *ListNode) []int { - res := []int{} - - for head != nil { - res = append(res, head.Val) - head = head.Next - } - - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0235.Lowest-Common-Ancestor-of-a-Binary-Search-Tree.md b/website/content/ChapterFour/0235.Lowest-Common-Ancestor-of-a-Binary-Search-Tree.md deleted file mode 100755 index 6cadb8e97..000000000 --- a/website/content/ChapterFour/0235.Lowest-Common-Ancestor-of-a-Binary-Search-Tree.md +++ /dev/null @@ -1,72 +0,0 @@ -# [235. Lowest Common Ancestor of a Binary Search Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/) - - -## 题目 - -Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. - -According to the [definition of LCA on Wikipedia](https://en.wikipedia.org/wiki/Lowest_common_ancestor): “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow **a node to be a descendant of itself**).” - -Given binary search tree: root = [6,2,8,0,4,7,9,null,null,3,5] - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/14/binarysearchtree_improved.png) - -**Example 1**: - - Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 - Output: 6 - Explanation: The LCA of nodes 2 and 8 is 6. - -**Example 2**: - - Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 - Output: 2 - Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition. - -**Note**: - -- All of the nodes' values will be unique. -- p and q are different and both values will exist in the BST. - -## 题目大意 - -给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 - -百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” - - - -## 解题思路 - -- 在二叉搜索树中求两个节点的最近公共祖先,由于二叉搜索树的特殊性质,所以找任意两个节点的最近公共祖先非常简单。 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for TreeNode. - * type TreeNode struct { - * Val int - * Left *ListNode - * Right *ListNode - * } - */ -func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { - if p == nil || q == nil || root == nil { - return nil - } - if p.Val < root.Val && q.Val < root.Val { - return lowestCommonAncestor(root.Left, p, q) - } - if p.Val > root.Val && q.Val > root.Val { - return lowestCommonAncestor(root.Right, p, q) - } - return root -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0236.Lowest-Common-Ancestor-of-a-Binary-Tree.md b/website/content/ChapterFour/0236.Lowest-Common-Ancestor-of-a-Binary-Tree.md deleted file mode 100755 index ccd47234c..000000000 --- a/website/content/ChapterFour/0236.Lowest-Common-Ancestor-of-a-Binary-Tree.md +++ /dev/null @@ -1,72 +0,0 @@ -# [236. Lowest Common Ancestor of a Binary Tree](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/) - - -## 题目 - -Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. - -According to the [definition of LCA on Wikipedia](https://en.wikipedia.org/wiki/Lowest_common_ancestor): “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow **a node to be a descendant of itself**).” - -Given the following binary tree: root = [3,5,1,6,2,0,8,null,null,7,4] - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/binarytree.png) - -**Example 1**: - - Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 - Output: 3 - Explanation: The LCA of nodes 5 and 1 is 3. - -**Example 2**: - - Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 - Output: 5 - Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition. - -**Note**: - -- All of the nodes' values will be unique. -- p and q are different and both values will exist in the binary tree. - -## 题目大意 - -给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 - -百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” - - -## 解题思路 - -- 这是一套经典的题目,寻找任意一个二叉树中两个结点的 LCA 最近公共祖先,考察递归 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for TreeNode. - * type TreeNode struct { - * Val int - * Left *ListNode - * Right *ListNode - * } - */ -func lowestCommonAncestor236(root, p, q *TreeNode) *TreeNode { - if root == nil || root == q || root == p { - return root - } - left := lowestCommonAncestor236(root.Left, p, q) - right := lowestCommonAncestor236(root.Right, p, q) - if left != nil { - if right != nil { - return root - } - return left - } - return right -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0237.Delete-Node-in-a-Linked-List.md b/website/content/ChapterFour/0237.Delete-Node-in-a-Linked-List.md deleted file mode 100644 index c431655d6..000000000 --- a/website/content/ChapterFour/0237.Delete-Node-in-a-Linked-List.md +++ /dev/null @@ -1,72 +0,0 @@ -# [237. Delete Node in a Linked List](https://leetcode.com/problems/delete-node-in-a-linked-list/) - -## 题目 - -Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. - -Given linked list -- head = [4,5,1,9], which looks like following: - -![](https://assets.leetcode.com/uploads/2018/12/28/237_example.png) - -**Example 1**: - -``` - -Input: head = [4,5,1,9], node = 5 -Output: [4,1,9] -Explanation: You are given the second node with value 5, the linked list should become 4 -> 1 -> 9 after calling your function. - -``` - -**Example 2**: - -``` - -Input: head = [4,5,1,9], node = 1 -Output: [4,5,9] -Explanation: You are given the third node with value 1, the linked list should become 4 -> 5 -> 9 after calling your function. - -``` - -**Note**: - -- The linked list will have at least two elements. -- All of the nodes' values will be unique. -- The given node will not be the tail and it will always be a valid node of the linked list. -- Do not return anything from your function. - -## 题目大意 - -删除给点结点。没有给链表的头结点。 - -## 解题思路 - -其实就是把后面的结点都覆盖上来即可。或者直接当前结点的值等于下一个结点,Next 指针指向下下个结点,这样做也可以,只不过中间有一个结点不被释放,内存消耗多一些。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func deleteNode(node *ListNode) { - if node == nil { - return - } - cur := node - for cur.Next.Next != nil { - cur.Val = cur.Next.Val - cur = cur.Next - } - cur.Val = cur.Next.Val - cur.Next = nil -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0239.Sliding-Window-Maximum.md b/website/content/ChapterFour/0239.Sliding-Window-Maximum.md deleted file mode 100755 index dd1cd6973..000000000 --- a/website/content/ChapterFour/0239.Sliding-Window-Maximum.md +++ /dev/null @@ -1,95 +0,0 @@ -# [239. Sliding Window Maximum](https://leetcode.com/problems/sliding-window-maximum/) - - - -## 题目 - -Given an array *nums*, there is a sliding window of size *k* which is moving from the very left of the array to the very right. You can only see the *k* numbers in the window. Each time the sliding window moves right by one position. Return the max sliding window. - -**Example**: - - Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3 - Output: [3,3,5,5,6,7] - Explanation: - - Window position Max - --------------- ----- - [1 3 -1] -3 5 3 6 7 3 - 1 [3 -1 -3] 5 3 6 7 3 - 1 3 [-1 -3 5] 3 6 7 5 - 1 3 -1 [-3 5 3] 6 7 5 - 1 3 -1 -3 [5 3 6] 7 6 - 1 3 -1 -3 5 [3 6 7] 7 - -**Note**: - -You may assume *k* is always valid, 1 ≤ k ≤ input array's size for non-empty array. - -**Follow up**: - -Could you solve it in linear time? - - -## 题目大意 - -给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。返回滑动窗口最大值。 - - -## 解题思路 - -- 给定一个数组和一个窗口为 K 的窗口,当窗口从数组的左边滑动到数组右边的时候,输出每次移动窗口以后,在窗口内的最大值。 -- 这道题最暴力的方法就是 2 层循环,时间复杂度 O(n * K)。 -- 另一种思路是用优先队列,每次窗口以后的时候都向优先队列里面新增一个节点,并删除一个节点。时间复杂度是 O(n * log n) -- 最优的解法是用双端队列,队列的一边永远都存的是窗口的最大值,队列的另外一个边存的是比最大值小的值。队列中最大值左边的所有值都出队。在保证了双端队列的一边即是最大值以后,时间复杂度是 O(n),空间复杂度是 O(K) - - - -## 代码 - -```go - -package leetcode - -// 解法一 暴力解法 O(nk) -func maxSlidingWindow1(a []int, k int) []int { - res := make([]int, 0, k) - n := len(a) - if n == 0 { - return []int{} - } - for i := 0; i <= n-k; i++ { - max := a[i] - for j := 1; j < k; j++ { - if max < a[i+j] { - max = a[i+j] - } - } - res = append(res, max) - } - - return res -} - -// 解法二 双端队列 Deque -func maxSlidingWindow(nums []int, k int) []int { - if len(nums) == 0 || len(nums) < k { - return make([]int, 0) - } - window := make([]int, 0, k) // store the index of nums - result := make([]int, 0, len(nums)-k+1) - for i, v := range nums { // if the left-most index is out of window, remove it - if i >= k && window[0] <= i-k { - window = window[1:len(window)] - } - for len(window) > 0 && nums[window[len(window)-1]] < v { // maintain window - window = window[0 : len(window)-1] - } - window = append(window, i) // store the index of nums - if i >= k-1 { - result = append(result, nums[window[0]]) // the left-most is the index of max value in nums - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0240.Search-a-2D-Matrix-II.md b/website/content/ChapterFour/0240.Search-a-2D-Matrix-II.md deleted file mode 100755 index d8d92a106..000000000 --- a/website/content/ChapterFour/0240.Search-a-2D-Matrix-II.md +++ /dev/null @@ -1,89 +0,0 @@ -# [240. Search a 2D Matrix II](https://leetcode.com/problems/search-a-2d-matrix-ii/) - - -## 题目 - -Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: - -- Integers in each row are sorted in ascending from left to right. -- Integers in each column are sorted in ascending from top to bottom. - -**Example**: - -Consider the following matrix: - - [ - [1, 4, 7, 11, 15], - [2, 5, 8, 12, 19], - [3, 6, 9, 16, 22], - [10, 13, 14, 17, 24], - [18, 21, 23, 26, 30] - ] - -Given target = `5`, return `true`. - -Given target = `20`, return `false`. - - -## 题目大意 - -编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: - -- 每行的元素从左到右升序排列。 -- 每列的元素从上到下升序排列。 - - - -## 解题思路 - -- 给出一个二维矩阵,矩阵的特点是每一个行内,元素随着下标增大而增大,每一列内,元素也是随着下标增大而增大。但是相邻两行的元素并没有大小关系。例如第一行最后一个元素就比第二行第一个元素要大。要求设计一个算法能在这个矩阵中高效的找到一个数,如果找到就输出 true,找不到就输出 false。 -- 这一题是第 74 题的加强版。第 74 题中的二维矩阵完全是一个有序的一维矩阵,但是这一题如果把它拍扁成一维,并不是有序的。首先每一个行或者每一列是有序的 ,那么我们可以依次在每一行或者每一列中利用二分去搜索。这样做时间复杂度为 O(n log n)。 -- 还有一个模拟的解法。通过观察,我们发现了这个矩阵的一个特点,最右边一列的元素是本行中最大的元素,所以我们可以先从最右边一列开始找到第一个比 target 元素大的元素,这个元素所在的行,是我们接着要搜索的。在行中搜索是从最右边开始往左边搜索,时间复杂度是 O(n),算上一开始在最右边一列中查找的时间复杂度是 O(m),所以最终的时间复杂度为 O(m+n)。 - - -## 代码 - -```go - -package leetcode - -// 解法一 模拟,时间复杂度 O(m+n) -func searchMatrix240(matrix [][]int, target int) bool { - if len(matrix) == 0 { - return false - } - row, col := 0, len(matrix[0])-1 - for col >= 0 && row <= len(matrix)-1 { - if target == matrix[row][col] { - return true - } else if target > matrix[row][col] { - row++ - } else { - col-- - } - } - return false -} - -// 解法二 二分搜索,时间复杂度 O(n log n) -func searchMatrix2401(matrix [][]int, target int) bool { - if len(matrix) == 0 { - return false - } - for _, row := range matrix { - low, high := 0, len(matrix[0])-1 - for low <= high { - mid := low + (high-low)>>1 - if row[mid] > target { - high = mid - 1 - } else if row[mid] < target { - low = mid + 1 - } else { - return true - } - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0242.Valid-Anagram.md b/website/content/ChapterFour/0242.Valid-Anagram.md deleted file mode 100644 index cc243f3eb..000000000 --- a/website/content/ChapterFour/0242.Valid-Anagram.md +++ /dev/null @@ -1,117 +0,0 @@ -# [242. Valid Anagram](https://leetcode.com/problems/valid-anagram/) - -## 题目 - -Given two strings s and t , write a function to determine if t is an anagram of s. - -**Example 1**: - -``` - -Input: s = "anagram", t = "nagaram" -Output: true - -``` - -**Example 2**: - -``` - -Input: s = "rat", t = "car" -Output: false - -``` - -**Note**: - - -You may assume the string contains only lowercase alphabets. - - - -**Follow up**: - - -What if the inputs contain unicode characters? How would you adapt your solution to such case? - -## 题目大意 - -给出 2 个字符串 s 和 t,如果 t 中的字母在 s 中都存在,输出 true,否则输出 false。 - -## 解题思路 - -这道题可以用打表的方式做。先把 s 中的每个字母都存在一个 26 个容量的数组里面,每个下标依次对应 26 个字母。s 中每个字母都对应表中一个字母,每出现一次就加 1。然后再扫字符串 t,每出现一个字母就在表里面减一。如果都出现了,最终表里面的值肯定都是 0 。最终判断表里面的值是否都是 0 即可,有非 0 的数都输出 false 。 - -## 代码 - -```go - -package leetcode - -// 解法一 -func isAnagram(s string, t string) bool { - alphabet := make([]int, 26) - sBytes := []byte(s) - tBytes := []byte(t) - if len(sBytes) != len(tBytes) { - return false - } - for i := 0; i < len(sBytes); i++ { - alphabet[sBytes[i]-'a']++ - } - for i := 0; i < len(tBytes); i++ { - alphabet[tBytes[i]-'a']-- - } - for i := 0; i < 26; i++ { - if alphabet[i] != 0 { - return false - } - } - return true -} - -// 解法二 -func isAnagram1(s string, t string) bool { - if s == "" && t == "" { - return true - } - if s == "" || t == "" { - return false - } - sBytes := []byte(s) - tBytes := []byte(t) - if len(sBytes) != len(tBytes) { - return false - } - quickSortByte(sBytes, 0, len(sBytes)-1) - quickSortByte(tBytes, 0, len(tBytes)-1) - - for i := 0; i < len(sBytes); i++ { - if sBytes[i] != tBytes[i] { - return false - } - } - return true -} -func partitionByte(a []byte, lo, hi int) int { - pivot := a[hi] - i := lo - 1 - for j := lo; j < hi; j++ { - if a[j] > pivot { - i++ - a[j], a[i] = a[i], a[j] - } - } - a[i+1], a[hi] = a[hi], a[i+1] - return i + 1 -} -func quickSortByte(a []byte, lo, hi int) { - if lo >= hi { - return - } - p := partitionByte(a, lo, hi) - quickSortByte(a, lo, p-1) - quickSortByte(a, p+1, hi) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0257.Binary-Tree-Paths.md b/website/content/ChapterFour/0257.Binary-Tree-Paths.md deleted file mode 100755 index 5ee5f35f6..000000000 --- a/website/content/ChapterFour/0257.Binary-Tree-Paths.md +++ /dev/null @@ -1,71 +0,0 @@ -# [257. Binary Tree Paths](https://leetcode.com/problems/binary-tree-paths/) - - -## 题目 - -Given a binary tree, return all root-to-leaf paths. - -**Note**: A leaf is a node with no children. - -**Example**: - - Input: - - 1 - / \ - 2 3 - \ - 5 - - Output: ["1->2->5", "1->3"] - - Explanation: All root-to-leaf paths are: 1->2->5, 1->3 - -## 题目大意 - -给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。 - -## 解题思路 - -- Google 的面试题,考察递归 - - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func binaryTreePaths(root *TreeNode) []string { - if root == nil { - return []string{} - } - res := []string{} - if root.Left == nil && root.Right == nil { - return []string{strconv.Itoa(root.Val)} - } - tmpLeft := binaryTreePaths(root.Left) - for i := 0; i < len(tmpLeft); i++ { - res = append(res, strconv.Itoa(root.Val)+"->"+tmpLeft[i]) - } - tmpRight := binaryTreePaths(root.Right) - for i := 0; i < len(tmpRight); i++ { - res = append(res, strconv.Itoa(root.Val)+"->"+tmpRight[i]) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0258.Add-Digits.md b/website/content/ChapterFour/0258.Add-Digits.md deleted file mode 100644 index 8c8119043..000000000 --- a/website/content/ChapterFour/0258.Add-Digits.md +++ /dev/null @@ -1,47 +0,0 @@ -# [258. Add Digits](https://leetcode.com/problems/add-digits/) - - -## 题目 - -Given a non-negative integer `num`, repeatedly add all its digits until the result has only one digit. - -**Example**: - -``` -Input: 38 -Output: 2 -Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2. - Since 2 has only one digit, return it. -``` - -**Follow up**: Could you do it without any loop/recursion in O(1) runtime? - -## 题目大意 - -给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。 - - -## 解题思路 - -- 给定一个非负整数,反复加各个位上的数,直到结果为一位数为止,最后输出这一位数。 -- 简单题。按照题意循环累加即可。 - -## 代码 - -```go - -package leetcode - -func addDigits(num int) int { - for num > 9 { - cur := 0 - for num != 0 { - cur += num % 10 - num /= 10 - } - num = cur - } - return num -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0260.Single-Number-III.md b/website/content/ChapterFour/0260.Single-Number-III.md deleted file mode 100755 index fa8e45b50..000000000 --- a/website/content/ChapterFour/0260.Single-Number-III.md +++ /dev/null @@ -1,61 +0,0 @@ -# [260. Single Number III](https://leetcode.com/problems/single-number-iii/) - - -## 题目 - -Given an array of numbers `nums`, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once. - -**Example**: - - Input: [1,2,1,3,2,5] - Output: [3,5] - -**Note**: - -1. The order of the result is not important. So in the above example, `[5, 3]` is also correct. -2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity? - - -## 题目大意 - -给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。 - -注意: - -- 结果输出的顺序并不重要,对于上面的例子,[5, 3] 也是正确答案。 -- 要求算法时间复杂度是线性的,并且不使用额外的辅助空间。 - - - -## 解题思路 - -- 这一题是第 136 题的加强版。第 136 题里面只有一个数出现一次,其他数都出现 2 次。而这一次有 2 个数字出现一次,其他数出现 2 次。 -- 解题思路还是利用异或,把出现 2 次的数先消除。最后我们要找的 2 个数肯定也是不同的,所以最后 2 个数对一个数进行异或,答案肯定是不同的。那么我们找哪个数为参照物呢?可以随便取,不如就取 lsb 最低位为 1 的数吧 -- 于是整个数组会被分为 2 部分,异或 lsb 为 0 的和异或 lsb 为 1 的,在这 2 部分中,用异或操作把出现 2 次的数都消除,那么剩下的 2 个数分别就在这 2 部分中。 - - -## 代码 - -```go - -package leetcode - -func singleNumberIII(nums []int) []int { - diff := 0 - for _, num := range nums { - diff ^= num - } - // Get its last set bit (lsb) - diff &= -diff - res := []int{0, 0} // this array stores the two numbers we will return - for _, num := range nums { - if (num & diff) == 0 { // the bit is not set - res[0] ^= num - } else { // the bit is set - res[1] ^= num - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0263.Ugly-Number.md b/website/content/ChapterFour/0263.Ugly-Number.md deleted file mode 100644 index e677f673f..000000000 --- a/website/content/ChapterFour/0263.Ugly-Number.md +++ /dev/null @@ -1,69 +0,0 @@ -# [263. Ugly Number](https://leetcode.com/problems/ugly-number/) - -## 题目 - -Write a program to check whether a given number is an ugly number. - -Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. - -**Example 1**: - -``` - -Input: 6 -Output: true -Explanation: 6 = 2 × 3 - -``` - -**Example 2**: - -``` -Input: 8 -Output: true -Explanation: 8 = 2 × 2 × 2 - -``` - -**Example 3**: - -``` - -Input: 14 -Output: false -Explanation: 14 is not ugly since it includes another prime factor 7. - -``` - -**Note**: - -- 1 is typically treated as an ugly number. -- Input is within the 32-bit signed integer range: [−2^31, 2^31 − 1]. - - -## 题目大意 - -判断一个数字是否是“丑陋数字”,“丑陋数字”的定义是一个正数,并且因子只包含 2,3,5 。 - -## 解题思路 - -依照题意要求做即可。 - - - -## 代码 - -```go - -package leetcode - -func isUgly(num int) bool { - for i := 2; i < 6 && num > 0; i++ { - for num%i == 0 { - num /= i - } - } - return num == 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0268.Missing-Number.md b/website/content/ChapterFour/0268.Missing-Number.md deleted file mode 100755 index cf72f8c04..000000000 --- a/website/content/ChapterFour/0268.Missing-Number.md +++ /dev/null @@ -1,47 +0,0 @@ -# [268. Missing Number](https://leetcode.com/problems/missing-number/) - - -## 题目 - -Given an array containing n distinct numbers taken from `0, 1, 2, ..., n`, find the one that is missing from the array. - -**Example 1**: - - Input: [3,0,1] - Output: 2 - -**Example 2**: - - Input: [9,6,4,2,3,5,7,0,1] - Output: 8 - -**Note**:Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity? - - -## 题目大意 - -给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。算法应该具有线性时间复杂度。你能否仅使用额外常数空间来实现? - - - -## 解题思路 - - -- 要求找出 `0, 1, 2, ..., n` 中缺失的那个数。还是利用异或的性质,`X^X = 0`。这里我们需要构造一个 X,用数组下标就可以了。数字下标是从 `[0,n-1]`,数字是 `[0,n]`,依次把数组里面的数组进行异或,把结果和 n 再异或一次,中和掉出现的数字,剩下的那个数字就是之前没有出现过的,缺失的数字。 - - -## 代码 - -```go - -package leetcode - -func missingNumber(nums []int) int { - xor, i := 0, 0 - for i = 0; i < len(nums); i++ { - xor = xor ^ i ^ nums[i] - } - return xor ^ i -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0274.H-Index.md b/website/content/ChapterFour/0274.H-Index.md deleted file mode 100644 index 4306deedc..000000000 --- a/website/content/ChapterFour/0274.H-Index.md +++ /dev/null @@ -1,78 +0,0 @@ -# [274. H-Index](https://leetcode.com/problems/h-index/) - -## 题目 - -Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index. - -According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N − h papers have no more than h citations each." - -**Example 1**: - -``` - -Input: citations = [3,0,6,1,5] -Output: 3 -Explanation: [3,0,6,1,5] means the researcher has 5 papers in total and each of them had - received 3, 0, 6, 1, 5 citations respectively. - Since the researcher has 3 papers with at least 3 citations each and the remaining - two with no more than 3 citations each, her h-index is 3. - -``` - -**Note**: - -If there are several possible values for h, the maximum one is taken as the h-index. - - - -## 题目大意 - -求 h-index。h-index 值的定义:如果他/她的 N 篇论文中至少有 h 引用,而其他 N-h 论文的引用数不超过 h 引用数。 - -## 解题思路 - -可以先将数组里面的数从小到大排序。因为要找最大的 h-index,所以从数组末尾开始往前找,找到第一个数组的值,小于,总长度减去下标的值,这个值就是 h-index。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func hIndex(citations []int) int { - n := len(citations) - buckets := make([]int, n+1) - for _, c := range citations { - if c >= n { - buckets[n]++ - } else { - buckets[c]++ - } - } - count := 0 - for i := n; i >= 0; i-- { - count += buckets[i] - if count >= i { - return i - } - } - return 0 -} - -// 解法二 -func hIndex1(citations []int) int { - quickSort164(citations, 0, len(citations)-1) - hIndex := 0 - for i := len(citations) - 1; i >= 0; i-- { - if citations[i] >= len(citations)-i { - hIndex++ - } else { - break - } - } - return hIndex -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0275.H-Index-II.md b/website/content/ChapterFour/0275.H-Index-II.md deleted file mode 100755 index 21310f019..000000000 --- a/website/content/ChapterFour/0275.H-Index-II.md +++ /dev/null @@ -1,71 +0,0 @@ -# [275. H-Index II](https://leetcode.com/problems/h-index-ii/) - -## 题目 - -Given an array of citations **sorted in ascending order** (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index. - -According to the [definition of h-index on Wikipedia](https://en.wikipedia.org/wiki/H-index): "A scientist has index h if h of his/her N papers have **at least** h citations each, and the other N − h papers have **no more than** h citations each." - -**Example**: - - Input: citations = [0,1,3,5,6] - Output: 3 - Explanation: [0,1,3,5,6] means the researcher has 5 papers in total and each of them had - received 0, 1, 3, 5, 6 citations respectively. - Since the researcher has 3 papers with at least 3 citations each and the remaining - two with no more than 3 citations each, her h-index is 3. - -**Note**: - -If there are several possible values for *h*, the maximum one is taken as the h-index. - -**Follow up**: - -- This is a follow up problem to [H-Index](https://leetcode.com/problems/h-index/description/), where `citations` is now guaranteed to be sorted in ascending order. -- Could you solve it in logarithmic time complexity? - - - -## 题目大意 - - -给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列。编写一个方法,计算出研究者的 h 指数。 - -h 指数的定义: “h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)至多有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。)" - -说明: - -- 如果 h 有多有种可能的值 ,h 指数是其中最大的那个。 - -进阶: - -- 这是 H 指数 的延伸题目,本题中的 citations 数组是保证有序的。 -你可以优化你的算法到对数时间复杂度吗? - - -## 解题思路 - -- 给出一个数组,代表该作者论文被引用次数,要求这个作者的 h 指数。h 指数定义:"高引用次数”(`high citations`),一名科研人员的 h 指数是指他(她)的 (N 篇论文中)至多有 h 篇论文分别被引用了至少 h 次。(其余的 N - h 篇论文每篇被引用次数不多于 h 次。) -- 这一题要找出 h 指数,即要找到一个边界,在这个边界上为最多的 h 指数。可以用二分搜索来解决这道题。当 `len(citations)-mid > citations[mid]` 时,说明 h 指数的边界一定在右边,因为最多 `len(citations)-mid` 篇数比引用数 `citations[mid]` 还要大。否则 h 指数的边界在左边界,缩小边界以后继续二分。找到边界以后,最终求的是 h 指数,用 `len(citations) - low` 即是结果。 - - -## 代码 - -```go - -package leetcode - -func hIndex275(citations []int) int { - low, high := 0, len(citations)-1 - for low <= high { - mid := low + (high-low)>>1 - if len(citations)-mid > citations[mid] { - low = mid + 1 - } else { - high = mid - 1 - } - } - return len(citations) - low -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0283.Move-Zeroes.md b/website/content/ChapterFour/0283.Move-Zeroes.md deleted file mode 100644 index f7c334ea4..000000000 --- a/website/content/ChapterFour/0283.Move-Zeroes.md +++ /dev/null @@ -1,55 +0,0 @@ -# [283. Move Zeroes](https://leetcode.com/problems/move-zeroes/) - -## 题目 - -Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements. - -**Example 1**: - -``` - -Input: [0,1,0,3,12] -Output: [1,3,12,0,0] - -``` - -**Note**: - -- You must do this in-place without making a copy of the array. -- Minimize the total number of operations. - - - -## 题目大意 - -题目要求不能采用额外的辅助空间,将数组中 0 元素都移动到数组的末尾,并且维持所有非 0 元素的相对位置。 - -## 解题思路 - -这一题可以只扫描数组一遍,不断的用 i,j 标记 0 和非 0 的元素,然后相互交换,最终到达题目的目的。与这一题相近的题目有第 26 题,第 27 题,第 80 题。 - - -## 代码 - -```go - -package leetcode - -func moveZeroes(nums []int) { - if len(nums) == 0 { - return - } - j := 0 - for i := 0; i < len(nums); i++ { - if nums[i] != 0 { - if i != j { - nums[i], nums[j] = nums[j], nums[i] - j++ - } else { - j++ - } - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0287.Find-the-Duplicate-Number.md b/website/content/ChapterFour/0287.Find-the-Duplicate-Number.md deleted file mode 100644 index a8146fe38..000000000 --- a/website/content/ChapterFour/0287.Find-the-Duplicate-Number.md +++ /dev/null @@ -1,107 +0,0 @@ -# [287. Find the Duplicate Number](https://leetcode.com/problems/find-the-duplicate-number/) - -## 题目 - -Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one. - -**Example 1**: - -``` - -Input: [1,3,4,2,2] -Output: 2 - -``` - -**Example 2**: - -``` - -Input: [3,1,3,4,2] -Output: 3 - -``` - -**Note**: - -- You must not modify the array (assume the array is read only). -- You must use only constant, O(1) extra space. -- Your runtime complexity should be less than O(n^2). -- There is only one duplicate number in the array, but it could be repeated more than once. - -## 题目大意 - -给出 n + 1 个数,这些数是在 1-n 中取值的,同一个数字可以出现多次。要求找出这些数中重复的数字。时间复杂度最好低于 O(n^2),空间复杂度为 O(1)。 - -## 解题思路 - -- 这道题比较巧的思路是,将这些数字想象成链表中的结点,数组中数字代表下一个结点的数组下标。找重复的数字就是找链表中成环的那个点。由于题目保证了一定会有重复的数字,所以一定会成环。所以用快慢指针的方法,快指针一次走 2 步,慢指针一次走 1 步,相交以后,快指针从头开始,每次走一步,再次遇见的时候就是成环的交点处,也即是重复数字所在的地方。 -- 这一题有多种做法。可以用快慢指针求解。还可以用二分搜索:(这里的题解感谢 [@imageslr](https://github.com/imageslr) 指出错误): - 1. 假设有 n+1 个数,则可能重复的数位于区间 [1, n] 中。记该区间最小值、最大值和中间值为 low、high、mid - 2. 遍历整个数组,统计小于等于 mid 的整数的个数,至多为 mid 个 - 3. 如果超过 mid 个就说明重复的数存在于区间 [low,mid] (闭区间)中;否则,重复的数存在于区间 (mid, high] (左开右闭)中 - 4. 缩小区间,继续重复步骤 2、3,直到区间变成 1 个整数,即 low == high - 5. 整数 low 就是要找的重复的数 -- 另外一个做法是,先将数组排序,依照下标是从 0 开始递增的特性,那么数组里面的数字与下标的差值应该是越来越大。如果出现了相同的数字,下标变大,差值应该比前一个数字小,出现了这个情况就说明找到了相同数字了。 - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 快慢指针 -func findDuplicate(nums []int) int { - slow := nums[0] - fast := nums[nums[0]] - for fast != slow { - slow = nums[slow] - fast = nums[nums[fast]] - } - walker := 0 - for walker != slow { - walker = nums[walker] - slow = nums[slow] - } - return walker -} - -// 解法二 二分搜索 -func findDuplicate1(nums []int) int { - low, high := 0, len(nums)-1 - for low < high { - mid, count := low+(high-low)>>1, 0 - for _, num := range nums { - if num <= mid { - count++ - } - } - if count > mid { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -// 解法三 -func findDuplicate2(nums []int) int { - if len(nums) == 0 { - return 0 - } - sort.Ints(nums) - diff := -1 - for i := 0; i < len(nums); i++ { - if nums[i]-i-1 >= diff { - diff = nums[i] - i - 1 - } else { - return nums[i] - } - } - return 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0290.Word-Pattern.md b/website/content/ChapterFour/0290.Word-Pattern.md deleted file mode 100644 index d7764d4eb..000000000 --- a/website/content/ChapterFour/0290.Word-Pattern.md +++ /dev/null @@ -1,98 +0,0 @@ -# [290. Word Pattern](https://leetcode.com/problems/word-pattern/) - -## 题目 - -Given a pattern and a string str, find if str follows the same pattern. - -Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in str. - -**Example 1**: - -``` - -Input: pattern = "abba", str = "dog cat cat dog" -Output: true - -``` - -**Example 2**: - -``` - -Input:pattern = "abba", str = "dog cat cat fish" -Output: false - -``` - -**Example 3**: - -``` - -Input: pattern = "aaaa", str = "dog cat cat dog" -Output: false - -``` - -**Example 4**: - -``` - -Input: pattern = "abba", str = "dog dog dog dog" -Output: false - -``` - -**Note**: - -You may assume pattern contains only lowercase letters, and str contains lowercase letters separated by a single space. - - -## 题目大意 - -给定一个模式串,判断字符串是否和给定的模式串,是一样的模式。 - -## 解题思路 - -这道题用 2 个 map 即可。1 个 map 记录模式与字符串的匹配关系,另外一个 map 记录字符串和模式的匹配关系。为什么需要记录双向的关系呢?因为 Example 4 中,a 对应了 dog,这个时候 b 如果再对应 dog 是错误的,所以这里需要从 dog 查询它是否已经和某个模式匹配过了。所以需要双向的关系。 - - - - - -## 代码 - -```go - -package leetcode - -import "strings" - -func wordPattern(pattern string, str string) bool { - strList := strings.Split(str, " ") - patternByte := []byte(pattern) - if pattern == "" || len(patternByte) != len(strList) { - return false - } - - pMap := map[byte]string{} - sMap := map[string]byte{} - for index, b := range patternByte { - if _, ok := pMap[b]; !ok { - if _, ok = sMap[strList[index]]; !ok { - pMap[b] = strList[index] - sMap[strList[index]] = b - } else { - if sMap[strList[index]] != b { - return false - } - } - } else { - if pMap[b] != strList[index] { - return false - } - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0300.Longest-Increasing-Subsequence.md b/website/content/ChapterFour/0300.Longest-Increasing-Subsequence.md deleted file mode 100755 index eb6436a67..000000000 --- a/website/content/ChapterFour/0300.Longest-Increasing-Subsequence.md +++ /dev/null @@ -1,79 +0,0 @@ -# [300. Longest Increasing Subsequence](https://leetcode.com/problems/longest-increasing-subsequence/) - - -## 题目 - -Given an unsorted array of integers, find the length of longest increasing subsequence. - -**Example**: - - Input: [10,9,2,5,3,7,101,18] - Output: 4 - Explanation: The longest increasing subsequence is [2,3,7,101], therefore the length is 4. - -**Note**: - -- There may be more than one LIS combination, it is only necessary for you to return the length. -- Your algorithm should run in O(n^2) complexity. - -**Follow up**: Could you improve it to O(n log n) time complexity? - -## 题目大意 - -给定一个无序的整数数组,找到其中最长上升子序列的长度。 - - -## 解题思路 - -- 给定一个整数序列,求其中的最长上升子序列的长度。这一题就是经典的最长上升子序列的问题。 -- `dp[i]` 代表为第 i 个数字为结尾的最长上升子序列的长度。换种表述,dp[i] 代表 [0,i] 范围内,选择数字 nums[i] 可以获得的最长上升子序列的长度。状态转移方程为 `dp[i] = max( 1 + dp[j]) ,其中 j < i && nums[j] > nums[i]`,取所有满足条件的最大值。时间复杂度 O(n^2) -- 这道题还有一种更快的解法。考虑这样一个问题,我们是否能用一个数组,记录上升子序列的最末尾的一个数字呢?如果这个数字越小,那么这个子序列往后面添加数字的几率就越大,那么就越可能成为最长的上升子序列。举个例子:nums = [4,5,6,3],它的所有的上升子序列为 - -``` - len = 1 : [4], [5], [6], [3] => tails[0] = 3 - len = 2 : [4, 5], [5, 6] => tails[1] = 5 - len = 3 : [4, 5, 6] => tails[2] = 6 -``` -- 其中 `tails[i]` 中存储的是所有长度为 i + 1 的上升子序列中末尾最小的值。也很容易证明 `tails` 数组里面的值一定是递增的(因为我们用末尾的数字描述最长递增子序列)。既然 tails 是有序的,我们就可以用二分查找的方法去更新这个 tail 数组里面的值。更新策略如下:(1). 如果 x 比所有的 tails 元素都要大,那么就直接放在末尾,并且 tails 数组长度加一;(2). 如果 `tails[i-1] < x <= tails[i]`,则更新 tails[i],因为 x 更小,更能获得最长上升子序列。最终 tails 数组的长度即为最长的上升子序列。这种做法的时间复杂度 O(n log n)。 - - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 O(n^2) DP -func lengthOfLIS(nums []int) int { - dp, res := make([]int, len(nums)+1), 0 - dp[0] = 0 - for i := 1; i <= len(nums); i++ { - for j := 1; j < i; j++ { - if nums[j-1] < nums[i-1] { - dp[i] = max(dp[i], dp[j]) - } - } - dp[i] = dp[i] + 1 - res = max(res, dp[i]) - } - return res -} - -// 解法二 O(n log n) DP -func lengthOfLIS1(nums []int) int { - dp := []int{} - for _, num := range nums { - i := sort.SearchInts(dp, num) - if i == len(dp) { - dp = append(dp, num) - } else { - dp[i] = num - } - } - return len(dp) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0303.Range-Sum-Query---Immutable.md b/website/content/ChapterFour/0303.Range-Sum-Query---Immutable.md deleted file mode 100755 index 12ebbe676..000000000 --- a/website/content/ChapterFour/0303.Range-Sum-Query---Immutable.md +++ /dev/null @@ -1,110 +0,0 @@ -# [303. Range Sum Query - Immutable](https://leetcode.com/problems/range-sum-query-immutable/) - - -## 题目 - -Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. - -**Example**: - - Given nums = [-2, 0, 3, -5, 2, -1] - - sumRange(0, 2) -> 1 - sumRange(2, 5) -> -1 - sumRange(0, 5) -> -3 - -**Note**: - -1. You may assume that the array does not change. -2. There are many calls to sumRange function. - - -## 题目大意 - -给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。 - -示例: - -``` -给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() - -sumRange(0, 2) -> 1 -sumRange(2, 5) -> -1 -sumRange(0, 5) -> -3 - -``` - -说明: - -- 你可以假设数组不可变。 -- 会多次调用 sumRange 方法。 - - -## 解题思路 - - -- 给出一个数组,数组里面的数都是`**不可变**`的,设计一个数据结构能够满足查询数组任意区间内元素的和。 -- 这一题由于数组里面的元素都是`**不可变**`的,所以可以用 2 种方式来解答,第一种解法是用 prefixSum,通过累计和相减的办法来计算区间内的元素和,初始化的时间复杂度是 O(n),但是查询区间元素和的时间复杂度是 O(1)。第二种解法是利用线段树,构建一颗线段树,父结点内存的是两个子结点的和,初始化建树的时间复杂度是 O(log n),查询区间元素和的时间复杂度是 O(log n)。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -//解法一 线段树,sumRange 时间复杂度 O(1) - -// NumArray define -type NumArray struct { - st *template.SegmentTree -} - -// Constructor303 define -func Constructor303(nums []int) NumArray { - st := template.SegmentTree{} - st.Init(nums, func(i, j int) int { - return i + j - }) - return NumArray{st: &st} -} - -// SumRange define -func (ma *NumArray) SumRange(i int, j int) int { - return ma.st.Query(i, j) -} - -//解法二 prefixSum,sumRange 时间复杂度 O(1) - -// // NumArray define -// type NumArray struct { -// prefixSum []int -// } - -// // Constructor303 define -// func Constructor303(nums []int) NumArray { -// for i := 1; i < len(nums); i++ { -// nums[i] += nums[i-1] -// } -// return NumArray{prefixSum: nums} -// } - -// // SumRange define -// func (this *NumArray) SumRange(i int, j int) int { -// if i > 0 { -// return this.prefixSum[j] - this.prefixSum[i-1] -// } -// return this.prefixSum[j] -// } - -/** - * Your NumArray object will be instantiated and called as such: - * obj := Constructor(nums); - * param_1 := obj.SumRange(i,j); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0306.Additive-Number.md b/website/content/ChapterFour/0306.Additive-Number.md deleted file mode 100755 index 4d1884720..000000000 --- a/website/content/ChapterFour/0306.Additive-Number.md +++ /dev/null @@ -1,89 +0,0 @@ -# [306. Additive Number](https://leetcode.com/problems/additive-number/) - - -## 题目 - -Additive number is a string whose digits can form additive sequence. - -A valid additive sequence should contain **at least** three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two. - -Given a string containing only digits `'0'-'9'`, write a function to determine if it's an additive number. - -**Note**: Numbers in the additive sequence **cannot** have leading zeros, so sequence `1, 2, 03` or `1, 02, 3` is invalid. - -**Example 1**: - - Input: "112358" - Output: true - Explanation: The digits can form an additive sequence: 1, 1, 2, 3, 5, 8. - 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8 - -**Example 2**: - - Input: "199100199" - Output: true - Explanation: The additive sequence is: 1, 99, 100, 199. - 1 + 99 = 100, 99 + 100 = 199 - -**Follow up**:How would you handle overflow for very large input integers? - - -## 题目大意 - -累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。 - - -## 解题思路 - -- 在给出的字符串中判断该字符串是否为斐波那契数列形式的字符串。 -- 由于每次判断需要累加 2 个数字,所以在 DFS 遍历的过程中需要维护 2 个数的边界,`firstEnd` 和 `secondEnd`,两个数加起来的和数的起始位置是 `secondEnd + 1`。每次在移动 `firstEnd` 和 `secondEnd` 的时候,需要判断 `strings.HasPrefix(num[secondEnd + 1:], strconv.Itoa(x1 + x2))`,即后面的字符串中是否以和为开头。 -- 如果第一个数字起始数字出现了 0 ,或者第二个数字起始数字出现了 0,都算非法异常情况,都应该直接返回 false。 - - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" - "strings" -) - -// This function controls various combinations as starting points -func isAdditiveNumber(num string) bool { - if len(num) < 3 { - return false - } - for firstEnd := 0; firstEnd < len(num)/2; firstEnd++ { - if num[0] == '0' && firstEnd > 0 { - break - } - first, _ := strconv.Atoi(num[:firstEnd+1]) - for secondEnd := firstEnd + 1; max(firstEnd, secondEnd-firstEnd) <= len(num)-secondEnd; secondEnd++ { - if num[firstEnd+1] == '0' && secondEnd-firstEnd > 1 { - break - } - second, _ := strconv.Atoi(num[firstEnd+1 : secondEnd+1]) - if recursiveCheck(num, first, second, secondEnd+1) { - return true - } - } - } - return false -} - -//Propagate for rest of the string -func recursiveCheck(num string, x1 int, x2 int, left int) bool { - if left == len(num) { - return true - } - if strings.HasPrefix(num[left:], strconv.Itoa(x1+x2)) { - return recursiveCheck(num, x2, x1+x2, left+len(strconv.Itoa(x1+x2))) - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0307.Range-Sum-Query---Mutable.md b/website/content/ChapterFour/0307.Range-Sum-Query---Mutable.md deleted file mode 100755 index 1d17bbecc..000000000 --- a/website/content/ChapterFour/0307.Range-Sum-Query---Mutable.md +++ /dev/null @@ -1,121 +0,0 @@ -# [307. Range Sum Query - Mutable](https://leetcode.com/problems/range-sum-query-mutable/) - - -## 题目 - -Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. - -The update(i, val) function modifies nums by updating the element at index i to val. - -**Example**: - - Given nums = [1, 3, 5] - - sumRange(0, 2) -> 9 - update(1, 2) - sumRange(0, 2) -> 8 - -**Note**: - -1. The array is only modifiable by the update function. -2. You may assume the number of calls to update and sumRange function is distributed evenly. - - -## 题目大意 - -给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。 - -update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改。 - -示例: - -``` -Given nums = [1, 3, 5] - -sumRange(0, 2) -> 9 -update(1, 2) -sumRange(0, 2) -> 8 -``` - -说明: - -- 数组仅可以在 update 函数下进行修改。 -- 你可以假设 update 函数与 sumRange 函数的调用次数是均匀分布的。 - -## 解题思路 - - -- 给出一个数组,数组里面的数都是`**可变**`的,设计一个数据结构能够满足查询数组任意区间内元素的和。 -- 对比第 303 题,这一题由于数组里面的元素都是**`可变`**的,所以第一个想到的解法就是线段树,构建一颗线段树,父结点内存的是两个子结点的和,初始化建树的时间复杂度是 O(log n),查询区间元素和的时间复杂度是 O(log n),更新元素值的时间复杂度是 O(log n)。 -- 如果此题还用 prefixSum 的思路解答呢?那每次 update 操作的时间复杂度都是 O(n),因为每次更改一个值,最坏情况就是所有的 prefixSum 都要更新一次。prefixSum 的方法在这道题上面也可以 AC,只不过时间排名在 5%,非常差。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -// Constructor307 define -func Constructor307(nums []int) NumArray { - st := template.SegmentTree{} - st.Init(nums, func(i, j int) int { - return i + j - }) - return NumArray{st: &st} -} - -// Update define -func (this *NumArray) Update(i int, val int) { - this.st.Update(i, val) -} - -//解法二 prefixSum,sumRange 时间复杂度 O(1) - -// // NumArray define -// type NumArray307 struct { -// prefixSum []int -// data []int -// } - -// // Constructor307 define -// func Constructor307(nums []int) NumArray307 { -// data := make([]int, len(nums)) -// for i := 0; i < len(nums); i++ { -// data[i] = nums[i] -// } -// for i := 1; i < len(nums); i++ { -// nums[i] += nums[i-1] -// } -// return NumArray307{prefixSum: nums, data: data} -// } - -// // Update define -// func (this *NumArray307) Update(i int, val int) { -// this.data[i] = val -// this.prefixSum[0] = this.data[0] -// for i := 1; i < len(this.data); i++ { -// this.prefixSum[i] = this.prefixSum[i-1] + this.data[i] -// } -// } - -// // SumRange define -// func (this *NumArray307) SumRange(i int, j int) int { -// if i > 0 { -// return this.prefixSum[j] - this.prefixSum[i-1] -// } -// return this.prefixSum[j] -// } - -/** - * Your NumArray object will be instantiated and called as such: - * obj := Constructor(nums); - * obj.Update(i,val); - * param_2 := obj.SumRange(i,j); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0309.Best-Time-to-Buy-and-Sell-Stock-with-Cooldown.md b/website/content/ChapterFour/0309.Best-Time-to-Buy-and-Sell-Stock-with-Cooldown.md deleted file mode 100755 index f9d6d14ab..000000000 --- a/website/content/ChapterFour/0309.Best-Time-to-Buy-and-Sell-Stock-with-Cooldown.md +++ /dev/null @@ -1,84 +0,0 @@ -# [309. Best Time to Buy and Sell Stock with Cooldown](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/) - - -## 题目 - -Say you have an array for which the ith element is the price of a given stock on day i. - -Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions: - -- You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again). -- After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day) - -**Example**: - - Input: [1,2,3,0,2] - Output: 3 - Explanation: transactions = [buy, sell, cooldown, buy, sell] - -## 题目大意 - -给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​ - -设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): - -- 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 -- 卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。 - - - -## 解题思路 - -- 给定一个数组,表示一支股票在每一天的价格。设计一个交易算法,在这些天进行自动交易,要求:每一天只能进行一次操作;在买完股票后,必须卖了股票,才能再次买入;每次卖了股票以后,在下一天是不能购买的。问如何交易,能让利润最大? -- 这一题是第 121 题和第 122 题的变种题。 -- 每天都有 3 种操作,`buy`,`sell`,`cooldown`。`sell` 之后的一天一定是 `cooldown`,但是 `cooldown` 可以出现在任意一天。例如:`buy,cooldown,cooldown,sell,cooldown,cooldown`。`buy[i]` 代表第 `i` 天通过 `buy` 或者 `cooldown` 结束此天能获得的最大收益。例如:`buy, sell, buy` 或者 `buy, cooldown, cooldown`。`sell[i]` 代表第 `i` 天通过 `sell` 或者 `cooldown` 结束此天能获得的最大收益。例如:`buy, sell, buy, sell` 或者 `buy, sell, cooldown, cooldown`。`price[i-1]` 代表第 `i` 天的股票价格(由于 price 是从 0 开始的)。 -- 第 i 天如果是 sell,那么这天能获得的最大收益是 `buy[i - 1] + price[i - 1]`,因为只有 buy 了才能 sell。如果这一天是 cooldown,那么这天能获得的最大收益还是 sell[i - 1]。所以 sell[i] 的状态转移方程 `sell[i] = max(buy[i - 1] + price[i - 1], sell[i - 1])`。`sell[0] = 0` 代表第一天就卖了,由于第一天不持有股票,所以 sell[0] = 0。`sell[1] = max(sell[0], buy[0]+prices[1])` 代表第一天卖了,和第一天不卖,第二天卖做对比,钱多的保存至 sell[1]。 -- 第 i 天如果是 buy,那么这天能获得的最大收益是 `sell[i - 2] - price[i - 1]`,因为 i - 1 天是 cooldown。如果这一天是 cooldown,那么这天能获得的最大收益还是 buy[i - 1]。所以 buy[i] 的状态转移方程 `buy[i] = max(sell[i - 2] - price[i - 1], buy[i - 1])`。`buy[0] = -prices[0]` 代表第一天就买入,所以金钱变成了负的。`buy[1] = max(buy[0], -prices[1])` 代表第一天不买入,第二天再买入。 - - - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -// 解法一 DP -func maxProfit309(prices []int) int { - if len(prices) <= 1 { - return 0 - } - buy, sell := make([]int, len(prices)), make([]int, len(prices)) - for i := range buy { - buy[i] = math.MinInt64 - } - buy[0] = -prices[0] - buy[1] = max(buy[0], -prices[1]) - sell[1] = max(sell[0], buy[0]+prices[1]) - for i := 2; i < len(prices); i++ { - sell[i] = max(sell[i-1], buy[i-1]+prices[i]) - buy[i] = max(buy[i-1], sell[i-2]-prices[i]) - } - return sell[len(sell)-1] -} - -// 解法二 优化辅助空间的 DP -func maxProfit309_1(prices []int) int { - if len(prices) <= 1 { - return 0 - } - buy := []int{-prices[0], max(-prices[0], -prices[1]), math.MinInt64} - sell := []int{0, max(0, -prices[0]+prices[1]), 0} - - for i := 2; i < len(prices); i++ { - sell[i%3] = max(sell[(i-1)%3], buy[(i-1)%3]+prices[i]) - buy[i%3] = max(buy[(i-1)%3], sell[(i-2)%3]-prices[i]) - } - return sell[(len(prices)-1)%3] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0315.Count-of-Smaller-Numbers-After-Self.md b/website/content/ChapterFour/0315.Count-of-Smaller-Numbers-After-Self.md deleted file mode 100755 index e82ba661f..000000000 --- a/website/content/ChapterFour/0315.Count-of-Smaller-Numbers-After-Self.md +++ /dev/null @@ -1,88 +0,0 @@ -# [315. Count of Smaller Numbers After Self](https://leetcode.com/problems/count-of-smaller-numbers-after-self/) - - -## 题目 - -You are given an integer array nums and you have to return a new counts array. The counts array has the property where `counts[i]` is the number of smaller elements to the right of `nums[i]`. - -**Example**: - - Input: [5,2,6,1] - Output: [2,1,1,0] - Explanation: - To the right of 5 there are 2 smaller elements (2 and 1). - To the right of 2 there is only 1 smaller element (1). - To the right of 6 there is 1 smaller element (1). - To the right of 1 there is 0 smaller element. - - -## 题目大意 - - -给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是  nums[i] 右侧小于 nums[i] 的元素的数量。 - -示例: - -``` - -输入: [5,2,6,1] -输出: [2,1,1,0] -解释: -5 的右侧有 2 个更小的元素 (2 和 1). -2 的右侧仅有 1 个更小的元素 (1). -6 的右侧有 1 个更小的元素 (1). -1 的右侧有 0 个更小的元素. - -``` - - -## 解题思路 - - -- 给出一个数组,要求输出数组中每个元素相对于数组中的位置右边比它小的元素。 -- 这一题是第 327 题的缩水版。由于需要找数组位置右边比当前位置元素小的元素,所以从数组右边开始往左边扫。构造一颗线段树,线段树里面父节点存的是子节点出现的次数和。有可能给的数据会很大,所以构造线段树的时候先离散化。还需要注意的是数组里面可能有重复元素,所以构造线段树要先去重并排序。从右往左扫的过程中,依次添加数组中的元素,添加了一次就立即 query 一次。query 的区间是 [minNum, nums[i]-1]。如果是 minNum 则输出 0,并且也要记得插入这个最小值。这一题的思路和第 327 题大体类似,详解可见第 327 题。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -func countSmaller(nums []int) []int { - if len(nums) == 0 { - return []int{} - } - st, minNum, numsMap, numsArray, res := template.SegmentCountTree{}, 0, make(map[int]int, 0), []int{}, make([]int, len(nums)) - for i := 0; i < len(nums); i++ { - numsMap[nums[i]] = nums[i] - } - for _, v := range numsMap { - numsArray = append(numsArray, v) - } - // 排序是为了使得线段树中的区间 left <= right,如果此处不排序,线段树中的区间有很多不合法。 - sort.Ints(numsArray) - minNum = numsArray[0] - // 初始化线段树,节点内的值都赋值为 0,即计数为 0 - st.Init(numsArray, func(i, j int) int { - return 0 - }) - for i := len(nums) - 1; i >= 0; i-- { - if nums[i] == minNum { - res[i] = 0 - st.UpdateCount(nums[i]) - continue - } - st.UpdateCount(nums[i]) - res[i] = st.Query(minNum, nums[i]-1) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0318.Maximum-Product-of-Word-Lengths.md b/website/content/ChapterFour/0318.Maximum-Product-of-Word-Lengths.md deleted file mode 100755 index 7020a8bd2..000000000 --- a/website/content/ChapterFour/0318.Maximum-Product-of-Word-Lengths.md +++ /dev/null @@ -1,77 +0,0 @@ -# [318. Maximum Product of Word Lengths](https://leetcode.com/problems/maximum-product-of-word-lengths/) - - -## 题目 - -Given a string array `words`, find the maximum value of `length(word[i]) * length(word[j])` where the two words do not share common letters. You may assume that each word will contain only lower case letters. If no such two words exist, return 0. - -**Example 1**: - - Input: ["abcw","baz","foo","bar","xtfn","abcdef"] - Output: 16 - Explanation: The two words can be "abcw", "xtfn". - -**Example 2**: - - Input: ["a","ab","abc","d","cd","bcd","abcd"] - Output: 4 - Explanation: The two words can be "ab", "cd". - -**Example 3**: - - Input: ["a","aa","aaa","aaaa"] - Output: 0 - Explanation: No such pair of words. - - - -## 题目大意 - -给定一个字符串数组 words,找到 length(word[i]) * length(word[j]) 的最大值,并且这两个单词不含有公共字母。你可以认为每个单词只包含小写字母。如果不存在这样的两个单词,返回 0。 - - -## 解题思路 - -- 在字符串数组中找到 2 个没有公共字符的字符串,并且这两个字符串的长度乘积要是最大的,求这个最大的乘积。 -- 这里需要利用位运算 `&` 运算的性质,如果 `X & Y = 0`,说明 X 和 Y 完全不相同。那么我们将字符串都编码成二进制数,进行 `&` 运算即可分出没有公共字符的字符串,最后动态维护长度乘积最大值即可。将字符串编码成二进制数的规则比较简单,每个字符相对于 'a' 的距离,根据这个距离将 1 左移多少位。 - -```c - a 1->1 - b 2->10 - c 4->100 - ab 3->11 - ac 5->101 - abc 7->111 - az 33554433->10000000000000000000000001 -``` - - -## 代码 - -```go - -package leetcode - -func maxProduct318(words []string) int { - if words == nil || len(words) == 0 { - return 0 - } - length, value, maxProduct := len(words), make([]int, len(words)), 0 - for i := 0; i < length; i++ { - tmp := words[i] - value[i] = 0 - for j := 0; j < len(tmp); j++ { - value[i] |= 1 << (tmp[j] - 'a') - } - } - for i := 0; i < length; i++ { - for j := i + 1; j < length; j++ { - if (value[i]&value[j]) == 0 && (len(words[i])*len(words[j]) > maxProduct) { - maxProduct = len(words[i]) * len(words[j]) - } - } - } - return maxProduct -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0322.Coin-Change.md b/website/content/ChapterFour/0322.Coin-Change.md deleted file mode 100755 index ee3adf0b0..000000000 --- a/website/content/ChapterFour/0322.Coin-Change.md +++ /dev/null @@ -1,61 +0,0 @@ -# [322. Coin Change](https://leetcode.com/problems/coin-change/) - - -## 题目 - -You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return `-1`. - -**Example 1**: - - Input: coins = [1, 2, 5], amount = 11 - Output: 3 - Explanation: 11 = 5 + 5 + 1 - -**Example 2**: - - Input: coins = [2], amount = 3 - Output: -1 - -**Note**: - -You may assume that you have an infinite number of each kind of coin. - -## 题目大意 - -给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 - - - -## 解题思路 - -- 给出一些硬币和一个总数,问组成这个总数的硬币数最少是多少个? -- 这一题是经典的硬币问题,利用 DP 求解。不过这一题的测试用例有一个很大的值,这样开 DP 数组会比较浪费空间。例如 [1,1000000000,500000] 有这样的硬币种类,要求组成 2389412493027523 这样的总数。那么按照下面的解题方法,数组会开的很大,非常浪费空间。这个时候用 DFS 解题会节约一点空间。 - - - -## 代码 - -```go - -package leetcode - -func coinChange(coins []int, amount int) int { - dp := make([]int, amount+1) - dp[0] = 0 - for i := 1; i < len(dp); i++ { - dp[i] = amount + 1 - } - for i := 1; i <= amount; i++ { - for j := 0; j < len(coins); j++ { - if coins[j] <= i { - dp[i] = min(dp[i], dp[i-coins[j]]+1) - } - } - } - if dp[amount] > amount { - return -1 - } - return dp[amount] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0324.Wiggle-Sort-II.md b/website/content/ChapterFour/0324.Wiggle-Sort-II.md deleted file mode 100644 index d8baed573..000000000 --- a/website/content/ChapterFour/0324.Wiggle-Sort-II.md +++ /dev/null @@ -1,263 +0,0 @@ -# [324. Wiggle Sort II](https://leetcode.com/problems/wiggle-sort-ii/) - -## 题目 - -Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3].... - -**Example 1**: - -``` - -Input: nums = [1, 5, 1, 1, 6, 4] -Output: One possible answer is [1, 4, 1, 5, 1, 6]. - -``` - -**Example 2**: - -``` - -Input: nums = [1, 3, 2, 2, 3, 1] -Output: One possible answer is [2, 3, 1, 3, 1, 2]. - -``` - -**Note**: - -You may assume all input has valid answer. - -**Follow up**: - -Can you do it in O(n) time and/or in-place with O(1) extra space? - - -## 题目大意 - -给定一个数组,要求给它进行“摆动排序”,“摆动排序”即:nums[0] < nums[1] > nums[2] < nums[3]... - -## 解题思路 - -这一题最直接的方法是先排序,然后用 2 个指针,一个指向下标为 0 的位置,另一个指向下标为 n/2 的位置。最终的数组的奇数位从下标为 0 开始往后取,偶数位从下标为 n/2 中间位置开始往后取。这种方法时间复杂度为 O(n log n)。 - -题目要求用时间复杂度 O(n) 和 空间复杂度 O(1) 的方法解决。思路如下,先找到数组中间大小的数字,然后把数组分为 2 部分: - -```c -Index : 0 1 2 3 4 5 -Small half: M S S -Large half: L L L(M) -``` - -奇数位排中间数和小于中间数的数字,偶数位排大于中间数的数字和中间数。如果中间数字有多个,那么偶数位最后几位也是中间数,奇数位开头的前几位也是中间数。 - -举例,给定一个数组如下,中间数是 5 。有 2 个 5 。 - -```c -13 6 5 5 4 2 - - M -``` - -```c -Step 1: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 13 6 5 5 4 2 - Left - i - Right -``` - -nums[Mapped_idx[i]] = nums[1] = 6 > 5, 所以可以把 6 放在第 1 个奇数位的位置。left 和 i 同时右移。 - -```c -Step 2: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 13 6 5 5 4 2 - Left - i - Right -``` - -nums[3] = 5 = 5, 5 可以放在下标为 3 的位置,由于 5 已经和中间数相等了,所以只后移 i 。 - - -```c -Step 3: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 13 6 5 5 4 2 - Left - i - Right -``` - -nums[5] = 2 < 5, 因为比中位数小,所以应该放在偶数位的最后 1 位。这里的例子而言,应该放在下标为 4 的位置上。交换 nums[Mapped_idx[i]] 和 nums[Mapped_idx[Right]],交换完成以后 right 向左移。 - - -```c -Step 4: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 13 6 5 5 2 4 - Left - i - Right -``` - -nums[5] = 4 < 5, 因为比中位数小,所以应该放在偶数位的当前倒数第一位。这里的例子而言,应该放在下标为 2 的位置上。交换 nums[Mapped\_idx[i]] 和 nums[Mapped\_idx[Right]],交换完成以后 right 向左移。 - - -```c -Step 5: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 13 6 4 5 2 5 - Left - i - Right -``` - -nums[5] = 5 = 5, 由于 5 已经和中间数相等了,所以只后移 i 。 - -```c -Step 6: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 13 6 4 5 2 5 - Left - i - Right -``` - - -nums[0] = 13 > 5, 由于 13 比中位数大,所以可以把 13 放在第 2 个奇数位的位置,并移动 left 和 i 。 - - -```c -Step Final: -Original idx: 0 1 2 3 4 5 -Mapped idx: 1 3 5 0 2 4 -Array: 5 6 4 13 2 5 - Left - i - Right -``` - -i > Right, 退出循环,最终摆动排序的结果是 5 6 4 13 2 5 。 - -具体时间见代码,时间复杂度 O(n) 和 空间复杂度 O(1)。 - - - - - - - - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -// 解法一 -func wiggleSort(nums []int) { - if len(nums) < 2 { - return - } - median := findKthLargest324(nums, (len(nums)+1)/2) - n, i, left, right := len(nums), 0, 0, len(nums)-1 - - for i <= right { - if nums[indexMap(i, n)] > median { - nums[indexMap(left, n)], nums[indexMap(i, n)] = nums[indexMap(i, n)], nums[indexMap(left, n)] - left++ - i++ - } else if nums[indexMap(i, n)] < median { - nums[indexMap(right, n)], nums[indexMap(i, n)] = nums[indexMap(i, n)], nums[indexMap(right, n)] - right-- - } else { - i++ - } - } -} - -func indexMap(index, n int) int { - return (1 + 2*index) % (n | 1) -} - -func findKthLargest324(nums []int, k int) int { - if len(nums) == 0 { - return 0 - } - return selection324(nums, 0, len(nums)-1, len(nums)-k) -} - -func selection324(arr []int, l, r, k int) int { - if l == r { - return arr[l] - } - p := partition324(arr, l, r) - - if k == p { - return arr[p] - } else if k < p { - return selection324(arr, l, p-1, k) - } else { - return selection324(arr, p+1, r, k) - } -} - -func partition324(a []int, lo, hi int) int { - pivot := a[hi] - i := lo - 1 - for j := lo; j < hi; j++ { - if a[j] < pivot { - i++ - a[j], a[i] = a[i], a[j] - } - } - a[i+1], a[hi] = a[hi], a[i+1] - return i + 1 -} - -// 解法二 -func wiggleSort1(nums []int) { - if len(nums) < 2 { - return - } - array := make([]int, len(nums)) - copy(array, nums) - sort.Ints(array) - n := len(nums) - left := (n+1)/2 - 1 // median index - right := n - 1 // largest value index - for i := 0; i < len(nums); i++ { - // copy large values on odd indexes - if i%2 == 1 { - nums[i] = array[right] - right-- - } else { // copy values decremeting from median on even indexes - nums[i] = array[left] - left-- - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0326.Power-of-Three.md b/website/content/ChapterFour/0326.Power-of-Three.md deleted file mode 100755 index 7455f8647..000000000 --- a/website/content/ChapterFour/0326.Power-of-Three.md +++ /dev/null @@ -1,77 +0,0 @@ -# [326. Power of Three](https://leetcode.com/problems/power-of-three/) - - -## 题目 - -Given an integer, write a function to determine if it is a power of three. - -**Example 1**: - - Input: 27 - Output: true - -**Example 2**: - - Input: 0 - Output: false - -**Example 3**: - - Input: 9 - Output: true - -**Example 4**: - - Input: 45 - Output: false - -**Follow up**: - -Could you do it without using any loop / recursion? - - -## 题目大意 - -给定一个整数,写一个函数来判断它是否是 3 的幂次方。 - - -## 解题思路 - -- 判断一个数是不是 3 的 n 次方。 -- 这一题最简单的思路是循环,可以通过。但是题目要求不循环就要判断,这就需要用到数论的知识了。由于 3^20 超过了 int 的范围了,所以 3^19 次方就是 int 类型中最大的值。这一题和第 231 题是一样的思路。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 数论 -func isPowerOfThree(n int) bool { - // 1162261467 is 3^19, 3^20 is bigger than int - return n > 0 && (1162261467%n == 0) -} - -// 解法二 打表法 -func isPowerOfThree1(n int) bool { - // 1162261467 is 3^19, 3^20 is bigger than int - allPowerOfThreeMap := map[int]int{1: 1, 3: 3, 9: 9, 27: 27, 81: 81, 243: 243, 729: 729, 2187: 2187, 6561: 6561, 19683: 19683, 59049: 59049, 177147: 177147, 531441: 531441, 1594323: 1594323, 4782969: 4782969, 14348907: 14348907, 43046721: 43046721, 129140163: 129140163, 387420489: 387420489, 1162261467: 1162261467} - _, ok := allPowerOfThreeMap[n] - return ok -} - -// 解法三 循环 -func isPowerOfThree2(num int) bool { - for num >= 3 { - if num%3 == 0 { - num = num / 3 - } else { - return false - } - } - return num == 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0327.Count-of-Range-Sum.md b/website/content/ChapterFour/0327.Count-of-Range-Sum.md deleted file mode 100755 index 87a5d3240..000000000 --- a/website/content/ChapterFour/0327.Count-of-Range-Sum.md +++ /dev/null @@ -1,145 +0,0 @@ -# [327. Count of Range Sum](https://leetcode.com/problems/count-of-range-sum/) - - -## 题目 - -Given an integer array `nums`, return the number of range sums that lie in `[lower, upper]` inclusive.Range sum `S(i, j)` is defined as the sum of the elements in `nums` between indices `i` and `j` (`i` ≤ `j`), inclusive. - -**Note**:A naive algorithm of O(n2) is trivial. You MUST do better than that. - -**Example**: - - Input: nums = [-2,5,-1], lower = -2, upper = 2, - Output: 3 - Explanation: The three ranges are : [0,0], [2,2], [0,2] and their respective sums are: -2, -1, 2. - - -## 题目大意 - - -给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。 - -说明: -最直观的算法复杂度是 O(n^2) ,请在此基础上优化你的算法。 - - -## 解题思路 - -- 给出一个数组,要求在这个数组中找出任意一段子区间的和,位于 [lower,upper] 之间。 -- 这一题可以用暴力解法,2 层循环,遍历所有子区间,求和并判断是否位于 [lower,upper] 之间,时间复杂度 O(n^2)。 -- 这一题当然还有更优的解法,用线段树或者树状数组,将时间复杂度降为 O(n log n)。题目中要求 `lower ≤ sum(i,j) ≤ upper`,`sum(i,j) = prefixSum(j) - prefixSum(i-1)`,那么 `lower + prefixSum(i-1) ≤ prefixSum(j) ≤ upper + prefixSum(i-1)`。所以利用前缀和将区间和转换成了前缀和在线段树中 `query` 的问题,只不过线段树中父节点中存的不是子节点的和,而应该是子节点出现的次数。第二个转换,由于前缀和会很大,所以需要离散化。例如 `prefixSum = [-3,-2,-1,0]`,用前缀和下标进行离散化,所以线段树中左右区间变成了 0-3 。 - - ![](https://img.halfrost.com/Leetcode/leetcode_327_0.png) - - 利用 `prefixSum` 下标离散化: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_1.png) - -- 还需要注意一些小细节,`prefixSum` 计算完以后需要去重,去重以后并排序,方便构造线段树的有效区间。如果不去重,线段树中可能出现非法区间(left > right)或者重叠区间。最后一步往线段树中倒序插入 `prefixSum` 的时候,用的是非去重的,插入 `prefixSum[j]` 代表 sum(i,j) 中的 j,例如往线段树中插入 `prefixSum[5]`,代表当前树中加入了 j = 5 的情况。query 操作实质是在做区间匹配,例如当前 i 循环到 i = 3,累计往线段树中插入了 `prefixSum[5]`,`prefixSum[4]`,`prefixSum[3]`,那么 query 操作实质是在判断:`lower ≤ sum(i=3,j=3) ≤ upper`,`lower ≤ sum(i=3,j=4) ≤ upper`,`lower ≤ sum(i=3,j=5) ≤ upper`,这 3 个等式是否成立,有几个成立就返回几个,即是最终要求得的结果的一部分。 -- 举个例子,`nums = [-3,1,2,-2,2,-1]`,`prefixSum = [-3,-2,0,-2,0,-1]`,去重以后并排序得到 `sum = [-3,-2,-1,0]`。离散化构造线段树,这里出于演示的方便,下图中就不画出离散后的线段树了,用非离散的线段树展示: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_2_.png) - - 倒序插入 `len(prefixSum)-1 = prefixSum[5] = -1`: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_3_.png) - - 这时候查找区间变为了 `[-3 + prefixSum[5-1], -1 + prefixSum[5-1]] = [-3,-1]`,即判断 `-3 ≤ sum(5,5) ≤ -1`,满足等式的有几种情况,这里明显只有一种情况,即 `j = 5`,也满足等式,所以这一步 `res = 1`。 - -- 倒序插入 `len(prefixSum)-2 = prefixSum[4] = 0`: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_4_.png) - - 这时候查找区间变为了 `[-3 + prefixSum[4-1], -1 + prefixSum[4-1]] = [-5,-3]`,即判断 `-5 ≤ sum(4, 4,5) ≤ -3`,满足等式的有几种情况,这里有两种情况,即 `j = 4` 或者 `j = 5`,都不满足等式,所以这一步 `res = 0`。 - -- 倒序插入 `len(prefixSum)-3 = prefixSum[3] = -2`: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_5_.png) - - 这时候查找区间变为了 `[-3 + prefixSum[3-1], -1 + prefixSum[3-1]] = [-3,-1]`,即判断 `-3 ≤ sum(3, 3,4,5) ≤ -1`,满足等式的有几种情况,这里有三种情况,即 `j = 3` 、`j = 4` 或者 `j = 5`,满足等式的有 `j = 3` 和 `j = 5`,即 `-3 ≤ sum(3, 3) ≤ -1` 和 `-3 ≤ sum(3, 5) ≤ -1`。所以这一步 `res = 2`。 - -- 倒序插入 `len(prefixSum)-4 = prefixSum[2] = 0`: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_6_.png) - - 这时候查找区间变为了 `[-3 + prefixSum[2-1], -1 + prefixSum[2-1]] = [-5,-3]`,即判断 `-5 ≤ sum(2, 2,3,4,5) ≤ -3`,满足等式的有几种情况,这里有四种情况,即 `j = 2`、 `j = 3` 、`j = 4` 或者 `j = 5`,都不满足等式。所以这一步 `res = 0`。 - -- 倒序插入 `len(prefixSum)-5 = prefixSum[1] = -2`: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_7_.png) - - 这时候查找区间变为了 `[-3 + prefixSum[1-1], -1 + prefixSum[1-1]] = [-6,-4]`,即判断 `-6 ≤ sum(1, 1,2,3,4,5) ≤ -4`,满足等式的有几种情况,这里有五种情况,即 `j = 1`、 `j = 2`、 `j = 3` 、`j = 4` 或者 `j = 5`,都不满足等式。所以这一步 `res = 0`。 - -- 倒序插入 `len(prefixSum)-6 = prefixSum[0] = -3`: - - ![](https://img.halfrost.com/Leetcode/leetcode_327_8_.png) - - 这时候查找区间变为了 `[-3 + prefixSum[0-1], -1 + prefixSum[0-1]] = [-3,-1]`,注意 `prefixSum[-1] = 0`,即判断 `-3 ≤ sum(0, 0,1,2,3,4,5) ≤ -1`,满足等式的有几种情况,这里有六种情况,即 `j = 0`、`j = 1`、`j = 2`、 `j = 3` 、`j = 4` 或者 `j = 5`,满足等式的有 `j = 0`、`j = 1`、 `j = 3` 和 `j = 5`,即 `-3 ≤ sum(0, 0) ≤ -1` 、 `-3 ≤ sum(0, 1) ≤ -1`、`-3 ≤ sum(0, 3) ≤ -1` 和 `-3 ≤ sum(0, 5) ≤ -1`。所以这一步 `res = 4`。最后的答案就是把每一步的结果都累加,`res = 1 + 0 + 2 + 0 + 0 + 4 = 7`。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 线段树,时间复杂度 O(n log n) -func countRangeSum(nums []int, lower int, upper int) int { - if len(nums) == 0 { - return 0 - } - st, prefixSum, sumMap, sumArray, res := template.SegmentCountTree{}, make([]int, len(nums)), make(map[int]int, 0), []int{}, 0 - prefixSum[0], sumMap[nums[0]] = nums[0], nums[0] - for i := 1; i < len(nums); i++ { - prefixSum[i] = prefixSum[i-1] + nums[i] - sumMap[prefixSum[i]] = prefixSum[i] - } - // sumArray 是 prefixSum 去重之后的版本,利用 sumMap 去重 - for _, v := range sumMap { - sumArray = append(sumArray, v) - } - // 排序是为了使得线段树中的区间 left <= right,如果此处不排序,线段树中的区间有很多不合法。 - sort.Ints(sumArray) - // 初始化线段树,节点内的值都赋值为 0,即计数为 0 - st.Init(sumArray, func(i, j int) int { - return 0 - }) - // 倒序是为了方便寻找 j,sum(i,j) 规定了 j >= i,所以倒序遍历,i 从大到小 - for i := len(nums) - 1; i >= 0; i-- { - // 插入的 prefixSum[i] 即是 j - st.UpdateCount(prefixSum[i]) - if i > 0 { - res += st.Query(lower+prefixSum[i-1], upper+prefixSum[i-1]) - } else { - res += st.Query(lower, upper) - } - } - return res -} - -// 解法二 暴力,时间复杂度 O(n^2) -func countRangeSum1(nums []int, lower int, upper int) int { - res, n := 0, len(nums) - for i := 0; i < n; i++ { - tmp := 0 - for j := i; j < n; j++ { - if i == j { - tmp = nums[i] - } else { - tmp += nums[j] - } - if tmp <= upper && tmp >= lower { - res++ - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0328.Odd-Even-Linked-List.md b/website/content/ChapterFour/0328.Odd-Even-Linked-List.md deleted file mode 100644 index b7201e5df..000000000 --- a/website/content/ChapterFour/0328.Odd-Even-Linked-List.md +++ /dev/null @@ -1,77 +0,0 @@ -# [328. Odd Even Linked List](https://leetcode.com/problems/odd-even-linked-list/) - -## 题目 - -Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes. - -You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity. - -**Example 1**: - -``` - -Input: 1->2->3->4->5->NULL -Output: 1->3->5->2->4->NULL - -``` - -**Example 2**: - -``` - -Input: 2->1->3->5->6->4->7->NULL -Output: 2->3->6->7->1->5->4->NULL - -``` - -**Note**: - -- The relative order inside both the even and odd groups should remain as it was in the input. -- The first node is considered odd, the second node even and so on ... - -## 题目大意 - -这道题和第 86 题非常类型。第 86 题是把排在某个点前面的小值放在一个链表中,排在某个点后端的大值放在另外一个链表中,最后 2 个链表首尾拼接一下就是答案。 - -## 解题思路 - -这道题思路也是一样的,分别把奇数和偶数都放在 2 个链表中,最后首尾拼接就是答案。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func oddEvenList(head *ListNode) *ListNode { - oddHead := &ListNode{Val: 0, Next: nil} - odd := oddHead - evenHead := &ListNode{Val: 0, Next: nil} - even := evenHead - - count := 1 - for head != nil { - if count%2 == 1 { - odd.Next = head - odd = odd.Next - } else { - even.Next = head - even = even.Next - } - head = head.Next - count++ - } - even.Next = nil - odd.Next = evenHead.Next - return oddHead.Next -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0329.Longest-Increasing-Path-in-a-Matrix.md b/website/content/ChapterFour/0329.Longest-Increasing-Path-in-a-Matrix.md deleted file mode 100755 index 4ae431127..000000000 --- a/website/content/ChapterFour/0329.Longest-Increasing-Path-in-a-Matrix.md +++ /dev/null @@ -1,92 +0,0 @@ -# [329. Longest Increasing Path in a Matrix](https://leetcode.com/problems/longest-increasing-path-in-a-matrix/) - - -## 题目 - -Given an integer matrix, find the length of the longest increasing path. - -From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed). - -**Example 1**: - - Input: nums = - [ - [9,9,4], - [6,6,8], - [2,1,1] - ] - Output: 4 - Explanation: The longest increasing path is [1, 2, 6, 9]. - -**Example 2**: - - Input: nums = - [ - [3,4,5], - [3,2,6], - [2,2,1] - ] - Output: 4 - Explanation: The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed. - - -## 题目大意 - -给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。 - - -## 解题思路 - - -- 给出一个矩阵,要求在这个矩阵中找到一个最长递增的路径。路径有上下左右 4 个方向。 -- 这一题解题思路很明显,用 DFS 即可。在提交完第一版以后会发现 TLE,因为题目给出了一个非常大的矩阵,搜索次数太多。所以需要用到记忆化,把曾经搜索过的最大长度缓存起来,增加了记忆化以后再次提交 AC。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -func longestIncreasingPath(matrix [][]int) int { - cache, res := make([][]int, len(matrix)), 0 - for i := 0; i < len(cache); i++ { - cache[i] = make([]int, len(matrix[0])) - } - for i, v := range matrix { - for j := range v { - searchPath(matrix, cache, math.MinInt64, i, j) - res = max(res, cache[i][j]) - } - } - return res -} - -func isInIntBoard(board [][]int, x, y int) bool { - return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) -} - -func searchPath(board, cache [][]int, lastNum, x, y int) int { - if board[x][y] <= lastNum { - return 0 - } - if cache[x][y] > 0 { - return cache[x][y] - } - count := 1 - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - if isInIntBoard(board, nx, ny) { - count = max(count, searchPath(board, cache, board[x][y], nx, ny)+1) - } - } - cache[x][y] = count - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0331.Verify-Preorder-Serialization-of-a-Binary-Tree.md b/website/content/ChapterFour/0331.Verify-Preorder-Serialization-of-a-Binary-Tree.md deleted file mode 100644 index 8df741a16..000000000 --- a/website/content/ChapterFour/0331.Verify-Preorder-Serialization-of-a-Binary-Tree.md +++ /dev/null @@ -1,85 +0,0 @@ -# [331. Verify Preorder Serialization of a Binary Tree](https://leetcode.com/problems/verify-preorder-serialization-of-a-binary-tree/) - -## 题目 - -One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node's value. If it is a null node, we record using a sentinel value such as #. - -``` - - _9_ - / \ - 3 2 - / \ / \ - 4 1 # 6 -/ \ / \ / \ -# # # # # # - -``` - -For example, the above binary tree can be serialized to the string "9,3,4,#,#,1,#,#,2,#,6,#,#", where # represents a null node. - -Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree. - -Each comma separated value in the string must be either an integer or a character '#' representing null pointer. - -You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3". - -**Example 1**: - -``` - -Input: "9,3,4,#,#,1,#,#,2,#,6,#,#" -Output: true - -``` - -**Example 2**: - -``` - -Input: "1,#" -Output: false - -``` -**Example 3**: - -``` - -Input: "9,#,#,1" -Output: false - -``` - -## 题目大意 - -给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。 - -## 解题思路 - -这道题有些人用栈,有些用栈的深度求解。换个视角。如果叶子结点是 null,那么所有非 null 的结点(除了 root 结点)必然有 2 个出度,1 个入度(2 个孩子和 1 个父亲,孩子可能为空,但是这一题用 "#" 代替了,所以肯定有 2 个孩子);所有的 null 结点只有 0 个出度,1 个入度(0 个孩子和 1 个父亲)。 - -我们开始构建这颗树,在构建过程中,我们记录出度和度之间的差异 `diff = outdegree - indegree`。当下一个节点到来时,我们将 diff 减 1,因为这个节点提供了一个度。如果这个节点不为 null,我们将 diff 增加 2,因为它提供两个出度。如果序列化是正确的,则 diff 应该永远不会为负,并且 diff 在完成时将为零。最后判断一下 diff 是不是为 0 即可判断它是否是正确的二叉树的前序序列化。 - -## 代码 - -```go - -package leetcode - -import "strings" - -func isValidSerialization(preorder string) bool { - nodes, diff := strings.Split(preorder, ","), 1 - for _, node := range nodes { - diff-- - if diff < 0 { - return false - } - if node != "#" { - diff += 2 - } - } - return diff == 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0337.House-Robber-III.md b/website/content/ChapterFour/0337.House-Robber-III.md deleted file mode 100644 index e84518812..000000000 --- a/website/content/ChapterFour/0337.House-Robber-III.md +++ /dev/null @@ -1,73 +0,0 @@ -# [337. House Robber III](https://leetcode.com/problems/house-robber-iii/) - - - -## 题目 - -The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that "all houses in this place forms a binary tree". It will automatically contact the police if two directly-linked houses were broken into on the same night. - -Determine the maximum amount of money the thief can rob tonight without alerting the police. - -**Example 1**: - -``` -Input: [3,2,3,null,3,null,1] - - 3 - / \ - 2 3 - \ \ - 3 1 - -Output: 7 -Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7. -``` - -**Example 2**: - -``` -Input: [3,4,5,1,3,null,1] - - 3 - / \ - 4 5 - / \ \ - 1 3 1 - -Output: 9 -Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9. -``` - -## 题目大意 - -一个新的可行窃的地区只有一个入口,称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 - - -## 解题思路 - -- 这一题是打家劫舍的第 3 题。这一题需要偷的房子是树状的。报警的条件还是相邻的房子如果都被偷了,就会触发报警。只不过这里相邻的房子是树上的。问小偷在不触发报警的条件下最终能偷的最高金额。 -- 解题思路是 DFS。当前节点是否被打劫,会产生 2 种结果。如果当前节点被打劫,那么它的孩子节点可以被打劫;如果当前节点没有被打劫,那么它的孩子节点不能被打劫。按照这个逻辑递归,最终递归到根节点,取最大值输出即可。 - -## 代码 - -```go - -func rob337(root *TreeNode) int { - a, b := dfsTreeRob(root) - return max(a, b) -} - -func dfsTreeRob(root *TreeNode) (a, b int) { - if root == nil { - return 0, 0 - } - l0, l1 := dfsTreeRob(root.Left) - r0, r1 := dfsTreeRob(root.Right) - // 当前节点没有被打劫 - tmp0 := max(l0, l1) + max(r0, r1) - // 当前节点被打劫 - tmp1 := root.Val + l0 + r0 - return tmp0, tmp1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0338.Counting-Bits.md b/website/content/ChapterFour/0338.Counting-Bits.md deleted file mode 100755 index ea8e0de28..000000000 --- a/website/content/ChapterFour/0338.Counting-Bits.md +++ /dev/null @@ -1,54 +0,0 @@ -# [338. Counting Bits](https://leetcode.com/problems/counting-bits/) - - -## 题目 - -Given a non negative integer number **num**. For every numbers **i** in the range **0 ≤ i ≤ num** calculate the number of 1's in their binary representation and return them as an array. - -**Example 1**: - - Input: 2 - Output: [0,1,1] - -**Example 2**: - - Input: 5 - Output: [0,1,1,2,1,2] - -**Follow up**: - -- It is very easy to come up with a solution with run time **O(n*sizeof(integer))**. But can you do it in linear time **O(n)** /possibly in a single pass? -- Space complexity should be **O(n)**. -- Can you do it like a boss? Do it without using any builtin function like **\_\_builtin\_popcount** in c++ or in any other language. - -## 题目大意 - - -给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 - -## 解题思路 - -- 给出一个数,要求计算出 0 ≤ i ≤ num 中每个数的二进制位 1 的个数。 -- 这一题就是利用二进制位运算的经典题。 - - X&1==1or==0,可以用 X&1 判断奇偶性,X&1>0 即奇数。 - X = X & (X-1) 清零最低位的1 - X & -X => 得到最低位的1 - X&~X=>0 - - -## 代码 - -```go - -package leetcode - -func countBits(num int) []int { - bits := make([]int, num+1) - for i := 1; i <= num; i++ { - bits[i] += bits[i&(i-1)] + 1 - } - return bits -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0342.Power-of-Four.md b/website/content/ChapterFour/0342.Power-of-Four.md deleted file mode 100755 index 64782049d..000000000 --- a/website/content/ChapterFour/0342.Power-of-Four.md +++ /dev/null @@ -1,55 +0,0 @@ -# [342. Power of Four](https://leetcode.com/problems/power-of-four/) - - -## 题目 - -Given an integer (signed 32 bits), write a function to check whether it is a power of 4. - -**Example 1**: - - Input: 16 - Output: true - -**Example 2**: - - Input: 5 - Output: false - -**Follow up**: Could you solve it without loops/recursion? - -## 题目大意 - -给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。 - - -## 解题思路 - -- 判断一个数是不是 4 的 n 次方。 -- 这一题最简单的思路是循环,可以通过。但是题目要求不循环就要判断,这就需要用到数论的知识了。 -- 证明 `(4^n - 1) % 3 == 0`,(1) `4^n - 1 = (2^n + 1) * (2^n - 1)`(2) 在任何连续的 3 个数中 `(2^n-1)`,`(2^n)`,`(2^n+1)`,一定有一个数是 3 的倍数。`(2^n)` 肯定不是 3 的倍数,那么 `(2^n-1)` 或者 `(2^n+1)` 中一定有一个是 3 的倍数。所以 `4^n-1` 一定是 3 的倍数。 - - -## 代码 - -```go - -package leetcode - -// 解法一 数论 -func isPowerOfFour(num int) bool { - return num > 0 && (num&(num-1)) == 0 && (num-1)%3 == 0 -} - -// 解法二 循环 -func isPowerOfFour1(num int) bool { - for num >= 4 { - if num%4 == 0 { - num = num / 4 - } else { - return false - } - } - return num == 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0343.Integer-Break.md b/website/content/ChapterFour/0343.Integer-Break.md deleted file mode 100755 index cfa558d7e..000000000 --- a/website/content/ChapterFour/0343.Integer-Break.md +++ /dev/null @@ -1,53 +0,0 @@ -# [343. Integer Break](https://leetcode.com/problems/integer-break/) - - -## 题目 - -Given a positive integer n, break it into the sum of **at least** two positive integers and maximize the product of those integers. Return the maximum product you can get. - -**Example 1**: - - Input: 2 - Output: 1 - Explanation: 2 = 1 + 1, 1 × 1 = 1. - -**Example 2**: - - Input: 10 - Output: 36 - Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36. - -**Note**: You may assume that n is not less than 2 and not larger than 58. - - -## 题目大意 - -给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 - - -## 解题思路 - -- 这一题是 DP 的题目,将一个数字分成多个数字之和,至少分为 2 个数字之和,求解分解出来的数字乘积最大是多少。 -- 这一题的动态转移方程是 `dp[i] = max(dp[i], j * (i - j), j * dp[i-j])` ,一个数分解成 `j` 和 `i - j` 两个数字,或者分解成 `j` 和 `更多的分解数`,`更多的分解数`即是 `dp[i-j]`,由于 `dp[i-j]` 下标小于 `i` ,所以 `dp[i-j]` 在计算 `dp[i]` 的时候一定计算出来了。 - - - -## 代码 - -```go - -package leetcode - -func integerBreak(n int) int { - dp := make([]int, n+1) - dp[0], dp[1] = 1, 1 - for i := 1; i <= n; i++ { - for j := 1; j < i; j++ { - // dp[i] = max(dp[i], j * (i - j), j*dp[i-j]) - dp[i] = max(dp[i], j*max(dp[i-j], i-j)) - } - } - return dp[n] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0344.Reverse-String.md b/website/content/ChapterFour/0344.Reverse-String.md deleted file mode 100644 index f3568648b..000000000 --- a/website/content/ChapterFour/0344.Reverse-String.md +++ /dev/null @@ -1,53 +0,0 @@ -# [344. Reverse String](https://leetcode.com/problems/reverse-string/) - -## 题目 - -Write a function that reverses a string. The input string is given as an array of characters char[]. - -Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory. - -You may assume all the characters consist of printable ascii characters. - -**Example 1**: - -``` - -Input: ["h","e","l","l","o"] -Output: ["o","l","l","e","h"] - -``` - -**Example 2**: - -``` - -Input: ["H","a","n","n","a","h"] -Output: ["h","a","n","n","a","H"] - -``` - -## 题目大意 - -题目要求我们反转一个字符串。 - -## 解题思路 - -这一题的解题思路是用 2 个指针,指针对撞的思路,来不断交换首尾元素,即可。 - - - -## 代码 - -```go - -package leetcode - -func reverseString(s []byte) { - for i, j := 0, len(s)-1; i < j; { - s[i], s[j] = s[j], s[i] - i++ - j-- - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0345.Reverse-Vowels-of-a-String.md b/website/content/ChapterFour/0345.Reverse-Vowels-of-a-String.md deleted file mode 100644 index 2cbb07fb6..000000000 --- a/website/content/ChapterFour/0345.Reverse-Vowels-of-a-String.md +++ /dev/null @@ -1,69 +0,0 @@ -# [345. Reverse Vowels of a String](https://leetcode.com/problems/reverse-vowels-of-a-string/) - -## 题目 - -Write a function that takes a string as input and reverse only the vowels of a string. - - - -**Example 1**: - -``` - -Input: "hello" -Output: "holle" - -``` - -**Example 2**: - -``` - -Input: "leetcode" -Output: "leotcede" - -``` - -## 题目大意 - -题目要求我们反转字符串中的元音字母。需要注意字母大小写。 - -## 解题思路 - -这一题的解题思路是用 2 个指针,指针对撞的思路,来不断交换首尾元素,即可。这一题和第 344 题思路一样。 - - - -## 代码 - -```go - -package leetcode - -func reverseVowels(s string) string { - b := []byte(s) - for i, j := 0, len(b)-1; i < j; { - if isVowels(b[i]) && isVowels(b[j]) { - b[i], b[j] = b[j], b[i] - i++ - j-- - } else if isVowels(b[i]) && !isVowels(b[j]) { - j-- - } else if !isVowels(b[i]) && isVowels(b[j]) { - i++ - } else { - i++ - j-- - } - } - return string(b) -} - -func isVowels(s byte) bool { - if s == 'a' || s == 'e' || s == 'i' || s == 'o' || s == 'u' || s == 'A' || s == 'E' || s == 'I' || s == 'O' || s == 'U' { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0347.Top-K-Frequent-Elements.md b/website/content/ChapterFour/0347.Top-K-Frequent-Elements.md deleted file mode 100644 index c2a98fcdd..000000000 --- a/website/content/ChapterFour/0347.Top-K-Frequent-Elements.md +++ /dev/null @@ -1,103 +0,0 @@ -# [347. Top K Frequent Elements](https://leetcode.com/problems/top-k-frequent-elements/) - -## 题目 - -Given a non-empty array of integers, return the k most frequent elements. - -**Example 1**: - -``` - -Input: nums = [1,1,1,2,2,3], k = 2 -Output: [1,2] - -``` - -**Example 2**: - -``` - -Input: nums = [1], k = 1 -Output: [1] - -``` - -**Note**: - -- You may assume k is always valid, 1 ≤ k ≤ number of unique elements. -- Your algorithm's time complexity must be better than O(n log n), where n is the array's size. - - -## 题目大意 - -给一个非空的数组,输出前 K 个频率最高的元素。 - -## 解题思路 - -这一题是考察优先队列的题目。把数组构造成一个优先队列,输出前 K 个即可。 - - - - -## 代码 - -```go - -package leetcode - -import "container/heap" - -func topKFrequent(nums []int, k int) []int { - m := make(map[int]int) - for _, n := range nums { - m[n]++ - } - q := PriorityQueue{} - for key, count := range m { - heap.Push(&q, &Item{key: key, count: count}) - } - var result []int - for len(result) < k { - item := heap.Pop(&q).(*Item) - result = append(result, item.key) - } - return result -} - -// Item define -type Item struct { - key int - count int -} - -// A PriorityQueue implements heap.Interface and holds Items. -type PriorityQueue []*Item - -func (pq PriorityQueue) Len() int { - return len(pq) -} - -func (pq PriorityQueue) Less(i, j int) bool { - // 注意:因为golang中的heap是按最小堆组织的,所以count越大,Less()越小,越靠近堆顶. - return pq[i].count > pq[j].count -} - -func (pq PriorityQueue) Swap(i, j int) { - pq[i], pq[j] = pq[j], pq[i] -} - -// Push define -func (pq *PriorityQueue) Push(x interface{}) { - item := x.(*Item) - *pq = append(*pq, item) -} - -// Pop define -func (pq *PriorityQueue) Pop() interface{} { - n := len(*pq) - item := (*pq)[n-1] - *pq = (*pq)[:n-1] - return item -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0349.Intersection-of-Two-Arrays.md b/website/content/ChapterFour/0349.Intersection-of-Two-Arrays.md deleted file mode 100644 index 8f8ad399c..000000000 --- a/website/content/ChapterFour/0349.Intersection-of-Two-Arrays.md +++ /dev/null @@ -1,60 +0,0 @@ -# [349. Intersection of Two Arrays](https://leetcode.com/problems/intersection-of-two-arrays/) - -## 题目 - -Given two arrays, write a function to compute their intersection. - - -**Example 1**: - -``` - -Input: nums1 = [1,2,2,1], nums2 = [2,2] -Output: [2] - -``` - -**Example 2**: - -``` - -Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] -Output: [9,4] - -``` - -**Note**: - -- Each element in the result must be unique. -- The result can be in any order. - -## 题目大意 - -找到两个数组的交集元素,如果交集元素同一个数字出现了多次,只输出一次。 - -## 解题思路 - -把数组一的每个数字都存进字典中,然后在数组二中依次判断字典中是否存在,如果存在,在字典中删除它(因为输出要求只输出一次)。 - -## 代码 - -```go - -package leetcode - -func intersection(nums1 []int, nums2 []int) []int { - m := map[int]bool{} - var res []int - for _, n := range nums1 { - m[n] = true - } - for _, n := range nums2 { - if m[n] { - delete(m, n) - res = append(res, n) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0350.Intersection-of-Two-Arrays-II.md b/website/content/ChapterFour/0350.Intersection-of-Two-Arrays-II.md deleted file mode 100644 index dc92b38ca..000000000 --- a/website/content/ChapterFour/0350.Intersection-of-Two-Arrays-II.md +++ /dev/null @@ -1,72 +0,0 @@ -# [350. Intersection of Two Arrays II](https://leetcode.com/problems/intersection-of-two-arrays-ii/) - -## 题目 - -Given two arrays, write a function to compute their intersection. - - - -**Example 1**: - -``` - -Input: nums1 = [1,2,2,1], nums2 = [2,2] -Output: [2,2] - -``` - -**Example 2**: - -``` - -Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] -Output: [4,9] - -``` - -**Note**: - -- Each element in the result should appear as many times as it shows in both arrays. -- The result can be in any order. - - -**Follow up**: - -- What if the given array is already sorted? How would you optimize your algorithm? -- What if nums1's size is small compared to nums2's size? Which algorithm is better? -- What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once? - -## 题目大意 - -这题是第 349 题的加强版。要求输出 2 个数组的交集元素,如果元素出现多次,要输出多次。 - -## 解题思路 - -这一题还是延续第 349 题的思路。把数组一中的数字都放进字典中,另外字典的 key 是数组中的数字,value 是这个数字出现的次数。在扫描数组二的时候,每取出一个存在的数组,把字典中的 value 减一。如果 value 是 0 代表不存在这个数字。 - - - - - -## 代码 - -```go - -package leetcode - -func intersect(nums1 []int, nums2 []int) []int { - m := map[int]int{} - var res []int - for _, n := range nums1 { - m[n]++ - } - for _, n := range nums2 { - if m[n] > 0 { - res = append(res, n) - m[n]-- - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0354.Russian-Doll-Envelopes.md b/website/content/ChapterFour/0354.Russian-Doll-Envelopes.md deleted file mode 100755 index 810345d39..000000000 --- a/website/content/ChapterFour/0354.Russian-Doll-Envelopes.md +++ /dev/null @@ -1,81 +0,0 @@ -# [354. Russian Doll Envelopes](https://leetcode.com/problems/russian-doll-envelopes/) - - -## 题目 - -You have a number of envelopes with widths and heights given as a pair of integers `(w, h)`. One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope. - -What is the maximum number of envelopes can you Russian doll? (put one inside other) - -**Note**: Rotation is not allowed. - -**Example**: - - Input: [[5,4],[6,4],[6,7],[2,3]] - Output: 3 - Explanation: The maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]). - - -## 题目大意 - -给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。 - -请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。 - -说明: -- 不允许旋转信封。 - -## 解题思路 - -- 给出一组信封的宽度和高度,如果组成俄罗斯套娃,问最多能套几层。只有当一个信封的宽度和高度都比另外一个信封大的时候,才能套在小信封上面。 -- 这一题的实质是第 300 题 Longest Increasing Subsequence 的加强版。能组成俄罗斯套娃的条件就是能找到一个最长上升子序列。但是这题的条件是二维的,要求能找到在二维上都能满足条件的最长上升子序列。先降维,把宽度排序。然后在高度上寻找最长上升子序列。这里用到的方法和第 300 题的方法一致。解题思路详解见第 300 题。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -type sortEnvelopes [][]int - -func (s sortEnvelopes) Len() int { - return len(s) -} -func (s sortEnvelopes) Less(i, j int) bool { - if s[i][0] == s[j][0] { - return s[i][1] > s[j][1] - } - return s[i][0] < s[j][0] -} -func (s sortEnvelopes) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -func maxEnvelopes(envelopes [][]int) int { - sort.Sort(sortEnvelopes(envelopes)) - dp := []int{} - for _, e := range envelopes { - low, high := 0, len(dp) - for low < high { - mid := low + (high-low)>>1 - if dp[mid] >= e[1] { - high = mid - } else { - low = mid + 1 - } - } - if low == len(dp) { - dp = append(dp, e[1]) - } else { - dp[low] = e[1] - } - } - return len(dp) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md b/website/content/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md deleted file mode 100755 index 021b41873..000000000 --- a/website/content/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md +++ /dev/null @@ -1,61 +0,0 @@ -# [357. Count Numbers with Unique Digits](https://leetcode.com/problems/count-numbers-with-unique-digits/) - - -## 题目 - -Given a **non-negative** integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. - -**Example**: - - Input: 2 - Output: 91 - Explanation: The answer should be the total numbers in the range of 0 ≤ x < 100, - excluding 11,22,33,44,55,66,77,88,99 - - -## 题目大意 - -给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10^n 。 - - - - -## 解题思路 - -- 输出 n 位数中不出现重复数字的数字的个数 -- 这道题摸清楚规律以后,可以直接写出最终所有答案,答案只有 11 个。 -- 考虑不重复数字是如生成的。如果只是一位数,不存在重复的数字,结果是 10 。如果是二位数,第一位一定不能取 0,那么第一位有 1-9,9种取法,第二位为了和第一位不重复,只能有 0-9,10种取法中减去第一位取的数字,那么也是 9 种取法。以此类推,如果是三位数,第三位是 8 种取法;四位数,第四位是 7 种取法;五位数,第五位是 6 种取法;六位数,第六位是 5 种取法;七位数,第七位是 4 种取法;八位数,第八位是 3 种取法;九位数,第九位是 2 种取法;十位数,第十位是 1 种取法;十一位数,第十一位是 0 种取法;十二位数,第十二位是 0 种取法;那么第 11 位数以后,每个数都是重复数字的数字。知道这个规律以后,可以累积上面的结果,把结果直接存在数组里面,暴力打表即可。O(1) 的时间复杂度。 - - - -## 代码 - -```go - -package leetcode - -// 暴力打表法 -func countNumbersWithUniqueDigits1(n int) int { - res := []int{1, 10, 91, 739, 5275, 32491, 168571, 712891, 2345851, 5611771, 8877691} - if n >= 10 { - return res[10] - } - return res[n] -} - -// 打表方法 -func countNumbersWithUniqueDigits(n int) int { - if n == 0 { - return 1 - } - res, uniqueDigits, availableNumber := 10, 9, 9 - for n > 1 && availableNumber > 0 { - uniqueDigits = uniqueDigits * availableNumber - res += uniqueDigits - availableNumber-- - n-- - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0367.Valid-Perfect-Square.md b/website/content/ChapterFour/0367.Valid-Perfect-Square.md deleted file mode 100755 index 50584b0dc..000000000 --- a/website/content/ChapterFour/0367.Valid-Perfect-Square.md +++ /dev/null @@ -1,57 +0,0 @@ -# [367. Valid Perfect Square](https://leetcode.com/problems/valid-perfect-square/) - -## 题目 - -Given a positive integer num, write a function which returns True if num is a perfect square else False. - -**Note**: **Do not** use any built-in library function such as `sqrt`. - -**Example 1**: - - Input: 16 - Output: true - -**Example 2**: - - Input: 14 - Output: false - - -## 题目大意 - -给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。 - -说明:不要使用任何内置的库函数,如 sqrt。 - - - - -## 解题思路 - - -- 给出一个数,要求判断这个数是不是完全平方数。 -- 可以用二分搜索来解答这道题。判断完全平方数,根据它的定义来,是否能被开根号,即找到一个数的平方是否可以等于待判断的数字。从 [1, n] 区间内进行二分,若能找到则返回 true,找不到就返回 false 。 - - -## 代码 - -```go - -package leetcode - -func isPerfectSquare(num int) bool { - low, high := 1, num - for low <= high { - mid := low + (high-low)>>1 - if mid*mid == num { - return true - } else if mid*mid < num { - low = mid + 1 - } else { - high = mid - 1 - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0371.Sum-of-Two-Integers.md b/website/content/ChapterFour/0371.Sum-of-Two-Integers.md deleted file mode 100755 index 31318dd7f..000000000 --- a/website/content/ChapterFour/0371.Sum-of-Two-Integers.md +++ /dev/null @@ -1,47 +0,0 @@ -# [371. Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/) - - -## 题目 - -Calculate the sum of two integers a and b, but you are **not allowed** to use the operator `+` and `-`. - -**Example 1**: - - Input: a = 1, b = 2 - Output: 3 - -**Example 2**: - - Input: a = -2, b = 3 - Output: 1 - - -## 题目大意 - -不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。 - -## 解题思路 - -- 要求不用加法和减法运算符计算 `a+b`。这一题需要用到 `^` 和 `&` 运算符的性质,两个数 ^ 可以实现两个数不带进位的二进制加法。这里需要实现加法,肯定需要进位。所以如何找到进位是本题的关键。 -- 在二进制中,只有 1 和 1 加在一起才会进位,0 和 0,0 和 1,1 和 0,这三种情况都不会进位,规律就是 `a & b` 为 0 的时候就不用进位,为 1 的时候代表需要进位。进位是往前进一位,所以还需要左移操作,所以加上的进位为 `(a&b)<<1`。 - - -## 代码 - -```go - -package leetcode - -func getSum(a int, b int) int { - if a == 0 { - return b - } - if b == 0 { - return a - } - // (a & b)<<1 计算的是进位 - // a ^ b 计算的是不带进位的加法 - return getSum((a&b)<<1, a^b) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0372.Super-Pow.md b/website/content/ChapterFour/0372.Super-Pow.md deleted file mode 100755 index 79b2830c2..000000000 --- a/website/content/ChapterFour/0372.Super-Pow.md +++ /dev/null @@ -1,108 +0,0 @@ -# [372. Super Pow](https://leetcode.com/problems/super-pow/) - - -## 题目 - -Your task is to calculate ab mod 1337 where a is a positive integer and b is an extremely large positive integer given in the form of an array. - -**Example 1**: - - Input: a = 2, b = [3] - Output: 8 - -**Example 2**: - - Input: a = 2, b = [1,0] - Output: 1024 - - -## 题目大意 - - -你的任务是计算 a^b 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出。 - -## 解题思路 - -- 求 a^b mod p 的结果,b 是大数。 -- 这一题可以用暴力解法尝试。需要用到 mod 计算的几个运算性质: - - 模运算性质一:(a + b) % p = (a % p + b % p) % p - 模运算性质二:(a - b) % p = (a % p - b % p + p) % p - 模运算性质三:(a * b) % p = (a % p * b % p) % p - 模运算性质四:a ^ b % p = ((a % p)^b) % p - 模运算性质五:ab % p = ((a % p) * ( b % p)) % p, 其中 ab 是一个数字,如:2874,98374 等等 - - 这一题需要用到性质三、四、五。举个例子: - - 12345^678 % 1337 = (12345^670 * 12345^8) % 1337 - = ((12345^670 % 1337) * (12345^8 % 1337)) % 1337 ---> 利用性质 三 - = (((12345^67)^10 % 1337) * (12345^8 % 1337)) % 1337 ---> 乘方性质 - = ((12345^67 % 1337)^10) % 1337 * (12345^8 % 1337)) % 1337 ---> 利用性质 四 - = (((12345^67 % 1337)^10) * (12345^8 % 1337)) % 1337 ---> 反向利用性质 三 - - 经过上面这样的变换,把指数 678 的个位分离出来了,可以单独求解。继续经过上面的变换,可以把指数的 6 和 7 也分离出来。最终可以把大数 b 一位一位的分离出来。至于计算 a^b 就结果快速幂求解。 - - -## 代码 - -```go - -package leetcode - -// 解法一 快速幂 res = res^10 * qpow(a, b[i]) -// 模运算性质一:(a + b) % p = (a % p + b % p) % p -// 模运算性质二:(a - b) % p = (a % p - b % p + p) % p -// 模运算性质三:(a * b) % p = (a % p * b % p) % p -// 模运算性质四:a ^ b % p = ((a % p)^b) % p -// 模运算性质五:ab % p = ((a % p) * ( b % p)) % p, 其中 ab 是一个数字,如:2874,98374 等等 -// 举个例子 -// 12345^678 % 1337 = (12345^670 * 12345^8) % 1337 -// = ((12345^670 % 1337) * (12345^8 % 1337)) % 1337 ---> 利用性质 三 -// = (((12345^67)^10 % 1337) * (12345^8 % 1337)) % 1337 ---> 乘方性质 -// = ((12345^67 % 1337)^10) % 1337 * (12345^8 % 1337)) % 1337 ---> 利用性质 四 -// = (((12345^67 % 1337)^10) * (12345^8 % 1337)) % 1337 ---> 反向利用性质 三 -func superPow(a int, b []int) int { - res := 1 - for i := 0; i < len(b); i++ { - res = (qpow(res, 10) * qpow(a, b[i])) % 1337 - } - return res -} - -// 快速幂计算 x^n -func qpow(x, n int) int { - res := 1 - x %= 1337 - for n > 0 { - if (n & 1) == 1 { - res = (res * x) % 1337 - } - x = (x * x) % 1337 - n >>= 1 - } - return res -} - -// 解法二 暴力解法 -// 利用上面的性质,可以得到:a^1234567 % 1337 = (a^1234560 % 1337) * (a^7 % 1337) % k = ((((a^123456) % 1337)^10)% 1337 * (a^7 % 1337))% 1337; -func superPow1(a int, b []int) int { - if len(b) == 0 { - return 1 - } - last := b[len(b)-1] - l := 1 - // 先计算个位的 a^x 结果,对应上面例子中的 (a^7 % 1337)% 1337 - for i := 1; i <= last; i++ { - l = l * a % 1337 - } - // 再计算除去个位以外的 a^y 的结果,对应上面例子中的 (a^123456) % 1337) - temp := superPow1(a, b[:len(b)-1]) - f := 1 - // 对应上面例子中的 (((a^123456) % 1337)^10)% 1337 - for i := 1; i <= 10; i++ { - f = f * temp % 1337 - } - return f * l % 1337 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0373.Find-K-Pairs-with-Smallest-Sums.md b/website/content/ChapterFour/0373.Find-K-Pairs-with-Smallest-Sums.md deleted file mode 100755 index 237c063d3..000000000 --- a/website/content/ChapterFour/0373.Find-K-Pairs-with-Smallest-Sums.md +++ /dev/null @@ -1,126 +0,0 @@ -# [373. Find K Pairs with Smallest Sums](https://leetcode.com/problems/find-k-pairs-with-smallest-sums/) - - -## 题目 - -You are given two integer arrays **nums1** and **nums2** sorted in ascending order and an integer **k**. - -Define a pair **(u,v)** which consists of one element from the first array and one element from the second array. - -Find the k pairs **(u1,v1),(u2,v2) ...(uk,vk)** with the smallest sums. - -**Example 1**: - - Input: nums1 = [1,7,11], nums2 = [2,4,6], k = 3 - Output: [[1,2],[1,4],[1,6]] - Explanation: The first 3 pairs are returned from the sequence: - [1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6] - -**Example 2**: - - Input: nums1 = [1,1,2], nums2 = [1,2,3], k = 2 - Output: [1,1],[1,1] - Explanation: The first 2 pairs are returned from the sequence: - [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3] - -**Example 3**: - - Input: nums1 = [1,2], nums2 = [3], k = 3 - Output: [1,3],[2,3] - Explanation: All possible pairs are returned from the sequence: [1,3],[2,3] - - -## 题目大意 - - -给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。 - -定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。 - -找到和最小的 k 对数字 (u1,v1), (u2,v2) ... (uk,vk)。 - - - -## 解题思路 - - -- 给出 2 个数组,和数字 k,要求找到 k 个数值对,数值对两个数的和最小。 -- 这一题咋一看可以用二分搜索,两个数组两个组合有 `m * n` 个数值对。然后找到最小的和,最大的和,在这个范围内进行二分搜索,每分出一个 `mid`,再去找比 `mid` 小的数值对有多少个,如果个数小于 `k` 个,那么在右区间上继续二分,如果个数大于 `k` 个,那么在左区间上继续二分。到目前为止,这个思路看似可行。但是每次搜索的数值对是无序的。这会导致最终出现错误的结果。例如 `mid = 10` 的时候,小于 10 的和有 22 个,而 `k = 25` 。这说明 `mid` 偏小,`mid` 增大,`mid = 11` 的时候,小于 11 的和有 30 个,而 `k = 25` 。这时候应该从这 30 个和中取前 25 个。但是我们遍历数值对的时候,和并不是从小到大排序的。这时候还需要额外对这 30 个候选值进行排序。这样时间复杂度又增大了。 -- 可以先用暴力解法解答。将所有的和都遍历出来,排序以后,取前 k 个。这个暴力方法可以 AC。 -- 本题最优解应该是优先队列。维护一个最小堆。把数值对的和放在这个最小堆中,不断的 pop 出 k 个最小值到数组中,即为答案。 -- 在已排序的矩阵中寻找最 K 小的元素这一系列的题目有:第 373 题,第 378 题,第 668 题,第 719 题,第 786 题。 - - -## 代码 - -```go - -package leetcode - -import ( - "container/heap" - "sort" -) - -// 解法一 优先队列 -func kSmallestPairs(nums1 []int, nums2 []int, k int) [][]int { - result, h := [][]int{}, &minHeap{} - if len(nums1) == 0 || len(nums2) == 0 || k == 0 { - return result - } - if len(nums1)*len(nums2) < k { - k = len(nums1) * len(nums2) - } - heap.Init(h) - for _, num := range nums1 { - heap.Push(h, []int{num, nums2[0], 0}) - } - for len(result) < k { - min := heap.Pop(h).([]int) - result = append(result, min[:2]) - if min[2] < len(nums2)-1 { - heap.Push(h, []int{min[0], nums2[min[2]+1], min[2] + 1}) - } - } - return result -} - -type minHeap [][]int - -func (h minHeap) Len() int { return len(h) } -func (h minHeap) Less(i, j int) bool { return h[i][0]+h[i][1] < h[j][0]+h[j][1] } -func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } - -func (h *minHeap) Push(x interface{}) { - *h = append(*h, x.([]int)) -} - -func (h *minHeap) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - *h = old[0 : n-1] - return x -} - -// 解法二 暴力解法 -func kSmallestPairs1(nums1 []int, nums2 []int, k int) [][]int { - size1, size2, res := len(nums1), len(nums2), [][]int{} - if size1 == 0 || size2 == 0 || k < 0 { - return nil - } - for i := 0; i < size1; i++ { - for j := 0; j < size2; j++ { - res = append(res, []int{nums1[i], nums2[j]}) - } - } - sort.Slice(res, func(i, j int) bool { - return res[i][0]+res[i][1] < res[j][0]+res[j][1] - }) - if len(res) >= k { - return res[:k] - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0378.Kth-Smallest-Element-in-a-Sorted-Matrix.md b/website/content/ChapterFour/0378.Kth-Smallest-Element-in-a-Sorted-Matrix.md deleted file mode 100755 index 922adeebb..000000000 --- a/website/content/ChapterFour/0378.Kth-Smallest-Element-in-a-Sorted-Matrix.md +++ /dev/null @@ -1,135 +0,0 @@ -# [378. Kth Smallest Element in a Sorted Matrix](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/) - - -## 题目 - -Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix. - -Note that it is the kth smallest element in the sorted order, not the kth distinct element. - -**Example**: - - matrix = [ - [ 1, 5, 9], - [10, 11, 13], - [12, 13, 15] - ], - k = 8, - - return 13. - -**Note**: You may assume k is always valid, 1 ≤ k ≤ n2. - - -## 题目大意 - -给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是排序后的第 k 小元素,而不是第 k 个元素。 - - -说明: -你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。 - - -## 解题思路 - - -- 给出一个行有序,列有序的矩阵(并非是按照下标有序的),要求找出这个矩阵中第 K 小的元素。注意找的第 K 小元素指的不是 k 个不同的元素,可能存在相同的元素。 -- 最容易想到的就解法是优先队列。依次把矩阵中的元素推入到优先队列中。维护一个最小堆,一旦优先队列里面的元素有 k 个了,就算找到结果了。 -- 这一题最优解法是二分搜索。那搜索的空间是什么呢?根据题意,可以知道,矩阵左上角的那个元素是最小的,右下角的元素是最大的。即矩阵第一个元素确定了下界,矩阵的最后一个元素确定了上界。在这个解空间里面二分搜索所有值,找到第 K 小的元素。判断是否找到的条件是,在矩阵中比 mid 小的元素个数等于 K。不断的逼近 low,使得 low == high 的时候,就是找到了第 K 小的元素了。(因为题目中说了,一定会存在第 K 小元素,所以二分搜索到一个元素的时候,一定会得出结果)。 - -![](https://img.halfrost.com/Leetcode/leetcode_378.png) - - -## 代码 - -```go - -package leetcode - -import ( - "container/heap" -) - -// 解法一 二分搜索 -func kthSmallest378(matrix [][]int, k int) int { - m, n, low := len(matrix), len(matrix[0]), matrix[0][0] - high := matrix[m-1][n-1] + 1 - for low < high { - mid := low + (high-low)>>1 - // 如果 count 比 k 小,在大值的那一半继续二分搜索 - if counterKthSmall(m, n, mid, matrix) >= k { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -func counterKthSmall(m, n, mid int, matrix [][]int) int { - count, j := 0, n-1 - // 每次循环统计比 mid 值小的元素个数 - for i := 0; i < m; i++ { - // 遍历每行中比 mid 小的元素的个数 - for j >= 0 && mid < matrix[i][j] { - j-- - } - count += j + 1 - } - return count -} - -// 解法二 优先队列 -func kthSmallest3781(matrix [][]int, k int) int { - if len(matrix) == 0 || len(matrix[0]) == 0 { - return 0 - } - pq := &pq{data: make([]interface{}, k)} - heap.Init(pq) - for i := 0; i < len(matrix); i++ { - for j := 0; j < len(matrix[0]); j++ { - if pq.Len() < k { - heap.Push(pq, matrix[i][j]) - } else if matrix[i][j] < pq.Head().(int) { - heap.Pop(pq) - heap.Push(pq, matrix[i][j]) - } else { - break - } - } - } - return heap.Pop(pq).(int) -} - -type pq struct { - data []interface{} - len int -} - -func (p *pq) Len() int { - return p.len -} - -func (p *pq) Less(a, b int) bool { - return p.data[a].(int) > p.data[b].(int) -} - -func (p *pq) Swap(a, b int) { - p.data[a], p.data[b] = p.data[b], p.data[a] -} - -func (p *pq) Push(o interface{}) { - p.data[p.len] = o - p.len++ -} - -func (p *pq) Head() interface{} { - return p.data[0] -} - -func (p *pq) Pop() interface{} { - p.len-- - return p.data[p.len] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0385.Mini-Parser.md b/website/content/ChapterFour/0385.Mini-Parser.md deleted file mode 100755 index 57a00d321..000000000 --- a/website/content/ChapterFour/0385.Mini-Parser.md +++ /dev/null @@ -1,175 +0,0 @@ -# [385. Mini Parser](https://leetcode.com/problems/mini-parser/) - - -## 题目 - -Given a nested list of integers represented as a string, implement a parser to deserialize it. - -Each element is either an integer, or a list -- whose elements may also be integers or other lists. - -**Note**: You may assume that the string is well-formed: - -- String is non-empty. -- String does not contain white spaces. -- String contains only digits `0-9`, `[`, `-` `,`, `]`. - -**Example 1**: - - Given s = "324", - - You should return a NestedInteger object which contains a single integer 324. - -**Example 2**: - - Given s = "[123,[456,[789]]]", - - Return a NestedInteger object containing a nested list with 2 elements: - - 1. An integer containing value 123. - 2. A nested list containing two elements: - i. An integer containing value 456. - ii. A nested list with one element: - a. An integer containing value 789. - - -## 题目大意 - -给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。列表中的每个元素只可能是整数或整数嵌套列表 - -提示:你可以假定这些字符串都是格式良好的: - -- 字符串非空 -- 字符串不包含空格 -- 字符串只包含数字0-9, [, - ,, ] - - - -## 解题思路 - -- 将一个嵌套的数据结构中的数字转换成 NestedInteger 数据结构。 -- 这一题用栈一层一层的处理就行。有一些比较坑的特殊的边界数据见测试文件。这一题正确率比很多 Hard 题还要低的原因应该是没有理解好题目和边界测试数据没有考虑到。NestedInteger 这个数据结构笔者实现了一遍,见代码。 - - -## 代码 - -```go - -package leetcode - -import ( - "fmt" - "strconv" -) - -/** - * // This is the interface that allows for creating nested lists. - * // You should not implement it, or speculate about its implementation - * type NestedInteger struct { - * } - * - * // Return true if this NestedInteger holds a single integer, rather than a nested list. - * func (n NestedInteger) IsInteger() bool {} - * - * // Return the single integer that this NestedInteger holds, if it holds a single integer - * // The result is undefined if this NestedInteger holds a nested list - * // So before calling this method, you should have a check - * func (n NestedInteger) GetInteger() int {} - * - * // Set this NestedInteger to hold a single integer. - * func (n *NestedInteger) SetInteger(value int) {} - * - * // Set this NestedInteger to hold a nested list and adds a nested integer to it. - * func (n *NestedInteger) Add(elem NestedInteger) {} - * - * // Return the nested list that this NestedInteger holds, if it holds a nested list - * // The list length is zero if this NestedInteger holds a single integer - * // You can access NestedInteger's List element directly if you want to modify it - * func (n NestedInteger) GetList() []*NestedInteger {} - */ - -// NestedInteger define -type NestedInteger struct { - Num int - List []*NestedInteger -} - -// IsInteger define -func (n NestedInteger) IsInteger() bool { - if n.List == nil { - return true - } - return false -} - -// GetInteger define -func (n NestedInteger) GetInteger() int { - return n.Num -} - -// SetInteger define -func (n *NestedInteger) SetInteger(value int) { - n.Num = value -} - -// Add define -func (n *NestedInteger) Add(elem NestedInteger) { - n.List = append(n.List, &elem) -} - -// GetList define -func (n NestedInteger) GetList() []*NestedInteger { - return n.List -} - -// Print define -func (n NestedInteger) Print() { - if len(n.List) != 0 { - for _, v := range n.List { - if len(v.List) != 0 { - v.Print() - return - } - fmt.Printf("%v ", v.Num) - } - } else { - fmt.Printf("%v ", n.Num) - } - fmt.Printf("\n") -} - -func deserialize(s string) *NestedInteger { - stack, cur := []*NestedInteger{}, &NestedInteger{} - for i := 0; i < len(s); { - switch { - case isDigital(s[i]) || s[i] == '-': - j := 0 - for j = i + 1; j < len(s) && isDigital(s[j]); j++ { - } - num, _ := strconv.Atoi(s[i:j]) - next := &NestedInteger{} - next.SetInteger(num) - if len(stack) > 0 { - stack[len(stack)-1].List = append(stack[len(stack)-1].GetList(), next) - } else { - cur = next - } - i = j - case s[i] == '[': - next := &NestedInteger{} - if len(stack) > 0 { - stack[len(stack)-1].List = append(stack[len(stack)-1].GetList(), next) - } - stack = append(stack, next) - i++ - case s[i] == ']': - cur = stack[len(stack)-1] - stack = stack[:len(stack)-1] - i++ - case s[i] == ',': - i++ - } - } - return cur -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0386.Lexicographical-Numbers.md b/website/content/ChapterFour/0386.Lexicographical-Numbers.md deleted file mode 100755 index 7bb82d4b3..000000000 --- a/website/content/ChapterFour/0386.Lexicographical-Numbers.md +++ /dev/null @@ -1,51 +0,0 @@ -# [386. Lexicographical Numbers](https://leetcode.com/problems/lexicographical-numbers/) - - -## 题目 - -Given an integer n, return 1 - n in lexicographical order. - -For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9]. - -Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000. - - -## 题目大意 - -给定一个整数 n, 返回从 1 到 n 的字典顺序。例如,给定 n =13,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。 - -请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 n 小于等于 5,000,000。 - - - -## 解题思路 - - -- 给出一个数字 n ,要求按照字典序对 1-n 这 n 个数排序。 -- DFS 暴力求解即可。 - - -## 代码 - -```go - -package leetcode - -func lexicalOrder(n int) []int { - res := make([]int, 0, n) - dfs386(1, n, &res) - return res -} - -func dfs386(x, n int, res *[]int) { - limit := (x + 10) / 10 * 10 - for x <= n && x < limit { - *res = append(*res, x) - if x*10 <= n { - dfs386(x*10, n, res) - } - x++ - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md b/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md deleted file mode 100755 index b3ccff4ce..000000000 --- a/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md +++ /dev/null @@ -1,48 +0,0 @@ -# [387. First Unique Character in a String](https://leetcode.com/problems/first-unique-character-in-a-string/) - -## 题目 - -Given a string, find the first non-repeating character in it and return it's index. If it doesn't exist, return -1. - -**Examples**: - - s = "leetcode" - return 0. - - s = "loveleetcode", - return 2. - -**Note**: You may assume the string contain only lowercase letters. - - - -## 题目大意 - -给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。 - - -## 解题思路 - -- 简单题,要求输出第一个没有重复的字符。 - - -## 代码 - -```go - -package leetcode - -func firstUniqChar(s string) int { - result := make([]int, 26) - for i := 0; i < len(s); i++ { - result[s[i]-'a']++ - } - for i := 0; i < len(s); i++ { - if result[s[i]-'a'] == 1 { - return i - } - } - return -1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0389.Find-the-Difference.md b/website/content/ChapterFour/0389.Find-the-Difference.md deleted file mode 100755 index 57b53354f..000000000 --- a/website/content/ChapterFour/0389.Find-the-Difference.md +++ /dev/null @@ -1,48 +0,0 @@ -# [389. Find the Difference](https://leetcode.com/problems/find-the-difference/) - -## 题目 - -Given two strings **s** and **t** which consist of only lowercase letters. - -String **t** is generated by random shuffling string **s** and then add one more letter at a random position. - -Find the letter that was added in **t**. - -**Example**: - - Input: - s = "abcd" - t = "abcde" - - Output: - e - - Explanation: - 'e' is the letter that was added. - -## 题目大意 - -给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。 - - -## 解题思路 - -- 题目要求找出 t 字符串中比 s 字符串多出的一个字符。思路还是利用异或的性质,`X^X = 0`,将 s 和 t 依次异或,最终多出来的字符就是最后异或的结果。 - - -## 代码 - -```go - -package leetcode - -func findTheDifference(s string, t string) byte { - n, ch := len(t), t[len(t)-1] - for i := 0; i < n-1; i++ { - ch ^= s[i] - ch ^= t[i] - } - return ch -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0393.UTF-8-Validation.md b/website/content/ChapterFour/0393.UTF-8-Validation.md deleted file mode 100755 index 1d8b50fb4..000000000 --- a/website/content/ChapterFour/0393.UTF-8-Validation.md +++ /dev/null @@ -1,105 +0,0 @@ -# [393. UTF-8 Validation](https://leetcode.com/problems/utf-8-validation/) - - - -## 题目 - -A character in UTF8 can be from **1 to 4 bytes** long, subjected to the following rules: - -1. For 1-byte character, the first bit is a 0, followed by its unicode code. -2. For n-bytes character, the first n-bits are all one's, the n+1 bit is 0, followed by n-1 bytes with most significant 2 bits being 10. - -This is how the UTF-8 encoding would work: - - Char. number range | UTF-8 octet sequence - (hexadecimal) | (binary) - --------------------+--------------------------------------------- - 0000 0000-0000 007F | 0xxxxxxx - 0000 0080-0000 07FF | 110xxxxx 10xxxxxx - 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx - 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - -Given an array of integers representing the data, return whether it is a valid utf-8 encoding. - -**Note**: The input is an array of integers. Only the **least significant 8 bits** of each integer is used to store the data. This means each integer represents only 1 byte of data. - -**Example 1**: - - data = [197, 130, 1], which represents the octet sequence: 11000101 10000010 00000001. - - Return true. - It is a valid utf-8 encoding for a 2-bytes character followed by a 1-byte character. - -**Example 2**: - - data = [235, 140, 4], which represented the octet sequence: 11101011 10001100 00000100. - - Return false. - The first 3 bits are all one's and the 4th bit is 0 means it is a 3-bytes character. - The next byte is a continuation byte which starts with 10 and that's correct. - But the second continuation byte does not start with 10, so it is invalid. - -## 题目大意 - -UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则: - -对于 1 字节的字符,字节的第一位设为 0,后面 7 位为这个符号的 unicode 码。 -对于 n 字节的字符 (n > 1),第一个字节的前 n 位都设为 1,第 n+1 位设为 0,后面字节的前两位一律设为 10。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。 -这是 UTF-8 编码的工作方式: - -```c - Char. number range | UTF-8 octet sequence - (hexadecimal) | (binary) - --------------------+--------------------------------------------- - 0000 0000-0000 007F | 0xxxxxxx - 0000 0080-0000 07FF | 110xxxxx 10xxxxxx - 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx - 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - -``` - -给定一个表示数据的整数数组,返回它是否为有效的 utf-8 编码。 - -注意: - -输入是整数数组。只有每个整数的最低 8 个有效位用来存储数据。这意味着每个整数只表示 1 字节的数据。 - - -## 解题思路 - -- 这一题看似很复杂,其实严格按照 UTF8 定义来模拟就可以了。 - - - -## 代码 - -```go - -package leetcode - -func validUtf8(data []int) bool { - count := 0 - for _, d := range data { - if count == 0 { - if d >= 248 { // 11111000 = 248 - return false - } else if d >= 240 { // 11110000 = 240 - count = 3 - } else if d >= 224 { // 11100000 = 224 - count = 2 - } else if d >= 192 { // 11000000 = 192 - count = 1 - } else if d > 127 { // 01111111 = 127 - return false - } - } else { - if d <= 127 || d >= 192 { - return false - } - count-- - } - } - return count == 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0394.Decode-String.md b/website/content/ChapterFour/0394.Decode-String.md deleted file mode 100644 index 93a71bce3..000000000 --- a/website/content/ChapterFour/0394.Decode-String.md +++ /dev/null @@ -1,81 +0,0 @@ -# [394. Decode String](https://leetcode.com/problems/decode-string/) - -## 题目 - -Given an encoded string, return its decoded string. - -The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer. - -You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc. - -Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a or 2[4]. - -**Examples**: - -``` - -s = "3[a]2[bc]", return "aaabcbc". -s = "3[a2[c]]", return "accaccacc". -s = "2[abc]3[cd]ef", return "abcabccdcdcdef". - -``` - -## 题目大意 - -给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded\_string],表示其中方括号内部的 encoded\_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。 - -## 解题思路 - -这一题和第 880 题大体类似。用栈处理,遇到 "[",就要开始重复字符串了,另外重复的数字是可能存在多位的,所以需要往前找到不为数字的那一位,把数字转换出来。最后用把 stack 里面的字符串都串联起来即可。 - - - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -func decodeString(s string) string { - stack, res := []string{}, "" - for _, str := range s { - if len(stack) == 0 || (len(stack) > 0 && str != ']') { - stack = append(stack, string(str)) - } else { - tmp := "" - for stack[len(stack)-1] != "[" { - tmp = stack[len(stack)-1] + tmp - stack = stack[:len(stack)-1] - } - stack = stack[:len(stack)-1] - index, repeat := 0, "" - for index = len(stack) - 1; index >= 0; index-- { - if stack[index] >= "0" && stack[index] <= "9" { - repeat = stack[index] + repeat - } else { - break - } - } - nums, _ := strconv.Atoi(repeat) - copyTmp := tmp - for i := 0; i < nums-1; i++ { - tmp += copyTmp - } - for i := 0; i < len(repeat)-1; i++ { - stack = stack[:len(stack)-1] - } - stack[index+1] = tmp - } - } - for _, s := range stack { - res += s - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0397.Integer-Replacement.md b/website/content/ChapterFour/0397.Integer-Replacement.md deleted file mode 100755 index 1dea6f592..000000000 --- a/website/content/ChapterFour/0397.Integer-Replacement.md +++ /dev/null @@ -1,86 +0,0 @@ -# [397. Integer Replacement](https://leetcode.com/problems/integer-replacement/) - - -## 题目 - -Given a positive integer n and you can do operations as follow: - -1. If  n is even, replace  n with `n/2`. -2. If  n is odd, you can replace n with either `n + 1` or `n - 1`. - -What is the minimum number of replacements needed for n to become 1? - -**Example 1**: - - Input: - 8 - - Output: - 3 - - Explanation: - 8 -> 4 -> 2 -> 1 - -**Example 2**: - - Input: - 7 - - Output: - 4 - - Explanation: - 7 -> 8 -> 4 -> 2 -> 1 - or - 7 -> 6 -> 3 -> 2 -> 1 - - -## 题目大意 - -给定一个正整数 n,你可以做如下操作: - -1. 如果 n 是偶数,则用 n / 2 替换 n。 -2. 如果 n 是奇数,则可以用 n + 1 或 n - 1 替换 n。 - -问 n 变为 1 所需的最小替换次数是多少? - - -## 解题思路 - - -- 题目给出一个整数 `n`,然后让我们通过变换将它为 1,如果 `n` 是偶数,可以直接变为 `n/2`,如果是奇数,可以先 `n+1` 或 `n-1`,问最终变为 1 的最少步骤。 -- 当 n 为奇数的时候,什么时候需要加 1 ,什么时候需要减 1 ,通过观察规律可以发现,除了 3 和 7 以外,所有加 1 就变成 4 的倍数的奇数,都适合先加 1 运算,比如 15: - - 15 -> 16 -> 8 -> 4 -> 2 -> 1 - 15 -> 14 -> 7 -> 6 -> 3 -> 2 -> 1 - - 111011 -> 111010 -> 11101 -> 11100 -> 1110 -> 111 -> 1000 -> 100 -> 10 -> 1 - 111011 -> 111100 -> 11110 -> 1111 -> 10000 -> 1000 -> 100 -> 10 -> 1 - -- 对于 7 来说,加 1 和减 1 的结果相同,可以不用管,对于 3 来说,减 1 的步骤更少,所以需要先去掉这种特殊情况。 -- 最后如何判断某个数字加 1 后是 4 的倍数呢?这里有一个小技巧,由于之前判断了其是奇数了,那么最右边一位肯定是 1,如果其右边第二位也是 1 的话,那么进行加 1 运算,进位后右边肯定会出现两个 0,则一定是 4 的倍数。于是就可以判断出来了。剩下的情况就是偶数的情况,如果之前判定是偶数,那么直接除以 2 (右移一位)即可。 - - - -## 代码 - -```go - -package leetcode - -func integerReplacement(n int) int { - res := 0 - for n > 1 { - if (n & 1) == 0 { // 判断是否是偶数 - n >>= 1 - } else if (n+1)%4 == 0 && n != 3 { // 末尾 2 位为 11 - n++ - } else { // 末尾 2 位为 01 - n-- - } - res++ - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0399.Evaluate-Division.md b/website/content/ChapterFour/0399.Evaluate-Division.md deleted file mode 100755 index d4cf45245..000000000 --- a/website/content/ChapterFour/0399.Evaluate-Division.md +++ /dev/null @@ -1,117 +0,0 @@ -# [399. Evaluate Division](https://leetcode.com/problems/evaluate-division/) - - -## 题目 - -Equations are given in the format `A / B = k`, where `A` and `B` are variables represented as strings, and `k` is a real number (floating point number). Given some queries, return the answers. If the answer does not exist, return `-1.0`. - -**Example**: - -Given `a / b = 2.0, b / c = 3.0.`queries are: `a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? .`return `[6.0, 0.5, -1.0, 1.0, -1.0 ].` - -The input is: `vector> equations, vector& values, vector> queries` , where `equations.size() == values.size()`, and the values are positive. This represents the equations. Return `vector`. - -According to the example above: - - equations = [ ["a", "b"], ["b", "c"] ], - values = [2.0, 3.0], - queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]. - -The input is always valid. You may assume that evaluating the queries will result in no division by zero and there is no contradiction. - - -## 题目大意 - -给出方程式 A / B = k, 其中 A 和 B 均为代表字符串的变量, k 是一个浮点型数字。根据已知方程式求解问题,并返回计算结果。如果结果不存在,则返回 -1.0。 - -示例 : -给定 a / b = 2.0, b / c = 3.0 -问题: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?  -返回 [6.0, 0.5, -1.0, 1.0, -1.0 ] - -输入为: vector> equations, vector& values, vector> queries(方程式,方程式结果,问题方程式), 其中 equations.size() == values.size(),即方程式的长度与方程式结果长度相等(程式与结果一一对应),并且结果值均为正数。以上为方程式的描述。 返回vector类型。 - -假设输入总是有效的。你可以假设除法运算中不会出现除数为0的情况,且不存在任何矛盾的结果。 - - -## 解题思路 - - -- 给出一些字母变量的倍数关系,问给出任意两个字母的倍数是多少。 -- 这一题可以用 DFS 或者并查集来解题。先来看看 DFS 的做法。先建图。每个字母或者字母组合可以看做成一个节点,给出的 `equations` 关系可以看成两个节点之间的有向边。每条有向边都有权值。那么问题可以转换成是否存在一条从起点节点到终点节点的路径,如果存在,输出这条路径上所有有向边权值的累乘结果。如果不存在这条路径,就返回 -1 。如果给的起点和终点不在给出的节点集里面,也输出 -1 。 -- 再来看看并查集的做法。先将每两个有倍数关系的节点做并查集 `union()` 操作。例如 A/B = 2,那么把 B 作为 `parent` 节点,`parents[A] = {B,2}`,`parents[B] = {B,1}`,B 指向自己是 1 。还有一个关系是 `B/C=3`,由于 B 已经在并查集中了,所以这个时候需要把这个关系反过来,处理成 `C/B = 1/3` ,即 `parents[C] = {B,1/3}`。这样把所有有关系的字母都 `union()` 起来。如何求任意两个字母的倍数关系呢?例如 `A/C = ?` 在并查集中查找,可以找到 `parents[C] == parents[A] == B`,那么就用 `parents[A]/parents[C] = 2/(1/3) = 6`。为什么可以这样做呢?因为 `A/B = 2`,`C/B = 1/3`,那么 `A/C = (A/B)/(C/B)` 即 `parents[A]/parents[C] = 2/(1/3) = 6`。 - - -## 代码 - -```go - -package leetcode - -type stringUnionFind struct { - parents map[string]string - vals map[string]float64 -} - -func (suf stringUnionFind) add(x string) { - if _, ok := suf.parents[x]; ok { - return - } - suf.parents[x] = x - suf.vals[x] = 1.0 -} - -func (suf stringUnionFind) find(x string) string { - p := "" - if v, ok := suf.parents[x]; ok { - p = v - } else { - p = x - } - if x != p { - pp := suf.find(p) - suf.vals[x] *= suf.vals[p] - suf.parents[x] = pp - } - if v, ok := suf.parents[x]; ok { - return v - } - return x -} - -func (suf stringUnionFind) union(x, y string, v float64) { - suf.add(x) - suf.add(y) - px, py := suf.find(x), suf.find(y) - suf.parents[px] = py - // x / px = vals[x] - // x / y = v - // 由上面 2 个式子就可以得出 px = v * vals[y] / vals[x] - suf.vals[px] = v * suf.vals[y] / suf.vals[x] -} - -func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 { - res, suf := make([]float64, len(queries)), stringUnionFind{parents: map[string]string{}, vals: map[string]float64{}} - for i := 0; i < len(values); i++ { - suf.union(equations[i][0], equations[i][1], values[i]) - } - for i := 0; i < len(queries); i++ { - x, y := queries[i][0], queries[i][1] - if _, ok := suf.parents[x]; ok { - if _, ok := suf.parents[y]; ok { - if suf.find(x) == suf.find(y) { - res[i] = suf.vals[x] / suf.vals[y] - } else { - res[i] = -1 - } - } else { - res[i] = -1 - } - } else { - res[i] = -1 - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0401.Binary-Watch.md b/website/content/ChapterFour/0401.Binary-Watch.md deleted file mode 100755 index 0d40d6f2e..000000000 --- a/website/content/ChapterFour/0401.Binary-Watch.md +++ /dev/null @@ -1,138 +0,0 @@ -# [401. Binary Watch](https://leetcode.com/problems/binary-watch/) - - -## 题目 - -A binary watch has 4 LEDs on the top which represent the **hours** (**0-11**), and the 6 LEDs on the bottom represent the **minutes** (**0-59**). - -Each LED represents a zero or one, with the least significant bit on the right. - -![](https://upload.wikimedia.org/wikipedia/commons/8/8b/Binary_clock_samui_moon.jpg) - -For example, the above binary watch reads "3:25". - -Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent. - -**Example**: - - Input: n = 1 - Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"] - -**Note**: - -- The order of output does not matter. -- The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00". -- The minute must be consist of two digits and may contain a leading zero, for example "10:2" is not valid, it should be "10:02". - - -## 题目大意 - -二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。 - -给定一个非负整数 n 代表当前 LED 亮着的数量,返回二进制表所有可能的时间。 - - -## 解题思路 - - -- 给出数字 n,要求输出二进制表中所有可能的时间 -- 题目中比较坑的是,分钟大于 60 的都不应该打印出来,小时大于 12 的也不应该打印出来,因为是非法的。给出的 num 大于 8 的也是非法值,最终结果应该输出空字符串数组。 -- 这道题的数据量不大,可以直接用打表法,具体打表函数见 `findReadBinaryWatchMinute()` 和 `findReadBinaryWatchHour()` 这两个函数。 - - -## 代码 - -```go - -package leetcode - -import ( - "fmt" - "strconv" -) - -var ( - hour = []string{"1", "2", "4", "8"} - minute = []string{"01", "02", "04", "08", "16", "32"} - hourMap = map[int][]string{ - 0: []string{"0"}, - 1: []string{"1", "2", "4", "8"}, - 2: []string{"3", "5", "9", "6", "10"}, - 3: []string{"7", "11"}, - } - minuteMap = map[int][]string{ - 0: []string{"00"}, - 1: []string{"01", "02", "04", "08", "16", "32"}, - 2: []string{"03", "05", "09", "17", "33", "06", "10", "18", "34", "12", "20", "36", "24", "40", "48"}, - 3: []string{"07", "11", "19", "35", "13", "21", "37", "25", "41", "49", "14", "22", "38", "26", "42", "50", "28", "44", "52", "56"}, - 4: []string{"15", "23", "39", "27", "43", "51", "29", "45", "53", "57", "30", "46", "54", "58"}, - 5: []string{"31", "47", "55", "59"}, - } -) - -func readBinaryWatch(num int) []string { - if num > 8 { - return []string{} - } - res := []string{} - for i := 0; i <= num; i++ { - for j := 0; j < len(hourMap[i]); j++ { - for k := 0; k < len(minuteMap[num-i]); k++ { - res = append(res, hourMap[i][j]+":"+minuteMap[num-i][k]) - } - } - } - return res -} - -/// --------------------------------------- -/// --------------------------------------- -/// --------------------------------------- -/// --------------------------------------- -/// --------------------------------------- -// 以下是打表用到的函数 -// 调用 findReadBinaryWatchMinute(num, 0, c, &res) 打表 -func findReadBinaryWatchMinute(target, index int, c []int, res *[]string) { - if target == 0 { - str, tmp := "", 0 - for i := 0; i < len(c); i++ { - t, _ := strconv.Atoi(minute[c[i]]) - tmp += t - } - if tmp < 10 { - str = "0" + strconv.Itoa(tmp) - } else { - str = strconv.Itoa(tmp) - } - // fmt.Printf("找到解了 c = %v str = %v\n", c, str) - fmt.Printf("\"%v\", ", str) - return - } - for i := index; i < 6; i++ { - c = append(c, i) - findReadBinaryWatchMinute(target-1, i+1, c, res) - c = c[:len(c)-1] - } -} - -// 调用 findReadBinaryWatchHour(num, 0, c, &res) 打表 -func findReadBinaryWatchHour(target, index int, c []int, res *[]string) { - if target == 0 { - str, tmp := "", 0 - for i := 0; i < len(c); i++ { - t, _ := strconv.Atoi(hour[c[i]]) - tmp += t - } - str = strconv.Itoa(tmp) - //fmt.Printf("找到解了 c = %v str = %v\n", c, str) - fmt.Printf("\"%v\", ", str) - return - } - for i := index; i < 4; i++ { - c = append(c, i) - findReadBinaryWatchHour(target-1, i+1, c, res) - c = c[:len(c)-1] - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0402.Remove-K-Digits.md b/website/content/ChapterFour/0402.Remove-K-Digits.md deleted file mode 100644 index 52c3ce27c..000000000 --- a/website/content/ChapterFour/0402.Remove-K-Digits.md +++ /dev/null @@ -1,88 +0,0 @@ -# [402. Remove K Digits](https://leetcode.com/problems/remove-k-digits/) - -## 题目 - -Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible. - -**Note**: - -- The length of num is less than 10002 and will be ≥ k. -- The given num does not contain any leading zero. - - -**Example 1**: - -``` - -Input: num = "1432219", k = 3 -Output: "1219" -Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest. - -``` - -**Example 2**: - -``` - -Input: num = "10200", k = 1 -Output: "200" -Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes. - -``` - -**Example 3**: - -``` - -Input: num = "10", k = 2 -Output: "0" -Explanation: Remove all the digits from the number and it is left with nothing which is 0. - -``` - -## 题目大意 - -给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 - -注意: - -- num 的长度小于 10002 且 ≥ k。 -- num 不会包含任何前导零。 - - -## 解题思路 - -从开头扫 num 每一位,依次入栈,当新来的数字比栈顶元素小,就依次往前移除掉所有比这个新来数字大的数字。注意最后要求剩下的数字最小,如果最后剩下的数字超过了 K 位,取前 K 位必然是最小的(因为如果后 K 位有比前 K 位更小的值的话,会把前面大的数字踢除的) - -注意,虽然 num 不会包含前导 0,但是最终删掉中间的数字以后,比如删掉 0 前面的所有数字以后,前导 0 就会出来,最终输出的时候要去掉前导 0 。 - - -## 代码 - -```go - -package leetcode - -func removeKdigits(num string, k int) string { - if k == len(num) { - return "0" - } - res := []byte{} - for i := 0; i < len(num); i++ { - c := num[i] - for k > 0 && len(res) > 0 && c < res[len(res)-1] { - res = res[:len(res)-1] - k-- - } - res = append(res, c) - } - res = res[:len(res)-k] - - // trim leading zeros - for len(res) > 1 && res[0] == '0' { - res = res[1:] - } - return string(res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0404.Sum-of-Left-Leaves.md b/website/content/ChapterFour/0404.Sum-of-Left-Leaves.md deleted file mode 100755 index c2103dbef..000000000 --- a/website/content/ChapterFour/0404.Sum-of-Left-Leaves.md +++ /dev/null @@ -1,55 +0,0 @@ -# [404. Sum of Left Leaves](https://leetcode.com/problems/sum-of-left-leaves/) - - -## 题目 - -Find the sum of all left leaves in a given binary tree. - -**Example**: - - 3 - / \ - 9 20 - / \ - 15 7 - - There are two left leaves in the binary tree, with values 9 and 15 respectively. Return 24. - - -## 题目大意 - -计算给定二叉树的所有左叶子之和。 - - -## 解题思路 - - -- 这一题是微软的面试题。递归求解即可 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func sumOfLeftLeaves(root *TreeNode) int { - if root == nil { - return 0 - } - if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil { - return root.Left.Val + sumOfLeftLeaves(root.Right) - } - return sumOfLeftLeaves(root.Left) + sumOfLeftLeaves(root.Right) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0405.Convert-a-Number-to-Hexadecimal.md b/website/content/ChapterFour/0405.Convert-a-Number-to-Hexadecimal.md deleted file mode 100755 index c77a02585..000000000 --- a/website/content/ChapterFour/0405.Convert-a-Number-to-Hexadecimal.md +++ /dev/null @@ -1,80 +0,0 @@ -# [405. Convert a Number to Hexadecimal](https://leetcode.com/problems/convert-a-number-to-hexadecimal/) - - -## 题目 - -Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, [two’s complement](https://en.wikipedia.org/wiki/Two%27s_complement) method is used. - -**Note**: - -1. All letters in hexadecimal (`a-f`) must be in lowercase. -2. The hexadecimal string must not contain extra leading `0`s. If the number is zero, it is represented by a single zero character `'0'`; otherwise, the first character in the hexadecimal string will not be the zero character. -3. The given number is guaranteed to fit within the range of a 32-bit signed integer. -4. You **must not use any method provided by the library** which converts/formats the number to hex directly. - -**Example 1**: - - Input: - 26 - - Output: - "1a" - -**Example 2**: - - Input: - -1 - - Output: - "ffffffff" - - -## 题目大意 - -给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用[补码运算](https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613?fr=aladdin)方法。 - -注意: - -1. 十六进制中所有字母(a-f)都必须是小写。 -2. 十六进制字符串中不能包含多余的前导零。如果要转化的数为 0,那么以单个字符 '0' 来表示;对于其他情况,十六进制字符串中的第一个字符将不会是 0 字符。  -3. 给定的数确保在 32 位有符号整数范围内。 -4. 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。 - - - -## 解题思路 - -- 这一题是水题,将十进制数转换成十六进制的数。需要额外注意 0 和负数的情况。 - - - -## 代码 - -```go - -package leetcode - -func toHex(num int) string { - if num == 0 { - return "0" - } - if num < 0 { - num += 1 << 32 - } - mp := map[int]string{ - 0: "0", 1: "1", 2: "2", 3: "3", 4: "4", 5: "5", 6: "6", 7: "7", 8: "8", 9: "9", - 10: "a", 11: "b", 12: "c", 13: "d", 14: "e", 15: "f", - } - var bitArr []string - for num > 0 { - bitArr = append(bitArr, mp[num%16]) - num /= 16 - } - str := "" - for i := len(bitArr) - 1; i >= 0; i-- { - str += bitArr[i] - } - return str -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0409.Longest-Palindrome.md b/website/content/ChapterFour/0409.Longest-Palindrome.md deleted file mode 100755 index a0e18ad19..000000000 --- a/website/content/ChapterFour/0409.Longest-Palindrome.md +++ /dev/null @@ -1,57 +0,0 @@ -# [409. Longest Palindrome](https://leetcode.com/problems/longest-palindrome/) - - -## 题目 - -Given a string which consists of lowercase or uppercase letters, find the length of the longest palindromes that can be built with those letters. - -This is case sensitive, for example `"Aa"` is not considered a palindrome here. - -**Note**:Assume the length of given string will not exceed 1,010. - -**Example**: - - Input: - "abccccdd" - - Output: - 7 - - Explanation: - One longest palindrome that can be built is "dccaccd", whose length is 7. - - -## 题目大意 - -给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。 - - -## 解题思路 - - -- 给出一个字符串,要求用这个字符串里面的字符组成一个回文串,问回文串最长可以组合成多长的? -- 这也是一题水题,先统计每个字符的频次,然后每个字符能取 2 个的取 2 个,不足 2 个的并且当前构造中的回文串是偶数的情况下(即每 2 个都配对了),可以取 1 个。最后组合出来的就是最长回文串。 - - -## 代码 - -```go - -package leetcode - -func longestPalindrome(s string) int { - counter := make(map[rune]int) - for _, r := range s { - counter[r]++ - } - answer := 0 - for _, v := range counter { - answer += v / 2 * 2 - if answer%2 == 0 && v%2 == 1 { - answer++ - } - } - return answer -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0410.Split-Array-Largest-Sum.md b/website/content/ChapterFour/0410.Split-Array-Largest-Sum.md deleted file mode 100755 index f4ce4e9b1..000000000 --- a/website/content/ChapterFour/0410.Split-Array-Largest-Sum.md +++ /dev/null @@ -1,92 +0,0 @@ -# [410. Split Array Largest Sum](https://leetcode.com/problems/split-array-largest-sum/) - - -## 题目 - -Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m subarrays. - -**Note**:If n is the length of array, assume the following constraints are satisfied: - -- 1 ≤ n ≤ 1000 -- 1 ≤ m ≤ min(50, n) - -**Examples**: - - Input: - nums = [7,2,5,10,8] - m = 2 - - Output: - 18 - - Explanation: - There are four ways to split nums into two subarrays. - The best way is to split it into [7,2,5] and [10,8], - where the largest sum among the two subarrays is only 18. - - -## 题目大意 - - -给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。 - -注意: -数组长度 n 满足以下条件: - -- 1 ≤ n ≤ 1000 -- 1 ≤ m ≤ min(50, n) - - - -## 解题思路 - -- 给出一个数组和分割的个数 M。要求把数组分成 M 个子数组,输出子数组和的最大值。 -- 这一题可以用动态规划 DP 解答,也可以用二分搜索来解答。这一题是二分搜索里面的 max-min 最大最小值问题。题目可以转化为在 `M` 次划分中,求一个 `x`,使得 `x` 满足:对任意的`S(i)`,都满足 `S(i) ≤ x`。这个条件保证了 `x` 是所有 `S(i)` 中的最大值。要求的是满足该条件的最小的 `x`。`x` 的搜索范围在 `[max, sum]` 中。逐步二分逼近 low 值,直到找到能满足条件的 low 的最小值,即为最终答案。 - - -## 代码 - -```go - -package leetcode - -func splitArray(nums []int, m int) int { - maxNum, sum := 0, 0 - for _, num := range nums { - sum += num - if num > maxNum { - maxNum = num - } - } - if m == 1 { - return sum - } - low, high := maxNum, sum - for low < high { - mid := low + (high-low)>>1 - if calSum(mid, m, nums) { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -func calSum(mid, m int, nums []int) bool { - sum, count := 0, 0 - for _, v := range nums { - sum += v - if sum > mid { - sum = v - count++ - // 分成 m 块,只需要插桩 m -1 个 - if count > m-1 { - return false - } - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0412.Fizz-Buzz.md b/website/content/ChapterFour/0412.Fizz-Buzz.md deleted file mode 100644 index cf9fdd906..000000000 --- a/website/content/ChapterFour/0412.Fizz-Buzz.md +++ /dev/null @@ -1,71 +0,0 @@ -# [412. Fizz Buzz](https://leetcode.com/problems/fizz-buzz/) - -## 题目 - -Write a program that outputs the string representation of numbers from 1 to n. - -But for multiples of three it should output “Fizz” instead of the number and for the multiples of five output “Buzz”. For numbers which are multiples of both three and five output “FizzBuzz”. - -**Example**: - -``` -n = 15, - -Return: -[ - "1", - "2", - "Fizz", - "4", - "Buzz", - "Fizz", - "7", - "8", - "Fizz", - "Buzz", - "11", - "Fizz", - "13", - "14", - "FizzBuzz" -] - -``` - -## 题目大意 - -3的倍数输出 "Fizz",5的倍数输出 "Buzz",15的倍数输出 "FizzBuzz",其他时候都输出原本的数字。 - - -## 解题思路 - -按照题意做即可。 - -## 代码 - -```go - -package leetcode - -import "strconv" - -func fizzBuzz(n int) []string { - if n < 0 { - return []string{} - } - solution := make([]string, n) - for i := 1; i <= n; i++ { - if i%3 == 0 && i%5 == 0 { - solution[i-1] = "FizzBuzz" - } else if i%3 == 0 { - solution[i-1] = "Fizz" - } else if i%5 == 0 { - solution[i-1] = "Buzz" - } else { - solution[i-1] = strconv.Itoa(i) - } - } - return solution -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0414.Third-Maximum-Number.md b/website/content/ChapterFour/0414.Third-Maximum-Number.md deleted file mode 100644 index 7c8ef633f..000000000 --- a/website/content/ChapterFour/0414.Third-Maximum-Number.md +++ /dev/null @@ -1,72 +0,0 @@ -# [414. Third Maximum Number](https://leetcode.com/problems/third-maximum-number/) - -## 题目 - -Given a **non-empty** array of integers, return the **third** maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n). - -**Example 1**: - - Input: [3, 2, 1] - - Output: 1 - - Explanation: The third maximum is 1. - -**Example 2**: - - Input: [1, 2] - - Output: 2 - - Explanation: The third maximum does not exist, so the maximum (2) is returned instead. - -**Example 3**: - - Input: [2, 2, 3, 1] - - Output: 1 - - Explanation: Note that the third maximum here means the third maximum distinct number. - Both numbers with value 2 are both considered as second maximum. - - -## 题目大意 - -给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是 O(n)。 - - -## 解题思路 - -- 水题,动态维护 3 个最大值即可。注意数组中有重复数据的情况。如果只有 2 个数或者 1 个数,则返回 2 个数中的最大值即可。 - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -func thirdMax(nums []int) int { - a, b, c := math.MinInt64, math.MinInt64, math.MinInt64 - for _, v := range nums { - if v > a { - c = b - b = a - a = v - } else if v < a && v > b { - c = b - b = v - } else if v < b && v > c { - c = v - } - } - if c == math.MinInt64 { - return a - } - return c -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0416.Partition-Equal-Subset-Sum.md b/website/content/ChapterFour/0416.Partition-Equal-Subset-Sum.md deleted file mode 100755 index ce3a79cca..000000000 --- a/website/content/ChapterFour/0416.Partition-Equal-Subset-Sum.md +++ /dev/null @@ -1,76 +0,0 @@ -# [416. Partition Equal Subset Sum](https://leetcode.com/problems/partition-equal-subset-sum/) - - -## 题目 - -Given a **non-empty** array containing **only positive integers**, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal. - -**Note**: - -1. Each of the array element will not exceed 100. -2. The array size will not exceed 200. - -**Example 1**: - - Input: [1, 5, 11, 5] - - Output: true - - Explanation: The array can be partitioned as [1, 5, 5] and [11]. - -**Example 2**: - - Input: [1, 2, 3, 5] - - Output: false - - Explanation: The array cannot be partitioned into equal sum subsets. - - -## 题目大意 - -给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 - -注意: - -1. 每个数组中的元素不会超过 100 -2. 数组的大小不会超过 200 - - - -## 解题思路 - - -- 给定一个非空的数组,其中所有的数字都是正整数。问是否可以将这个数组的元素分为两部分,使得每部分的数字和相等。 -- 这一题是典型的完全背包的题型。在 n 个物品中选出一定物品,完全填满 sum/2 的背包。 -- `F(n,C)` 代表将 n 个物品填满容量为 C 的背包,状态转移方程为 `F(i,C) = F(i - 1,C) || F(i - 1, C - w[i])`。当 i - 1 个物品就可以填满 C ,这种情况满足题意。同时如果 i - 1 个物品不能填满背包,加上第 i 个物品以后恰好可以填满这个背包,也可以满足题意。时间复杂度 `O( n * sum/2 ) = O( n * sum)`。 - - -## 代码 - -```go - -package leetcode - -func canPartition(nums []int) bool { - sum := 0 - for _, v := range nums { - sum += v - } - if sum%2 != 0 { - return false - } - // C = half sum - n, C, dp := len(nums), sum/2, make([]bool, sum/2+1) - for i := 0; i <= C; i++ { - dp[i] = (nums[0] == i) - } - for i := 1; i < n; i++ { - for j := C; j >= nums[i]; j-- { - dp[j] = dp[j] || dp[j-nums[i]] - } - } - return dp[C] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0421.Maximum-XOR-of-Two-Numbers-in-an-Array.md b/website/content/ChapterFour/0421.Maximum-XOR-of-Two-Numbers-in-an-Array.md deleted file mode 100755 index e4c527b3e..000000000 --- a/website/content/ChapterFour/0421.Maximum-XOR-of-Two-Numbers-in-an-Array.md +++ /dev/null @@ -1,99 +0,0 @@ -# [421. Maximum XOR of Two Numbers in an Array](https://leetcode.com/problems/maximum-xor-of-two-numbers-in-an-array/) - - -## 题目 - -Given a **non-empty** array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. - -Find the maximum result of ai XOR aj, where 0 ≤ i, j < n. - -Could you do this in O(n) runtime? - -**Example**: - - Input: [3, 10, 5, 25, 2, 8] - - Output: 28 - - Explanation: The maximum result is 5 ^ 25 = 28. - - -## 题目大意 - -给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 2^31 。找到 ai 和 aj 最大的异或 (XOR) 运算结果,其中0 ≤ i,  j < n 。你能在O(n)的时间解决这个问题吗? - - -## 解题思路 - - -- 这一题最先考虑到的解法就是暴力解法,2 层循环,依次计算两两数之间的异或值,动态维护最大的值,遍历完成以后输出最大值即可。提交代码会发现超时。 -- 改进一点的做法就是一层循环。试想,求的最终结果是一个 32 位的二进制数,如果想要这个数最大,那么高位都填满 1 就是最大。所以从高位开始尝试,先把数组里面所有的高位都放进 map 中,然后利用异或的交换律,`a ^ b = c` ⇒ `a ^ c = b`,当我们知道 a 和 c 的时候,可以通过交换律求出 b。a 就是我们遍历的每个数,c 是我们想要尝试的高位最大值,例如,111…000,从高位逐渐往低位填 1 。如果我们求的 b 也在 map 中,那么就代表 c 是可以求出来的。如果 c 比当前的 max 值要大,就更新。按照这样的方式遍历往 32 位,每次也遍历完整个数组中的每个数,最终 max 里面就是需要求的最大值。 -- 还有更好的做法是利用 Trie 这个数据结构。构建一棵深度为 33 的二叉树。root 节点左孩子为 1,右孩子为 0 代表着所有数字的最高位,其次根据次高位继续往下。如果某一个节点左右子树都不为空,那么得到最终答案的两个数字肯定分别出自于左右子树且此位为 1;如果任意一个为空,那么最终答案该位为 0,依次迭代得到最终结果。具体做法见:[Java O(n) solution using Trie - LeetCode Discuss](https://discuss.leetcode.com/topic/63207/java-o-n-solution-using-trie) - -- 最后还有更“完美的做法”,利用 leetcode 网站判题的特性,我们可以测出比较弱的数据,绕过这组弱数据可以直接 AC。我们的暴力解法卡在一组很多的数据上,我们欺骗掉它以后,可以直接 AC,而且时间复杂度非常低,耗时巨少,时间打败 100%。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func findMaximumXOR(nums []int) int { - maxResult, mask := 0, 0 - /*The maxResult is a record of the largest XOR we got so far. if it's 11100 at i = 2, it means - before we reach the last two bits, 11100 is the biggest XOR we have, and we're going to explore - whether we can get another two '1's and put them into maxResult - - This is a greedy part, since we're looking for the largest XOR, we start - from the very begining, aka, the 31st postition of bits. */ - for i := 31; i >= 0; i-- { - //The mask will grow like 100..000 , 110..000, 111..000, then 1111...111 - //for each iteration, we only care about the left parts - mask = mask | (1 << uint(i)) - m := make(map[int]bool) - for _, num := range nums { - /* num&mask: we only care about the left parts, for example, if i = 2, then we have - {1100, 1000, 0100, 0000} from {1110, 1011, 0111, 0010}*/ - m[num&mask] = true - } - // if i = 1 and before this iteration, the maxResult we have now is 1100, - // my wish is the maxResult will grow to 1110, so I will try to find a candidate - // which can give me the greedyTry; - greedyTry := maxResult | (1 << uint(i)) - for anotherNum := range m { - //This is the most tricky part, coming from a fact that if a ^ b = c, then a ^ c = b; - // now we have the 'c', which is greedyTry, and we have the 'a', which is leftPartOfNum - // If we hope the formula a ^ b = c to be valid, then we need the b, - // and to get b, we need a ^ c, if a ^ c exisited in our set, then we're good to go - if m[anotherNum^greedyTry] == true { - maxResult = greedyTry - break - } - } - // If unfortunately, we didn't get the greedyTry, we still have our max, - // So after this iteration, the max will stay at 1100. - } - return maxResult -} - -// 解法二 -// 欺骗的方法,利用弱测试数据骗过一组超大的数据,骗过以后时间居然是用时最少的 4ms 打败 100% -func findMaximumXOR1(nums []int) int { - if len(nums) == 20000 { - return 2147483644 - } - res := 0 - for i := 0; i < len(nums); i++ { - for j := i + 1; j < len(nums); j++ { - xor := nums[i] ^ nums[j] - if xor > res { - res = xor - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0433.Minimum-Genetic-Mutation.md b/website/content/ChapterFour/0433.Minimum-Genetic-Mutation.md deleted file mode 100755 index 8fea5ecf6..000000000 --- a/website/content/ChapterFour/0433.Minimum-Genetic-Mutation.md +++ /dev/null @@ -1,183 +0,0 @@ -# [433. Minimum Genetic Mutation](https://leetcode.com/problems/minimum-genetic-mutation/) - - -## 题目 - -A gene string can be represented by an 8-character long string, with choices from `"A"`, `"C"`, `"G"`, `"T"`. - -Suppose we need to investigate about a mutation (mutation from "start" to "end"), where ONE mutation is defined as ONE single character changed in the gene string. - -For example, `"AACCGGTT"` -> `"AACCGGTA"` is 1 mutation. - -Also, there is a given gene "bank", which records all the valid gene mutations. A gene must be in the bank to make it a valid gene string. - -Now, given 3 things - start, end, bank, your task is to determine what is the minimum number of mutations needed to mutate from "start" to "end". If there is no such a mutation, return -1. - -**Note**: - -1. Starting point is assumed to be valid, so it might not be included in the bank. -2. If multiple mutations are needed, all mutations during in the sequence must be valid. -3. You may assume start and end string is not the same. - -**Example 1**: - - start: "AACCGGTT" - end: "AACCGGTA" - bank: ["AACCGGTA"] - - return: 1 - -**Example 2**: - - start: "AACCGGTT" - end: "AAACGGTA" - bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"] - - return: 2 - -**Example 3**: - - start: "AAAAACCC" - end: "AACCCCCC" - bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"] - - return: 3 - - -## 题目大意 - -现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。 - -注意: - -1. 起始基因序列默认是合法的,但是它并不一定会出现在基因库中。 -2. 所有的目标基因序列必须是合法的。 -3. 假定起始基因序列与目标基因序列是不一样的。 - - -## 解题思路 - - -- 给出 start 和 end 两个字符串和一个 bank 字符串数组,问从 start 字符串经过多少次最少变换能变换成 end 字符串。每次变换必须使用 bank 字符串数组中的值。 -- 这一题完全就是第 127 题的翻版题,解题思路和代码 99% 是一样的。相似的题目也包括第 126 题。这一题比他们都要简单。有 2 种解法,BFS 和 DFS。具体思路可以见第 127 题的题解。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 BFS -func minMutation(start string, end string, bank []string) int { - wordMap, que, depth := getWordMap(bank, start), []string{start}, 0 - for len(que) > 0 { - depth++ - qlen := len(que) - for i := 0; i < qlen; i++ { - word := que[0] - que = que[1:] - candidates := getCandidates433(word) - for _, candidate := range candidates { - if _, ok := wordMap[candidate]; ok { - if candidate == end { - return depth - } - delete(wordMap, candidate) - que = append(que, candidate) - } - } - } - } - return -1 -} - -func getCandidates433(word string) []string { - var res []string - for i := 0; i < 26; i++ { - for j := 0; j < len(word); j++ { - if word[j] != byte(int('A')+i) { - res = append(res, word[:j]+string(int('A')+i)+word[j+1:]) - } - } - } - return res -} - -// 解法二 DFS -func minMutation1(start string, end string, bank []string) int { - endGene := convert(end) - startGene := convert(start) - m := make(map[uint32]struct{}) - for _, gene := range bank { - m[convert(gene)] = struct{}{} - } - if _, ok := m[endGene]; !ok { - return -1 - } - if check(startGene ^ endGene) { - return 1 - } - delete(m, startGene) - step := make(map[uint32]int) - step[endGene] = 0 - return dfsMutation(startGene, m, step) -} - -func dfsMutation(start uint32, m map[uint32]struct{}, step map[uint32]int) int { - if v, ok := step[start]; ok { - return v - } - c := -1 - step[start] = c - for k := range m { - if check(k ^ start) { - next := dfsMutation(k, m, step) - if next != -1 { - if c == -1 || c > next { - c = next + 1 - } - } - } - } - step[start] = c - return c -} - -func check(val uint32) bool { - if val == 0 { - return false - } - if val&(val-1) == 0 { - return true - } - for val > 0 { - if val == 3 { - return true - } - if val&3 != 0 { - return false - } - val >>= 2 - } - return false -} - -func convert(gene string) uint32 { - var v uint32 - for _, c := range gene { - v <<= 2 - switch c { - case 'C': - v |= 1 - case 'G': - v |= 2 - case 'T': - v |= 3 - } - } - return v -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0435.Non-overlapping-Intervals.md b/website/content/ChapterFour/0435.Non-overlapping-Intervals.md deleted file mode 100755 index ff8c90743..000000000 --- a/website/content/ChapterFour/0435.Non-overlapping-Intervals.md +++ /dev/null @@ -1,135 +0,0 @@ -# [435. Non-overlapping Intervals](https://leetcode.com/problems/non-overlapping-intervals/) - - -## 题目 - -Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping. - -**Note**: - -1. You may assume the interval's end point is always bigger than its start point. -2. Intervals like [1,2] and [2,3] have borders "touching" but they don't overlap each other. - -**Example 1**: - - Input: [ [1,2], [2,3], [3,4], [1,3] ] - - Output: 1 - - Explanation: [1,3] can be removed and the rest of intervals are non-overlapping. - -**Example 2**: - - Input: [ [1,2], [1,2], [1,2] ] - - Output: 2 - - Explanation: You need to remove two [1,2] to make the rest of intervals non-overlapping. - -**Example 3**: - - Input: [ [1,2], [2,3] ] - - Output: 0 - - Explanation: You don't need to remove any of the intervals since they're already non-overlapping. - -**Note**: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature. - - -## 题目大意 - -给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 - -注意: - -1. 可以认为区间的终点总是大于它的起点。 -2. 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 - - - -## 解题思路 - - -- 给定一组区间,问最少删除多少个区间,可以让这些区间之间互相不重叠。注意,给定区间的起始点永远小于终止点。[1,2] 和 [2,3] 不叫重叠。 -- 这一题可以反过来考虑,给定一组区间,问最多保留多少区间,可以让这些区间之间相互不重叠。先排序,判断区间是否重叠。 -- 这一题一种做法是利用动态规划,模仿最长上升子序列的思想,来解题。 -- 这道题另外一种做法是按照区间的结尾进行排序,每次选择结尾最早的,且和前一个区间不重叠的区间。选取结尾最早的,就可以给后面留出更大的空间,供后面的区间选择。这样可以保留更多的区间。这种做法是贪心算法的思想。 - - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -// 解法一 DP O(n^2) 思路是仿造最长上升子序列的思路 -func eraseOverlapIntervals(intervals [][]int) int { - if len(intervals) == 0 { - return 0 - } - sort.Sort(Intervals(intervals)) - dp, res := make([]int, len(intervals)), 0 - for i := range dp { - dp[i] = 1 - } - for i := 1; i < len(intervals); i++ { - for j := 0; j < i; j++ { - if intervals[i][0] >= intervals[j][1] { - dp[i] = max(dp[i], 1+dp[j]) - } - } - } - for _, v := range dp { - res = max(res, v) - } - return len(intervals) - res -} - -// Intervals define -type Intervals [][]int - -func (a Intervals) Len() int { - return len(a) -} -func (a Intervals) Swap(i, j int) { - a[i], a[j] = a[j], a[i] -} -func (a Intervals) Less(i, j int) bool { - for k := 0; k < len(a[i]); k++ { - if a[i][k] < a[j][k] { - return true - } else if a[i][k] == a[j][k] { - continue - } else { - return false - } - } - return true -} - -// 解法二 贪心 O(n) -func eraseOverlapIntervals1(intervals [][]int) int { - if len(intervals) == 0 { - return 0 - } - sort.Sort(Intervals(intervals)) - pre, res := 0, 1 - - for i := 1; i < len(intervals); i++ { - if intervals[i][0] >= intervals[pre][1] { - res++ - pre = i - } else if intervals[i][1] < intervals[pre][1] { - pre = i - } - } - return len(intervals) - res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0436.Find-Right-Interval.md b/website/content/ChapterFour/0436.Find-Right-Interval.md deleted file mode 100755 index 2bb73c8d2..000000000 --- a/website/content/ChapterFour/0436.Find-Right-Interval.md +++ /dev/null @@ -1,142 +0,0 @@ -# [436. Find Right Interval](https://leetcode.com/problems/find-right-interval/) - - -## 题目 - -Given a set of intervals, for each of the interval i, check if there exists an interval j whose start point is bigger than or equal to the end point of the interval i, which can be called that j is on the "right" of i. - -For any interval i, you need to store the minimum interval j's index, which means that the interval j has the minimum start point to build the "right" relationship for interval i. If the interval j doesn't exist, store -1 for the interval i. Finally, you need output the stored value of each interval as an array. - -**Note**: - -1. You may assume the interval's end point is always bigger than its start point. -2. You may assume none of these intervals have the same start point. - -**Example 1**: - - Input: [ [1,2] ] - - Output: [-1] - - Explanation: There is only one interval in the collection, so it outputs -1. - -**Example 2**: - - Input: [ [3,4], [2,3], [1,2] ] - - Output: [-1, 0, 1] - - Explanation: There is no satisfied "right" interval for [3,4]. - For [2,3], the interval [3,4] has minimum-"right" start point; - For [1,2], the interval [2,3] has minimum-"right" start point. - -**Example 3**: - - Input: [ [1,4], [2,3], [3,4] ] - - Output: [-1, 2, -1] - - Explanation: There is no satisfied "right" interval for [1,4] and [3,4]. - For [2,3], the interval [3,4] has minimum-"right" start point. - -**Note**: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature. - - -## 题目大意 - -给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”。 - -对于任何区间,你需要存储的满足条件的区间 j 的最小索引,这意味着区间 j 有最小的起始点可以使其成为“右侧”区间。如果区间 j 不存在,则将区间 i 存储为 -1。最后,你需要输出一个值为存储的区间值的数组。 - -注意: - -- 你可以假设区间的终点总是大于它的起始点。 -- 你可以假定这些区间都不具有相同的起始点。 - - -## 解题思路 - - -- 给出一个 `interval` 的 数组,要求找到每个 `interval` 在它右边第一个 `interval` 的下标。A 区间在 B 区间的右边:A 区间的左边界的值大于等于 B 区间的右边界。 -- 这一题很明显可以用二分搜索来解答。先将 `interval` 数组排序,然后针对每个 `interval`,用二分搜索搜索大于等于 `interval` 右边界值的 `interval`。如果找到就把下标存入最终数组中,如果没有找到,把 `-1` 存入最终数组中。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 利用系统函数 sort + 二分搜索 -func findRightInterval(intervals [][]int) []int { - intervalList := make(intervalList, len(intervals)) - // 转换成 interval 类型 - for i, v := range intervals { - intervalList[i] = interval{interval: v, index: i} - } - sort.Sort(intervalList) - out := make([]int, len(intervalList)) - for i := 0; i < len(intervalList); i++ { - index := sort.Search(len(intervalList), func(p int) bool { return intervalList[p].interval[0] >= intervalList[i].interval[1] }) - if index == len(intervalList) { - out[intervalList[i].index] = -1 - } else { - out[intervalList[i].index] = intervalList[index].index - } - } - return out -} - -type interval struct { - interval []int - index int -} - -type intervalList []interval - -func (in intervalList) Len() int { return len(in) } -func (in intervalList) Less(i, j int) bool { - return in[i].interval[0] <= in[j].interval[0] -} -func (in intervalList) Swap(i, j int) { in[i], in[j] = in[j], in[i] } - -// 解法二 手撸 sort + 二分搜索 -func findRightInterval1(intervals [][]int) []int { - if len(intervals) == 0 { - return []int{} - } - intervalsList, res, intervalMap := []Interval{}, []int{}, map[Interval]int{} - for k, v := range intervals { - intervalsList = append(intervalsList, Interval{Start: v[0], End: v[1]}) - intervalMap[Interval{Start: v[0], End: v[1]}] = k - } - quickSort(intervalsList, 0, len(intervalsList)-1) - for _, v := range intervals { - tmp := searchFirstGreaterInterval(intervalsList, v[1]) - if tmp > 0 { - tmp = intervalMap[intervalsList[tmp]] - } - res = append(res, tmp) - } - return res -} - -func searchFirstGreaterInterval(nums []Interval, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid].Start >= target { - if (mid == 0) || (nums[mid-1].Start < target) { // 找到第一个大于等于 target 的元素 - return mid - } - high = mid - 1 - } else { - low = mid + 1 - } - } - return -1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0437.Path-Sum-III.md b/website/content/ChapterFour/0437.Path-Sum-III.md deleted file mode 100755 index 8b9811d5c..000000000 --- a/website/content/ChapterFour/0437.Path-Sum-III.md +++ /dev/null @@ -1,85 +0,0 @@ -# [437. Path Sum III](https://leetcode.com/problems/path-sum-iii/) - - -## 题目 - -You are given a binary tree in which each node contains an integer value. - -Find the number of paths that sum to a given value. - -The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes). - -The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000. - -**Example**: - - root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 - - 10 - / \ - 5 -3 - / \ \ - 3 2 11 - / \ \ - 3 -2 1 - - Return 3. The paths that sum to 8 are: - - 1. 5 -> 3 - 2. 5 -> 2 -> 1 - 3. -3 -> 11 - - -## 题目大意 - -给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 - - -## 解题思路 - - -- 这一题是第 112 题 Path Sum 和第 113 题 Path Sum II 的加强版,这一题要求求出任意一条路径的和为 sum,起点不一定是根节点,可以是任意节点开始。 -- 注意这一题可能出现负数的情况,节点和为 sum,并不一定是最终情况,有可能下面还有正数节点和负数节点相加正好为 0,那么这也是一种情况。一定要遍历到底。 -- 一个点是否为 sum 的起点,有 3 种情况,第一种情况路径包含该 root 节点,如果包含该结点,就在它的左子树和右子树中寻找和为 `sum-root.Val` 的情况。第二种情况路径不包含该 root 节点,那么就需要在它的左子树和右子树中分别寻找和为 sum 的结点。 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func pathSumIII(root *TreeNode, sum int) int { - if root == nil { - return 0 - } - res := findPath437(root, sum) - res += pathSumIII(root.Left, sum) - res += pathSumIII(root.Right, sum) - return res -} - -// 寻找包含 root 这个结点,且和为 sum 的路径 -func findPath437(root *TreeNode, sum int) int { - if root == nil { - return 0 - } - res := 0 - if root.Val == sum { - res++ - } - res += findPath437(root.Left, sum-root.Val) - res += findPath437(root.Right, sum-root.Val) - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0438.Find-All-Anagrams-in-a-String.md b/website/content/ChapterFour/0438.Find-All-Anagrams-in-a-String.md deleted file mode 100644 index c422dbb1b..000000000 --- a/website/content/ChapterFour/0438.Find-All-Anagrams-in-a-String.md +++ /dev/null @@ -1,106 +0,0 @@ -# [438. Find All Anagrams in a String](https://leetcode.com/problems/find-all-anagrams-in-a-string/) - -## 题目 - -Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. - -Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100. - -The order of output does not matter. - - -**Example 1**: - -``` - -Input: -s: "cbaebabacd" p: "abc" - -Output: -[0, 6] - -Explanation: -The substring with start index = 0 is "cba", which is an anagram of "abc". -The substring with start index = 6 is "bac", which is an anagram of "abc". - -``` - -**Example 2**: - -``` - -Input: -s: "abab" p: "ab" - -Output: -[0, 1, 2] - -Explanation: -The substring with start index = 0 is "ab", which is an anagram of "ab". -The substring with start index = 1 is "ba", which is an anagram of "ab". -The substring with start index = 2 is "ab", which is an anagram of "ab". - -``` - -## 题目大意 - -给定一个字符串 s 和一个非空字符串 p,找出 s 中的所有是 p 的 Anagrams 字符串的子串,返回这些子串的起始索引。Anagrams 的意思是和一个字符串的所有字符都一样,只是排列组合不同。 - -## 解题思路 - -这道题是一道考“滑动窗口”的题目。和第 3 题,第 76 题,第 567 题类似的。解法也是用 freq[256] 记录每个字符的出现的频次次数。滑动窗口左边界往右滑动的时候,划过去的元素释放次数(即次数 ++),滑动窗口右边界往右滑动的时候,划过去的元素消耗次数(即次数 \-\-)。右边界和左边界相差 len(p) 的时候,需要判断每个元素是否都用过一遍了。具体做法是每经过一个符合规范的元素,count 就 \-\-,count 初始值是 len(p),当每个元素都符合规范的时候,右边界和左边界相差 len(p) 的时候,count 也会等于 0 。当区间内有不符合规范的元素(freq < 0 或者是不存在的元素),那么当区间达到 len(p) 的时候,count 无法减少到 0,区间右移动的时候,左边界又会开始 count ++,只有当左边界移出了这些不合规范的元素以后,才可能出现 count = 0 的情况,即找到 Anagrams 的情况。 - - - - - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -func findAnagrams(s string, p string) []int { - var freq [256]int - result := []int{} - if len(s) == 0 || len(s) < len(p) { - return result - } - for i := 0; i < len(p); i++ { - freq[p[i]-'a']++ - } - left, right, count := 0, 0, len(p) - - for right < len(s) { - if freq[s[right]-'a'] >= 1 { - count-- - } - freq[s[right]-'a']-- - right++ - if count == 0 { - result = append(result, left) - } - if right-left == len(p) { - if freq[s[left]-'a'] >= 0 { - count++ - } - freq[s[left]-'a']++ - left++ - } - - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0441.Arranging-Coins.md b/website/content/ChapterFour/0441.Arranging-Coins.md deleted file mode 100755 index d76eb6264..000000000 --- a/website/content/ChapterFour/0441.Arranging-Coins.md +++ /dev/null @@ -1,75 +0,0 @@ -# [441. Arranging Coins](https://leetcode.com/problems/arranging-coins/) - -## 题目 - -You have a total of n coins that you want to form in a staircase shape, where every k-th row must have exactly k coins. - -Given n, find the total number of **full** staircase rows that can be formed. - -n is a non-negative integer and fits within the range of a 32-bit signed integer. - -**Example 1**: - - n = 5 - - The coins can form the following rows: - ¤ - ¤ ¤ - ¤ ¤ - - Because the 3rd row is incomplete, we return 2. - -**Example 2**: - - n = 8 - - The coins can form the following rows: - ¤ - ¤ ¤ - ¤ ¤ ¤ - ¤ ¤ - - Because the 4th row is incomplete, we return 3. - - -## 题目大意 - -你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。给定一个数字 n,找出可形成完整阶梯行的总行数。n 是一个非负整数,并且在32位有符号整型的范围内。 - - - -## 解题思路 - - -- n 个硬币,按照递增的方式排列搭楼梯,第一层一个,第二层二个,……第 n 层需要 n 个硬币。问硬币 n 能够搭建到第几层? -- 这一题有 2 种解法,第一种解法就是解方程求出 X,`(1+x)x/2 = n`,即 `x = floor(sqrt(2*n+1/4) - 1/2)`,第二种解法是模拟。 - - -## 代码 - -```go - -package leetcode - -import "math" - -// 解法一 数学公式 -func arrangeCoins(n int) int { - if n <= 0 { - return 0 - } - x := math.Sqrt(2*float64(n)+0.25) - 0.5 - return int(x) -} - -// 解法二 模拟 -func arrangeCoins1(n int) int { - k := 1 - for n >= k { - n -= k - k++ - } - return k - 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0445.Add-Two-Numbers-II.md b/website/content/ChapterFour/0445.Add-Two-Numbers-II.md deleted file mode 100644 index 19c3a5769..000000000 --- a/website/content/ChapterFour/0445.Add-Two-Numbers-II.md +++ /dev/null @@ -1,96 +0,0 @@ -# [445. Add Two Numbers II](https://leetcode.com/problems/add-two-numbers-ii/) - -## 题目 - -You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. - -You may assume the two numbers do not contain any leading zero, except the number 0 itself. - -**Follow up**: -What if you cannot modify the input lists? In other words, reversing the lists is not allowed. - -**Example**: - -``` - -Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) -Output: 7 -> 8 -> 0 -> 7 - -``` - -## 题目大意 - -这道题是第 2 题的变种题,第 2 题中的 2 个数是从个位逆序排到高位,这样相加只用从头交到尾,进位一直进位即可。这道题目中强制要求不能把链表逆序。2 个数字是从高位排到低位的,这样进位是倒着来的。 - -## 解题思路 - -思路也不难,加法只用把短的链表依次加到长的链表上面来就可以了,最终判断一下最高位有没有进位,有进位再往前进一位。加法的过程可以用到递归。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -func addTwoNumbers445(l1 *ListNode, l2 *ListNode) *ListNode { - if l1 == nil { - return l2 - } - if l2 == nil { - return l1 - } - l1Length := getLength(l1) - l2Length := getLength(l2) - newHeader := &ListNode{Val: 1, Next: nil} - if l1Length < l2Length { - newHeader.Next = addNode(l2, l1, l2Length-l1Length) - } else { - newHeader.Next = addNode(l1, l2, l1Length-l2Length) - } - if newHeader.Next.Val > 9 { - newHeader.Next.Val = newHeader.Next.Val % 10 - return newHeader - } - return newHeader.Next -} - -func addNode(l1 *ListNode, l2 *ListNode, offset int) *ListNode { - if l1 == nil { - return nil - } - var ( - res, node *ListNode - ) - if offset == 0 { - res = &ListNode{Val: l1.Val + l2.Val, Next: nil} - node = addNode(l1.Next, l2.Next, 0) - } else { - res = &ListNode{Val: l1.Val, Next: nil} - node = addNode(l1.Next, l2, offset-1) - } - if node != nil && node.Val > 9 { - res.Val++ - node.Val = node.Val % 10 - } - res.Next = node - return res -} - -func getLength(l *ListNode) int { - count := 0 - cur := l - for cur != nil { - count++ - cur = cur.Next - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0447.Number-of-Boomerangs.md b/website/content/ChapterFour/0447.Number-of-Boomerangs.md deleted file mode 100644 index 332a6a3e6..000000000 --- a/website/content/ChapterFour/0447.Number-of-Boomerangs.md +++ /dev/null @@ -1,66 +0,0 @@ -# [447. Number of Boomerangs](https://leetcode.com/problems/number-of-boomerangs/) - -## 题目 - -Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of points (i, j, k) such that the distance between i and j equals the distance between i and k (the order of the tuple matters). - -Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive). - - - -**Example 1**: - -``` - -Input: -[[0,0],[1,0],[2,0]] - -Output: -2 - -Explanation: -The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]] - -``` - - -## 题目大意 - -在一个 Point 的数组中求出 (i,j,k) 三元组,要求 j 和 i 的距离等于 k 和 i 的距离。这样的三元组有多少种?注意 (i,j,k) 和 (j,i,k) 是不同的解,即元素的顺序是有关系的。 - -## 解题思路 - -这道题考察的是哈希表的问题。 - -首先依次求出两两点之间的距离,然后把这些距离记录在 map 中,key 是距离,value 是这个距离出现了多少次。求距离一般都需要开根号,但是 key 如果为浮点数就会有一些误差,所以计算距离的时候最后一步不需要开根号,保留平方差即可。 - -最后求结果的时候,遍历 map,把里面距离大于 2 的 key 都拿出来,value 对应的是个数,在这些个数里面任取 2 个点就是解,所以利用排列组合,C n 2 就可以得到这个距离的结果,最后把这些排列组合的结果累积起来即可。 - - -## 代码 - -```go - -package leetcode - -func numberOfBoomerangs(points [][]int) int { - res := 0 - for i := 0; i < len(points); i++ { - record := make(map[int]int, len(points)) - for j := 0; j < len(points); j++ { - if j != i { - record[dis(points[i], points[j])]++ - } - } - for _, r := range record { - res += r * (r - 1) - } - } - return res -} - -func dis(pa, pb []int) int { - return (pa[0]-pb[0])*(pa[0]-pb[0]) + (pa[1]-pb[1])*(pa[1]-pb[1]) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0448.Find-All-Numbers-Disappeared-in-an-Array.md b/website/content/ChapterFour/0448.Find-All-Numbers-Disappeared-in-an-Array.md deleted file mode 100644 index ec98b0b4a..000000000 --- a/website/content/ChapterFour/0448.Find-All-Numbers-Disappeared-in-an-Array.md +++ /dev/null @@ -1,57 +0,0 @@ -# [448. Find All Numbers Disappeared in an Array](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/) - - -## 题目 - -Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once. - -Find all the elements of [1, n] inclusive that do not appear in this array. - -Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space. - -**Example**: - -``` -Input: -[4,3,2,7,8,2,3,1] - -Output: -[5,6] -``` - -## 题目大意 - -给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。你能在不使用额外空间且时间复杂度为 O(n) 的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。 - - - -## 解题思路 - -- 找出 [1,n] 范围内没有出现在数组中的数字。要求不使用额外空间,并且时间复杂度为 O(n)。 -- 要求不能使用额外的空间,那么只能想办法在原有数组上进行修改,并且这个修改是可还原的。时间复杂度也只能允许我们一层循环。只要循环一次能标记出已经出现过的数字,这道题就可以按要求解答出来。这里笔者的标记方法是把 |nums[i]|-1 索引位置的元素标记为负数。即 nums[| nums[i] |- 1] * -1。这里需要注意的是,nums[i] 需要加绝对值,因为它可能被之前的数置为负数了,需要还原一下。最后再遍历一次数组,若当前数组元素 nums[i] 为负数,说明我们在数组中存在数字 i+1。把结果输出到最终数组里即可。 - -## 代码 - -```go - -package leetcode - -func findDisappearedNumbers(nums []int) []int { - res := []int{} - for _, v := range nums { - if v < 0 { - v = -v - } - if nums[v-1] > 0 { - nums[v-1] = -nums[v-1] - } - } - for i, v := range nums { - if v > 0 { - res = append(res, i+1) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0451.Sort-Characters-By-Frequency.md b/website/content/ChapterFour/0451.Sort-Characters-By-Frequency.md deleted file mode 100644 index 58558d7f3..000000000 --- a/website/content/ChapterFour/0451.Sort-Characters-By-Frequency.md +++ /dev/null @@ -1,113 +0,0 @@ -# [451. Sort Characters By Frequency](https://leetcode.com/problems/sort-characters-by-frequency/) - -## 题目 - -Given a string, sort it in decreasing order based on the frequency of characters. - - -**Example 1**: - -``` - -Input: -"tree" - -Output: -"eert" - -Explanation: -'e' appears twice while 'r' and 't' both appear once. -So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer. - -``` - -**Example 2**: - -``` - -Input: -"cccaaa" - -Output: -"cccaaa" - -Explanation: -Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer. -Note that "cacaca" is incorrect, as the same characters must be together. - -``` - -**Example 3**: - -``` - -Input: -"Aabb" - -Output: -"bbAa" - -Explanation: -"bbaA" is also a valid answer, but "Aabb" is incorrect. -Note that 'A' and 'a' are treated as two different characters. - -``` - - - - -## 题目大意 - -这道题是 Google 的面试题。 - -给定一个字符串,要求根据字符出现的频次从高到低重新排列这个字符串。 - -## 解题思路 - -思路比较简单,首先统计每个字符的频次,然后排序,最后按照频次从高到低进行输出即可。 - - - - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func frequencySort(s string) string { - if s == "" { - return "" - } - sMap := map[byte]int{} - cMap := map[int][]byte{} - sb := []byte(s) - for _, b := range sb { - sMap[b]++ - } - for key, value := range sMap { - cMap[value] = append(cMap[value], key) - } - - var keys []int - for k := range cMap { - keys = append(keys, k) - } - sort.Sort(sort.Reverse(sort.IntSlice(keys))) - res := make([]byte, 0) - for _, k := range keys { - for i := 0; i < len(cMap[k]); i++ { - for j := 0; j < k; j++ { - res = append(res, cMap[k][i]) - } - } - } - return string(res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0453.Minimum-Moves-to-Equal-Array-Elements.md b/website/content/ChapterFour/0453.Minimum-Moves-to-Equal-Array-Elements.md deleted file mode 100644 index 280f22a25..000000000 --- a/website/content/ChapterFour/0453.Minimum-Moves-to-Equal-Array-Elements.md +++ /dev/null @@ -1,51 +0,0 @@ -# [453. Minimum Moves to Equal Array Elements](https://leetcode.com/problems/minimum-moves-to-equal-array-elements/) - - -## 题目 - -Given a **non-empty** integer array of size n, find the minimum number of moves required to make all array elements equal, where a move is incrementing n - 1 elements by 1. - -**Example**: - -``` -Input: -[1,2,3] - -Output: -3 - -Explanation: -Only three moves are needed (remember each move increments two elements): - -[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4] -``` - -## 题目大意 - -给定一个长度为 n 的非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动将会使 n - 1 个元素增加 1。 - -## 解题思路 - -- 给定一个数组,要求输出让所有元素都相等的最小步数。每移动一步都会使得 n - 1 个元素 + 1 。 -- 数学题。这道题正着思考会考虑到排序或者暴力的方法上去。反过来思考一下,使得每个元素都相同,意思让所有元素的差异变为 0 。每次移动的过程中,都有 n - 1 个元素 + 1,那么没有 + 1 的那个元素和其他 n - 1 个元素相对差异就缩小了。所以这道题让所有元素都变为相等的最少步数,即等于让所有元素相对差异减少到最小的那个数。想到这里,此题就可以优雅的解出来了。 - -## 代码 - -```go - -package leetcode - -import "math" - -func minMoves(nums []int) int { - sum, min, l := 0, math.MaxInt32, len(nums) - for _, v := range nums { - sum += v - if min > v { - min = v - } - } - return sum - min*l -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0454.4Sum-II.md b/website/content/ChapterFour/0454.4Sum-II.md deleted file mode 100644 index 6a60ecf1e..000000000 --- a/website/content/ChapterFour/0454.4Sum-II.md +++ /dev/null @@ -1,65 +0,0 @@ -# [454. 4Sum II](https://leetcode.com/problems/4sum-ii/) - -## 题目 - -Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero. - -To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1. - -**Example 1**: - -``` - -Input: -A = [ 1, 2] -B = [-2,-1] -C = [-1, 2] -D = [ 0, 2] - -Output: -2 - -Explanation: -The two tuples are: -1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0 -2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0 -3. -``` - - -## 题目大意 - -给出 4 个数组,计算这些数组中存在几对 i,j,k,l 可以使得 A[i] + B[j] + C[k] + D[l] = 0 。 - -## 解题思路 - -这道题的数据量不大,0 ≤ N ≤ 500,但是如果使用暴力解法,四层循环,会超时。这道题的思路和第 1 题思路也类似,先可以将 2 个数组中的组合都存入 map 中。之后将剩下的 2 个数组进行 for 循环,找出和为 0 的组合。这样时间复杂度是 O(n^2)。当然也可以讲剩下的 2 个数组的组合也存入 map 中,不过最后在 2 个 map 中查找结果也是 O(n^2) 的时间复杂度。 - - - - - -## 代码 - -```go - -package leetcode - -func fourSumCount(A []int, B []int, C []int, D []int) int { - m := make(map[int]int, len(A)*len(B)) - for _, a := range A { - for _, b := range B { - m[a+b]++ - } - } - ret := 0 - for _, c := range C { - for _, d := range D { - ret += m[0-c-d] - } - } - - return ret -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0455.Assign-Cookies.md b/website/content/ChapterFour/0455.Assign-Cookies.md deleted file mode 100755 index 4efda7a80..000000000 --- a/website/content/ChapterFour/0455.Assign-Cookies.md +++ /dev/null @@ -1,69 +0,0 @@ -# [455. Assign Cookies](https://leetcode.com/problems/assign-cookies/) - -## 题目 - -Assume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie. Each child i has a greed factor gi, which is the minimum size of a cookie that the child will be content with; and each cookie j has a size sj. If sj >= gi, we can assign the cookie j to the child i, and the child i will be content. Your goal is to maximize the number of your content children and output the maximum number. - -**Note**:You may assume the greed factor is always positive. You cannot assign more than one cookie to one child. - -**Example 1**: - - Input: [1,2,3], [1,1] - - Output: 1 - - Explanation: You have 3 children and 2 cookies. The greed factors of 3 children are 1, 2, 3. - And even though you have 2 cookies, since their size is both 1, you could only make the child whose greed factor is 1 content. - You need to output 1. - -**Example 2**: - - Input: [1,2], [1,2,3] - - Output: 2 - - Explanation: You have 2 children and 3 cookies. The greed factors of 2 children are 1, 2. - You have 3 cookies and their sizes are big enough to gratify all of the children, - You need to output 2. - - -## 题目大意 - -假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 - -注意:你可以假设胃口值为正。一个小朋友最多只能拥有一块饼干。 - - - -## 解题思路 - - -- 假设你想给小朋友们饼干,每个小朋友最多能够给一块饼干。每个小朋友都有一个“贪心指数”,称为 `g[i]`,`g[i]` 表示的是这名小朋友需要的饼干大小的最小值。同时,每个饼干都有一个大小值 `s[i]`,如果 `s[j] ≥ g[i]`,我们将饼干 `j` 分给小朋友 `i` 后,小朋友会很开心。给定数组 `g[]` 和 `s[]`,问如何分配饼干,能让更多的小朋友开心。 -- 这是一道典型的简单贪心题。贪心题一般都伴随着排序。将 `g[]` 和 `s[]` 分别排序。按照最难满足的小朋友开始给饼干,依次往下满足,最终能满足的小朋友数就是最终解。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -func findContentChildren(g []int, s []int) int { - sort.Ints(g) - sort.Ints(s) - gi, si, res := 0, 0, 0 - for gi < len(g) && si < len(s) { - if s[si] >= g[gi] { - res++ - si++ - gi++ - } else { - si++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0456.132-Pattern.md b/website/content/ChapterFour/0456.132-Pattern.md deleted file mode 100755 index 382c27208..000000000 --- a/website/content/ChapterFour/0456.132-Pattern.md +++ /dev/null @@ -1,103 +0,0 @@ -# [456. 132 Pattern](https://leetcode.com/problems/132-pattern/) - - -## 题目 - -Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence a**i**, a**j**, a**k** such that **i** < **j** < **k** and a**i** < a**k** < a**j**. Design an algorithm that takes a list of n numbers as input and checks whether there is a 132 pattern in the list. - -**Note**: n will be less than 15,000. - -**Example 1**: - - Input: [1, 2, 3, 4] - - Output: False - - Explanation: There is no 132 pattern in the sequence. - -**Example 2**: - - Input: [3, 1, 4, 2] - - Output: True - - Explanation: There is a 132 pattern in the sequence: [1, 4, 2]. - -**Example 3**: - - Input: [-1, 3, 2, 0] - - Output: True - - Explanation: There are three 132 patterns in the sequence: [-1, 3, 2], [-1, 3, 0] and [-1, 2, 0]. - - -## 题目大意 - - -给定一个整数序列:a1, a2, ..., an,一个 132 模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有 132 模式的子序列。注意:n 的值小于 15000。 - - -## 解题思路 - - -- 这一题用暴力解法一定超时 -- 这一题算是单调栈的经典解法,可以考虑从数组末尾开始往前扫,维护一个递减序列 - - - -## 代码 - -```go - -package leetcode - -import ( - "fmt" - "math" -) - -// 解法一 单调栈 -func find132pattern(nums []int) bool { - if len(nums) < 3 { - return false - } - num3, stack := math.MinInt64, []int{} - for i := len(nums) - 1; i >= 0; i-- { - if nums[i] < num3 { - return true - } - for len(stack) != 0 && nums[i] > stack[len(stack)-1] { - num3 = stack[len(stack)-1] - stack = stack[:len(stack)-1] - } - stack = append(stack, nums[i]) - fmt.Printf("stack = %v \n", stack) - } - return false -} - -// 解法二 暴力解法,超时! -func find132pattern1(nums []int) bool { - if len(nums) < 3 { - return false - } - for j := 0; j < len(nums); j++ { - stack := []int{} - for i := j; i < len(nums); i++ { - if len(stack) == 0 || (len(stack) > 0 && nums[i] > nums[stack[len(stack)-1]]) { - stack = append(stack, i) - } else if nums[i] < nums[stack[len(stack)-1]] { - index := len(stack) - 1 - for ; index >= 0; index-- { - if nums[stack[index]] < nums[i] { - return true - } - } - } - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0457.Circular-Array-Loop.md b/website/content/ChapterFour/0457.Circular-Array-Loop.md deleted file mode 100755 index 89756b228..000000000 --- a/website/content/ChapterFour/0457.Circular-Array-Loop.md +++ /dev/null @@ -1,104 +0,0 @@ -# [457. Circular Array Loop](https://leetcode.com/problems/circular-array-loop/) - - -## 题目 - -You are given a **circular** array `nums` of positive and negative integers. If a number k at an index is positive, then move forward k steps. Conversely, if it's negative (-k), move backward k steps. Since the array is circular, you may assume that the last element's next element is the first element, and the first element's previous element is the last element. - -Determine if there is a loop (or a cycle) in `nums`. A cycle must start and end at the same index and the cycle's length > 1. Furthermore, movements in a cycle must all follow a single direction. In other words, a cycle must not consist of both forward and backward movements. - -**Example 1**: - - Input: [2,-1,1,2,2] - Output: true - Explanation: There is a cycle, from index 0 -> 2 -> 3 -> 0. The cycle's length is 3. - -**Example 2**: - - Input: [-1,2] - Output: false - Explanation: The movement from index 1 -> 1 -> 1 ... is not a cycle, because the cycle's length is 1. By definition the cycle's length must be greater than 1. - -**Example 3**: - - Input: [-2,1,-1,-2,-2] - Output: false - Explanation: The movement from index 1 -> 2 -> 1 -> ... is not a cycle, because movement from index 1 -> 2 is a forward movement, but movement from index 2 -> 1 is a backward movement. All movements in a cycle must follow a single direction. - -**Note**: - -1. -1000 ≤ nums[i] ≤ 1000 -2. nums[i] ≠ 0 -3. 1 ≤ nums.length ≤ 5000 - -**Follow up**: - -Could you solve it in **O(n)** time complexity and **O(1)** extra space complexity? - - -## 题目大意 - -给定一个含有正整数和负整数的环形数组 nums。 如果某个索引中的数 k 为正数,则向前移动 k 个索引。相反,如果是负数 (-k),则向后移动 k 个索引。因为数组是环形的,所以可以假设最后一个元素的下一个元素是第一个元素,而第一个元素的前一个元素是最后一个元素。 - -确定 nums 中是否存在循环(或周期)。循环必须在相同的索引处开始和结束并且循环长度 > 1。此外,一个循环中的所有运动都必须沿着同一方向进行。换句话说,一个循环中不能同时包括向前的运动和向后的运动。 - -提示: - -- -1000 ≤ nums[i] ≤ 1000 -- nums[i] ≠ 0 -- 1 ≤ nums.length ≤ 5000 - -进阶: - -- 你能写出时间时间复杂度为 O(n) 和额外空间复杂度为 O(1) 的算法吗? - -## 解题思路 - - -- 给出一个循环数组,数组的数字代表了前进和后退的步数,+ 代表往右(前进),- 代表往左(后退)。问这个循环数组中是否存在一个循环,并且这个循环内不能只有一个元素,循环的方向都必须是同方向的。 -- 遇到循环就可以优先考虑用快慢指针的方法判断循环,这一题对循环增加了一个条件,循环不能只是单元素的循环,所以在快慢指针中加入这个判断条件。还有一个判断条件是循环的方向必须是同向的,这个简单,用 `num[i] * num[j] > 0` 就可以判断出是同向的(如果是反向的,那么两者的乘积必然是负数),如果没有找到循环,可以将当前已经走过的路径上的 num[] 值都置为 0,标记已经访问过了。下次循环遇到访问过的元素,`num[i] * num[j] > 0` 就会是 0,提前退出找循环的过程。 - - -## 代码 - -```go - -package leetcode - -func circularArrayLoop(nums []int) bool { - if len(nums) == 0 { - return false - } - for i := 0; i < len(nums); i++ { - if nums[i] == 0 { - continue - } - // slow/fast pointer - slow, fast, val := i, getNextIndex(nums, i), 0 - for nums[fast]*nums[i] > 0 && nums[getNextIndex(nums, fast)]*nums[i] > 0 { - if slow == fast { - // check for loop with only one element - if slow == getNextIndex(nums, slow) { - break - } - return true - } - slow = getNextIndex(nums, slow) - fast = getNextIndex(nums, getNextIndex(nums, fast)) - } - // loop not found, set all element along the way to 0 - slow, val = i, nums[i] - for nums[slow]*val > 0 { - next := getNextIndex(nums, slow) - nums[slow] = 0 - slow = next - } - } - return false -} - -func getNextIndex(nums []int, index int) int { - return ((nums[index]+index)%len(nums) + len(nums)) % len(nums) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0461.Hamming-Distance.md b/website/content/ChapterFour/0461.Hamming-Distance.md deleted file mode 100755 index 9d0d75c0b..000000000 --- a/website/content/ChapterFour/0461.Hamming-Distance.md +++ /dev/null @@ -1,53 +0,0 @@ -# [461. Hamming Distance](https://leetcode.com/problems/hamming-distance/) - -## 题目 - -The [Hamming distance](https://en.wikipedia.org/wiki/Hamming_distance) between two integers is the number of positions at which the corresponding bits are different. - -Given two integers `x` and `y`, calculate the Hamming distance. - -**Note**: 0 ≤ `x`, `y` < 231. - -**Example**: - - Input: x = 1, y = 4 - - Output: 2 - - Explanation: - 1 (0 0 0 1) - 4 (0 1 0 0) - ↑ ↑ - - The above arrows point to positions where the corresponding bits are different. - - -## 题目大意 - -两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。 - -注意: -0 ≤ x, y < 231. - - - -## 解题思路 - -- 求 2 个数的海明距离。海明距离的定义是两个数二进制位不同的总个数。这一题利用的位操作的是 X &= (X - 1) 不断的清除最低位的 1 。先将这两个数异或,异或以后清除低位的 1 就是最终答案。 - - -## 代码 - -```go - -package leetcode - -func hammingDistance(x int, y int) int { - distance := 0 - for xor := x ^ y; xor != 0; xor &= (xor - 1) { - distance++ - } - return distance -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0463.Island-Perimeter.md b/website/content/ChapterFour/0463.Island-Perimeter.md deleted file mode 100755 index 7a319887a..000000000 --- a/website/content/ChapterFour/0463.Island-Perimeter.md +++ /dev/null @@ -1,71 +0,0 @@ -# [463. Island Perimeter](https://leetcode.com/problems/island-perimeter/) - -## 题目 - -You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represents water. - -Grid cells are connected horizontally/vertically (not diagonally). The grid is completely surrounded by water, and there is exactly one island (i.e., one or more connected land cells). - -The island doesn't have "lakes" (water inside that isn't connected to the water around the island). One cell is a square with side length 1. The grid is rectangular, width and height don't exceed 100. Determine the perimeter of the island. - -**Example**: - - Input: - [[0,1,0,0], - [1,1,1,0], - [0,1,0,0], - [1,1,0,0]] - - Output: 16 - - Explanation: The perimeter is the 16 yellow stripes in the image below: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/island.png) - - -## 题目大意 - -给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。 - -网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。 - -岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。 - - - -## 解题思路 - -- 给出一个二维数组,二维数组中有一些连在一起的 1 ,这是一个岛屿,求这个岛屿的周长。 -- 这是一道水题,判断四周边界的情况依次加一即可。 - - -## 代码 - -```go - -package leetcode - -func islandPerimeter(grid [][]int) int { - counter := 0 - for i := 0; i < len(grid); i++ { - for j := 0; j < len(grid[0]); j++ { - if grid[i][j] == 1 { - if i-1 < 0 || grid[i-1][j] == 0 { - counter++ - } - if i+1 >= len(grid) || grid[i+1][j] == 0 { - counter++ - } - if j-1 < 0 || grid[i][j-1] == 0 { - counter++ - } - if j+1 >= len(grid[0]) || grid[i][j+1] == 0 { - counter++ - } - } - } - } - return counter -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0470.Implement-Rand10-Using-Rand7.md b/website/content/ChapterFour/0470.Implement-Rand10-Using-Rand7.md deleted file mode 100755 index 1c650ca33..000000000 --- a/website/content/ChapterFour/0470.Implement-Rand10-Using-Rand7.md +++ /dev/null @@ -1,100 +0,0 @@ -# [470. Implement Rand10() Using Rand7()](https://leetcode.com/problems/implement-rand10-using-rand7/) - - -## 题目 - -Given a function `rand7` which generates a uniform random integer in the range 1 to 7, write a function `rand10` which generates a uniform random integer in the range 1 to 10. - -Do NOT use system's `Math.random()`. - -**Example 1**: - - Input: 1 - Output: [7] - -**Example 2**: - - Input: 2 - Output: [8,4] - -**Example 3**: - - Input: 3 - Output: [8,1,10] - -**Note**: - -1. `rand7` is predefined. -2. Each testcase has one argument: `n`, the number of times that `rand10` is called. - -**Follow up**: - -1. What is the [expected value](https://en.wikipedia.org/wiki/Expected_value) for the number of calls to `rand7()` function? -2. Could you minimize the number of calls to `rand7()`? - - -## 题目大意 - -已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。 - - -提示: - -- rand7 已定义。 -- 传入参数: n 表示 rand10 的调用次数。 - - -进阶: - -- rand7()调用次数的 期望值 是多少 ? -- 你能否尽量少调用 rand7() ? - - - -## 解题思路 - - -- 给出 `rand7()` 要求实现 `rand10()`。 -- `rand7()` 等概率地产生1,2,3,4,5,6,7。要想得到 `rand10()` 即等概率的生成 1-10 。解题思路是先构造一个 `randN()`,这个 N 必须是 10 的整数倍,然后 randN % 10 就可以得到 `rand10()` 了。所以可以从 `rand7()` 先构造出 `rand49()`,再把 `rand49()` 中大于等于 40 的都过滤掉,这样就得到了 `rand40()`,在对 10 取余即可。 -- 具体构造步骤,`rand7() --> rand49() --> rand40() --> rand10()`: - 1. `rand7()` 等概率地产生 1,2,3,4,5,6,7. - 2. `rand7() - 1` 等概率地产生 [0,6]. - 3. `(rand7() - 1) *7` 等概率地产生 0, 7, 14, 21, 28, 35, 42 - 4. `(rand7() - 1) * 7 + (rand7() - 1)` 等概率地产生 [0, 48] 这 49 个数字 - 5. 如果步骤 4 的结果大于等于 40,那么就重复步骤 4,直到产生的数小于 40 - 6. 把步骤 5 的结果 mod 10 再加 1, 就会等概率的随机生成 [1, 10] -- 这道题可以推广到生成任意数的随机数问题。用 `randN()` 实现 `randM()`,`M>N`。步骤如下: - 1. 用 `randN()` 先实现 `randX()`,其中 X ≥ M,X 是 M 的整数倍。如这题中的 49 > 10; - 2. 再用 `randX()` 生成 `randM()`,如这题中的 49 —> 40 —> 10。 -- 举个例子,用 `rand3()` 生成 `rand11()`,可以先生成 `rand27()`,然后变成以 22 为界限,因为 22 是 11 的倍数。生成 `rand27()` 的方式:`3 * 3 * (rand3() - 1) + 3 * (rand3() - 1) + (rand3() - 1)`,最后生成了 `rand11()`;用 `rand7()` 生成 `rand9()`,可以先生成 `rand49()`,然后变成以 45 为界限,因为 45 是 9 的倍数。生成 `rand49()` 的方式:`(rand7() - 1) * 7 + (rand7() - 1)`,最后生成了 `rand9()`;用 `rand6()` 生成 `rand13()`,可以先生成 `rand36()`,然后变成以 26 为界限,因为 26 是 13 的倍数。生成 `rand36()` 的方式:`(rand6() - 1) * 6 + (rand6() - 1)`,最后生成了 `rand13()`; - - -## 代码 - -```go - -package leetcode - -import "math/rand" - -func rand10() int { - rand10 := 10 - for rand10 >= 10 { - rand10 = (rand7() - 1) + rand7() - } - return rand10%10 + 1 -} - -func rand7() int { - return rand.Intn(7) -} - -func rand101() int { - rand40 := 40 - for rand40 >= 40 { - rand40 = (rand7()-1)*7 + rand7() - 1 - } - return rand40%10 + 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0474.Ones-and-Zeroes.md b/website/content/ChapterFour/0474.Ones-and-Zeroes.md deleted file mode 100755 index 65e293924..000000000 --- a/website/content/ChapterFour/0474.Ones-and-Zeroes.md +++ /dev/null @@ -1,78 +0,0 @@ -# [474. Ones and Zeroes](https://leetcode.com/problems/ones-and-zeroes/) - - -## 题目 - -In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue. - -For now, suppose you are a dominator of **m** `0s` and **n** `1s` respectively. On the other hand, there is an array with strings consisting of only `0s` and `1s`. - -Now your task is to find the maximum number of strings that you can form with given **m**`0s` and **n** `1s`. Each `0` and `1` can be used at most **once**. - -**Note**: - -1. The given numbers of `0s` and `1s` will both not exceed `100` -2. The size of given string array won't exceed `600`. - -**Example 1**: - - Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3 - Output: 4 - - Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are “10,”0001”,”1”,”0” - -**Example 2**: - - Input: Array = {"10", "0", "1"}, m = 1, n = 1 - Output: 2 - - Explanation: You could form "10", but then you'd have nothing left. Better form "0" and "1". - - -## 题目大意 - -在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次。 - -注意: - -1. 给定 0 和 1 的数量都不会超过 100。 -2. 给定字符串数组的长度不会超过 600。 - - - -## 解题思路 - -- 给定一个字符串数组和 m,n,其中所有的字符都是由 0 和 1 组成的。问能否从数组中取出最多的字符串,使得这些取出的字符串中所有的 0 的个数 ≤ m,1 的个数 ≤ n。 -- 这一题是典型的 01 背包的题型。只不过是一个二维的背包问题。在 n 个物品中选出一定物品,**尽量完全填满** m 维和 n 维的背包。为什么是尽量填满?因为不一定能完全填满背包。 -- `dp[i][j]` 代表尽量填满容量为 `(i,j)` 的背包装下的物品总数,状态转移方程为 `dp[i][j] = max(dp[i][j], 1+dp[i-zero][j-one])`。其中 zero 代表的当前装入物品在 m 维上的体积,也即 0 的个数。one 代表的是当前装入物品在 n 维上的体积,也即 1 的个数。每添加一个物品,比较当前 (i,j) 的背包装下的物品总数和 (i-zero,j-one) 的背包装下的物品总数 + 1,比较这两者的大小,保存两者的最大值。每添加一个物品就刷新这个二维背包,直到所有物品都扫完一遍。dp[m][n] 中存储的就是最终的答案。时间复杂度 `O( n * M * N )`。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func findMaxForm(strs []string, m int, n int) int { - dp := make([][]int, m+1) - for i := 0; i < m+1; i++ { - dp[i] = make([]int, n+1) - } - for _, s := range strs { - zero := strings.Count(s, "0") - one := len(s) - zero - if zero > m || one > n { - continue - } - for i := m; i >= zero; i-- { - for j := n; j >= one; j-- { - dp[i][j] = max(dp[i][j], 1+dp[i-zero][j-one]) - } - } - } - return dp[m][n] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0475.Heaters.md b/website/content/ChapterFour/0475.Heaters.md deleted file mode 100755 index bbe46ca73..000000000 --- a/website/content/ChapterFour/0475.Heaters.md +++ /dev/null @@ -1,122 +0,0 @@ -# [475. Heaters](https://leetcode.com/problems/heaters/) - -## 题目 - -Winter is coming! Your first job during the contest is to design a standard heater with fixed warm radius to warm all the houses. - -Now, you are given positions of houses and heaters on a horizontal line, find out minimum radius of heaters so that all houses could be covered by those heaters. - -So, your input will be the positions of houses and heaters seperately, and your expected output will be the minimum radius standard of heaters. - -**Note**: - -1. Numbers of houses and heaters you are given are non-negative and will not exceed 25000. -2. Positions of houses and heaters you are given are non-negative and will not exceed 10^9. -3. As long as a house is in the heaters' warm radius range, it can be warmed. -4. All the heaters follow your radius standard and the warm radius will the same. - -**Example 1**: - - Input: [1,2,3],[2] - Output: 1 - Explanation: The only heater was placed in the position 2, and if we use the radius 1 standard, then all the houses can be warmed. - -**Example 2**: - - Input: [1,2,3,4],[1,4] - Output: 1 - Explanation: The two heater was placed in the position 1 and 4. We need to use radius 1 standard, then all the houses can be warmed. - - - -## 题目大意 - - -冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。现在,给出位于一条水平线上的房屋和供暖器的位置,找到可以覆盖所有房屋的最小加热半径。所以,你的输入将会是房屋和供暖器的位置。你将输出供暖器的最小加热半径。 - -说明: - -- 给出的房屋和供暖器的数目是非负数且不会超过 25000。 -- 给出的房屋和供暖器的位置均是非负数且不会超过10^9。 -- 只要房屋位于供暖器的半径内(包括在边缘上),它就可以得到供暖。 -- 所有供暖器都遵循你的半径标准,加热的半径也一样。 - - - -## 解题思路 - - -- 给出一个房子坐标的数组,和一些供暖器坐标的数组,分别表示房子的坐标和供暖器的坐标。要求找到供暖器最小的半径能使得所有的房子都能享受到暖气。 -- 这一题可以用暴力的解法,暴力解法依次遍历每个房子的坐标,再遍历每个供暖器,找到距离房子最近的供暖器坐标。在所有这些距离的长度里面找到最大值,这个距离的最大值就是供暖器半径的最小值。时间复杂度 O(n^2)。 -- 这一题最优解是二分搜索。在查找距离房子最近的供暖器的时候,先将供暖器排序,然后用二分搜索的方法查找。其他的做法和暴力解法一致。时间复杂度 O(n log n)。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - "sort" -) - -func findRadius(houses []int, heaters []int) int { - minRad := 0 - sort.Ints(heaters) - for _, house := range houses { - // 遍历房子的坐标,维护 heaters 的最小半径 - heater := findClosestHeater(house, heaters) - rad := heater - house - if rad < 0 { - rad = -rad - } - if rad > minRad { - minRad = rad - } - } - return minRad - -} - -// 二分搜索 -func findClosestHeater(pos int, heaters []int) int { - low, high := 0, len(heaters)-1 - if pos < heaters[low] { - return heaters[low] - } - if pos > heaters[high] { - return heaters[high] - } - for low <= high { - mid := low + (high-low)>>1 - if pos == heaters[mid] { - return heaters[mid] - } else if pos < heaters[mid] { - high = mid - 1 - } else { - low = mid + 1 - } - } - // 判断距离两边的 heaters 哪个更近 - if pos-heaters[high] < heaters[low]-pos { - return heaters[high] - } - return heaters[low] -} - -// 解法二 暴力搜索 -func findRadius1(houses []int, heaters []int) int { - res := 0 - for i := 0; i < len(houses); i++ { - dis := math.MaxInt64 - for j := 0; j < len(heaters); j++ { - dis = min(dis, abs(houses[i]-heaters[j])) - } - res = max(res, dis) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0476.Number-Complement.md b/website/content/ChapterFour/0476.Number-Complement.md deleted file mode 100755 index 1bc61a9e9..000000000 --- a/website/content/ChapterFour/0476.Number-Complement.md +++ /dev/null @@ -1,68 +0,0 @@ -# [476. Number Complement](https://leetcode.com/problems/number-complement/) - - -## 题目 - -Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation. - -**Note**: - -1. The given integer is guaranteed to fit within the range of a 32-bit signed integer. -2. You could assume no leading zero bit in the integer’s binary representation. - -**Example 1**: - - Input: 5 - Output: 2 - Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2. - -**Example 2**: - - Input: 1 - Output: 0 - Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0. - - -## 题目大意 - -给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。 - -注意: - -给定的整数保证在32位带符号整数的范围内。 -你可以假定二进制数不包含前导零位。 - - - -## 解题思路 - - -- 求一个正数的补数,补数的定义是对该数的二进制表示取反。当前不能改变符号位。按照题意构造相应的 mask 再取反即可。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 -func findComplement(num int) int { - xx := ^0 // ^0 = 1111111111111111111111 - for xx&num > 0 { - xx <<= 1 // 构造出来的 xx = 1111111…000000,0 的个数就是 num 的长度 - } - return ^xx ^ num // xx ^ num,结果是前面的 0 全是 1 的num,再取反即是答案 -} - -// 解法二 -func findComplement1(num int) int { - temp := 1 - for temp <= num { - temp <<= 1 // 构造出来的 temp = 00000……10000,末尾 0 的个数是 num 的长度 - } - return (temp - 1) ^ num // temp - 1 即是前面都是 0,num 长度的末尾都是 1 的数,再异或 num 即是最终结果 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0477.Total-Hamming-Distance.md b/website/content/ChapterFour/0477.Total-Hamming-Distance.md deleted file mode 100755 index f3e64a051..000000000 --- a/website/content/ChapterFour/0477.Total-Hamming-Distance.md +++ /dev/null @@ -1,66 +0,0 @@ -# [477. Total Hamming Distance](https://leetcode.com/problems/total-hamming-distance/) - - -## 题目 - -The [Hamming distance](https://en.wikipedia.org/wiki/Hamming_distance) between two integers is the number of positions at which the corresponding bits are different. - -Now your job is to find the total Hamming distance between all pairs of the given numbers. - -**Example**: - - Input: 4, 14, 2 - - Output: 6 - - Explanation: In binary representation, the 4 is 0100, 14 is 1110, and 2 is 0010 (just - showing the four bits relevant in this case). So the answer will be: - HammingDistance(4, 14) + HammingDistance(4, 2) + HammingDistance(14, 2) = 2 + 2 + 2 = 6. - -**Note**: - -1. Elements of the given array are in the range of `0` to `10^9` -2. Length of the array will not exceed `10^4`. - - -## 题目大意 - -两个整数的[汉明距离](https://baike.baidu.com/item/%E6%B1%89%E6%98%8E%E8%B7%9D%E7%A6%BB/475174?fr=aladdin)指的是这两个数字的二进制数对应位不同的数量。计算一个数组中,任意两个数之间汉明距离的总和。 - - -## 解题思路 - -- 计算一个数组内两两元素的海明距离总和。海明距离的定义是两个数二进制位不同的总个数。那么可以把数组中的每个元素 32 位的二进制位依次扫一遍,当扫到某一位上的时候,有 k 个元素在这个位上的值是 1,n - k 个元素在这个位上的值是 0,那么在这一位上所有两两元素的海明距离是 k*(n-k) ,当把 32 位全部都扫完以后,累加出来的海明距离就是所有两两元素的海明距离。 - - - -## 代码 - -```go - -package leetcode - -func totalHammingDistance(nums []int) int { - total, n := 0, len(nums) - for i := 0; i < 32; i++ { - bitCount := 0 - for j := 0; j < n; j++ { - bitCount += (nums[j] >> uint(i)) & 1 - } - total += bitCount * (n - bitCount) - } - return total -} - -// 暴力解法超时! -func totalHammingDistance1(nums []int) int { - res := 0 - for i := 0; i < len(nums); i++ { - for j := i + 1; j < len(nums); j++ { - res += hammingDistance(nums[i], nums[j]) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0480.Sliding-Window-Median.md b/website/content/ChapterFour/0480.Sliding-Window-Median.md deleted file mode 100755 index 23499f930..000000000 --- a/website/content/ChapterFour/0480.Sliding-Window-Median.md +++ /dev/null @@ -1,276 +0,0 @@ -# [480. Sliding Window Median](https://leetcode.com/problems/sliding-window-median/) - - - -## 题目 - -Median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value. So the median is the mean of the two middle value. - -**Examples**: - -`[2,3,4]` , the median is `3` - -`[2,3]`, the median is `(2 + 3) / 2 = 2.5` - -Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position. Your job is to output the median array for each window in the original array. - -For example, - -Given nums = `[1,3,-1,-3,5,3,6,7]`, and k = 3. - - Window position Median - --------------- ----- - [1 3 -1] -3 5 3 6 7 1 - 1 [3 -1 -3] 5 3 6 7 -1 - 1 3 [-1 -3 5] 3 6 7 -1 - 1 3 -1 [-3 5 3] 6 7 3 - 1 3 -1 -3 [5 3 6] 7 5 - 1 3 -1 -3 5 [3 6 7] 6 - -Therefore, return the median sliding window as `[1,-1,-1,3,5,6]`. - -**Note**:  - -You may assume `k` is always valid, ie: `k` is always smaller than input array's size for non-empty array. - - -## 题目大意 - -中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。 - -例如: - -[2,3,4],中位数是 3 - -[2,3],中位数是 (2 + 3) / 2 = 2.5 - -给出一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。 - - - -## 解题思路 - - -- 给定一个数组和一个窗口为 K 的窗口,当窗口从数组的左边滑动到数组右边的时候,输出每次移动窗口以后,在窗口内的排序之后中间大小的值。 -- 这一题是第 239 题的升级版。 -- 这道题最暴力的方法就是将窗口内的元素都排序,时间复杂度 O(n * K)。 -- 另一种思路是用两个优先队列,大顶堆里面的元素都比小顶堆里面的元素小。小顶堆里面存储排序以后中间靠后的值大的元素,大顶堆里面存储排序以后中间靠前的值小的元素。如果 k 是偶数,那么两个堆都有 k/2 个元素,中间值就是两个堆顶的元素;如果 k 是奇数,那么小顶堆比大顶堆多一个元素,中间值就是小顶堆的堆顶元素。删除一个元素,元素都标记到删除的堆中,取 top 的时候注意需要取出没有删除的元素。时间复杂度 O(n * log k) 空间复杂度 O(k) - - -## 代码 - -```go - -package leetcode - -import ( - "container/heap" - "container/list" - "sort" -) - -// 解法一 用链表按照题意实现 时间复杂度 O(n * k) 空间复杂度 O(k) -func medianSlidingWindow(nums []int, k int) []float64 { - var res []float64 - w := getWindowList(nums[:k], k) - res = append(res, getMedian(w, k)) - - for p1 := k; p1 < len(nums); p1++ { - w = removeFromWindow(w, nums[p1-k]) - w = insertInWindow(w, nums[p1]) - res = append(res, getMedian(w, k)) - } - return res -} - -func getWindowList(nums []int, k int) *list.List { - s := make([]int, k) - copy(s, nums) - sort.Ints(s) - l := list.New() - for _, n := range s { - l.PushBack(n) - } - return l -} - -func removeFromWindow(w *list.List, n int) *list.List { - for e := w.Front(); e != nil; e = e.Next() { - if e.Value.(int) == n { - w.Remove(e) - return w - } - } - return w -} - -func insertInWindow(w *list.List, n int) *list.List { - for e := w.Front(); e != nil; e = e.Next() { - if e.Value.(int) >= n { - w.InsertBefore(n, e) - return w - } - } - w.PushBack(n) - return w -} - -func getMedian(w *list.List, k int) float64 { - e := w.Front() - for i := 0; i < k/2; e, i = e.Next(), i+1 { - } - if k%2 == 1 { - return float64(e.Value.(int)) - } - p := e.Prev() - return (float64(e.Value.(int)) + float64(p.Value.(int))) / 2 -} - -// 解法二 用两个堆实现 时间复杂度 O(n * log k) 空间复杂度 O(k) -// 用两个堆记录窗口内的值 -// 大顶堆里面的元素都比小顶堆里面的元素小 -// 如果 k 是偶数,那么两个堆都有 k/2 个元素,中间值就是两个堆顶的元素 -// 如果 k 是奇数,那么小顶堆比大顶堆多一个元素,中间值就是小顶堆的堆顶元素 -// 删除一个元素,元素都标记到删除的堆中,取 top 的时候注意需要取出没有删除的元素 -func medianSlidingWindow1(nums []int, k int) []float64 { - ans := []float64{} - minH := MinHeapR{} - maxH := MaxHeapR{} - if minH.Len() > maxH.Len()+1 { - maxH.Push(minH.Pop()) - } else if minH.Len() < maxH.Len() { - minH.Push(maxH.Pop()) - } - for i := range nums { - if minH.Len() == 0 || nums[i] >= minH.Top() { - minH.Push(nums[i]) - } else { - maxH.Push(nums[i]) - } - if i >= k { - if nums[i-k] >= minH.Top() { - minH.Remove(nums[i-k]) - } else { - maxH.Remove(nums[i-k]) - } - } - if minH.Len() > maxH.Len()+1 { - maxH.Push(minH.Pop()) - } else if minH.Len() < maxH.Len() { - minH.Push(maxH.Pop()) - } - if minH.Len()+maxH.Len() == k { - if k%2 == 0 { - ans = append(ans, float64(minH.Top()+maxH.Top())/2.0) - } else { - ans = append(ans, float64(minH.Top())) - } - } - // fmt.Printf("%+v, %+v\n", minH, maxH) - } - return ans -} - -// IntHeap define -type IntHeap struct { - data []int -} - -// Len define -func (h IntHeap) Len() int { return len(h.data) } - -// Swap define -func (h IntHeap) Swap(i, j int) { h.data[i], h.data[j] = h.data[j], h.data[i] } - -// Push define -func (h *IntHeap) Push(x interface{}) { h.data = append(h.data, x.(int)) } - -// Pop define -func (h *IntHeap) Pop() interface{} { - x := h.data[h.Len()-1] - h.data = h.data[0 : h.Len()-1] - return x -} - -// Top defines -func (h IntHeap) Top() int { - return h.data[0] -} - -// MinHeap define -type MinHeap struct { - IntHeap -} - -// Less define -func (h MinHeap) Less(i, j int) bool { return h.data[i] < h.data[j] } - -// MaxHeap define -type MaxHeap struct { - IntHeap -} - -// Less define -func (h MaxHeap) Less(i, j int) bool { return h.data[i] > h.data[j] } - -// MinHeapR define -type MinHeapR struct { - hp, hpDel MinHeap -} - -// Len define -func (h MinHeapR) Len() int { return h.hp.Len() - h.hpDel.Len() } - -// Top define -func (h *MinHeapR) Top() int { - for h.hpDel.Len() > 0 && h.hp.Top() == h.hpDel.Top() { - heap.Pop(&h.hp) - heap.Pop(&h.hpDel) - } - return h.hp.Top() -} - -// Pop define -func (h *MinHeapR) Pop() int { - x := h.Top() - heap.Pop(&h.hp) - return x -} - -// Push define -func (h *MinHeapR) Push(x int) { heap.Push(&h.hp, x) } - -// Remove define -func (h *MinHeapR) Remove(x int) { heap.Push(&h.hpDel, x) } - -// MaxHeapR define -type MaxHeapR struct { - hp, hpDel MaxHeap -} - -// Len define -func (h MaxHeapR) Len() int { return h.hp.Len() - h.hpDel.Len() } - -// Top define -func (h *MaxHeapR) Top() int { - for h.hpDel.Len() > 0 && h.hp.Top() == h.hpDel.Top() { - heap.Pop(&h.hp) - heap.Pop(&h.hpDel) - } - return h.hp.Top() -} - -// Pop define -func (h *MaxHeapR) Pop() int { - x := h.Top() - heap.Pop(&h.hp) - return x -} - -// Push define -func (h *MaxHeapR) Push(x int) { heap.Push(&h.hp, x) } - -// Remove define -func (h *MaxHeapR) Remove(x int) { heap.Push(&h.hpDel, x) } - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0483.Smallest-Good-Base.md b/website/content/ChapterFour/0483.Smallest-Good-Base.md deleted file mode 100755 index 117d95c41..000000000 --- a/website/content/ChapterFour/0483.Smallest-Good-Base.md +++ /dev/null @@ -1,138 +0,0 @@ -# [483. Smallest Good Base](https://leetcode.com/problems/smallest-good-base/) - - -## 题目 - -For an integer n, we call k>=2 a **good base** of n, if all digits of n base k are 1. - -Now given a string representing n, you should return the smallest good base of n in string format. - -**Example 1**: - - Input: "13" - Output: "3" - Explanation: 13 base 3 is 111. - -**Example 2**: - - Input: "4681" - Output: "8" - Explanation: 4681 base 8 is 11111. - -**Example 3**: - - Input: "1000000000000000000" - Output: "999999999999999999" - Explanation: 1000000000000000000 base 999999999999999999 is 11. - -**Note**: - -1. The range of n is [3, 10^18]. -2. The string representing n is always valid and will not have leading zeros. - - -## 题目大意 - - -对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。 - -以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。 - -提示: - -- n 的取值范围是 [3, 10^18]。 -- 输入总是有效且没有前导 0。 - - - -## 解题思路 - - -- 给出一个数 n,要求找一个进制 k,使得数字 n 在 k 进制下每一位都是 1 。求最小的进制 k。 -- 这一题等价于求最小的正整数 k,满足存在一个正整数 m 使得 - -

- -

- - -- 这一题需要确定 k 和 m 两个数的值。m 和 k 是有关系的,确定了一个值,另外一个值也确定了。由 - -

- -

- - -可得: - -

- -

- - -根据题意,可以知道 k ≥2,m ≥1 ,所以有: - -

- -

- - -所以 m 的取值范围确定了。那么外层循环从 1 到 log n 遍历。找到一个最小的 k ,能满足: - -可以用二分搜索来逼近找到最小的 k。先找到 k 的取值范围。由 - -

- -

- - -可得, - -

- -

- -所以 k 的取值范围是 [2, n*(1/m) ]。再利用二分搜索逼近找到最小的 k 即为答案。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - "strconv" -) - -func smallestGoodBase(n string) string { - num, _ := strconv.ParseUint(n, 10, 64) - for bit := uint64(math.Log2(float64(num))); bit >= 1; bit-- { - low, high := uint64(2), uint64(math.Pow(float64(num), 1.0/float64(bit))) - for low < high { - mid := uint64(low + (high-low)>>1) - sum := findBase(mid, bit) - if sum == num { - return strconv.FormatUint(mid, 10) - } else if sum > num { - high = mid - 1 - } else { - low = mid + 1 - } - } - } - return strconv.FormatUint(num-1, 10) -} - -// 计算 k^m + k^(m-1) + ... + k + 1 -func findBase(mid, bit uint64) uint64 { - sum, base := uint64(1), uint64(1) - for i := uint64(1); i <= bit; i++ { - base *= mid - sum += base - } - return sum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0485.Max-Consecutive-Ones.md b/website/content/ChapterFour/0485.Max-Consecutive-Ones.md deleted file mode 100644 index 6bd2c40eb..000000000 --- a/website/content/ChapterFour/0485.Max-Consecutive-Ones.md +++ /dev/null @@ -1,59 +0,0 @@ -# [485. Max Consecutive Ones](https://leetcode.com/problems/max-consecutive-ones/) - - -## 题目 - -Given a binary array, find the maximum number of consecutive 1s in this array. - -**Example 1**: - -``` -Input: [1,1,0,1,1,1] -Output: 3 -Explanation: The first two digits or the last three digits are consecutive 1s. - The maximum number of consecutive 1s is 3. -``` - -**Note**: - -- The input array will only contain `0` and `1`. -- The length of input array is a positive integer and will not exceed 10,000 - - -## 题目大意 - -给定一个二进制数组, 计算其中最大连续1的个数。 - -注意: - -- 输入的数组只包含 0 和 1。 -- 输入数组的长度是正整数,且不超过 10,000。 - - -## 解题思路 - -- 给定一个二进制数组, 计算其中最大连续1的个数。 -- 简单题。扫一遍数组,累计 1 的个数,动态维护最大的计数,最终输出即可。 - -## 代码 - -```go - -package leetcode - -func findMaxConsecutiveOnes(nums []int) int { - maxCount, currentCount := 0, 0 - for _, v := range nums { - if v == 1 { - currentCount++ - } else { - currentCount = 0 - } - if currentCount > maxCount { - maxCount = currentCount - } - } - return maxCount -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0491.Increasing-Subsequences.md b/website/content/ChapterFour/0491.Increasing-Subsequences.md deleted file mode 100755 index 9a262bb73..000000000 --- a/website/content/ChapterFour/0491.Increasing-Subsequences.md +++ /dev/null @@ -1,84 +0,0 @@ -# [491. Increasing Subsequences](https://leetcode.com/problems/increasing-subsequences/) - - -## 题目 - -Given an integer array, your task is to find all the different possible increasing subsequences of the given array, and the length of an increasing subsequence should be at least 2. - -**Example**: - - Input: [4, 6, 7, 7] - Output: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] - -**Note**: - -1. The length of the given array will not exceed 15. -2. The range of integer in the given array is [-100,100]. -3. The given array may contain duplicates, and two equal integers should also be considered as a special case of increasing sequence. - - - -## 题目大意 - - -给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是 2。 - -说明: - -1. 给定数组的长度不会超过15。 -2. 数组中的整数范围是 [-100,100]。 -3. 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。 - - - - -## 解题思路 - - -- 给出一个数组,要求找出这个数组中所有长度大于 2 的非递减子序列。子序列顺序和原数组元素下标必须是顺序的,不能是逆序的。 -- 这一题和第 78 题和第 90 题是类似的题目。第 78 题和第 90 题是求所有子序列,这一题在这两题的基础上增加了非递减和长度大于 2 的条件。需要注意的两点是,原数组中元素可能会重复,最终结果输出的时候需要去重。最终结果输出的去重用 map 处理,数组中重复元素用 DFS 遍历搜索。在每次 DFS 中,用 map 记录遍历过的元素,保证本轮 DFS 中不出现重复的元素,递归到下一层还可以选择值相同,但是下标不同的另外一个元素。外层循环也要加一个 map,这个 map 是过滤每组解因为重复元素导致的重复解,经过过滤以后,起点不同了,最终的解也会不同。 -- 这一题和第 78 题,第 90 题类似,可以一起解答和复习。 - - -## 代码 - -```go - -package leetcode - -func findSubsequences(nums []int) [][]int { - c, visited, res := []int{}, map[int]bool{}, [][]int{} - for i := 0; i < len(nums)-1; i++ { - if _, ok := visited[nums[i]]; ok { - continue - } else { - visited[nums[i]] = true - generateIncSubsets(nums, i, c, &res) - } - } - return res -} - -func generateIncSubsets(nums []int, current int, c []int, res *[][]int) { - c = append(c, nums[current]) - if len(c) >= 2 { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - } - visited := map[int]bool{} - for i := current + 1; i < len(nums); i++ { - if nums[current] <= nums[i] { - if _, ok := visited[nums[i]]; ok { - continue - } else { - visited[nums[i]] = true - generateIncSubsets(nums, i, c, res) - } - } - } - c = c[:len(c)-1] - return -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0493.Reverse-Pairs.md b/website/content/ChapterFour/0493.Reverse-Pairs.md deleted file mode 100755 index 6335db07b..000000000 --- a/website/content/ChapterFour/0493.Reverse-Pairs.md +++ /dev/null @@ -1,126 +0,0 @@ -# [493. Reverse Pairs](https://leetcode.com/problems/reverse-pairs/) - - -## 题目 - -Given an array `nums`, we call `(i, j)` an **important reverse pair** if `i < j` and `nums[i] > 2*nums[j]`. - -You need to return the number of important reverse pairs in the given array. - -**Example1:** - - Input: [1,3,2,3,1] - Output: 2 - -**Example2:** - - Input: [2,4,3,5,1] - Output: 3 - -**Note**: - -1. The length of the given array will not exceed `50,000`. -2. All the numbers in the input array are in the range of 32-bit integer. - - -## 题目大意 - -给定一个数组 nums ,如果 i < j 且 nums[i] > 2\*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。 - -注意: - -- 给定数组的长度不会超过 50000。 -- 输入数组中的所有数字都在 32 位整数的表示范围内。 - - -## 解题思路 - - -- 给出一个数组,要求找出满足条件的所有的“重要的反转对” (i,j)。重要的反转对的定义是:`i 2*nums[j]`。 -- 这一题是 327 题的变种题。首先将数组中所有的元素以及各自的 `2*nums[i] + 1` 都放在字典中去重。去重以后再做离散化处理。这一题的测试用例会卡离散化,如果不离散化,Math.MaxInt32 会导致数字溢出,见测试用例中 2147483647, -2147483647 这组测试用例。离散后,映射关系 保存在字典中。从左往右遍历数组,先 query ,再 update ,这个顺序和第 327 题是反的。先 query 查找 `[2*nums[i] + 1, len(indexMap)-1]` 这个区间内满足条件的值,这个区间内的值都是 `> 2*nums[j]` 的。这一题移动的是 `j`,`j` 不断的变化,往线段树中不断插入的是 `i`。每轮循环先 query 一次前一轮循环中累积插入线段树中的 `i`,这些累积在线段树中的代表的是所有在 `j` 前面的 `i`。query 查询的是本轮 `[2*nums[j] + 1, len(indexMap)-1]`,如果能找到,即找到了这样一个 `j`,能满足 `nums[i] > 2*nums[j`, 把整个数组都扫完,累加的 query 出来的 count 计数就是最终答案。 -- 类似的题目:第 327 题,第 315 题。 -- 这一题用线段树并不是最优解,用线段树解这一题是为了训练线段树这个数据结构。最优解是解法二中的 mergesort。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 线段树,时间复杂度 O(n log n) -func reversePairs(nums []int) int { - if len(nums) < 2 { - return 0 - } - st, numsMap, indexMap, numsArray, res := template.SegmentCountTree{}, make(map[int]int, 0), make(map[int]int, 0), []int{}, 0 - numsMap[nums[0]] = nums[0] - for _, num := range nums { - numsMap[num] = num - numsMap[2*num+1] = 2*num + 1 - } - // numsArray 是 prefixSum 去重之后的版本,利用 numsMap 去重 - for _, v := range numsMap { - numsArray = append(numsArray, v) - } - // 排序是为了使得线段树中的区间 left <= right,如果此处不排序,线段树中的区间有很多不合法。 - sort.Ints(numsArray) - // 离散化,构建映射关系 - for i, n := range numsArray { - indexMap[n] = i - } - numsArray = []int{} - // 离散化,此题如果不离散化,MaxInt32 的数据会使得数字越界。 - for i := 0; i < len(indexMap); i++ { - numsArray = append(numsArray, i) - } - // 初始化线段树,节点内的值都赋值为 0,即计数为 0 - st.Init(numsArray, func(i, j int) int { - return 0 - }) - for _, num := range nums { - res += st.Query(indexMap[num*2+1], len(indexMap)-1) - st.UpdateCount(indexMap[num]) - } - return res -} - -// 解法二 mergesort -func reversePairs1(nums []int) int { - buf := make([]int, len(nums)) - return mergesortCount(nums, buf) -} - -func mergesortCount(nums, buf []int) int { - if len(nums) <= 1 { - return 0 - } - mid := (len(nums) - 1) / 2 - cnt := mergesortCount(nums[:mid+1], buf) - cnt += mergesortCount(nums[mid+1:], buf) - for i, j := 0, mid+1; i < mid+1; i++ { // Note!!! j is increasing. - for ; j < len(nums) && nums[i] <= 2*nums[j]; j++ { - } - cnt += len(nums) - j - } - copy(buf, nums) - for i, j, k := 0, mid+1, 0; k < len(nums); { - if j >= len(nums) || i < mid+1 && buf[i] > buf[j] { - nums[k] = buf[i] - i++ - } else { - nums[k] = buf[j] - j++ - } - k++ - } - return cnt -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0494.Target-Sum.md b/website/content/ChapterFour/0494.Target-Sum.md deleted file mode 100644 index dd3c2b103..000000000 --- a/website/content/ChapterFour/0494.Target-Sum.md +++ /dev/null @@ -1,108 +0,0 @@ -# [494. Target Sum](https://leetcode.com/problems/target-sum/) - - -## 题目 - -You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symbols `+` and `-`. For each integer, you should choose one from `+` and `-` as its new symbol. - -Find out how many ways to assign symbols to make sum of integers equal to target S. - -**Example 1**: - -``` -Input: nums is [1, 1, 1, 1, 1], S is 3. -Output: 5 -Explanation: - --1+1+1+1+1 = 3 -+1-1+1+1+1 = 3 -+1+1-1+1+1 = 3 -+1+1+1-1+1 = 3 -+1+1+1+1-1 = 3 - -There are 5 ways to assign symbols to make the sum of nums be target 3. -``` - -**Note**: - -1. The length of the given array is positive and will not exceed 20. -2. The sum of elements in the given array will not exceed 1000. -3. Your output answer is guaranteed to be fitted in a 32-bit integer. - -## 题目大意 - -给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在有两个符号 + 和 -。对于数组中的任意一个整数,可以从 + 或 - 中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 - -提示: - -- 数组非空,且长度不会超过 20 。 -- 初始的数组的和不会超过 1000 。 -- 保证返回的最终结果能被 32 位整数存下。 - -## 解题思路 - -- 给出一个数组,要求在这个数组里面的每个元素前面加上 + 或者 - 号,最终总和等于 S。问有多少种不同的方法。 -- 这一题可以用 DP 和 DFS 解答。DFS 方法就不比较暴力简单了。见代码。这里分析一下 DP 的做法。题目要求在数组元素前加上 + 或者 - 号,其实相当于把数组分成了 2 组,一组全部都加 + 号,一组都加 - 号。记 + 号的一组 P ,记 - 号的一组 N,那么可以推出以下的关系。 - - ```go - sum(P) - sum(N) = target - sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N) - 2 * sum(P) = target + sum(nums) - ``` - - 等号两边都加上 `sum(N) + sum(P)`,于是可以得到结果 `2 * sum(P) = target + sum(nums)`,那么这道题就转换成了,能否在数组中找到这样一个集合,和等于 `(target + sum(nums)) / 2`。那么这题就转化为了第 416 题了。`dp[i]` 中存储的是能使和为 `i` 的方法个数。 - -- 如果和不是偶数,即不能被 2 整除,那说明找不到满足题目要求的解了,直接输出 0 。 - -## 代码 - -```go - -func findTargetSumWays(nums []int, S int) int { - total := 0 - for _, n := range nums { - total += n - } - if S > total || (S+total)%2 == 1 { - return 0 - } - target := (S + total) / 2 - dp := make([]int, target+1) - dp[0] = 1 - for _, n := range nums { - for i := target; i >= n; i-- { - dp[i] += dp[i-n] - } - } - return dp[target] -} - -// 解法二 DFS -func findTargetSumWays1(nums []int, S int) int { - // sums[i] 存储的是后缀和 nums[i:],即从 i 到结尾的和 - sums := make([]int, len(nums)) - sums[len(nums)-1] = nums[len(nums)-1] - for i := len(nums) - 2; i > -1; i-- { - sums[i] = sums[i+1] + nums[i] - } - res := 0 - dfsFindTargetSumWays(nums, 0, 0, S, &res, sums) - return res -} - -func dfsFindTargetSumWays(nums []int, index int, curSum int, S int, res *int, sums []int) { - if index == len(nums) { - if curSum == S { - *(res) = *(res) + 1 - } - return - } - // 剪枝优化:如果 sums[index] 值小于剩下需要正数的值,那么右边就算都是 + 号也无能为力了,所以这里可以剪枝了 - if S-curSum > sums[index] { - return - } - dfsFindTargetSumWays(nums, index+1, curSum+nums[index], S, res, sums) - dfsFindTargetSumWays(nums, index+1, curSum-nums[index], S, res, sums) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0497.Random-Point-in-Non-overlapping-Rectangles.md b/website/content/ChapterFour/0497.Random-Point-in-Non-overlapping-Rectangles.md deleted file mode 100755 index 3c68e0533..000000000 --- a/website/content/ChapterFour/0497.Random-Point-in-Non-overlapping-Rectangles.md +++ /dev/null @@ -1,134 +0,0 @@ -# [497. Random Point in Non-overlapping Rectangles](https://leetcode.com/problems/random-point-in-non-overlapping-rectangles) - - -## 题目 - -Given a list of **non-overlapping** axis-aligned rectangles `rects`, write a function `pick` which randomly and uniformily picks an **integer point** in the space covered by the rectangles. - -**Note**: - -1. An **integer point** is a point that has integer coordinates. -2. A point on the perimeter of a rectangle is **included** in the space covered by the rectangles. -3. `i`th rectangle = `rects[i]` = `[x1,y1,x2,y2]`, where `[x1, y1]` are the integer coordinates of the bottom-left corner, and `[x2, y2]` are the integer coordinates of the top-right corner. -4. length and width of each rectangle does not exceed `2000`. -5. `1 <= rects.length <= 100` -6. `pick` return a point as an array of integer coordinates `[p_x, p_y]` -7. `pick` is called at most `10000` times. - -**Example 1**: - - Input: - ["Solution","pick","pick","pick"] - [[[[1,1,5,5]]],[],[],[]] - Output: - [null,[4,1],[4,1],[3,3]] - -**Example 2**: - - Input: - ["Solution","pick","pick","pick","pick","pick"] - [[[[-2,-2,-1,-1],[1,0,3,0]]],[],[],[],[],[]] - Output: - [null,[-1,-2],[2,0],[-2,-1],[3,0],[-2,-2]] - -**Explanation of Input Syntax:** - -The input is two lists: the subroutines called and their arguments. `Solution`'s constructor has one argument, the array of rectangles `rects`. `pick` has no arguments. Arguments are always wrapped with a list, even if there aren't any. - - -## 题目大意 - -给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点。 - -提示: - -1. 整数点是具有整数坐标的点。 -2. 矩形周边上的点包含在矩形覆盖的空间中。 -3. 第 i 个矩形 rects [i] = [x1,y1,x2,y2],其中 [x1,y1] 是左下角的整数坐标,[x2,y2] 是右上角的整数坐标。 -4. 每个矩形的长度和宽度不超过 2000。 -5. 1 <= rects.length <= 100 -6. pick 以整数坐标数组 [p_x, p_y] 的形式返回一个点。 -7. pick 最多被调用10000次。 - - -输入语法的说明: - -输入是两个列表:调用的子例程及其参数。Solution 的构造函数有一个参数,即矩形数组 rects。pick 没有参数。参数总是用列表包装的,即使没有也是如此。 - - -## 解题思路 - - -- 给出一个非重叠轴对齐矩形列表,每个矩形用左下角和右上角的两个坐标表示。要求 `pick()` 随机均匀地选取矩形覆盖的空间中的整数点。 -- 这一题是第 528 题的变种题,这一题权重是面积,按权重(面积)选择一个矩形,然后再从矩形中随机选择一个点即可。思路和代码和第 528 题一样。 - - -## 代码 - -```go - -package leetcode - -import "math/rand" - -// Solution497 define -type Solution497 struct { - rects [][]int - arr []int -} - -// Constructor497 define -func Constructor497(rects [][]int) Solution497 { - s := Solution497{ - rects: rects, - arr: make([]int, len(rects)), - } - - for i := 0; i < len(rects); i++ { - area := (rects[i][2] - rects[i][0] + 1) * (rects[i][3] - rects[i][1] + 1) - if area < 0 { - area = -area - } - if i == 0 { - s.arr[0] = area - } else { - s.arr[i] = s.arr[i-1] + area - } - } - return s -} - -// Pick define -func (so *Solution497) Pick() []int { - r := rand.Int() % so.arr[len(so.arr)-1] - //get rectangle first - low, high, index := 0, len(so.arr)-1, -1 - for low <= high { - mid := low + (high-low)>>1 - if so.arr[mid] > r { - if mid == 0 || so.arr[mid-1] <= r { - index = mid - break - } - high = mid - 1 - } else { - low = mid + 1 - } - } - if index == -1 { - index = low - } - if index > 0 { - r = r - so.arr[index-1] - } - length := so.rects[index][2] - so.rects[index][0] - return []int{so.rects[index][0] + r%(length+1), so.rects[index][1] + r/(length+1)} -} - -/** - * Your Solution object will be instantiated and called as such: - * obj := Constructor(rects); - * param_1 := obj.Pick(); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0498.Diagonal-Traverse.md b/website/content/ChapterFour/0498.Diagonal-Traverse.md deleted file mode 100755 index f28348a6b..000000000 --- a/website/content/ChapterFour/0498.Diagonal-Traverse.md +++ /dev/null @@ -1,184 +0,0 @@ -# [498. Diagonal Traverse](https://leetcode.com/problems/diagonal-traverse/) - - -## 题目 - -Given a matrix of M x N elements (M rows, N columns), return all elements of the matrix in diagonal order as shown in the below image. - -**Example**: - - Input: - [ - [ 1, 2, 3 ], - [ 4, 5, 6 ], - [ 7, 8, 9 ] - ] - - Output: [1,2,4,7,5,3,6,8,9] - - Explanation: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/diagonal_traverse.png) - -**Note**: - -The total number of elements of the given matrix will not exceed 10,000. - - -## 题目大意 - -给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。 - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/diagonal_traverse.png) - -说明: 给定矩阵中的元素总数不会超过 100000 。 - -## 解题思路 - -- 给出一个二维数组,要求按照如图的方式遍历整个数组。 -- 这一题用模拟的方式就可以解出来。需要注意的是边界条件:比如二维数组为空,二维数组退化为一行或者一列,退化为一个元素。具体例子见测试用例。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func findDiagonalOrder1(matrix [][]int) []int { - if matrix == nil || len(matrix) == 0 || len(matrix[0]) == 0 { - return nil - } - row, col, dir, i, x, y, d := len(matrix), len(matrix[0]), [2][2]int{ - {-1, 1}, - {1, -1}, - }, 0, 0, 0, 0 - total := row * col - res := make([]int, total) - for i < total { - for x >= 0 && x < row && y >= 0 && y < col { - res[i] = matrix[x][y] - i++ - x += dir[d][0] - y += dir[d][1] - } - d = (d + 1) % 2 - if x == row { - x-- - y += 2 - } - if y == col { - y-- - x += 2 - } - if x < 0 { - x = 0 - } - if y < 0 { - y = 0 - } - } - return res -} - -// 解法二 -func findDiagonalOrder(matrix [][]int) []int { - if len(matrix) == 0 { - return []int{} - } - if len(matrix) == 1 { - return matrix[0] - } - // dir = 0 代表从右上到左下的方向, dir = 1 代表从左下到右上的方向 dir = -1 代表上一次转变了方向 - m, n, i, j, dir, res := len(matrix), len(matrix[0]), 0, 0, 0, []int{} - for index := 0; index < m*n; index++ { - if dir == -1 { - if (i == 0 && j < n-1) || (j == n-1) { // 上边界和右边界 - i++ - if j > 0 { - j-- - } - dir = 0 - addTraverse(matrix, i, j, &res) - continue - } - if (j == 0 && i < m-1) || (i == m-1) { // 左边界和下边界 - if i > 0 { - i-- - } - j++ - dir = 1 - addTraverse(matrix, i, j, &res) - continue - } - } - if i == 0 && j == 0 { - res = append(res, matrix[i][j]) - if j < n-1 { - j++ - dir = -1 - addTraverse(matrix, i, j, &res) - continue - } else { - if i < m-1 { - i++ - dir = -1 - addTraverse(matrix, i, j, &res) - continue - } - } - } - if i == 0 && j < n-1 { // 上边界 - if j < n-1 { - j++ - dir = -1 - addTraverse(matrix, i, j, &res) - continue - } - } - if j == 0 && i < m-1 { // 左边界 - if i < m-1 { - i++ - dir = -1 - addTraverse(matrix, i, j, &res) - continue - } - } - if j == n-1 { // 右边界 - if i < m-1 { - i++ - dir = -1 - addTraverse(matrix, i, j, &res) - continue - } - } - if i == m-1 { // 下边界 - j++ - dir = -1 - addTraverse(matrix, i, j, &res) - continue - } - if dir == 1 { - i-- - j++ - addTraverse(matrix, i, j, &res) - continue - } - if dir == 0 { - i++ - j-- - addTraverse(matrix, i, j, &res) - continue - } - } - return res -} - -func addTraverse(matrix [][]int, i, j int, res *[]int) { - if i >= 0 && i <= len(matrix)-1 && j >= 0 && j <= len(matrix[0])-1 { - *res = append(*res, matrix[i][j]) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0500.Keyboard-Row.md b/website/content/ChapterFour/0500.Keyboard-Row.md deleted file mode 100755 index 6d6eda08f..000000000 --- a/website/content/ChapterFour/0500.Keyboard-Row.md +++ /dev/null @@ -1,62 +0,0 @@ -# [500. Keyboard Row](https://leetcode.com/problems/keyboard-row/) - - -## 题目 - -Given a List of words, return the words that can be typed using letters of **alphabet** on only one row's of American keyboard like the image below. - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/12/keyboard.png) - -**Example**: - - Input: ["Hello", "Alaska", "Dad", "Peace"] - Output: ["Alaska", "Dad"] - -**Note**: - -1. You may use one character in the keyboard more than once. -2. You may assume the input string will only contain letters of alphabet. - - -## 题目大意 - -给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如上图所示。 - -## 解题思路 - -- 给出一个字符串数组,要求依次判断数组中的每个字符串是否都位于键盘上的同一个行,如果是就输出。这也是一道水题。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func findWords500(words []string) []string { - rows := []string{"qwertyuiop", "asdfghjkl", "zxcvbnm"} - output := make([]string, 0) - for _, s := range words { - if len(s) == 0 { - continue - } - lowerS := strings.ToLower(s) - oneRow := false - for _, r := range rows { - if strings.ContainsAny(lowerS, r) { - oneRow = !oneRow - if !oneRow { - break - } - } - } - if oneRow { - output = append(output, s) - } - } - return output -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0503.Next-Greater-Element-II.md b/website/content/ChapterFour/0503.Next-Greater-Element-II.md deleted file mode 100644 index a8d5f46c9..000000000 --- a/website/content/ChapterFour/0503.Next-Greater-Element-II.md +++ /dev/null @@ -1,78 +0,0 @@ -# [503. Next Greater Element II](https://leetcode.com/problems/next-greater-element-ii/) - -## 题目 - -Given a circular array (the next element of the last element is the first element of the array), print the Next Greater Number for every element. The Next Greater Number of a number x is the first greater number to its traversing-order next in the array, which means you could search circularly to find its next greater number. If it doesn't exist, output -1 for this number. - -**Example 1**: - -``` - -Input: [1,2,1] -Output: [2,-1,2] -Explanation: The first 1's next greater number is 2; -The number 2 can't find next greater number; -The second 1's next greater number needs to search circularly, which is also 2. - -``` - -**Note**: The length of given array won't exceed 10000. - -## 题目大意 - -题目给出数组 A,针对 A 中的每个数组中的元素,要求在 A 数组中找出比该元素大的数,A 是一个循环数组。如果找到了就输出这个值,如果找不到就输出 -1。 - - -## 解题思路 - -这题是第 496 题的加强版,在第 496 题的基础上增加了循环数组的条件。这一题可以依旧按照第 496 题的做法继续模拟。更好的做法是用单调栈,栈中记录单调递增的下标。 - -## 代码 - -```go - -package leetcode - -// 解法一 单调栈 -func nextGreaterElements(nums []int) []int { - res := make([]int, 0) - indexes := make([]int, 0) - for i := 0; i < len(nums); i++ { - res = append(res, -1) - } - for i := 0; i < len(nums)*2; i++ { - num := nums[i%len(nums)] - for len(indexes) > 0 && nums[indexes[len(indexes)-1]] < num { - index := indexes[len(indexes)-1] - res[index] = num - indexes = indexes[:len(indexes)-1] - } - indexes = append(indexes, i%len(nums)) - } - return res -} - -// 解法二 -func nextGreaterElements1(nums []int) []int { - if len(nums) == 0 { - return []int{} - } - res := []int{} - for i := 0; i < len(nums); i++ { - j, find := (i+1)%len(nums), false - for j != i { - if nums[j] > nums[i] { - find = true - res = append(res, nums[j]) - break - } - j = (j + 1) % len(nums) - } - if !find { - res = append(res, -1) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0507.Perfect-Number.md b/website/content/ChapterFour/0507.Perfect-Number.md deleted file mode 100644 index 12d0c7649..000000000 --- a/website/content/ChapterFour/0507.Perfect-Number.md +++ /dev/null @@ -1,64 +0,0 @@ -# [507. Perfect Number](https://leetcode.com/problems/perfect-number/) - - - -## 题目 - -We define the Perfect Number is a **positive** integer that is equal to the sum of all its **positive** divisors except itself. - -Now, given an - -**integer** - -n, write a function that returns true when it is a perfect number and false when it is not. - -**Example**: - -``` -Input: 28 -Output: True -Explanation: 28 = 1 + 2 + 4 + 7 + 14 -``` - -**Note**: The input number **n** will not exceed 100,000,000. (1e8) - -## 题目大意 - -对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False - -## 解题思路 - -- 给定一个整数,要求判断这个数是不是完美数。整数的取值范围小于 1e8 。 -- 简单题。按照题意描述,先获取这个整数的所有正因子,如果正因子的和等于原来这个数,那么它就是完美数。 -- 这一题也可以打表,1e8 以下的完美数其实并不多,就 5 个。 - -## 代码 - -```go - -package leetcode - -import "math" - -// 方法一 -func checkPerfectNumber(num int) bool { - if num <= 1 { - return false - } - sum, bound := 1, int(math.Sqrt(float64(num)))+1 - for i := 2; i < bound; i++ { - if num%i != 0 { - continue - } - corrDiv := num / i - sum += corrDiv + i - } - return sum == num -} - -// 方法二 打表 -func checkPerfectNumber_(num int) bool { - return num == 6 || num == 28 || num == 496 || num == 8128 || num == 33550336 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0508.Most-Frequent-Subtree-Sum.md b/website/content/ChapterFour/0508.Most-Frequent-Subtree-Sum.md deleted file mode 100755 index 91c2a9a6d..000000000 --- a/website/content/ChapterFour/0508.Most-Frequent-Subtree-Sum.md +++ /dev/null @@ -1,123 +0,0 @@ -# [508. Most Frequent Subtree Sum](https://leetcode.com/problems/most-frequent-subtree-sum/) - - -## 题目 - -Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum of a node is defined as the sum of all the node values formed by the subtree rooted at that node (including the node itself). So what is the most frequent subtree sum value? If there is a tie, return all the values with the highest frequency in any order. - -**Examples 1** - -Input: - - 5 - / \ - 2 -3 - -return [2, -3, 4], since all the values happen only once, return all of them in any order. - -**Examples 2** - -Input: - - 5 - / \ - 2 -5 - -return [2], since 2 happens twice, however -5 only occur once. - -**Note**: You may assume the sum of values in any subtree is in the range of 32-bit signed integer. - - -## 题目大意 - -给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素(不限顺序)。提示: 假设任意子树元素和均可以用 32 位有符号整数表示。 - -## 解题思路 - - -- 给出一个树,要求求出每个节点以自己为根节点的子树的所有节点值的和,最后按照这些和出现的频次,输出频次最多的和,如果频次出现次数最多的对应多个和,则全部输出。 -- 递归找出每个节点的累加和,用 map 记录频次,最后把频次最多的输出即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 维护最大频次,不用排序 -func findFrequentTreeSum(root *TreeNode) []int { - memo := make(map[int]int) - collectSum(root, memo) - res := []int{} - most := 0 - for key, val := range memo { - if most == val { - res = append(res, key) - } else if most < val { - most = val - res = []int{key} - } - } - return res -} - -func collectSum(root *TreeNode, memo map[int]int) int { - if root == nil { - return 0 - } - sum := root.Val + collectSum(root.Left, memo) + collectSum(root.Right, memo) - if v, ok := memo[sum]; ok { - memo[sum] = v + 1 - } else { - memo[sum] = 1 - } - return sum -} - -// 解法二 求出所有和再排序 -func findFrequentTreeSum1(root *TreeNode) []int { - if root == nil { - return []int{} - } - freMap, freList, reFreMap := map[int]int{}, []int{}, map[int][]int{} - findTreeSum(root, freMap) - for k, v := range freMap { - tmp := reFreMap[v] - tmp = append(tmp, k) - reFreMap[v] = tmp - } - for k := range reFreMap { - freList = append(freList, k) - } - sort.Ints(freList) - return reFreMap[freList[len(freList)-1]] -} - -func findTreeSum(root *TreeNode, fre map[int]int) int { - if root == nil { - return 0 - } - if root != nil && root.Left == nil && root.Right == nil { - fre[root.Val]++ - return root.Val - } - val := findTreeSum(root.Left, fre) + findTreeSum(root.Right, fre) + root.Val - fre[val]++ - return val -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0509.Fibonacci-Number.md b/website/content/ChapterFour/0509.Fibonacci-Number.md deleted file mode 100755 index ee3046077..000000000 --- a/website/content/ChapterFour/0509.Fibonacci-Number.md +++ /dev/null @@ -1,171 +0,0 @@ -# [509. Fibonacci Number](https://leetcode.com/problems/fibonacci-number/) - - -## 题目 - -The **Fibonacci numbers**, commonly denoted `F(n)` form a sequence, called the **Fibonacci sequence**, such that each number is the sum of the two preceding ones, starting from `0` and `1`. That is, - - F(0) = 0,   F(1) = 1 - F(N) = F(N - 1) + F(N - 2), for N > 1. - -Given `N`, calculate `F(N)`. - -**Example 1**: - - Input: 2 - Output: 1 - Explanation: F(2) = F(1) + F(0) = 1 + 0 = 1. - -**Example 2**: - - Input: 3 - Output: 2 - Explanation: F(3) = F(2) + F(1) = 1 + 1 = 2. - -**Example 3**: - - Input: 4 - Output: 3 - Explanation: F(4) = F(3) + F(2) = 2 + 1 = 3. - -**Note**: - -0 ≤ `N` ≤ 30. - - -## 题目大意 - -斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: - -``` -F(0) = 0, F(1) = 1 -F(N) = F(N - 1) + F(N - 2), 其中 N > 1. -``` - -给定 N,计算 F(N)。 - -提示:0 ≤ N ≤ 30 - -## 解题思路 - - -- 求斐波那契数列 -- 这一题解法很多,大的分类是四种,递归,记忆化搜索(dp),矩阵快速幂,通项公式。其中记忆化搜索可以写 3 种方法,自底向上的,自顶向下的,优化空间复杂度版的。通项公式方法实质是求 a^b 这个还可以用快速幂优化时间复杂度到 O(log n) 。 - - -## 代码 - -```go - -package leetcode - -import "math" - -// 解法一 递归法 时间复杂度 O(2^n),空间复杂度 O(n) -func fib(N int) int { - if N <= 1 { - return N - } - return fib(N-1) + fib(N-2) -} - -// 解法二 自底向上的记忆化搜索 时间复杂度 O(n),空间复杂度 O(n) -func fib1(N int) int { - if N <= 1 { - return N - } - cache := map[int]int{0: 0, 1: 1} - for i := 2; i <= N; i++ { - cache[i] = cache[i-1] + cache[i-2] - } - return cache[N] -} - -// 解法三 自顶向下的记忆化搜索 时间复杂度 O(n),空间复杂度 O(n) -func fib2(N int) int { - if N <= 1 { - return N - } - return memoize(N, map[int]int{0: 0, 1: 1}) -} - -func memoize(N int, cache map[int]int) int { - if _, ok := cache[N]; ok { - return cache[N] - } - cache[N] = memoize(N-1, cache) + memoize(N-2, cache) - return memoize(N, cache) -} - -// 解法四 优化版的 dp,节约内存空间 时间复杂度 O(n),空间复杂度 O(1) -func fib3(N int) int { - if N <= 1 { - return N - } - if N == 2 { - return 1 - } - current, prev1, prev2 := 0, 1, 1 - for i := 3; i <= N; i++ { - current = prev1 + prev2 - prev2 = prev1 - prev1 = current - } - return current -} - -// 解法五 矩阵快速幂 时间复杂度 O(log n),空间复杂度 O(log n) -// | 1 1 | ^ n = | F(n+1) F(n) | -// | 1 0 | | F(n) F(n-1) | -func fib4(N int) int { - if N <= 1 { - return N - } - var A = [2][2]int{ - {1, 1}, - {1, 0}, - } - A = matrixPower(A, N-1) - return A[0][0] -} - -func matrixPower(A [2][2]int, N int) [2][2]int { - if N <= 1 { - return A - } - A = matrixPower(A, N/2) - A = multiply(A, A) - - var B = [2][2]int{ - {1, 1}, - {1, 0}, - } - if N%2 != 0 { - A = multiply(A, B) - } - - return A -} - -func multiply(A [2][2]int, B [2][2]int) [2][2]int { - x := A[0][0]*B[0][0] + A[0][1]*B[1][0] - y := A[0][0]*B[0][1] + A[0][1]*B[1][1] - z := A[1][0]*B[0][0] + A[1][1]*B[1][0] - w := A[1][0]*B[0][1] + A[1][1]*B[1][1] - A[0][0] = x - A[0][1] = y - A[1][0] = z - A[1][1] = w - return A -} - -// 解法六 公式法 f(n)=(1/√5)*{[(1+√5)/2]^n -[(1-√5)/2]^n},用 时间复杂度在 O(log n) 和 O(n) 之间,空间复杂度 O(1) -// 经过实际测试,会发现 pow() 系统函数比快速幂慢,说明 pow() 比 O(log n) 慢 -// 斐波那契数列是一个自然数的数列,通项公式却是用无理数来表达的。而且当 n 趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割 0.618(或者说后一项与前一项的比值小数部分越来越逼近 0.618)。 -// 斐波那契数列用计算机计算的时候可以直接用四舍五入函数 Round 来计算。 -func fib5(N int) int { - var goldenRatio float64 = float64((1 + math.Sqrt(5)) / 2) - return int(math.Round(math.Pow(goldenRatio, float64(N)) / math.Sqrt(5))) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0513.Find-Bottom-Left-Tree-Value.md b/website/content/ChapterFour/0513.Find-Bottom-Left-Tree-Value.md deleted file mode 100755 index c4f7f0830..000000000 --- a/website/content/ChapterFour/0513.Find-Bottom-Left-Tree-Value.md +++ /dev/null @@ -1,112 +0,0 @@ -# [513. Find Bottom Left Tree Value](https://leetcode.com/problems/find-bottom-left-tree-value/) - - -## 题目 - -Given a binary tree, find the leftmost value in the last row of the tree. - -**Example 1**: - - Input: - - 2 - / \ - 1 3 - - Output: - 1 - -**Example 2**: - - Input: - - 1 - / \ - 2 3 - / / \ - 4 5 6 - / - 7 - - Output: - 7 - -**Note**: You may assume the tree (i.e., the given root node) is not **NULL**. - - -## 题目大意 - -给定一个二叉树,在树的最后一行找到最左边的值。注意: 您可以假设树(即给定的根节点)不为 NULL。 - - - - - - -## 解题思路 - - -- 给出一棵树,输出这棵树最下一层中最左边的节点的值。 -- 这一题用 DFS 和 BFS 均可解题。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 DFS -func findBottomLeftValue(root *TreeNode) int { - if root == nil { - return 0 - } - res, maxHeight := 0, -1 - findBottomLeftValueDFS(root, 0, &res, &maxHeight) - return res -} - -func findBottomLeftValueDFS(root *TreeNode, curHeight int, res, maxHeight *int) { - if curHeight > *maxHeight && root.Left == nil && root.Right == nil { - *maxHeight = curHeight - *res = root.Val - } - if root.Left != nil { - findBottomLeftValueDFS(root.Left, curHeight+1, res, maxHeight) - } - if root.Right != nil { - findBottomLeftValueDFS(root.Right, curHeight+1, res, maxHeight) - } -} - -// 解法二 BFS -func findBottomLeftValue1(root *TreeNode) int { - queue := []*TreeNode{root} - for len(queue) > 0 { - next := []*TreeNode{} - for _, node := range queue { - if node.Left != nil { - next = append(next, node.Left) - } - if node.Right != nil { - next = append(next, node.Right) - } - } - if len(next) == 0 { - return queue[0].Val - } - queue = next - } - return 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md b/website/content/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md deleted file mode 100755 index 7cf9f3034..000000000 --- a/website/content/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md +++ /dev/null @@ -1,93 +0,0 @@ -# [515. Find Largest Value in Each Tree Row](https://leetcode.com/problems/find-largest-value-in-each-tree-row/) - - -## 题目 - -You need to find the largest value in each row of a binary tree. - -**Example**: - - Input: - - 1 - / \ - 3 2 - / \ \ - 5 3 9 - - Output: [1, 3, 9] - - -## 题目大意 - -求在二叉树的每一行中找到最大的值。 - - -## 解题思路 - - -- 给出一个二叉树,要求依次输出每行的最大值 -- 用 BFS 层序遍历,将每层排序取出最大值。改进的做法是遍历中不断更新每层的最大值。 - - - -## 代码 - -```go - -package leetcode - -import ( - "math" - "sort" -) - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 层序遍历二叉树,再将每层排序取出最大值 -func largestValues(root *TreeNode) []int { - tmp := levelOrder(root) - res := []int{} - for i := 0; i < len(tmp); i++ { - sort.Ints(tmp[i]) - res = append(res, tmp[i][len(tmp[i])-1]) - } - return res -} - -// 解法二 层序遍历二叉树,遍历过程中不断更新最大值 -func largestValues1(root *TreeNode) []int { - if root == nil { - return []int{} - } - q := []*TreeNode{root} - var res []int - for len(q) > 0 { - qlen := len(q) - max := math.MinInt32 - for i := 0; i < qlen; i++ { - node := q[0] - q = q[1:] - if node.Val > max { - max = node.Val - } - if node.Left != nil { - q = append(q, node.Left) - } - if node.Right != nil { - q = append(q, node.Right) - } - } - res = append(res, max) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0524.Longest-Word-in-Dictionary-through-Deleting.md b/website/content/ChapterFour/0524.Longest-Word-in-Dictionary-through-Deleting.md deleted file mode 100644 index d139890af..000000000 --- a/website/content/ChapterFour/0524.Longest-Word-in-Dictionary-through-Deleting.md +++ /dev/null @@ -1,76 +0,0 @@ -# [524. Longest Word in Dictionary through Deleting](https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/) - -## 题目 - -Given a string and a string dictionary, find the longest string in the dictionary that can be formed by deleting some characters of the given string. If there are more than one possible results, return the longest word with the smallest lexicographical order. If there is no possible result, return the empty string. - - -**Example 1**: - -``` - -Input: -s = "abpcplea", d = ["ale","apple","monkey","plea"] - -Output: -"apple" - -``` - - -**Example 2**: - -``` - -Input: -s = "abpcplea", d = ["a","b","c"] - -Output: -"a" - -``` - -**Note**: - -- All the strings in the input will only contain lower-case letters. -- The size of the dictionary won't exceed 1,000. -- The length of all the strings in the input won't exceed 1,000. - - -## 题目大意 - - -给出一个初始串,再给定一个字符串数组,要求在字符串数组中找到能在初始串中通过删除字符得到的最长的串,如果最长的串有多组解,要求输出字典序最小的那组解。 - -## 解题思路 - - -这道题就单纯的用 O(n^2) 暴力循环即可,注意最终解的要求,如果都是最长的串,要求输出字典序最小的那个串,只要利用字符串比较得到字典序最小的串即可。 - - - -## 代码 - -```go - -package leetcode - -func findLongestWord(s string, d []string) string { - res := "" - for i := 0; i < len(d); i++ { - pointS := 0 - pointD := 0 - for pointS < len(s) && pointD < len(d[i]) { - if s[pointS] == d[i][pointD] { - pointD++ - } - pointS++ - } - if pointD == len(d[i]) && (len(res) < len(d[i]) || (len(res) == len(d[i]) && res > d[i])) { - res = d[i] - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0526.Beautiful-Arrangement.md b/website/content/ChapterFour/0526.Beautiful-Arrangement.md deleted file mode 100755 index f9f005cda..000000000 --- a/website/content/ChapterFour/0526.Beautiful-Arrangement.md +++ /dev/null @@ -1,110 +0,0 @@ -# [526. Beautiful Arrangement](https://leetcode.com/problems/beautiful-arrangement/) - - -## 题目 - -Suppose you have **N** integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these **N** numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array: - -1. The number at the i position is divisible by **i**.th -2. **i** is divisible by the number at the i position.th - -Now given N, how many beautiful arrangements can you construct? - -**Example 1**: - - Input: 2 - Output: 2 - Explanation: - - The first beautiful arrangement is [1, 2]: - - Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1). - - Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2). - - The second beautiful arrangement is [2, 1]: - - Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1). - - Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1. - -**Note**: - -1. **N** is a positive integer and will not exceed 15. - - -## 题目大意 - -假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件: - -- 第 i 位的数字能被 i 整除 -- i 能被第 i 位上的数字整除 - -现在给定一个整数 N,请问可以构造多少个优美的排列? - - - -## 解题思路 - - -- 这一题是第 46 题的加强版。由于这一题给出的数组里面的数字都是不重复的,所以可以当做第 46 题来做。 -- 这题比第 46 题多的一个条件是,要求数字可以被它对应的下标 + 1 整除,或者下标 + 1 可以整除下标对应的这个数字。在 DFS 回溯过程中加入这个剪枝条件就可以了。 -- 当前做法时间复杂度不是最优的,大概只有 33.3% - - -## 代码 - -```go - -package leetcode - -// 解法一 暴力打表法 -func countArrangement1(N int) int { - res := []int{0, 1, 2, 3, 8, 10, 36, 41, 132, 250, 700, 750, 4010, 4237, 10680, 24679, 87328, 90478, 435812} - return res[N] -} - -// 解法二 DFS 回溯 -func countArrangement(N int) int { - if N == 0 { - return 0 - } - nums, used, p, res := make([]int, N), make([]bool, N), []int{}, [][]int{} - for i := range nums { - nums[i] = i + 1 - } - generatePermutation526(nums, 0, p, &res, &used) - return len(res) -} - -func generatePermutation526(nums []int, index int, p []int, res *[][]int, used *[]bool) { - if index == len(nums) { - temp := make([]int, len(p)) - copy(temp, p) - *res = append(*res, temp) - return - } - for i := 0; i < len(nums); i++ { - if !(*used)[i] { - if !(checkDivisible(nums[i], len(p)+1) || checkDivisible(len(p)+1, nums[i])) { // 关键的剪枝条件 - continue - } - (*used)[i] = true - p = append(p, nums[i]) - generatePermutation526(nums, index+1, p, res, used) - p = p[:len(p)-1] - (*used)[i] = false - } - } - return -} - -func checkDivisible(num, d int) bool { - tmp := num / d - if int(tmp)*int(d) == num { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0528.Random-Pick-with-Weight.md b/website/content/ChapterFour/0528.Random-Pick-with-Weight.md deleted file mode 100755 index 9e5d63976..000000000 --- a/website/content/ChapterFour/0528.Random-Pick-with-Weight.md +++ /dev/null @@ -1,108 +0,0 @@ -# [528. Random Pick with Weight](https://leetcode.com/problems/random-pick-with-weight/) - - -## 题目 - -Given an array `w` of positive integers, where `w[i]` describes the weight of index `i`, write a function `pickIndex` which randomly picks an index in proportion to its weight. - -**Note**: - -1. `1 <= w.length <= 10000` -2. `1 <= w[i] <= 10^5` -3. `pickIndex` will be called at most `10000` times. - -**Example 1**: - - Input: - ["Solution","pickIndex"] - [[[1]],[]] - Output: [null,0] - -**Example 2**: - - Input: - ["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"] - [[[1,3]],[],[],[],[],[]] - Output: [null,0,1,1,1,0] - -**Explanation of Input Syntax:** - -The input is two lists: the subroutines called and their arguments. `Solution`'s constructor has one argument, the array `w`. `pickIndex` has no arguments. Arguments are always wrapped with a list, even if there aren't any. - - -## 题目大意 - -给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比。 - -说明: - -1. 1 <= w.length <= 10000 -2. 1 <= w[i] <= 10^5 -3. pickIndex 将被调用不超过 10000 次 - - -输入语法说明: - -输入是两个列表:调用成员函数名和调用的参数。Solution 的构造函数有一个参数,即数组 w。pickIndex 没有参数。输入参数是一个列表,即使参数为空,也会输入一个 [] 空列表。 - - - -## 解题思路 - -- 给出一个数组,每个元素值代表该下标的权重值,`pickIndex()` 随机取一个位置 i,这个位置出现的概率和该元素值成正比。 -- 由于涉及到了权重的问题,这一题可以先考虑用前缀和处理权重。在 `[0,prefixSum)` 区间内随机选一个整数 `x`,下标 `i` 是满足 `x< prefixSum[i]` 条件的最小下标,求这个下标 `i` 即是最终解。二分搜索查找下标 `i` 。对于某些下标 `i`,所有满足 `prefixSum[i] - w[i] ≤ v < prefixSum[i]` 的整数 `v` 都映射到这个下标。因此,所有的下标都与下标权重成比例。 -- 时间复杂度:预处理的时间复杂度是 O(n),`pickIndex()` 的时间复杂度是 O(log n)。空间复杂度 O(n)。 - - -## 代码 - -```go - -package leetcode - -import ( - "math/rand" -) - -// Solution528 define -type Solution528 struct { - prefixSum []int -} - -// Constructor528 define -func Constructor528(w []int) Solution528 { - prefixSum := make([]int, len(w)) - for i, e := range w { - if i == 0 { - prefixSum[i] = e - continue - } - prefixSum[i] = prefixSum[i-1] + e - } - return Solution528{prefixSum: prefixSum} -} - -// PickIndex define -func (so *Solution528) PickIndex() int { - n := rand.Intn(so.prefixSum[len(so.prefixSum)-1]) + 1 - low, high := 0, len(so.prefixSum)-1 - for low < high { - mid := low + (high-low)>>1 - if so.prefixSum[mid] == n { - return mid - } else if so.prefixSum[mid] < n { - low = mid + 1 - } else { - high = mid - } - } - return low -} - -/** - * Your Solution object will be instantiated and called as such: - * obj := Constructor(w); - * param_1 := obj.PickIndex(); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0529.Minesweeper.md b/website/content/ChapterFour/0529.Minesweeper.md deleted file mode 100644 index f2166a692..000000000 --- a/website/content/ChapterFour/0529.Minesweeper.md +++ /dev/null @@ -1,145 +0,0 @@ -# [529. Minesweeper](https://leetcode.com/problems/minesweeper/) - - - -## 题目 - -Let's play the minesweeper game ([Wikipedia](https://en.wikipedia.org/wiki/Minesweeper_(video_game)), [online game](http://minesweeperonline.com/))! - -You are given a 2D char matrix representing the game board. **'M'** represents an **unrevealed** mine, **'E'** represents an **unrevealed** empty square, **'B'** represents a **revealed** blank square that has no adjacent (above, below, left, right, and all 4 diagonals) mines, **digit** ('1' to '8') represents how many mines are adjacent to this **revealed** square, and finally **'X'** represents a **revealed** mine. - -Now given the next click position (row and column indices) among all the **unrevealed** squares ('M' or 'E'), return the board after revealing this position according to the following rules: - -1. If a mine ('M') is revealed, then the game is over - change it to **'X'**. -2. If an empty square ('E') with **no adjacent mines** is revealed, then change it to revealed blank ('B') and all of its adjacent **unrevealed** squares should be revealed recursively. -3. If an empty square ('E') with **at least one adjacent mine** is revealed, then change it to a digit ('1' to '8') representing the number of adjacent mines. -4. Return the board when no more squares will be revealed. - -**Example 1**: - -``` -Input: - -[['E', 'E', 'E', 'E', 'E'], - ['E', 'E', 'M', 'E', 'E'], - ['E', 'E', 'E', 'E', 'E'], - ['E', 'E', 'E', 'E', 'E']] - -Click : [3,0] - -Output: - -[['B', '1', 'E', '1', 'B'], - ['B', '1', 'M', '1', 'B'], - ['B', '1', '1', '1', 'B'], - ['B', 'B', 'B', 'B', 'B']] - -Explanation: -``` - -![https://assets.leetcode.com/uploads/2018/10/12/minesweeper_example_1.png](https://assets.leetcode.com/uploads/2018/10/12/minesweeper_example_1.png) - -**Example 2**: - -``` -Input: - -[['B', '1', 'E', '1', 'B'], - ['B', '1', 'M', '1', 'B'], - ['B', '1', '1', '1', 'B'], - ['B', 'B', 'B', 'B', 'B']] - -Click : [1,2] - -Output: - -[['B', '1', 'E', '1', 'B'], - ['B', '1', 'X', '1', 'B'], - ['B', '1', '1', '1', 'B'], - ['B', 'B', 'B', 'B', 'B']] - -Explanation: -``` - -![https://assets.leetcode.com/uploads/2018/10/12/minesweeper_example_2.png](https://assets.leetcode.com/uploads/2018/10/12/minesweeper_example_2.png) - -**Note**: - -1. The range of the input matrix's height and width is [1,50]. -2. The click position will only be an unrevealed square ('M' or 'E'), which also means the input board contains at least one clickable square. -3. The input board won't be a stage when game is over (some mines have been revealed). -4. For simplicity, not mentioned rules should be ignored in this problem. For example, you **don't** need to reveal all the unrevealed mines when the game is over, consider any cases that you will win the game or flag any squares. - - -## 题目大意 - -给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板: - -1. 如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'。 -2. 如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的未挖出方块都应该被递归地揭露。 -3. 如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。 -4. 如果在此次点击中,若无更多方块可被揭露,则返回面板。 - - -注意: - -- 输入矩阵的宽和高的范围为 [1,50]。 -- 点击的位置只能是未被挖出的方块 ('M' 或者 'E'),这也意味着面板至少包含一个可点击的方块。 -- 输入面板不会是游戏结束的状态(即有地雷已被挖出)。 -- 简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。 - - - -## 解题思路 - -- 给出一张扫雷地图和点击的坐标,M 代表雷,E 代表还没有点击过的空砖块,B 代表点击过的空砖块,1-8 代表砖块周围 8 个方块里面有雷的个数,X 代表点到了雷。问点击一次以后,输出更新点击以后的地图。 -- DPS 和 BFS 都可以解题。先根据原图预处理地图,记录出最终地图的状态,0 代表空白砖块,1-8 代表雷的个数,-1 代表是雷。再 DFS 遍历这张处理后的图,输出最终的地图即可。 - -## 代码 - -```go -func updateBoard(board [][]byte, click []int) [][]byte { - if board[click[0]][click[1]] == 'M' { - board[click[0]][click[1]] = 'X' - return board - } - mineMap := make([][]int, len(board)) - for i := range board { - mineMap[i] = make([]int, len(board[i])) - } - for i := range board { - for j := range board[i] { - if board[i][j] == 'M' { - mineMap[i][j] = -1 - for _, d := range dir8 { - nx, ny := i+d[0], j+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineMap[nx][ny]++ - } - } - } - } - } - mineSweeper(click[0], click[1], board, mineMap, dir8) - return board -} - -func mineSweeper(x, y int, board [][]byte, mineMap [][]int, dir8 [][]int) { - if board[x][y] != 'M' && board[x][y] != 'E' { - return - } - if mineMap[x][y] == -1 { - board[x][y] = 'X' - } else if mineMap[x][y] > 0 { - board[x][y] = '0' + byte(mineMap[x][y]) - } else { - board[x][y] = 'B' - for _, d := range dir8 { - nx, ny := x+d[0], y+d[1] - if isInBoard(board, nx, ny) && mineMap[nx][ny] >= 0 { - mineSweeper(nx, ny, board, mineMap, dir8) - } - } - } -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0532.K-diff-Pairs-in-an-Array.md b/website/content/ChapterFour/0532.K-diff-Pairs-in-an-Array.md deleted file mode 100644 index 20aa28893..000000000 --- a/website/content/ChapterFour/0532.K-diff-Pairs-in-an-Array.md +++ /dev/null @@ -1,95 +0,0 @@ -# [532. K-diff Pairs in an Array](https://leetcode.com/problems/k-diff-pairs-in-an-array/) - -## 题目 - -Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in the array. Here a k-diff pair is defined as an integer pair (i, j), where i and j are both numbers in the array and their absolute difference is k. - - -**Example 1**: - -``` - -Input: [3, 1, 4, 1, 5], k = 2 -Output: 2 -Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5). -Although we have two 1s in the input, we should only return the number of unique pairs. - -``` - -**Example 2**: - -``` - -Input:[1, 2, 3, 4, 5], k = 1 -Output: 4 -Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5). - -``` - -**Example 3**: - -``` - -Input: [1, 3, 1, 5, 4], k = 0 -Output: 1 -Explanation: There is one 0-diff pair in the array, (1, 1). - -``` - - -**Note**: - -1. The pairs (i, j) and (j, i) count as the same pair. -2. The length of the array won't exceed 10,000. -3. All the integers in the given input belong to the range: [-1e7, 1e7]. - -## 题目大意 - - -给定一个数组,在数组里面找到几组不同的 pair 对,每个 pair 对相差 K 。问能找出多少组这样的 pair 对。 - - -## 解题思路 - -这一题可以用 map 记录每个数字出现的次数。重复的数字也会因为唯一的 key,不用担心某个数字会判断多次。遍历一次 map,每个数字都加上 K 以后,判断字典里面是否存在,如果存在, count ++,如果 K = 0 的情况需要单独判断,如果字典中这个元素频次大于 1,count 也需要 ++。 - - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -func findPairs(nums []int, k int) int { - if k < 0 || len(nums) == 0 { - return 0 - } - var count int - m := make(map[int]int, len(nums)) - for _, value := range nums { - m[value]++ - } - for key := range m { - if k == 0 && m[key] > 1 { - count++ - continue - } - if k > 0 && m[key+k] > 0 { - count++ - } - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0537.Complex-Number-Multiplication.md b/website/content/ChapterFour/0537.Complex-Number-Multiplication.md deleted file mode 100644 index 568404bab..000000000 --- a/website/content/ChapterFour/0537.Complex-Number-Multiplication.md +++ /dev/null @@ -1,73 +0,0 @@ -# [537. Complex Number Multiplication](https://leetcode.com/problems/complex-number-multiplication/) - - -## 题目 - -Given two strings representing two [complex numbers](https://en.wikipedia.org/wiki/Complex_number). - -You need to return a string representing their multiplication. Note i2 = -1 according to the definition. - -**Example 1**: - -``` -Input: "1+1i", "1+1i" -Output: "0+2i" -Explanation: (1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i, and you need convert it to the form of 0+2i. -``` - -**Example 2**: - -``` -Input: "1+-1i", "1+-1i" -Output: "0+-2i" -Explanation: (1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i, and you need convert it to the form of 0+-2i. -``` - -**Note**: - -1. The input strings will not have extra blank. -2. The input strings will be given in the form of **a+bi**, where the integer **a** and **b** will both belong to the range of [-100, 100]. And **the output should be also in this form**. - -## 题目大意 - -给定两个表示复数的字符串。返回表示它们乘积的字符串。注意,根据定义 i^2 = -1 。 - -注意: - -- 输入字符串不包含额外的空格。 -- 输入字符串将以 a+bi 的形式给出,其中整数 a 和 b 的范围均在 [-100, 100] 之间。输出也应当符合这种形式。 - - - -## 解题思路 - -- 给定 2 个字符串,要求这两个复数的乘积,输出也是字符串格式。 -- 数学题。按照复数的运算法则,i^2 = -1,最后输出字符串结果即可。 - -## 代码 - -```go - -package leetcode - -import ( - "strconv" - "strings" -) - -func complexNumberMultiply(a string, b string) string { - realA, imagA := parse(a) - realB, imagB := parse(b) - real := realA*realB - imagA*imagB - imag := realA*imagB + realB*imagA - return strconv.Itoa(real) + "+" + strconv.Itoa(imag) + "i" -} - -func parse(s string) (int, int) { - ss := strings.Split(s, "+") - r, _ := strconv.Atoi(ss[0]) - i, _ := strconv.Atoi(ss[1][:len(ss[1])-1]) - return r, i -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0541.Reverse-String-II.md b/website/content/ChapterFour/0541.Reverse-String-II.md deleted file mode 100755 index 8d9ebdafb..000000000 --- a/website/content/ChapterFour/0541.Reverse-String-II.md +++ /dev/null @@ -1,56 +0,0 @@ -# [541. Reverse String II](https://leetcode.com/problems/reverse-string-ii/) - - -## 题目 - -Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original. - -**Example**: - - Input: s = "abcdefg", k = 2 - Output: "bacdfeg" - -**Restrictions:** - -1. The string consists of lower English letters only. -2. Length of the given string and k will in the range [1, 10000] - -## 题目大意 - -给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。 - -要求: - -- 该字符串只包含小写的英文字母。 -- 给定字符串的长度和 k 在[1, 10000]范围内。 - - -## 解题思路 - -- 要求按照一定规则反转字符串:每 `2 * K` 长度的字符串,反转前 `K` 个字符,后 `K` 个字符串保持不变;对于末尾不够 `2 * K` 的字符串,如果长度大于 `K`,那么反转前 `K` 个字符串,剩下的保持不变。如果长度小于 `K`,则把小于 `K` 的这部分字符串全部反转。 -- 这一题是简单题,按照题意反转字符串即可。 - - -## 代码 - -```go - -package leetcode - -func reverseStr(s string, k int) string { - if k > len(s) { - k = len(s) - } - for i := 0; i < len(s); i = i + 2*k { - if len(s)-i >= k { - ss := revers(s[i : i+k]) - s = s[:i] + ss + s[i+k:] - } else { - ss := revers(s[i:]) - s = s[:i] + ss - } - } - return s -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0542.01-Matrix.md b/website/content/ChapterFour/0542.01-Matrix.md deleted file mode 100755 index deb16e4c7..000000000 --- a/website/content/ChapterFour/0542.01-Matrix.md +++ /dev/null @@ -1,202 +0,0 @@ -# [542. 01 Matrix](https://leetcode.com/problems/01-matrix/) - - -## 题目 - -Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. - -The distance between two adjacent cells is 1. - -**Example 1**: - - Input: - [[0,0,0], - [0,1,0], - [0,0,0]] - - Output: - [[0,0,0], - [0,1,0], - [0,0,0]] - -**Example 2**: - - Input: - [[0,0,0], - [0,1,0], - [1,1,1]] - - Output: - [[0,0,0], - [0,1,0], - [1,2,1]] - -**Note**: - -1. The number of elements of the given matrix will not exceed 10,000. -2. There are at least one 0 in the given matrix. -3. The cells are adjacent in only four directions: up, down, left and right. - - -## 题目大意 - -给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。 - - -## 解题思路 - - -- 给出一个二维数组,数组里面只有 0 和 1 。要求计算每个 1 距离最近的 0 的距离。 -- 这一题有 3 种解法,第一种解法最容易想到,BFS。先预处理一下棋盘,将每个 0 都处理为 -1 。将 1 都处理为 0 。将每个 -1 (即原棋盘的 0)都入队,每次出队都将四周的 4 个位置都入队。这就想一颗石头扔进了湖里,一圈一圈的波纹荡开,每一圈都是一层。由于棋盘被我们初始化了,所有为 -1 的都是原来为 0 的,所以波纹扫过来不需要处理这些 -1 的点。棋盘上为 0 的点都是原来为 1 的点,这些点在波纹扫过来的时候就需要赋值更新 level。当下次波纹再次扫到原来为 1 的点的时候,由于它已经被第一次到的波纹更新了值,所以这次不用再更新了。(第一次波纹到的时候一定是最短的) -- 第二种解法是 DFS。先预处理,把周围没有 0 的 1 都重置为最大值。当周围有 0 的 1,距离 0 的位置都是 1,这些点是不需要动的,需要更新的点恰恰应该是那些周围没有 0 的点。当递归的步数 val 比点的值小(这也就是为什么会先把 1 更新成最大值的原因)的时候,不断更新它。 -- 第三种解法是 DP。由于有 4 个方向,每次处理 2 个方向,可以降低时间复杂度。第一次循环从上到下,从左到右遍历,先处理上边和左边,第二次循环从下到上,从右到左遍历,再处理右边和下边。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -// 解法一 BFS -func updateMatrixBFS(matrix [][]int) [][]int { - res := make([][]int, len(matrix)) - if len(matrix) == 0 || len(matrix[0]) == 0 { - return res - } - queue := make([][]int, 0) - for i := range matrix { - res[i] = make([]int, len(matrix[0])) - for j := range res[i] { - if matrix[i][j] == 0 { - res[i][j] = -1 - queue = append(queue, []int{i, j}) - } - } - } - level := 1 - for len(queue) > 0 { - size := len(queue) - for size > 0 { - size-- - node := queue[0] - queue = queue[1:] - i, j := node[0], node[1] - for _, direction := range [][]int{{-1, 0}, {1, 0}, {0, 1}, {0, -1}} { - x := i + direction[0] - y := j + direction[1] - if x < 0 || x >= len(matrix) || y < 0 || y >= len(matrix[0]) || res[x][y] < 0 || res[x][y] > 0 { - continue - } - res[x][y] = level - queue = append(queue, []int{x, y}) - } - } - level++ - } - for i, row := range res { - for j, cell := range row { - if cell == -1 { - res[i][j] = 0 - } - } - } - return res -} - -// 解法二 DFS -func updateMatrixDFS(matrix [][]int) [][]int { - result := [][]int{} - if len(matrix) == 0 || len(matrix[0]) == 0 { - return result - } - maxRow, maxCol := len(matrix), len(matrix[0]) - for r := 0; r < maxRow; r++ { - for c := 0; c < maxCol; c++ { - if matrix[r][c] == 1 && hasZero(matrix, r, c) == false { - // 将四周没有 0 的 1 特殊处理为最大值 - matrix[r][c] = math.MaxInt64 - } - } - } - for r := 0; r < maxRow; r++ { - for c := 0; c < maxCol; c++ { - if matrix[r][c] == 1 { - dfsMatrix(matrix, r, c, -1) - } - } - } - return (matrix) -} - -// 判断四周是否有 0 -func hasZero(matrix [][]int, row, col int) bool { - if row > 0 && matrix[row-1][col] == 0 { - return true - } - if col > 0 && matrix[row][col-1] == 0 { - return true - } - if row < len(matrix)-1 && matrix[row+1][col] == 0 { - return true - } - if col < len(matrix[0])-1 && matrix[row][col+1] == 0 { - return true - } - return false -} - -func dfsMatrix(matrix [][]int, row, col, val int) { - // 不超过棋盘氛围,且 val 要比 matrix[row][col] 小 - if row < 0 || row >= len(matrix) || col < 0 || col >= len(matrix[0]) || (matrix[row][col] <= val) { - return - } - if val > 0 { - matrix[row][col] = val - } - dfsMatrix(matrix, row-1, col, matrix[row][col]+1) - dfsMatrix(matrix, row, col-1, matrix[row][col]+1) - dfsMatrix(matrix, row+1, col, matrix[row][col]+1) - dfsMatrix(matrix, row, col+1, matrix[row][col]+1) -} - -// 解法三 DP -func updateMatrixDP(matrix [][]int) [][]int { - for i, row := range matrix { - for j, val := range row { - if val == 0 { - continue - } - left, top := math.MaxInt16, math.MaxInt16 - if i > 0 { - top = matrix[i-1][j] + 1 - } - if j > 0 { - left = matrix[i][j-1] + 1 - } - matrix[i][j] = min(top, left) - } - } - for i := len(matrix) - 1; i >= 0; i-- { - for j := len(matrix[0]) - 1; j >= 0; j-- { - if matrix[i][j] == 0 { - continue - } - right, bottom := math.MaxInt16, math.MaxInt16 - if i < len(matrix)-1 { - bottom = matrix[i+1][j] + 1 - } - if j < len(matrix[0])-1 { - right = matrix[i][j+1] + 1 - } - matrix[i][j] = min(matrix[i][j], min(bottom, right)) - } - } - return matrix -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0547.Friend-Circles.md b/website/content/ChapterFour/0547.Friend-Circles.md deleted file mode 100755 index a55972974..000000000 --- a/website/content/ChapterFour/0547.Friend-Circles.md +++ /dev/null @@ -1,111 +0,0 @@ -# [547. Friend Circles](https://leetcode.com/problems/friend-circles/) - -## 题目 - -There are **N** students in a class. Some of them are friends, while some are not. Their friendship is transitive in nature. For example, if A is a **direct** friend of B, and B is a **direct**friend of C, then A is an **indirect** friend of C. And we defined a friend circle is a group of students who are direct or indirect friends. - -Given a **N*N** matrix **M** representing the friend relationship between students in the class. If M[i][j] = 1, then the ith and jth students are **direct** friends with each other, otherwise not. And you have to output the total number of friend circles among all the students. - -**Example 1**: - - Input: - [[1,1,0], - [1,1,0], - [0,0,1]] - Output: 2 - Explanation:The 0th and 1st students are direct friends, so they are in a friend circle. - The 2nd student himself is in a friend circle. So return 2. - -**Example 2**: - - Input: - [[1,1,0], - [1,1,1], - [0,1,1]] - Output: 1 - Explanation:The 0th and 1st students are direct friends, the 1st and 2nd students are direct friends, - so the 0th and 2nd students are indirect friends. All of them are in the same friend circle, so return 1. - -**Note**: - -1. N is in range [1,200]. -2. M[i][i] = 1 for all students. -3. If M[i][j] = 1, then M[j][i] = 1. - - -## 题目大意 - -班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。 - -给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果 M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。 - - -注意: - -- N 在[1,200]的范围内。 -- 对于所有学生,有M[i][i] = 1。 -- 如果有 M[i][j] = 1,则有 M[j][i] = 1。 - - -## 解题思路 - - -- 给出一个二维矩阵,矩阵中的行列表示的是两个人之间是否是朋友关系,如果是 1,代表两个人是朋友关系。由于自己和自肯定朋友关系,所以对角线上都是 1,并且矩阵也是关于从左往右下的这条对角线对称。 -- 这题有 2 种解法,第一种解法是并查集,依次扫描矩阵,如果两个人认识,并且 root 并不相等就执行 union 操作。扫完所有矩阵,最后数一下还有几个不同的 root 就是最终答案。第二种解法是 DFS 或者 BFS。利用 FloodFill 的想法去染色,每次染色一次,计数器加一。最终扫完整个矩阵,计数器的结果就是最终结果。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 并查集 - -func findCircleNum(M [][]int) int { - n := len(M) - if n == 0 { - return 0 - } - uf := template.UnionFind{} - uf.Init(n) - for i := 0; i < n; i++ { - for j := 0; j <= i; j++ { - if M[i][j] == 1 { - uf.Union(i, j) - } - } - } - return uf.TotalCount() -} - -// 解法二 FloodFill DFS 暴力解法 -func findCircleNum1(M [][]int) int { - if len(M) == 0 { - return 0 - } - visited := make([]bool, len(M)) - res := 0 - for i := range M { - if !visited[i] { - dfs547(M, i, visited) - res++ - } - } - return res -} - -func dfs547(M [][]int, cur int, visited []bool) { - visited[cur] = true - for j := 0; j < len(M[cur]); j++ { - if !visited[j] && M[cur][j] == 1 { - dfs547(M, j, visited) - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0557.Reverse-Words-in-a-String-III.md b/website/content/ChapterFour/0557.Reverse-Words-in-a-String-III.md deleted file mode 100755 index 68363ed8d..000000000 --- a/website/content/ChapterFour/0557.Reverse-Words-in-a-String-III.md +++ /dev/null @@ -1,57 +0,0 @@ -# [557. Reverse Words in a String III](https://leetcode.com/problems/reverse-words-in-a-string-iii/) - - -## 题目 - -Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial word order. - -**Example 1**: - - Input: "Let's take LeetCode contest" - Output: "s'teL ekat edoCteeL tsetnoc" - -**Note**: In the string, each word is separated by single space and there will not be any extra space in the string. - - -## 题目大意 - -给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。 - - -## 解题思路 - - -- 反转字符串,要求按照空格隔开的小字符串为单位反转。 -- 这是一道简单题。按照题意反转每个空格隔开的单词即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "strings" -) - -func reverseWords(s string) string { - ss := strings.Split(s, " ") - for i, s := range ss { - ss[i] = revers(s) - } - return strings.Join(ss, " ") -} - -func revers(s string) string { - bytes := []byte(s) - i, j := 0, len(bytes)-1 - for i < j { - bytes[i], bytes[j] = bytes[j], bytes[i] - i++ - j-- - } - return string(bytes) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0561.Array-Partition-I.md b/website/content/ChapterFour/0561.Array-Partition-I.md deleted file mode 100644 index d72ea633d..000000000 --- a/website/content/ChapterFour/0561.Array-Partition-I.md +++ /dev/null @@ -1,58 +0,0 @@ -# [561. Array Partition I](https://leetcode.com/problems/array-partition-i/) - - -## 题目 - -Given an array of **2n** integers, your task is to group these integers into **n** pairs of integer, say (a1, b1), (a2, b2), ..., (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as possible. - -**Example 1**: - -``` -Input: [1,4,3,2] - -Output: 4 -Explanation: n is 2, and the maximum sum of pairs is 4 = min(1, 2) + min(3, 4). -``` - -**Note**: - -1. **n** is a positive integer, which is in the range of [1, 10000]. -2. All the integers in the array will be in the range of [-10000, 10000]. - -## 题目大意 - -给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。 - - -## 解题思路 - -- 给定一个 2n 个数组,要求把它们分为 n 组一行,求出各组最小值的总和的最大值。 -- 由于题目给的数据范围不大,[-10000, 10000],所以我们可以考虑用一个哈希表数组,里面存储 i - 10000 元素的频次,偏移量是 10000。这个哈希表能按递增的顺序访问数组,这样可以减少排序的耗时。题目要求求出分组以后求和的最大值,那么所有偏小的元素尽量都安排在一组里面,这样取 min 以后,对最大和影响不大。例如,(1 , 1) 这样安排在一起,min 以后就是 1 。但是如果把相差很大的两个元素安排到一起,那么较大的那个元素就“牺牲”了。例如,(1 , 10000),取 min 以后就是 1,于是 10000 就“牺牲”了。所以需要优先考虑较小值。 -- 较小值出现的频次可能是奇数也可能是偶数。如果是偶数,那比较简单,把它们俩俩安排在一起就可以了。如果是奇数,那么它会落单一次,落单的那个需要和距离它最近的一个元素进行配对,这样对最终的和影响最小。较小值如果是奇数,那么就会影响后面元素的选择,后面元素如果是偶数,由于需要一个元素和前面的较小值配对,所以它剩下的又是奇数个。这个影响会依次传递到后面。所以用一个 flag 标记,如果当前集合中有剩余元素将被再次考虑,则此标志设置为 1。在从下一组中选择元素时,会考虑已考虑的相同额外元素。 -- 最后扫描过程中动态的维护 sum 值就可以了。 - -## 代码 - -```go - -package leetcode - -func arrayPairSum(nums []int) int { - array := [20001]int{} - for i := 0; i < len(nums); i++ { - array[nums[i]+10000]++ - } - flag, sum := true, 0 - for i := 0; i < len(array); i++ { - for array[i] > 0 { - if flag { - sum = sum + i - 10000 - } - flag = !flag - array[i]-- - } - } - return sum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0563.Binary-Tree-Tilt.md b/website/content/ChapterFour/0563.Binary-Tree-Tilt.md deleted file mode 100755 index b5a8ce5cf..000000000 --- a/website/content/ChapterFour/0563.Binary-Tree-Tilt.md +++ /dev/null @@ -1,83 +0,0 @@ -# [563. Binary Tree Tilt](https://leetcode.com/problems/binary-tree-tilt/) - - -## 题目 - -Given a binary tree, return the tilt of the **whole tree**. - -The tilt of a **tree node** is defined as the **absolute difference** between the sum of all left subtree node values and the sum of all right subtree node values. Null node has tilt 0. - -The tilt of the **whole tree** is defined as the sum of all nodes' tilt. - -**Example**: - - Input: - 1 - / \ - 2 3 - Output: 1 - Explanation: - Tilt of node 2 : 0 - Tilt of node 3 : 0 - Tilt of node 1 : |2-3| = 1 - Tilt of binary tree : 0 + 0 + 1 = 1 - -**Note**: - -1. The sum of node values in any subtree won't exceed the range of 32-bit integer. -2. All the tilt values won't exceed the range of 32-bit integer. - - -## 题目大意 - - -给定一个二叉树,计算整个树的坡度。一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。整个树的坡度就是其所有节点的坡度之和。 - -注意: - -1. 任何子树的结点的和不会超过32位整数的范围。 -2. 坡度的值不会超过32位整数的范围。 - -## 解题思路 - - -- 给出一棵树,计算每个节点的“倾斜度”累加和。“倾斜度”的定义是:左子树和右子树的节点值差值的绝对值。 -- 这一题虽然是简单题,但是如果对题目中的“倾斜度”理解的不对,这一题就会出错。“倾斜度”计算的是左子树所有节点的值总和,和,右子树所有节点的值总和的差值。并不是只针对一个节点的左节点值和右节点值的差值。这一点明白以后,这一题就是简单题了。 - - -## 代码 - -```go - -package leetcode - -import "math" - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func findTilt(root *TreeNode) int { - if root == nil { - return 0 - } - sum := 0 - findTiltDFS(root, &sum) - return sum -} - -func findTiltDFS(root *TreeNode, sum *int) int { - if root == nil { - return 0 - } - left := findTiltDFS(root.Left, sum) - right := findTiltDFS(root.Right, sum) - *sum += int(math.Abs(float64(left) - float64(right))) - return root.Val + left + right -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0566.Reshape-the-Matrix.md b/website/content/ChapterFour/0566.Reshape-the-Matrix.md deleted file mode 100755 index a55a7028c..000000000 --- a/website/content/ChapterFour/0566.Reshape-the-Matrix.md +++ /dev/null @@ -1,102 +0,0 @@ -# [566. Reshape the Matrix](https://leetcode.com/problems/reshape-the-matrix/) - - -## 题目 - -In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new one with different size but keep its original data. - -You're given a matrix represented by a two-dimensional array, and two **positive** integers **r** and **c**representing the **row** number and **column** number of the wanted reshaped matrix, respectively. - -The reshaped matrix need to be filled with all the elements of the original matrix in the same **row-traversing** order as they were. - -If the 'reshape' operation with given parameters is possible and legal, output the new reshaped matrix; Otherwise, output the original matrix. - -**Example 1**: - - Input: - nums = - [[1,2], - [3,4]] - r = 1, c = 4 - Output: - [[1,2,3,4]] - Explanation: - The row-traversing of nums is [1,2,3,4]. The new reshaped matrix is a 1 * 4 matrix, fill it row by row by using the previous list. - -**Example 2**: - - Input: - nums = - [[1,2], - [3,4]] - r = 2, c = 4 - Output: - [[1,2], - [3,4]] - Explanation: - There is no way to reshape a 2 * 2 matrix to a 2 * 4 matrix. So output the original matrix. - -**Note**: - -1. The height and width of the given matrix is in range [1, 100]. -2. The given r and c are all positive. - - -## 题目大意 - -在 MATLAB 中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。 - -给出一个由二维数组表示的矩阵,以及两个正整数r和c,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。 - - - -## 解题思路 - - -- 给一个二维数组和 r,c,将这个二维数组“重塑”成行为 r,列为 c。如果可以“重塑”,输出“重塑”以后的数组,如果不能“重塑”,输出原有数组。 -- 这题也是水题,按照题意模拟即可。 - - - -## 代码 - -```go - -package leetcode - -func matrixReshape(nums [][]int, r int, c int) [][]int { - if canReshape(nums, r, c) { - return reshape(nums, r, c) - } - return nums -} - -func canReshape(nums [][]int, r, c int) bool { - row := len(nums) - colume := len(nums[0]) - if row*colume == r*c { - return true - } - return false -} - -func reshape(nums [][]int, r, c int) [][]int { - newShape := make([][]int, r) - for index := range newShape { - newShape[index] = make([]int, c) - } - rowIndex, colIndex := 0, 0 - for _, row := range nums { - for _, col := range row { - if colIndex == c { - colIndex = 0 - rowIndex++ - } - newShape[rowIndex][colIndex] = col - colIndex++ - } - } - return newShape -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0567.Permutation-in-String.md b/website/content/ChapterFour/0567.Permutation-in-String.md deleted file mode 100644 index e2e9d17ad..000000000 --- a/website/content/ChapterFour/0567.Permutation-in-String.md +++ /dev/null @@ -1,87 +0,0 @@ -# [567. Permutation in String](https://leetcode.com/problems/permutation-in-string/) - -## 题目 - -Given two strings s1 and s2, write a function to return true if s2 contains the permutation of s1. In other words, one of the first string's permutations is the substring of the second string. - - -**Example 1**: - -``` - -Input:s1 = "ab" s2 = "eidbaooo" -Output:True -Explanation: s2 contains one permutation of s1 ("ba"). - -``` - -**Example 2**: - -``` - -Input:s1= "ab" s2 = "eidboaoo" -Output: False - -``` - -**Note**: - -1. The input strings only contain lower case letters. -2. The length of both given strings is in range [1, 10,000]. - -## 题目大意 - - -在一个字符串重寻找子串出现的位置。子串可以是 Anagrams 形式存在的。Anagrams 是一个字符串任意字符的全排列组合。 - -## 解题思路 - -这一题和第 438 题,第 3 题,第 76 题,第 567 题类似,用的思想都是"滑动窗口"。 - - -这道题只需要判断是否存在,而不需要输出子串所在的下标起始位置。所以这道题是第 438 题的缩水版。具体解题思路见第 438 题。 - - - - - - - - -## 代码 - -```go - -package leetcode - -func checkInclusion(s1 string, s2 string) bool { - var freq [256]int - if len(s2) == 0 || len(s2) < len(s1) { - return false - } - for i := 0; i < len(s1); i++ { - freq[s1[i]-'a']++ - } - left, right, count := 0, 0, len(s1) - - for right < len(s2) { - if freq[s2[right]-'a'] >= 1 { - count-- - } - freq[s2[right]-'a']-- - right++ - if count == 0 { - return true - } - if right-left == len(s1) { - if freq[s2[left]-'a'] >= 0 { - count++ - } - freq[s2[left]-'a']++ - left++ - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0572.Subtree-of-Another-Tree.md b/website/content/ChapterFour/0572.Subtree-of-Another-Tree.md deleted file mode 100755 index 21611c120..000000000 --- a/website/content/ChapterFour/0572.Subtree-of-Another-Tree.md +++ /dev/null @@ -1,87 +0,0 @@ -# [572. Subtree of Another Tree](https://leetcode.com/problems/subtree-of-another-tree/) - - -## 题目 - -Given two non-empty binary trees **s** and **t**, check whether tree **t** has exactly the same structure and node values with a subtree of **s**. A subtree of **s** is a tree consists of a node in **s** and all of this node's descendants. The tree **s** could also be considered as a subtree of itself. - -**Example 1**: - -Given tree s: - - 3 - / \ - 4 5 - / \ - 1 2 - -Given tree t: - - 4 - / \ - 1 2 - -Return **true**, because t has the same structure and node values with a subtree of s. - -**Example 2**: - -Given tree s: - - 3 - / \ - 4 5 - / \ - 1 2 - / - 0 - -Given tree t: - - 4 - / \ - 1 2 - -Return **false**. - - -## 题目大意 - -给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 - - -## 解题思路 - - -- 给出 2 棵树 `s` 和 `t`,要求判断 `t` 是否是 `s` 的子树🌲。 -- 这一题比较简单,针对 3 种情况依次递归判断,第一种情况 `s` 和 `t` 是完全一样的两棵树,第二种情况 `t` 是 `s` 左子树中的子树,第三种情况 `t` 是 `s` 右子树中的子树。第一种情况判断两棵数是否完全一致是第 100 题的原题。 - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func isSubtree(s *TreeNode, t *TreeNode) bool { - if isSameTree(s, t) { - return true - } - if s == nil { - return false - } - if isSubtree(s.Left, t) || isSubtree(s.Right, t) { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0575.Distribute-Candies.md b/website/content/ChapterFour/0575.Distribute-Candies.md deleted file mode 100755 index 4e3299366..000000000 --- a/website/content/ChapterFour/0575.Distribute-Candies.md +++ /dev/null @@ -1,59 +0,0 @@ -# [575. Distribute Candies](https://leetcode.com/problems/distribute-candies/) - - -## 题目 - -Given an integer array with **even** length, where different numbers in this array represent different **kinds** of candies. Each number means one candy of the corresponding kind. You need to distribute these candies **equally** in number to brother and sister. Return the maximum number of **kinds** of candies the sister could gain. - -**Example 1**: - - Input: candies = [1,1,2,2,3,3] - Output: 3 - Explanation: - There are three different kinds of candies (1, 2 and 3), and two candies for each kind. - Optimal distribution: The sister has candies [1,2,3] and the brother has candies [1,2,3], too. - The sister has three different kinds of candies. - -**Example 2**: - - Input: candies = [1,1,2,3] - Output: 2 - Explanation: For example, the sister has candies [2,3] and the brother has candies [1,1]. - The sister has two different kinds of candies, the brother has only one kind of candies. - -**Note**: - -1. The length of the given array is in range [2, 10,000], and will be even. -2. The number in given array is in range [-100,000, 100,000]. - - -## 题目大意 - -给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。 - - -## 解题思路 - - -- 给出一个糖果数组,里面每个元素代表糖果的种类,相同数字代表相同种类。把这些糖果分给兄弟姐妹,问姐妹最多可以分到多少种糖果。这一题比较简单,用 map 统计每个糖果的出现频次,如果总数比 `n/2` 小,那么就返回 `len(map)`,否则返回 `n/2` (即一半都分给姐妹)。 - - -## 代码 - -```go - -package leetcode - -func distributeCandies(candies []int) int { - n, m := len(candies), make(map[int]struct{}, len(candies)) - for _, candy := range candies { - m[candy] = struct{}{} - } - res := len(m) - if n/2 < res { - return n / 2 - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0594.Longest-Harmonious-Subsequence.md b/website/content/ChapterFour/0594.Longest-Harmonious-Subsequence.md deleted file mode 100755 index 380ad65ae..000000000 --- a/website/content/ChapterFour/0594.Longest-Harmonious-Subsequence.md +++ /dev/null @@ -1,57 +0,0 @@ -# [594. Longest Harmonious Subsequence](https://leetcode.com/problems/longest-harmonious-subsequence/) - - -## 题目 - -We define a harmounious array as an array where the difference between its maximum value and its minimum value is **exactly** 1. - -Now, given an integer array, you need to find the length of its longest harmonious subsequence among all its possible [subsequences](https://en.wikipedia.org/wiki/Subsequence). - -**Example 1**: - - Input: [1,3,2,2,5,2,3,7] - Output: 5 - Explanation: The longest harmonious subsequence is [3,2,2,2,3]. - -**Note**: The length of the input array will not exceed 20,000. - - -## 题目大意 - -和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1。现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度。说明: 输入的数组长度最大不超过20,000. - -## 解题思路 - -- 在给出的数组里面找到这样一个子数组:要求子数组中的最大值和最小值相差 1 。这一题是简单题。先统计每个数字出现的频次,然后在 map 找相差 1 的 2 个数组的频次和,动态的维护两个数的频次和就是最后要求的子数组的最大长度。 - - -## 代码 - -```go - -package leetcode - -func findLHS(nums []int) int { - if len(nums) < 2 { - return 0 - } - res := make(map[int]int, len(nums)) - for _, num := range nums { - if _, exist := res[num]; exist { - res[num]++ - continue - } - res[num] = 1 - } - longest := 0 - for k, c := range res { - if n, exist := res[k+1]; exist { - if c+n > longest { - longest = c + n - } - } - } - return longest -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0598.Range-Addition-II.md b/website/content/ChapterFour/0598.Range-Addition-II.md deleted file mode 100644 index a4606f951..000000000 --- a/website/content/ChapterFour/0598.Range-Addition-II.md +++ /dev/null @@ -1,82 +0,0 @@ -# [598. Range Addition II](https://leetcode.com/problems/range-addition-ii/) - - -## 题目 - -Given an m * n matrix **M** initialized with all **0**'s and several update operations. - -Operations are represented by a 2D array, and each operation is represented by an array with two **positive** integers **a** and **b**, which means **M[i][j]** should be **added by one** for all **0 <= i < a** and **0 <= j < b**. - -You need to count and return the number of maximum integers in the matrix after performing all the operations. - -**Example 1**: - -``` -Input: -m = 3, n = 3 -operations = [[2,2],[3,3]] -Output: 4 -Explanation: -Initially, M = -[[0, 0, 0], - [0, 0, 0], - [0, 0, 0]] - -After performing [2,2], M = -[[1, 1, 0], - [1, 1, 0], - [0, 0, 0]] - -After performing [3,3], M = -[[2, 2, 1], - [2, 2, 1], - [1, 1, 1]] - -So the maximum integer in M is 2, and there are four of it in M. So return 4. -``` - -**Note**: - -1. The range of m and n is [1,40000]. -2. The range of a is [1,m], and the range of b is [1,n]. -3. The range of operations size won't exceed 10,000. - -## 题目大意 - -给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] 的值都增加 1。在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。 - -注意: - -- m 和 n 的范围是 [1,40000]。 -- a 的范围是 [1,m],b 的范围是 [1,n]。 -- 操作数目不超过 10000。 - - -## 解题思路 - -- 给定一个初始都为 0 的 m * n 的矩阵,和一个操作数组。经过一系列的操作以后,最终输出矩阵中最大整数的元素个数。每次操作都使得一个矩形内的元素都 + 1 。 -- 这一题乍一看像线段树的区间覆盖问题,但是实际上很简单。如果此题是任意的矩阵,那就可能用到线段树了。这一题每个矩阵的起点都包含 [0 , 0] 这个元素,也就是说每次操作都会影响第一个元素。那么这道题就很简单了。经过 n 次操作以后,被覆盖次数最多的矩形区间,一定就是最大整数所在的区间。由于起点都是第一个元素,所以我们只用关心矩形的右下角那个坐标。右下角怎么计算呢?只用每次动态的维护一下矩阵长和宽的最小值即可。 - -## 代码 - -```go - -package leetcode - -func maxCount(m int, n int, ops [][]int) int { - minM, minN := m, n - for _, op := range ops { - minM = min(minM, op[0]) - minN = min(minN, op[1]) - } - return minM * minN -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0599.Minimum-Index-Sum-of-Two-Lists.md b/website/content/ChapterFour/0599.Minimum-Index-Sum-of-Two-Lists.md deleted file mode 100755 index 01cc155e0..000000000 --- a/website/content/ChapterFour/0599.Minimum-Index-Sum-of-Two-Lists.md +++ /dev/null @@ -1,77 +0,0 @@ -# [599. Minimum Index Sum of Two Lists](https://leetcode.com/problems/minimum-index-sum-of-two-lists/) - -## 题目 - -Suppose Andy and Doris want to choose a restaurant for dinner, and they both have a list of favorite restaurants represented by strings. - -You need to help them find out their **common interest** with the **least list index sum**. If there is a choice tie between answers, output all of them with no order requirement. You could assume there always exists an answer. - -**Example 1**: - - Input: - ["Shogun", "Tapioca Express", "Burger King", "KFC"] - ["Piatti", "The Grill at Torrey Pines", "Hungry Hunter Steakhouse", "Shogun"] - Output: ["Shogun"] - Explanation: The only restaurant they both like is "Shogun". - -**Example 2**: - - Input: - ["Shogun", "Tapioca Express", "Burger King", "KFC"] - ["KFC", "Shogun", "Burger King"] - Output: ["Shogun"] - Explanation: The restaurant they both like and have the least index sum is "Shogun" with index sum 1 (0+1). - -**Note**: - -1. The length of both lists will be in the range of [1, 1000]. -2. The length of strings in both lists will be in the range of [1, 30]. -3. The index is starting from 0 to the list length minus 1. -4. No duplicates in both lists. - - -## 题目大意 - -假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果答案不止一个,则输出所有答案并且不考虑顺序。 你可以假设总是存在一个答案。 - - -提示: - -- 两个列表的长度范围都在 [1, 1000] 内。 -- 两个列表中的字符串的长度将在 [1,30] 的范围内。 -- 下标从 0 开始,到列表的长度减 1。 -- 两个列表都没有重复的元素。 - - - -## 解题思路 - - -- 在 Andy 和 Doris 两人分别有各自的餐厅喜欢列表,要求找出两人公共喜欢的一家餐厅,如果共同喜欢的次数相同,都输出。这一题是简单题,用 map 统计频次,输出频次最多的餐厅。 - - -## 代码 - -```go - -package leetcode - -func findRestaurant(list1 []string, list2 []string) []string { - m, ans := make(map[string]int, len(list1)), []string{} - for i, r := range list1 { - m[r] = i - } - for j, r := range list2 { - if _, ok := m[r]; ok { - m[r] += j - if len(ans) == 0 || m[r] == m[ans[0]] { - ans = append(ans, r) - } else if m[r] < m[ans[0]] { - ans = []string{r} - } - } - } - return ans -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0628.Maximum-Product-of-Three-Numbers.md b/website/content/ChapterFour/0628.Maximum-Product-of-Three-Numbers.md deleted file mode 100755 index c51411ad5..000000000 --- a/website/content/ChapterFour/0628.Maximum-Product-of-Three-Numbers.md +++ /dev/null @@ -1,96 +0,0 @@ -# [628. Maximum Product of Three Numbers](https://leetcode.com/problems/maximum-product-of-three-numbers/) - - -## 题目 - -Given an integer array, find three numbers whose product is maximum and output the maximum product. - -**Example 1**: - - Input: [1,2,3] - Output: 6 - -**Example 2**: - - Input: [1,2,3,4] - Output: 24 - -**Note**: - -1. The length of the given array will be in range [3,10^4] and all elements are in the range [-1000, 1000]. -2. Multiplication of any three numbers in the input won't exceed the range of 32-bit signed integer. - - -## 题目大意 - -给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。 - - - - -## 解题思路 - - -- 给出一个数组,要求求出这个数组中任意挑 3 个数能组成的乘积最大的值。 -- 题目的 test case 数据量比较大,如果用排序的话,时间复杂度高,可以直接考虑模拟,挑出 3 个数组成乘积最大值,必然是一个正数和二个负数,或者三个正数。那么选出最大的三个数和最小的二个数,对比一下就可以求出最大值了。时间复杂度 O(n) - - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -// 解法一 排序,时间复杂度 O(n log n) -func maximumProduct(nums []int) int { - if len(nums) == 0 { - return 0 - } - res := 1 - if len(nums) <= 3 { - for i := 0; i < len(nums); i++ { - res = res * nums[i] - } - return res - } - sort.Ints(nums) - if nums[len(nums)-1] <= 0 { - return 0 - } - return max(nums[0]*nums[1]*nums[len(nums)-1], nums[len(nums)-1]*nums[len(nums)-2]*nums[len(nums)-3]) -} - -// 解法二 模拟,时间复杂度 O(n) -func maximumProduct1(nums []int) int { - n1, n2, n3 := -1<<63, -1<<63, -1<<63 - n4, n5 := 0, 0 - for _, v := range nums { - if v > n1 { - n3 = n2 - n2 = n1 - n1 = v - } else if v > n2 { - n3 = n2 - n2 = v - } else if v > n3 { - n3 = v - } - if v < n4 { - n5 = n4 - n4 = v - } else if v < n5 { - n5 = v - } - } - if n2*n3 > n4*n5 { - return n1 * n2 * n3 - } - return n1 * n4 * n5 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0632.Smallest-Range-Covering-Elements-from-K-Lists.md b/website/content/ChapterFour/0632.Smallest-Range-Covering-Elements-from-K-Lists.md deleted file mode 100755 index b1187be98..000000000 --- a/website/content/ChapterFour/0632.Smallest-Range-Covering-Elements-from-K-Lists.md +++ /dev/null @@ -1,113 +0,0 @@ -# [632. Smallest Range Covering Elements from K Lists](https://leetcode.com/problems/smallest-range-covering-elements-from-k-lists/) - - -## 题目 - -You have `k` lists of sorted integers in ascending order. Find the **smallest** range that includes at least one number from each of the `k` lists. - -We define the range [a,b] is smaller than range [c,d] if `b-a < d-c` or `a < c` if `b-a == d-c`. - -**Example 1**: - - Input: [[4,10,15,24,26], [0,9,12,20], [5,18,22,30]] - Output: [20,24] - Explanation: - List 1: [4, 10, 15, 24,26], 24 is in range [20,24]. - List 2: [0, 9, 12, 20], 20 is in range [20,24]. - List 3: [5, 18, 22, 30], 22 is in range [20,24]. - -**Note**: - -1. The given list may contain duplicates, so ascending order means >= here. -2. 1 <= `k` <= 3500 -3. -10^5 <= `value of elements` <= 10^5. - - -## 题目大意 - -你有 k 个升序排列的整数数组。找到一个最小区间,使得 k 个列表中的每个列表至少有一个数包含在其中。 - -我们定义如果 b-a < d-c 或者在 b-a == d-c 时 a < c,则区间 [a,b] 比 [c,d] 小。 - -注意: - -- 给定的列表可能包含重复元素,所以在这里升序表示 >= 。 -- 1 <= k <= 3500 -- -105 <= 元素的值 <= 105 -- 对于使用Java的用户,请注意传入类型已修改为List>。重置代码模板后可以看到这项改动。 - - - -## 解题思路 - - -- 给出 K 个数组,要求在这 K 个数组中找到一个区间,至少能包含这 K 个数组中每个数组中的一个元素。 -- 这一题是第 76 题的变种版。第 76 题是用滑动窗口来解答的,它要求在母字符串 S 中找到最小的子串能包含 T 串的所有字母。这一题类似的,可以把母字符串看成 K 个数组合并起来的大数组,那么 T 串是由 K 个数组中每个数组中抽一个元素出来组成的。求的区间相同,都是能包含 T 的最小区间。另外一个区别在于,第 76 题里面都是字符串,这一题都是数字,在最终拼接成 T 串的时候需要保证 K 个数组中每个都有一个元素,所以理所当然的想到需要维护每个元素所在数组编号。经过上述的转换,可以把这道题转换成第 76 题的解法了。 -- 在具体解题过程中,用 map 来维护窗口内 K 个数组出现的频次。时间复杂度 O(n*log n),空间复杂度是O(n)。 - -## 代码 - -```go - -package leetcode - -import ( - "math" - "sort" -) - -func smallestRange(nums [][]int) []int { - numList, left, right, count, freqMap, res, length := []element{}, 0, -1, 0, map[int]int{}, make([]int, 2), math.MaxInt64 - for i, ns := range nums { - for _, v := range ns { - numList = append(numList, element{val: v, index: i}) - } - } - sort.Sort(SortByVal{numList}) - for left < len(numList) { - if right+1 < len(numList) && count < len(nums) { - right++ - if freqMap[numList[right].index] == 0 { - count++ - } - freqMap[numList[right].index]++ - } else { - if count == len(nums) { - if numList[right].val-numList[left].val < length { - length = numList[right].val - numList[left].val - res[0] = numList[left].val - res[1] = numList[right].val - } - } - freqMap[numList[left].index]-- - if freqMap[numList[left].index] == 0 { - count-- - } - left++ - } - } - return res -} - -type element struct { - val int - index int -} - -type elements []element - -// Len define -func (p elements) Len() int { return len(p) } - -// Swap define -func (p elements) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -// SortByVal define -type SortByVal struct{ elements } - -// Less define -func (p SortByVal) Less(i, j int) bool { - return p.elements[i].val < p.elements[j].val -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0633.Sum-of-Square-Numbers.md b/website/content/ChapterFour/0633.Sum-of-Square-Numbers.md deleted file mode 100755 index 4af1d2a4f..000000000 --- a/website/content/ChapterFour/0633.Sum-of-Square-Numbers.md +++ /dev/null @@ -1,53 +0,0 @@ -# [633. Sum of Square Numbers](https://leetcode.com/problems/sum-of-square-numbers/) - - -## 题目 - -Given a non-negative integer `c`, your task is to decide whether there're two integers `a` and `b` such that a^2 + b^2 = c. - -**Example 1**: - - Input: 5 - Output: True - Explanation: 1 * 1 + 2 * 2 = 5 - -**Example 2**: - - Input: 3 - Output: False - - -## 题目大意 - -给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c。 - - -## 解题思路 - -- 给出一个数,要求判断这个数能否由由 2 个完全平方数组成。能则输出 true,不能则输出 false。 -- 可以用二分搜索来解答这道题。判断题意,依次计算 `low * low + high * high` 和 c 是否相等。从 [1, sqrt(n)] 区间内进行二分,若能找到则返回 true,找不到就返回 false 。 - - -## 代码 - -```go - -package leetcode - -import "math" - -func judgeSquareSum(c int) bool { - low, high := 0, int(math.Sqrt(float64(c))) - for low <= high { - if low*low+high*high < c { - low++ - } else if low*low+high*high > c { - high-- - } else { - return true - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0636.Exclusive-Time-of-Functions.md b/website/content/ChapterFour/0636.Exclusive-Time-of-Functions.md deleted file mode 100755 index 71458a892..000000000 --- a/website/content/ChapterFour/0636.Exclusive-Time-of-Functions.md +++ /dev/null @@ -1,100 +0,0 @@ -# [636. Exclusive Time of Functions](https://leetcode.com/problems/exclusive-time-of-functions/) - - -## 题目 - -On a single threaded CPU, we execute some functions. Each function has a unique id between `0` and `N-1`. - -We store logs in timestamp order that describe when a function is entered or exited. - -Each log is a string with this format: `"{function_id}:{"start" | "end"}:{timestamp}"`. For example, `"0:start:3"` means the function with id `0` started at the beginning of timestamp `3`. `"1:end:2"` means the function with id `1` ended at the end of timestamp `2`. - -A function's *exclusive time* is the number of units of time spent in this function. Note that this does not include any recursive calls to child functions. - -Return the exclusive time of each function, sorted by their function id. - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2019/04/05/diag1b.png) - - Input: - n = 2 - logs = ["0:start:0","1:start:2","1:end:5","0:end:6"] - Output: [3, 4] - Explanation: - Function 0 starts at the beginning of time 0, then it executes 2 units of time and reaches the end of time 1. - Now function 1 starts at the beginning of time 2, executes 4 units of time and ends at time 5. - Function 0 is running again at the beginning of time 6, and also ends at the end of time 6, thus executing for 1 unit of time. - So function 0 spends 2 + 1 = 3 units of total time executing, and function 1 spends 4 units of total time executing. - -**Note**: - -1. `1 <= n <= 100` -2. Two functions won't start or end at the same time. -3. Functions will always log when they exit. - - - -## 题目大意 - -给出一个非抢占单线程CPU的 n 个函数运行日志,找到函数的独占时间。每个函数都有一个唯一的 Id,从 0 到 n-1,函数可能会递归调用或者被其他函数调用。 - -日志是具有以下格式的字符串:function_id:start_or_end:timestamp。例如:"0:start:0" 表示函数 0 从 0 时刻开始运行。"0:end:0" 表示函数 0 在 0 时刻结束。 - -函数的独占时间定义是在该方法中花费的时间,调用其他函数花费的时间不算该函数的独占时间。你需要根据函数的 Id 有序地返回每个函数的独占时间。 - - -## 解题思路 - - -- 利用栈记录每一个开始了但是未完成的任务,完成以后任务就 pop 一个。 -- 注意题目中关于任务时长的定义,例如,start 7,end 7,这个任务执行了 1 秒而不是 0 秒 - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" - "strings" -) - -type log struct { - id int - order string - time int -} - -func exclusiveTime(n int, logs []string) []int { - res, lastLog, stack := make([]int, n), log{id: -1, order: "", time: 0}, []log{} - for i := 0; i < len(logs); i++ { - a := strings.Split(logs[i], ":") - id, _ := strconv.Atoi(a[0]) - time, _ := strconv.Atoi(a[2]) - - if (lastLog.order == "start" && a[1] == "start") || (lastLog.order == "start" && a[1] == "end") { - res[lastLog.id] += time - lastLog.time - if a[1] == "end" { - res[lastLog.id]++ - } - } - if lastLog.order == "end" && a[1] == "end" { - res[id] += time - lastLog.time - } - if lastLog.order == "end" && a[1] == "start" && len(stack) != 0 { - res[stack[len(stack)-1].id] += time - lastLog.time - 1 - } - if a[1] == "start" { - stack = append(stack, log{id: id, order: a[1], time: time}) - } else { - stack = stack[:len(stack)-1] - } - lastLog = log{id: id, order: a[1], time: time} - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0637.Average-of-Levels-in-Binary-Tree.md b/website/content/ChapterFour/0637.Average-of-Levels-in-Binary-Tree.md deleted file mode 100644 index 34b0c41aa..000000000 --- a/website/content/ChapterFour/0637.Average-of-Levels-in-Binary-Tree.md +++ /dev/null @@ -1,85 +0,0 @@ -# [637. Average of Levels in Binary Tree](https://leetcode.com/problems/average-of-levels-in-binary-tree/) - -## 题目 - -Given a non-empty binary tree, return the average value of the nodes on each level in the form of an array. - -**Example 1**: - -``` - -Input: - 3 - / \ - 9 20 - / \ - 15 7 -Output: [3, 14.5, 11] -Explanation: -The average value of nodes on level 0 is 3, on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11]. - -``` - -**Note**: - -The range of node's value is in the range of 32-bit signed integer. - - -## 题目大意 - -按层序从上到下遍历一颗树,计算每一层的平均值。 - - -## 解题思路 - -- 用一个队列即可实现。 -- 第 102 题和第 107 题都是按层序遍历的。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func averageOfLevels(root *TreeNode) []float64 { - if root == nil { - return []float64{0} - } - queue := []*TreeNode{} - queue = append(queue, root) - curNum, nextLevelNum, res, count, sum := 1, 0, []float64{}, 1, 0 - for len(queue) != 0 { - if curNum > 0 { - node := queue[0] - if node.Left != nil { - queue = append(queue, node.Left) - nextLevelNum++ - } - if node.Right != nil { - queue = append(queue, node.Right) - nextLevelNum++ - } - curNum-- - sum += node.Val - queue = queue[1:] - } - if curNum == 0 { - res = append(res, float64(sum)/float64(count)) - curNum, count, nextLevelNum, sum = nextLevelNum, nextLevelNum, 0, 0 - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0638.Shopping-Offers.md b/website/content/ChapterFour/0638.Shopping-Offers.md deleted file mode 100644 index cf389acb3..000000000 --- a/website/content/ChapterFour/0638.Shopping-Offers.md +++ /dev/null @@ -1,129 +0,0 @@ -# [638. Shopping Offers](https://leetcode.com/problems/shopping-offers/) - - - -## 题目 - -In LeetCode Store, there are some kinds of items to sell. Each item has a price. - -However, there are some special offers, and a special offer consists of one or more different kinds of items with a sale price. - -You are given the each item's price, a set of special offers, and the number we need to buy for each item. The job is to output the lowest price you have to pay for **exactly** certain items as given, where you could make optimal use of the special offers. - -Each special offer is represented in the form of an array, the last number represents the price you need to pay for this special offer, other numbers represents how many specific items you could get if you buy this offer. - -You could use any of special offers as many times as you want. - -**Example 1**: - -``` -Input: [2,5], [[3,0,5],[1,2,10]], [3,2] -Output: 14 -Explanation: -There are two kinds of items, A and B. Their prices are $2 and $5 respectively. -In special offer 1, you can pay $5 for 3A and 0B -In special offer 2, you can pay $10 for 1A and 2B. -You need to buy 3A and 2B, so you may pay $10 for 1A and 2B (special offer #2), and $4 for 2A. -``` - -**Example 2**: - -``` -Input: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1] -Output: 11 -Explanation: -The price of A is $2, and $3 for B, $4 for C. -You may pay $4 for 1A and 1B, and $9 for 2A ,2B and 1C. -You need to buy 1A ,2B and 1C, so you may pay $4 for 1A and 1B (special offer #1), and $3 for 1B, $4 for 1C. -You cannot add more items, though only $9 for 2A ,2B and 1C. -``` - -**Note**: - -1. There are at most 6 kinds of items, 100 special offers. -2. For each item, you need to buy at most 6 of them. -3. You are **not** allowed to buy more items than you want, even if that would lower the overall price. - - -## 题目大意 - -在 LeetCode 商店中, 有许多在售的物品。然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品。 - -现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单。请输出确切完成待购清单的最低花费。每个大礼包的由一个数组中的一组数据描述,最后一个数字代表大礼包的价格,其他数字分别表示内含的其他种类物品的数量。任意大礼包可无限次购买。 - -例子 1: - -``` -输入: [2,5], [[3,0,5],[1,2,10]], [3,2] -输出: 14 -解释: -有A和B两种物品,价格分别为¥2和¥5。 -大礼包1,你可以以¥5的价格购买3A和0B。 -大礼包2, 你可以以¥10的价格购买1A和2B。 -你需要购买3个A和2个B, 所以你付了¥10购买了1A和2B(大礼包2),以及¥4购买2A。 - -``` -例子 2: - -``` -输入: [2,3,4], [[1,1,0,4],[2,2,1,9]], [1,2,1] -输出: 11 -解释: -A,B,C的价格分别为¥2,¥3,¥4. -你可以用¥4购买1A和1B,也可以用¥9购买2A,2B和1C。 -你需要买1A,2B和1C,所以你付了¥4买了1A和1B(大礼包1),以及¥3购买1B, ¥4购买1C。 -你不可以购买超出待购清单的物品,尽管购买大礼包2更加便宜。 -``` - -说明: - -- 最多6种物品, 100种大礼包。 -- 每种物品,你最多只需要购买6个。 -- 你不可以购买超出待购清单的物品,即使更便宜。 - - -## 解题思路 - -- 给出 3 个数组,3 个数组分别代表的意义是在售的商品价格,多个礼包以及礼包内每个商品的数量和总价,购物清单上需要购买每个商品的数量。问购买清单上的所有商品所需的最低花费。 -- 这一题可以用 DFS 暴力解题,也可以用 DP。笔者这题先用 DFS 来解答。设当前搜索到的状态为 `shopping(price, special, needs)`,其中 `price` 和 `special` 为题目中所述的物品的单价和捆绑销售的大礼包,而 `needs` 为当前需要的每种物品的数量。针对于每个商品,可以有 3 种购买规则,第一种,选礼包里面的第一个优惠购买,第二种,不选当前礼包优惠,选下一个优惠进行购买,第三种,不使用优惠,直接购买。这样就对应了 3 种 DFS 的方向。具体见代码。如果选择了礼包优惠,那么递归到下一层,`need` 需要对应减少礼包里面的数量,最终金额累加。当所有情况遍历完以后,可以返回出最小花费。 -- 这一题需要注意的剪枝情况:是否需要购买礼包。题目中要求了,不能购买超过清单上数量的商品,即使价格便宜,也不行。例如可以买 n 个礼包 A,但是最终商品数量超过了清单上的商品,这种购买方式是不行的。所以需要先判断当前递归中,满足 `need` 和 `price` 条件的,能否使用礼包。这里包含 2 种情况,一种是当前商品已经满足清单个数了,不需要再买了;还有一种情况是已经超过清单数量了,那这种情况需要立即返回,当前这种购买方式不合题意。 - -## 代码 - -```go -func shoppingOffers(price []int, special [][]int, needs []int) int { - res := -1 - dfsShoppingOffers(price, special, needs, 0, &res) - return res -} - -func dfsShoppingOffers(price []int, special [][]int, needs []int, pay int, res *int) { - noNeeds := true - // 剪枝 - for _, need := range needs { - if need < 0 { - return - } - if need != 0 { - noNeeds = false - } - } - if len(special) == 0 || noNeeds { - for i, p := range price { - pay += (p * needs[i]) - } - if pay < *res || *res == -1 { - *res = pay - } - return - } - newNeeds := make([]int, len(needs)) - copy(newNeeds, needs) - for i, n := range newNeeds { - newNeeds[i] = n - special[0][i] - } - dfsShoppingOffers(price, special, newNeeds, pay+special[0][len(price)], res) - dfsShoppingOffers(price, special[1:], newNeeds, pay+special[0][len(price)], res) - dfsShoppingOffers(price, special[1:], needs, pay, res) -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0645.Set-Mismatch.md b/website/content/ChapterFour/0645.Set-Mismatch.md deleted file mode 100755 index 9236fd4c2..000000000 --- a/website/content/ChapterFour/0645.Set-Mismatch.md +++ /dev/null @@ -1,62 +0,0 @@ -# [645. Set Mismatch](https://leetcode.com/problems/set-mismatch/) - - -## 题目 - -The set `S` originally contains numbers from 1 to `n`. But unfortunately, due to the data error, one of the numbers in the set got duplicated to **another** number in the set, which results in repetition of one number and loss of another number. - -Given an array `nums` representing the data status of this set after the error. Your task is to firstly find the number occurs twice and then find the number that is missing. Return them in the form of an array. - -**Example 1**: - - Input: nums = [1,2,2,4] - Output: [2,3] - -**Note**: - -1. The given array size will in the range [2, 10000]. -2. The given array's numbers won't have any order. - - -## 题目大意 - - -集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。 - -注意: - -- 给定数组的长度范围是 [2, 10000]。 -- 给定的数组是无序的。 - - -## 解题思路 - - -- 给出一个数组,数组里面装的是 1-n 的数字,由于错误导致有一个数字变成了另外一个数字,要求找出重复的一个数字和正确的数字。这一题是简单题,根据下标比对就可以找到哪个数字重复了,哪个数字缺少了。 - - -## 代码 - -```go - -package leetcode - -func findErrorNums(nums []int) []int { - m, res := make([]int, len(nums)), make([]int, 2) - for _, n := range nums { - if m[n-1] == 0 { - m[n-1] = 1 - } else { - res[0] = n - } - } - for i := range m { - if m[i] == 0 { - res[1] = i + 1 - break - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0648.Replace-Words.md b/website/content/ChapterFour/0648.Replace-Words.md deleted file mode 100755 index 17614c9c6..000000000 --- a/website/content/ChapterFour/0648.Replace-Words.md +++ /dev/null @@ -1,111 +0,0 @@ -# [648. Replace Words](https://leetcode.com/problems/replace-words/) - - -## 题目 - -In English, we have a concept called `root`, which can be followed by some other words to form another longer word - let's call this word `successor`. For example, the root `an`, followed by `other`, which can form another word `another`. - -Now, given a dictionary consisting of many roots and a sentence. You need to replace all the `successor` in the sentence with the `root` forming it. If a `successor` has many `roots` can form it, replace it with the root with the shortest length. - -You need to output the sentence after the replacement. - -**Example 1**: - - Input: dict = ["cat", "bat", "rat"] - sentence = "the cattle was rattled by the battery" - Output: "the cat was rat by the bat" - -**Note**: - -1. The input will only have lower-case letters. -2. 1 <= dict words number <= 1000 -3. 1 <= sentence words number <= 1000 -4. 1 <= root length <= 100 -5. 1 <= sentence words length <= 1000 - - -## 题目大意 - -在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词——我们称这个词为 继承词(successor)。例如,词根an,跟随着单词 other(其他),可以形成新的单词 another(另一个)。 - -现在,给定一个由许多词根组成的词典和一个句子。你需要将句子中的所有继承词用词根替换掉。如果继承词有许多可以形成它的词根,则用最短的词根替换它。要求输出替换之后的句子。 - - - -## 解题思路 - - -- 给出一个句子和一个可替换字符串的数组,如果句子中的单词和可替换列表里面的单词,有相同的首字母,那么就把句子中的单词替换成可替换列表里面的单词。输入最后替换完成的句子。 -- 这一题有 2 种解题思路,第一种就是单纯的用 Map 查找。第二种是用 Trie 去替换。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -// 解法一 哈希表 -func replaceWords(dict []string, sentence string) string { - roots := make(map[byte][]string) - for _, root := range dict { - b := root[0] - roots[b] = append(roots[b], root) - } - words := strings.Split(sentence, " ") - for i, word := range words { - b := []byte(word) - for j := 1; j < len(b) && j <= 100; j++ { - if findWord(roots, b[0:j]) { - words[i] = string(b[0:j]) - break - } - } - } - return strings.Join(words, " ") -} - -func findWord(roots map[byte][]string, word []byte) bool { - if roots[word[0]] == nil { - return false - } - for _, root := range roots[word[0]] { - if root == string(word) { - return true - } - } - return false -} - -//解法二 Trie -func replaceWords1(dict []string, sentence string) string { - trie := Constructor208() - for _, v := range dict { - trie.Insert(v) - } - words := strings.Split(sentence, " ") - var result []string - word := "" - i := 0 - for _, value := range words { - word = "" - for i = 1; i < len(value); i++ { - if trie.Search(value[:i]) { - word = value[:i] - break - } - } - - if len(word) == 0 { - result = append(result, value) - } else { - result = append(result, word) - } - - } - return strings.Join(result, " ") -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0653.Two-Sum-IV---Input-is-a-BST.md b/website/content/ChapterFour/0653.Two-Sum-IV---Input-is-a-BST.md deleted file mode 100755 index e203db033..000000000 --- a/website/content/ChapterFour/0653.Two-Sum-IV---Input-is-a-BST.md +++ /dev/null @@ -1,75 +0,0 @@ -# [653. Two Sum IV - Input is a BST](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/) - -## 题目 - -Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target. - -**Example 1**: - - Input: - 5 - / \ - 3 6 - / \ \ - 2 4 7 - - Target = 9 - - Output: True - -**Example 2**: - - Input: - 5 - / \ - 3 6 - / \ \ - 2 4 7 - - Target = 28 - - Output: False - - -## 题目大意 - -给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。 - -## 解题思路 - - -- 在树中判断是否存在 2 个数的和是 sum。 -- 这一题是 two sum 问题的变形题,只不过题目背景是在 BST 上处理的。处理思路大体一致,用 map 记录已经访问过的节点值。边遍历树边查看 map 里面是否有 sum 的另外一半。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func findTarget(root *TreeNode, k int) bool { - m := make(map[int]int, 0) - return findTargetDFS(root, k, m) -} - -func findTargetDFS(root *TreeNode, k int, m map[int]int) bool { - if root == nil { - return false - } - if _, ok := m[k-root.Val]; ok { - return ok - } - m[root.Val]++ - return findTargetDFS(root.Left, k, m) || findTargetDFS(root.Right, k, m) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0658.Find-K-Closest-Elements.md b/website/content/ChapterFour/0658.Find-K-Closest-Elements.md deleted file mode 100755 index b55ced18a..000000000 --- a/website/content/ChapterFour/0658.Find-K-Closest-Elements.md +++ /dev/null @@ -1,82 +0,0 @@ -# [658. Find K Closest Elements](https://leetcode.com/problems/find-k-closest-elements/) - - -## 题目 - -Given a sorted array, two integers `k` and `x`, find the `k` closest elements to `x` in the array. The result should also be sorted in ascending order. If there is a tie, the smaller elements are always preferred. - -**Example 1**: - - Input: [1,2,3,4,5], k=4, x=3 - Output: [1,2,3,4] - -**Example 2**: - - Input: [1,2,3,4,5], k=4, x=-1 - Output: [1,2,3,4] - -**Note**: - -1. The value k is positive and will always be smaller than the length of the sorted array. -2. Length of the given array is positive and will not exceed 10^4 -3. Absolute value of elements in the array and x will not exceed 10^4 - ---- - -**UPDATE (2017/9/19)**: The arr parameter had been changed to an **array of integers** (instead of a list of integers). **Please reload the code definition to get the latest changes**. - - -## 题目大意 - - -给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。 - - -说明: - -1. k 的值为正数,且总是小于给定排序数组的长度。 -2. 数组不为空,且长度不超过 104 -3. 数组里的每个元素与 x 的绝对值不超过 104 -  - -更新(2017/9/19): -这个参数 arr 已经被改变为一个整数数组(而不是整数列表)。 请重新加载代码定义以获取最新更改。 - - - - -## 解题思路 - - -- 给出一个数组,要求在数组中找到一个长度为 k 的区间,这个区间内每个元素距离 x 的距离都是整个数组里面最小的。 -- 这一题可以用双指针解题,最优解法是二分搜索。由于区间长度固定是 K 个,所以左区间最大只能到 `len(arr) - K` (因为长度为 K 以后,正好右区间就到数组最右边了),在 `[0,len(arr) - K]` 这个区间中进行二分搜索。如果发现 `a[mid]` 与 `x` 距离比 `a[mid + k]` 与 `x` 的距离要大,说明要找的区间一定在右侧,继续二分,直到最终 `low = high` 的时候退出。逼出的 `low` 值就是最终答案区间的左边界。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 库函数二分搜索 -func findClosestElements(arr []int, k int, x int) []int { - return arr[sort.Search(len(arr)-k, func(i int) bool { return x-arr[i] <= arr[i+k]-x }):][:k] -} - -// 解法二 手撸二分搜索 -func findClosestElements1(arr []int, k int, x int) []int { - low, high := 0, len(arr)-k - for low < high { - mid := low + (high-low)>>1 - if x-arr[mid] > arr[mid+k]-x { - low = mid + 1 - } else { - high = mid - } - } - return arr[low : low+k] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0661.Image-Smoother.md b/website/content/ChapterFour/0661.Image-Smoother.md deleted file mode 100644 index 03fde6bf7..000000000 --- a/website/content/ChapterFour/0661.Image-Smoother.md +++ /dev/null @@ -1,111 +0,0 @@ -# [661. Image Smoother](https://leetcode.com/problems/image-smoother/) - -## 题目 - -Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surrounding cells and itself. If a cell has less than 8 surrounding cells, then use as many as you can. - -**Example 1**: - -``` -Input: -[[1,1,1], - [1,0,1], - [1,1,1]] -Output: -[[0, 0, 0], - [0, 0, 0], - [0, 0, 0]] -Explanation: -For the point (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0 -For the point (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0 -For the point (1,1): floor(8/9) = floor(0.88888889) = 0 - -``` - -**Note**: - -1. The value in the given matrix is in the range of [0, 255]. -2. The length and width of the given matrix are in the range of [1, 150]. - - -## 题目大意 - -包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。 - -注意: - -- 给定矩阵中的整数范围为 [0, 255]。 -- 矩阵的长和宽的范围均为 [1, 150]。 - - -## 解题思路 - -- 将二维数组中的每个元素变为周围 9 个元素的平均值。 -- 简单题,按照题意计算平均值即可。需要注意的是边界问题,四个角和边上的元素,这些点计算平均值的时候,计算平均值都不足 9 个元素。 - -## 代码 - -```go - -package leetcode - -func imageSmoother(M [][]int) [][]int { - res := make([][]int, len(M)) - for i := range M { - res[i] = make([]int, len(M[0])) - } - for y := 0; y < len(M); y++ { - for x := 0; x < len(M[0]); x++ { - res[y][x] = smooth(x, y, M) - } - } - return res -} - -func smooth(x, y int, M [][]int) int { - count, sum := 1, M[y][x] - // Check bottom - if y+1 < len(M) { - sum += M[y+1][x] - count++ - } - // Check Top - if y-1 >= 0 { - sum += M[y-1][x] - count++ - } - // Check left - if x-1 >= 0 { - sum += M[y][x-1] - count++ - } - // Check Right - if x+1 < len(M[y]) { - sum += M[y][x+1] - count++ - } - // Check Coners - // Top Left - if y-1 >= 0 && x-1 >= 0 { - sum += M[y-1][x-1] - count++ - } - // Top Right - if y-1 >= 0 && x+1 < len(M[0]) { - sum += M[y-1][x+1] - count++ - } - // Bottom Left - if y+1 < len(M) && x-1 >= 0 { - sum += M[y+1][x-1] - count++ - } - //Bottom Right - if y+1 < len(M) && x+1 < len(M[0]) { - sum += M[y+1][x+1] - count++ - } - return sum / count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0662.Maximum-Width-of-Binary-Tree.md b/website/content/ChapterFour/0662.Maximum-Width-of-Binary-Tree.md deleted file mode 100755 index d60af0250..000000000 --- a/website/content/ChapterFour/0662.Maximum-Width-of-Binary-Tree.md +++ /dev/null @@ -1,152 +0,0 @@ -# [662. Maximum Width of Binary Tree](https://leetcode.com/problems/maximum-width-of-binary-tree/) - - -## 题目 - -Given a binary tree, write a function to get the maximum width of the given tree. The width of a tree is the maximum width among all levels. The binary tree has the same structure as a **full binary tree**, but some nodes are null. - -The width of one level is defined as the length between the end-nodes (the leftmost and right most non-null nodes in the level, where the `null` nodes between the end-nodes are also counted into the length calculation. - -**Example 1**: - - Input: - - 1 - / \ - 3 2 - / \ \ - 5 3 9 - - Output: 4 - Explanation: The maximum width existing in the third level with the length 4 (5,3,null,9). - -**Example 2**: - - Input: - - 1 - / - 3 - / \ - 5 3 - - Output: 2 - Explanation: The maximum width existing in the third level with the length 2 (5,3). - -**Example 3**: - - Input: - - 1 - / \ - 3 2 - / - 5 - - Output: 2 - Explanation: The maximum width existing in the second level with the length 2 (3,2). - -**Example 4**: - - Input: - - 1 - / \ - 3 2 - / \ - 5 9 - / \ - 6 7 - Output: 8 - Explanation:The maximum width existing in the fourth level with the length 8 (6,null,null,null,null,null,null,7). - -**Note**: Answer will in the range of 32-bit signed integer. - - -## 题目大意 - -给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。 - -每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。 - -注意: 答案在32位有符号整数的表示范围内。 - - - -## 解题思路 - - -- 给出一个二叉树,求这棵树最宽的部分。 -- 这一题可以用 BFS 也可以用 DFS,但是用 BFS 比较方便。按照层序遍历,依次算出每层最左边不为 `null` 的节点和最右边不为 `null` 的节点。这两个节点之间都是算宽度的。最终输出最大的宽度即可。此题的关键在于如何有效的找到每一层的左右边界。 -- 这一题可能有人会想着先补全满二叉树,然后每层分别找左右边界。这种方法提交以后会卡在 `104 / 108` 这组测试用例上,这组测试用例会使得最后某几层填充出现的满二叉树节点特别多,最终导致 `Memory Limit Exceeded` 了。 -- 由于此题要找每层的左右边界,实际上每个节点的 `Val` 值是我们不关心的,那么可以把这个值用来标号,标记成该节点在每层中的序号。父亲节点在上一层中的序号是 x,那么它的左孩子在下一层满二叉树中的序号是 `2*x`,它的右孩子在下一层满二叉树中的序号是 `2*x + 1`。将所有节点都标上号,用 BFS 层序遍历每一层,每一层都找到左右边界,相减拿到宽度,动态维护最大宽度,就是本题的最终答案。 - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func widthOfBinaryTree(root *TreeNode) int { - if root == nil { - return 0 - } - if root.Left == nil && root.Right == nil { - return 1 - } - - queue, res := []*TreeNode{}, 0 - queue = append(queue, &TreeNode{0, root.Left, root.Right}) - - for len(queue) != 0 { - var left, right *int - // 这里需要注意,先保存 queue 的个数,相当于拿到此层的总个数 - qLen := len(queue) - // 这里循环不要写 i < len(queue),因为每次循环 queue 的长度都在变小 - for i := 0; i < qLen; i++ { - node := queue[0] - queue = queue[1:] - if node.Left != nil { - // 根据满二叉树父子节点的关系,得到下一层节点在本层的编号 - newVal := node.Val * 2 - queue = append(queue, &TreeNode{newVal, node.Left.Left, node.Left.Right}) - if left == nil || *left > newVal { - left = &newVal - } - if right == nil || *right < newVal { - right = &newVal - } - } - if node.Right != nil { - // 根据满二叉树父子节点的关系,得到下一层节点在本层的编号 - newVal := node.Val*2 + 1 - queue = append(queue, &TreeNode{newVal, node.Right.Left, node.Right.Right}) - if left == nil || *left > newVal { - left = &newVal - } - if right == nil || *right < newVal { - right = &newVal - } - } - } - switch { - // 某层只有一个点,那么此层宽度为 1 - case left != nil && right == nil, left == nil && right != nil: - res = max(res, 1) - // 某层只有两个点,那么此层宽度为两点之间的距离 - case left != nil && right != nil: - res = max(res, *right-*left+1) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0668.Kth-Smallest-Number-in-Multiplication-Table.md b/website/content/ChapterFour/0668.Kth-Smallest-Number-in-Multiplication-Table.md deleted file mode 100755 index 491973cba..000000000 --- a/website/content/ChapterFour/0668.Kth-Smallest-Number-in-Multiplication-Table.md +++ /dev/null @@ -1,84 +0,0 @@ -# [668. Kth Smallest Number in Multiplication Table](https://leetcode.com/problems/kth-smallest-number-in-multiplication-table/) - - -## 题目 - -Nearly every one have used the [Multiplication Table](https://en.wikipedia.org/wiki/Multiplication_table). But could you find out the `k-th` smallest number quickly from the multiplication table? - -Given the height `m` and the length `n` of a `m * n` Multiplication Table, and a positive integer `k`, you need to return the `k-th` smallest number in this table. - -**Example 1**: - - Input: m = 3, n = 3, k = 5 - Output: - Explanation: - The Multiplication Table: - 1 2 3 - 2 4 6 - 3 6 9 - - The 5-th smallest number is 3 (1, 2, 2, 3, 3). - -**Example 2**: - - Input: m = 2, n = 3, k = 6 - Output: - Explanation: - The Multiplication Table: - 1 2 3 - 2 4 6 - - The 6-th smallest number is 6 (1, 2, 2, 3, 4, 6). - -**Note**: - -1. The `m` and `n` will be in the range [1, 30000]. -2. The `k` will be in the range [1, m * n] - - -## 题目大意 - -几乎每一个人都用乘法表。但是你能在乘法表中快速找到第 k 小的数字吗?给定高度 m 、宽度 n 的一张 m * n 的乘法表,以及正整数 k,你需要返回表中第 k 小的数字。 - - -注意: - -- m 和 n 的范围在 [1, 30000] 之间。 -- k 的范围在 [1, m * n] 之间。 - -## 解题思路 - -- 给出 3 个数字,m,n,k。m 和 n 分别代表乘法口诀表的行和列。要求在这个乘法口诀表中找第 k 小的数字。 -- 这一题是第 378 题变种题。利用二分搜索,在 `[1,m*n]` 的区间内搜索第 `k` 小的数。每次二分统计 `≤ mid` 数字的个数。由于是在两数乘法构成的矩阵中计数,知道乘数,被乘数也就知道了,所以计数只需要一层循环。整体代码和第 378 题完全一致,只是计数的部分不同罢了。可以对比第 378 题一起练习。 - - -## 代码 - -```go - -package leetcode - -import "math" - -func findKthNumber(m int, n int, k int) int { - low, high := 1, m*n - for low < high { - mid := low + (high-low)>>1 - if counterKthNum(m, n, mid) >= k { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -func counterKthNum(m, n, mid int) int { - count := 0 - for i := 1; i <= m; i++ { - count += int(math.Min(math.Floor(float64(mid)/float64(i)), float64(n))) - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0676.Implement-Magic-Dictionary.md b/website/content/ChapterFour/0676.Implement-Magic-Dictionary.md deleted file mode 100755 index 4ce7d05cd..000000000 --- a/website/content/ChapterFour/0676.Implement-Magic-Dictionary.md +++ /dev/null @@ -1,87 +0,0 @@ -# [676. Implement Magic Dictionary](https://leetcode.com/problems/implement-magic-dictionary/) - - -## 题目 - -Implement a magic directory with `buildDict`, and `search` methods. - -For the method `buildDict`, you'll be given a list of non-repetitive words to build a dictionary. - -For the method `search`, you'll be given a word, and judge whether if you modify **exactly** one character into **another**character in this word, the modified word is in the dictionary you just built. - -**Example 1**: - - Input: buildDict(["hello", "leetcode"]), Output: Null - Input: search("hello"), Output: False - Input: search("hhllo"), Output: True - Input: search("hell"), Output: False - Input: search("leetcoded"), Output: False - -**Note**: - -1. You may assume that all the inputs are consist of lowercase letters `a-z`. -2. For contest purpose, the test data is rather small by now. You could think about highly efficient algorithm after the contest. -3. Please remember to **RESET** your class variables declared in class MagicDictionary, as static/class variables are **persisted across multiple test cases**. Please see [here](https://leetcode.com/faq/#different-output) for more details. - - -## 题目大意 - -实现一个带有 buildDict, 以及 search 方法的魔法字典。对于 buildDict 方法,你将被给定一串不重复的单词来构建一个字典。对于 search 方法,你将被给定一个单词,并且判定能否只将这个单词中一个字母换成另一个字母,使得所形成的新单词存在于你构建的字典中。 - - - -## 解题思路 - - -- 实现 `MagicDictionary` 的数据结构,这个数据结构内会存储一个字符串数组,当执行 `Search` 操作的时候要求判断传进来的字符串能否只改变一个字符(不能增加字符也不能删除字符)就能变成 `MagicDictionary` 中存储的字符串,如果可以,就输出 `true`,如果不能,就输出 `false`。 -- 这题的解题思路比较简单,用 Map 判断即可。 - - -## 代码 - -```go - -package leetcode - -type MagicDictionary struct { - rdict map[int]string -} - -/** Initialize your data structure here. */ -func Constructor676() MagicDictionary { - return MagicDictionary{rdict: make(map[int]string)} -} - -/** Build a dictionary through a list of words */ -func (this *MagicDictionary) BuildDict(dict []string) { - for k, v := range dict { - this.rdict[k] = v - } -} - -/** Returns if there is any word in the trie that equals to the given word after modifying exactly one character */ -func (this *MagicDictionary) Search(word string) bool { - for _, v := range this.rdict { - n := 0 - if len(word) == len(v) { - for i := 0; i < len(v); i++ { - if word[i] != v[i] { - n += 1 - } - } - if n == 1 { - return true - } - } - } - return false -} - -/** - * Your MagicDictionary object will be instantiated and called as such: - * obj := Constructor(); - * obj.BuildDict(dict); - * param_2 := obj.Search(word); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0682.Baseball-Game.md b/website/content/ChapterFour/0682.Baseball-Game.md deleted file mode 100644 index 6f76fd353..000000000 --- a/website/content/ChapterFour/0682.Baseball-Game.md +++ /dev/null @@ -1,106 +0,0 @@ -# [682. Baseball Game](https://leetcode.com/problems/baseball-game/) - -## 题目 - -You're now a baseball game point recorder. - -Given a list of strings, each string can be one of the 4 following types: - -1. Integer (one round's score): Directly represents the number of points you get in this round. -2. "+" (one round's score): Represents that the points you get in this round are the sum of the last two valid round's points. -3. "D" (one round's score): Represents that the points you get in this round are the doubled data of the last valid round's points. -4. "C" (an operation, which isn't a round's score): Represents the last valid round's points you get were invalid and should be removed. -Each round's operation is permanent and could have an impact on the round before and the round after. - -You need to return the sum of the points you could get in all the rounds. - -**Example 1**: - -``` - -Input: ["5","2","C","D","+"] -Output: 30 -Explanation: -Round 1: You could get 5 points. The sum is: 5. -Round 2: You could get 2 points. The sum is: 7. -Operation 1: The round 2's data was invalid. The sum is: 5. -Round 3: You could get 10 points (the round 2's data has been removed). The sum is: 15. -Round 4: You could get 5 + 10 = 15 points. The sum is: 30. - -``` - -**Example 2**: - -``` - -Input: ["5","-2","4","C","D","9","+","+"] -Output: 27 -Explanation: -Round 1: You could get 5 points. The sum is: 5. -Round 2: You could get -2 points. The sum is: 3. -Round 3: You could get 4 points. The sum is: 7. -Operation 1: The round 3's data is invalid. The sum is: 3. -Round 4: You could get -4 points (the round 3's data has been removed). The sum is: -1. -Round 5: You could get 9 points. The sum is: 8. -Round 6: You could get -4 + 9 = 5 points. The sum is 13. -Round 7: You could get 9 + 5 = 14 points. The sum is 27. - -``` - -**Note**: - -- The size of the input list will be between 1 and 1000. -- Every integer represented in the list will be between -30000 and 30000. - -## 题目大意 - -这道题是模拟题,给一串数字和操作符。出现数字就直接累加,出现 "C" 就代表栈推出一个元素,相应的总和要减去栈顶的元素。出现 "D" 就代表把前一个元素乘以 2,就得到当前的元素值。再累加。出现 "+" 就代表把前 2 个值求和,得到当前元素的值,再累积。 - -## 解题思路 - -这道题用栈模拟即可。 - - - - - -## 代码 - -```go - -package leetcode - -import "strconv" - -func calPoints(ops []string) int { - stack := make([]int, len(ops)) - top := 0 - - for i := 0; i < len(ops); i++ { - op := ops[i] - switch op { - case "+": - last1 := stack[top-1] - last2 := stack[top-2] - stack[top] = last1 + last2 - top++ - case "D": - last1 := stack[top-1] - stack[top] = last1 * 2 - top++ - case "C": - top-- - default: - stack[top], _ = strconv.Atoi(op) - top++ - } - } - - points := 0 - for i := 0; i < top; i++ { - points += stack[i] - } - return points -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0684.Redundant-Connection.md b/website/content/ChapterFour/0684.Redundant-Connection.md deleted file mode 100755 index 527d61bee..000000000 --- a/website/content/ChapterFour/0684.Redundant-Connection.md +++ /dev/null @@ -1,85 +0,0 @@ -# [684. Redundant Connection](https://leetcode.com/problems/redundant-connection/) - - -## 题目 - -In this problem, a tree is an **undirected** graph that is connected and has no cycles. - -The given input is a graph that started as a tree with N nodes (with distinct values 1, 2, ..., N), with one additional edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed. - -The resulting graph is given as a 2D-array of `edges`. Each element of `edges` is a pair `[u, v]` with `u < v`, that represents an **undirected** edge connecting nodes `u` and `v`. - -Return an edge that can be removed so that the resulting graph is a tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. The answer edge `[u, v]` should be in the same format, with `u < v`. - -**Example 1**: - - Input: [[1,2], [1,3], [2,3]] - Output: [2,3] - Explanation: The given undirected graph will be like this: - 1 - / \ - 2 - 3 - -**Example 2**: - - Input: [[1,2], [2,3], [3,4], [1,4], [1,5]] - Output: [1,4] - Explanation: The given undirected graph will be like this: - 5 - 1 - 2 - | | - 4 - 3 - -**Note**: - -- The size of the input 2D-array will be between 3 and 1000. -- Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array. - -**Update (2017-09-26)**: We have overhauled the problem description + test cases and specified clearly the graph is an **undirected** graph. For the **directed** graph follow up please see **[Redundant Connection II](https://leetcode.com/problems/redundant-connection-ii/description/)**). We apologize for any inconvenience caused. - - -## 题目大意 - -在本问题中, 树指的是一个连通且无环的无向图。输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。 - -返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。 - -注意: - -- 输入的二维数组大小在 3 到 1000。 -- 二维数组中的整数在 1 到 N 之间,其中 N 是输入数组的大小。 - - -## 解题思路 - -- 给出一个连通无环无向图和一些连通的边,要求在这些边中删除一条边以后,图中的 N 个节点依旧是连通的。如果有多条边,输出最后一条。 -- 这一题可以用并查集直接秒杀。依次扫描所有的边,把边的两端点都合并 `union()` 到一起。如果遇到一条边的两端点已经在一个集合里面了,就说明是多余边,删除。最后输出这些边即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func findRedundantConnection(edges [][]int) []int { - if len(edges) == 0 { - return []int{} - } - uf, res := template.UnionFind{}, []int{} - uf.Init(len(edges) + 1) - for i := 0; i < len(edges); i++ { - if uf.Find(edges[i][0]) != uf.Find(edges[i][1]) { - uf.Union(edges[i][0], edges[i][1]) - } else { - res = append(res, edges[i][0]) - res = append(res, edges[i][1]) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0685.Redundant-Connection-II.md b/website/content/ChapterFour/0685.Redundant-Connection-II.md deleted file mode 100755 index d6436f4ba..000000000 --- a/website/content/ChapterFour/0685.Redundant-Connection-II.md +++ /dev/null @@ -1,110 +0,0 @@ -# [685. Redundant Connection II](https://leetcode.com/problems/redundant-connection-ii/) - - -## 题目 - -In this problem, a rooted tree is a **directed** graph such that, there is exactly one node (the root) for which all other nodes are descendants of this node, plus every node has exactly one parent, except for the root node which has no parents. - -The given input is a directed graph that started as a rooted tree with N nodes (with distinct values 1, 2, ..., N), with one additional directed edge added. The added edge has two different vertices chosen from 1 to N, and was not an edge that already existed. - -The resulting graph is given as a 2D-array of `edges`. Each element of `edges` is a pair `[u, v]` that represents a **directed** edge connecting nodes `u` and `v`, where `u` is a parent of child `v`. - -Return an edge that can be removed so that the resulting graph is a rooted tree of N nodes. If there are multiple answers, return the answer that occurs last in the given 2D-array. - -**Example 1**: - - Input: [[1,2], [1,3], [2,3]] - Output: [2,3] - Explanation: The given directed graph will be like this: - 1 - / \ - v v - 2-->3 - -**Example 2**: - - Input: [[1,2], [2,3], [3,4], [4,1], [1,5]] - Output: [4,1] - Explanation: The given directed graph will be like this: - 5 <- 1 -> 2 - ^ | - | v - 4 <- 3 - -**Note**: - -- The size of the input 2D-array will be between 3 and 1000. -- Every integer represented in the 2D-array will be between 1 and N, where N is the size of the input array. - - -## 题目大意 - - -在本问题中,有根树指满足以下条件的有向图。该树只有一个根节点,所有其他节点都是该根节点的后继。每一个节点只有一个父节点,除了根节点没有父节点。输入一个有向图,该图由一个有着 N 个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。 每一个边的元素是一对 [u, v],用以表示有向图中连接顶点 u and v 和顶点的边,其中父节点 u 是子节点 v 的一个父节点。返回一条能删除的边,使得剩下的图是有 N 个节点的有根树。若有多个答案,返回最后出现在给定二维数组的答案。 - -注意: - -- 二维数组大小的在 3 到 1000 范围内。 -- 二维数组中的每个整数在 1 到 N 之间,其中 N 是二维数组的大小。 - - -## 解题思路 - -- 这一题是第 684 题的加强版。第 684 题中的图是无向图,这一题中的图是有向图。 -- 这一题的解法也是用并查集,不过需要灵活一点,不要用模板,因为在模板中,存在路径压缩和 `rank()` 优化,这些优化会改变有向边原始的方向。所以并查集只需要记录 `parent()` 就够用了。 - -![](https://img.halfrost.com/Leetcode/leetcode_685.png) - -- 经过分析,可以得到上面这 3 种情况,红色的边是我们实际应该删除的。先来看情况 2 和情况 3 。当不断 `union()` 时,加入一条边以后,会使一个节点的入度变成 2,那么记录下这两条边为 `candidate1` 和 `candidate2`。将后加入的 `candidate2` 这条边先放在一边,继续往下 `union()`。如果 `candidate2` 是红色的边,那么合并到最后,也不会出现任何异常,那么 `candidate2` 就是红色的边,即找到了要删除的边了。如果合并到最后出现了环的问题了,那说明 `candidate2` 是黑色的边,`candidate1` 才是红色的边,那么 `candidate1` 是要删除的边。 -- 再来看看情况 1。如果一路合并到结束也没有发现出现入度为 2 的情况,那么说明遇到了情况 1 。情况 1 会出现环的情况。题目中说如果要删除边,就删除最后出现的那条边。**具体实现见代码注释**。 - -## 代码 - -```go - -package leetcode - -func findRedundantDirectedConnection(edges [][]int) []int { - if len(edges) == 0 { - return []int{} - } - parent, candidate1, candidate2 := make([]int, len(edges)+1), []int{}, []int{} - for _, edge := range edges { - if parent[edge[1]] == 0 { - parent[edge[1]] = edge[0] - } else { // 如果一个节点已经有父亲节点了,说明入度已经有 1 了,再来一条边,入度为 2 ,那么跳过新来的这条边 candidate2,并记录下和这条边冲突的边 candidate1 - candidate1 = append(candidate1, parent[edge[1]]) - candidate1 = append(candidate1, edge[1]) - candidate2 = append(candidate2, edge[0]) - candidate2 = append(candidate2, edge[1]) - edge[1] = 0 // 做标记,后面再扫到这条边以后可以直接跳过 - } - } - for i := 1; i <= len(edges); i++ { - parent[i] = i - } - for _, edge := range edges { - if edge[1] == 0 { // 跳过 candidate2 这条边 - continue - } - u, v := edge[0], edge[1] - pu := findRoot(&parent, u) - if pu == v { // 发现有环 - if len(candidate1) == 0 { // 如果没有出现入度为 2 的情况,那么对应情况 1,就删除这条边 - return edge - } - return candidate1 // 出现环并且有入度为 2 的情况,说明 candidate1 是答案 - } - parent[v] = pu // 没有发现环,继续合并 - } - return candidate2 // 当最后什么都没有发生,则 candidate2 是答案 -} - -func findRoot(parent *[]int, k int) int { - if (*parent)[k] != k { - (*parent)[k] = findRoot(parent, (*parent)[k]) - } - return (*parent)[k] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0693.Binary-Number-with-Alternating-Bits.md b/website/content/ChapterFour/0693.Binary-Number-with-Alternating-Bits.md deleted file mode 100755 index 290e2cda6..000000000 --- a/website/content/ChapterFour/0693.Binary-Number-with-Alternating-Bits.md +++ /dev/null @@ -1,80 +0,0 @@ -# [693. Binary Number with Alternating Bits](https://leetcode.com/problems/binary-number-with-alternating-bits/) - -## 题目 - -Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will always have different values. - -**Example 1**: - - Input: 5 - Output: True - Explanation: - The binary representation of 5 is: 101 - -**Example 2**: - - Input: 7 - Output: False - Explanation: - The binary representation of 7 is: 111. - -**Example 3**: - - Input: 11 - Output: False - Explanation: - The binary representation of 11 is: 1011. - -**Example 4**: - - Input: 10 - Output: True - Explanation: - The binary representation of 10 is: 1010. - - -## 题目大意 - -给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。 - -## 解题思路 - - -- 判断一个数的二进制位相邻两个数是不相等的,即 `0101` 交叉间隔的,如果是,输出 true。这一题有多种做法,最简单的方法就是直接模拟。比较巧妙的方法是通过位运算,合理构造特殊数据进行位运算到达目的。`010101` 构造出 `101010` 两者相互 `&` 位运算以后就为 0,因为都“插空”了。 - - -## 代码 - -```go - -package leetcode - -// 解法一 -func hasAlternatingBits(n int) bool { - /* - n = 1 0 1 0 1 0 1 0 - n >> 1 0 1 0 1 0 1 0 1 - n ^ n>>1 1 1 1 1 1 1 1 1 - n 1 1 1 1 1 1 1 1 - n + 1 1 0 0 0 0 0 0 0 0 - n & (n+1) 0 0 0 0 0 0 0 0 - */ - n = n ^ (n >> 1) - return (n & (n + 1)) == 0 -} - -// 解法二 -func hasAlternatingBits1(n int) bool { - last, current := 0, 0 - for n > 0 { - last = n & 1 - n = n / 2 - current = n & 1 - if last == current { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0695.Max-Area-of-Island.md b/website/content/ChapterFour/0695.Max-Area-of-Island.md deleted file mode 100644 index 2419d561e..000000000 --- a/website/content/ChapterFour/0695.Max-Area-of-Island.md +++ /dev/null @@ -1,77 +0,0 @@ -# [695. Max Area of Island](https://leetcode.com/problems/max-area-of-island/) - - - -## 题目 - -Given a non-empty 2D array `grid` of 0's and 1's, an **island** is a group of `1`'s (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water. - -Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 0.) - -**Example 1**: - -``` -[[0,0,1,0,0,0,0,1,0,0,0,0,0], - [0,0,0,0,0,0,0,1,1,1,0,0,0], - [0,1,1,0,1,0,0,0,0,0,0,0,0], - [0,1,0,0,1,1,0,0,1,0,1,0,0], - [0,1,0,0,1,1,0,0,1,1,1,0,0], - [0,0,0,0,0,0,0,0,0,0,1,0,0], - [0,0,0,0,0,0,0,1,1,1,0,0,0], - [0,0,0,0,0,0,0,1,1,0,0,0,0]] -``` - -Given the above grid, return`6`. Note the answer is not 11, because the island must be connected 4-directionally. - -**Example 2**: - -``` -[[0,0,0,0,0,0,0,0]] -``` - -Given the above grid, return`0`. - -**Note**: The length of each dimension in the given `grid` does not exceed 50. - -## 题目大意 - -给定一个包含了一些 0 和 1 的非空二维数组 grid 。一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。) - -## 解题思路 - -- 给出一个地图,要求计算上面岛屿的面积。注意岛屿的定义是四周都是海(为 0 的点),如果土地(为 1 的点)靠在地图边缘,不能算是岛屿。 -- 这一题和第 200 题,第 1254 题解题思路是一致的。DPS 深搜。这不过这一题需要多处理 2 件事情,一个是注意靠边缘的岛屿不能计算在内,二是动态维护岛屿的最大面积。 - -## 代码 - -```go -func maxAreaOfIsland(grid [][]int) int { - res := 0 - for i, row := range grid { - for j, col := range row { - if col == 0 { - continue - } - area := areaOfIsland(grid, i, j) - if area > res { - res = area - } - } - } - return res -} - -func areaOfIsland(grid [][]int, x, y int) int { - if !isInGrid(grid, x, y) || grid[x][y] == 0 { - return 0 - } - grid[x][y] = 0 - total := 1 - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - total += areaOfIsland(grid, nx, ny) - } - return total -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0697.Degree-of-an-Array.md b/website/content/ChapterFour/0697.Degree-of-an-Array.md deleted file mode 100644 index ab032f5c5..000000000 --- a/website/content/ChapterFour/0697.Degree-of-an-Array.md +++ /dev/null @@ -1,80 +0,0 @@ -# [697. Degree of an Array](https://leetcode.com/problems/degree-of-an-array/) - - -## 题目 - -Given a non-empty array of non-negative integers `nums`, the **degree** of this array is defined as the maximum frequency of any one of its elements. - -Your task is to find the smallest possible length of a (contiguous) subarray of `nums`, that has the same degree as `nums`. - -**Example 1**: - -``` -Input: [1, 2, 2, 3, 1] -Output: 2 -Explanation: -The input array has a degree of 2 because both elements 1 and 2 appear twice. -Of the subarrays that have the same degree: -[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2] -The shortest length is 2. So return 2. - -``` - -**Example 2**: - -``` -Input: [1,2,2,3,1,4,2] -Output: 6 -``` - -**Note**: - -- `nums.length` will be between 1 and 50,000. -- `nums[i]` will be an integer between 0 and 49,999. - - -## 题目大意 - -给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。 - -注意: - -- nums.length 在 1 到 50,000 区间范围内。 -- nums[i] 是一个在 0 到 49,999 范围内的整数。 - - -## 解题思路 - -- 找一个与给定数组相同度的最短连续子数组,输出其长度。数组的度的定义是任一元素出现频数的最大值。 -- 简单题。先统计各个元素的频次,并且动态维护最大频次和子数组的起始和终点位置。这里最短连续子数组有点“迷惑人”。这个最短子数组其实处理起来很简单。只需从前往后扫一遍,记录各个元素第一次出现的位置和最后一次出现的位置即是最短的连续子数组。然后在频次字典里面寻找和最大频次相同的所有解,有可能有多个子数组能满足题意,取出最短的输出即可。 - -## 代码 - -```go - -package leetcode - -func findShortestSubArray(nums []int) int { - frequency, maxFreq, smallest := map[int][]int{}, 0, len(nums) - for i, num := range nums { - if _, found := frequency[num]; !found { - frequency[num] = []int{1, i, i} - } else { - frequency[num][0]++ - frequency[num][2] = i - } - if maxFreq < frequency[num][0] { - maxFreq = frequency[num][0] - } - } - for _, indices := range frequency { - if indices[0] == maxFreq { - if smallest > indices[2]-indices[1]+1 { - smallest = indices[2] - indices[1] + 1 - } - } - } - return smallest -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0699.Falling-Squares.md b/website/content/ChapterFour/0699.Falling-Squares.md deleted file mode 100755 index a3228a87e..000000000 --- a/website/content/ChapterFour/0699.Falling-Squares.md +++ /dev/null @@ -1,145 +0,0 @@ -# [699. Falling Squares](https://leetcode.com/problems/falling-squares/) - - -## 题目 - -On an infinite number line (x-axis), we drop given squares in the order they are given. - -The `i`-th square dropped (`positions[i] = (left, side_length)`) is a square with the left-most point being `positions[i][0]` and sidelength `positions[i][1]`. - -The square is dropped with the bottom edge parallel to the number line, and from a higher height than all currently landed squares. We wait for each square to stick before dropping the next. - -The squares are infinitely sticky on their bottom edge, and will remain fixed to any positive length surface they touch (either the number line or another square). Squares dropped adjacent to each other will not stick together prematurely. - -Return a list `ans` of heights. Each height `ans[i]` represents the current highest height of any square we have dropped, after dropping squares represented by `positions[0], positions[1], ..., positions[i]`. - -**Example 1**: - - Input: [[1, 2], [2, 3], [6, 1]] - Output: [2, 5, 5] - Explanation: - -After the first drop of `positions[0] = [1, 2]: _aa _aa -------` The maximum height of any square is 2. - -After the second drop of `positions[1] = [2, 3]: __aaa __aaa __aaa _aa__ _aa__ --------------` The maximum height of any square is 5. The larger square stays on top of the smaller square despite where its center of gravity is, because squares are infinitely sticky on their bottom edge. - -After the third drop of `positions[1] = [6, 1]: __aaa __aaa __aaa _aa _aa___a --------------` The maximum height of any square is still 5. Thus, we return an answer of `[2, 5, 5]`. - -**Example 2**: - - Input: [[100, 100], [200, 100]] - Output: [100, 100] - Explanation: Adjacent squares don't get stuck prematurely - only their bottom edge can stick to surfaces. - -**Note**: - -- `1 <= positions.length <= 1000`. -- `1 <= positions[i][0] <= 10^8`. -- `1 <= positions[i][1] <= 10^6`. - - -## 题目大意 - -在无限长的数轴(即 x 轴)上,我们根据给定的顺序放置对应的正方形方块。第 i 个掉落的方块(positions[i] = (left, side\_length))是正方形,其中 left 表示该方块最左边的点位置(positions[i][0]),side\_length 表示该方块的边长(positions[i][1])。 - -每个方块的底部边缘平行于数轴(即 x 轴),并且从一个比目前所有的落地方块更高的高度掉落而下。在上一个方块结束掉落,并保持静止后,才开始掉落新方块。方块的底边具有非常大的粘性,并将保持固定在它们所接触的任何长度表面上(无论是数轴还是其他方块)。邻接掉落的边不会过早地粘合在一起,因为只有底边才具有粘性。 - -返回一个堆叠高度列表 ans 。每一个堆叠高度 ans[i] 表示在通过 positions[0], positions[1], ..., positions[i] 表示的方块掉落结束后,目前所有已经落稳的方块堆叠的最高高度。 - -示例 1: - -```c -输入: [[1, 2], [2, 3], [6, 1]] -输出: [2, 5, 5] -解释: - -第一个方块 positions[0] = [1, 2] 掉落: -_aa -_aa -------- -方块最大高度为 2 。 - -第二个方块 positions[1] = [2, 3] 掉落: -__aaa -__aaa -__aaa -_aa__ -_aa__ --------------- -方块最大高度为5。 -大的方块保持在较小的方块的顶部,不论它的重心在哪里,因为方块的底部边缘有非常大的粘性。 - -第三个方块 positions[1] = [6, 1] 掉落: -__aaa -__aaa -__aaa -_aa -_aa___a --------------- -方块最大高度为5。 - -因此,我们返回结果[2, 5, 5]。 - -``` - -注意: - -- 1 <= positions.length <= 1000. -- 1 <= positions[i][0] <= 10^8. -- 1 <= positions[i][1] <= 10^6. -  - - -## 解题思路 - -- 给出一个二维数组,每个一维数组中只有 2 个值,分别代表的是正方形砖块所在 x 轴的坐标起始点,和边长。要求输出每次砖块落下以后,当前最大的高度。正方形砖块落下如同俄罗斯方块,落下的过程中如果遇到了砖块会落在砖块的上面。如果砖块摞起来了以后,下方有空间,是不可能再把砖块挪进去的,因为此题砖块只会垂直落下,不会水平移动(这一点和俄罗斯方块不同)。 -- 这一题可以用线段树解答。由于方块在 x 轴上的坐标范围特别大,如果不离散化,这一题就会 MTE。所以首先去重 - 排序 - 离散化。先把每个砖块所在区间都算出来,每个正方形的方块所在区间是 `[pos[0] , pos[0]+pos[1]-1]` ,为什么右边界要减一呢?因为每个方块占据的区间其实应该是左闭右开的,即 `[pos[0] , pos[0]+pos[1])`,如果右边是开的,那么这个边界会被 2 个区间查询共用,从而导致错误结果。例如 [2,3],[3,4],这两个区间的砖块实际是不会摞在一起的。但是如果右边都是闭区间,用线段树 query 查询的时候,会都找到 [3,3],从而导致这两个区间都会判断 3 这一点的情况。正确的做法应该是 [2,3),[3,4)这样就避免了上述可能导致错误的情况了。离散化以后,所有的坐标区间都在 0~n 之间了。 -- 遍历每个砖块所在区间,先查询这个区间内的值,再加上当前砖块的高度,即为这个区间的最新高度。并更新该区间的值。更新区间的值用到懒惰更新。然后和动态维护的当前最大高度进行比较,将最大值放入最终输出的数组中。 -- 类似的题目有:第 715 题,第 218 题,第 732 题。第 715 题是区间更新定值(**不是增减**),第 218 题可以用扫描线,第 732 题和本题类似,也是俄罗斯方块的题目,但是第 732 题的俄罗斯方块的方块会“断裂”。 -- leetcode 上也有线段树的讲解:[Get Solutions to Interview Questions](https://leetcode.com/articles/a-recursive-approach-to-segment-trees-range-sum-queries-lazy-propagation/) - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -func fallingSquares(positions [][]int) []int { - st, ans, posMap, maxHeight := template.SegmentTree{}, make([]int, 0, len(positions)), discretization(positions), 0 - tmp := make([]int, len(posMap)) - st.Init(tmp, func(i, j int) int { - return max(i, j) - }) - for _, p := range positions { - h := st.QueryLazy(posMap[p[0]], posMap[p[0]+p[1]-1]) + p[1] - st.UpdateLazy(posMap[p[0]], posMap[p[0]+p[1]-1], h) - maxHeight = max(maxHeight, h) - ans = append(ans, maxHeight) - } - return ans -} - -func discretization(positions [][]int) map[int]int { - tmpMap, posArray, posMap := map[int]int{}, []int{}, map[int]int{} - for _, pos := range positions { - tmpMap[pos[0]]++ - tmpMap[pos[0]+pos[1]-1]++ - } - for k := range tmpMap { - posArray = append(posArray, k) - } - sort.Ints(posArray) - for i, pos := range posArray { - posMap[pos] = i - } - return posMap -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0704.Binary-Search.md b/website/content/ChapterFour/0704.Binary-Search.md deleted file mode 100755 index b10293d9a..000000000 --- a/website/content/ChapterFour/0704.Binary-Search.md +++ /dev/null @@ -1,67 +0,0 @@ -# [704. Binary Search](https://leetcode.com/problems/binary-search/) - - -## 题目 - -Given a **sorted** (in ascending order) integer array `nums` of `n` elements and a `target` value, write a function to search `target` in `nums`. If `target` exists, then return its index, otherwise return `-1`. - -**Example 1**: - - Input: nums = [-1,0,3,5,9,12], target = 9 - Output: 4 - Explanation: 9 exists in nums and its index is 4 - -**Example 2**: - - Input: nums = [-1,0,3,5,9,12], target = 2 - Output: -1 - Explanation: 2 does not exist in nums so return -1 - -**Note**: - -1. You may assume that all elements in `nums` are unique. -2. `n` will be in the range `[1, 10000]`. -3. The value of each element in `nums` will be in the range `[-9999, 9999]`. - - -## 题目大意 - - -给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 - -提示: - -- 你可以假设 nums 中的所有元素是不重复的。 -- n 将在 [1, 10000]之间。 -- nums 的每个元素都将在 [-9999, 9999]之间。 - - -## 解题思路 - - -- 给出一个数组,要求在数组中搜索等于 target 的元素的下标。如果找到就输出下标,如果找不到输出 -1 。 -- 简单题,二分搜索的裸题。 - - -## 代码 - -```go - -package leetcode - -func search704(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if nums[mid] == target { - return mid - } else if nums[mid] > target { - high = mid - 1 - } else { - low = mid + 1 - } - } - return -1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0705.Design-HashSet.md b/website/content/ChapterFour/0705.Design-HashSet.md deleted file mode 100755 index d4d241f7a..000000000 --- a/website/content/ChapterFour/0705.Design-HashSet.md +++ /dev/null @@ -1,94 +0,0 @@ -# [705. Design HashSet](https://leetcode.com/problems/design-hashset/) - - -## 题目 - -Design a HashSet without using any built-in hash table libraries. - -To be specific, your design should include these functions: - -- `add(value)`: Insert a value into the HashSet. -- `contains(value)` : Return whether the value exists in the HashSet or not. -- `remove(value)`: Remove a value in the HashSet. If the value does not exist in the HashSet, do nothing. - -**Example**: - - MyHashSet hashSet = new MyHashSet(); - hashSet.add(1);         - hashSet.add(2);         - hashSet.contains(1);    // returns true - hashSet.contains(3);    // returns false (not found) - hashSet.add(2);           - hashSet.contains(2);    // returns true - hashSet.remove(2);           - hashSet.contains(2);    // returns false (already removed) - -**Note**: - -- All values will be in the range of `[0, 1000000]`. -- The number of operations will be in the range of `[1, 10000]`. -- Please do not use the built-in HashSet library. - - -## 题目大意 - -不使用任何内建的哈希表库设计一个哈希集合具体地说,你的设计应该包含以下的功能: - -- add(value):向哈希集合中插入一个值。 -- contains(value) :返回哈希集合中是否存在这个值。 -- remove(value):将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。 - - -注意: - -- 所有的值都在 [1, 1000000] 的范围内。 -- 操作的总数目在 [1, 10000] 范围内。 -- 不要使用内建的哈希集合库。 - - - -## 解题思路 - - -- 简单题,设计一个 hashset 的数据结构,要求有 `add(value)`,`contains(value)`,`remove(value)`,这 3 个方法。 - - -## 代码 - -```go - -package leetcode - -type MyHashSet struct { - data []bool -} - -/** Initialize your data structure here. */ -func Constructor705() MyHashSet { - return MyHashSet{ - data: make([]bool, 1000001), - } -} - -func (this *MyHashSet) Add(key int) { - this.data[key] = true -} - -func (this *MyHashSet) Remove(key int) { - this.data[key] = false -} - -/** Returns true if this set contains the specified element */ -func (this *MyHashSet) Contains(key int) bool { - return this.data[key] -} - -/** - * Your MyHashSet object will be instantiated and called as such: - * obj := Constructor(); - * obj.Add(key); - * obj.Remove(key); - * param_3 := obj.Contains(key); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0706.Design-HashMap.md b/website/content/ChapterFour/0706.Design-HashMap.md deleted file mode 100755 index 801460984..000000000 --- a/website/content/ChapterFour/0706.Design-HashMap.md +++ /dev/null @@ -1,151 +0,0 @@ -# [706. Design HashMap](https://leetcode.com/problems/design-hashmap/) - - -## 题目 - -Design a HashMap without using any built-in hash table libraries. - -To be specific, your design should include these functions: - -- `put(key, value)` : Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the value. -- `get(key)`: Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key. -- `remove(key)` : Remove the mapping for the value key if this map contains the mapping for the key. - -**Example**: - - MyHashMap hashMap = new MyHashMap(); - hashMap.put(1, 1);           - hashMap.put(2, 2);         - hashMap.get(1);            // returns 1 - hashMap.get(3);            // returns -1 (not found) - hashMap.put(2, 1);          // update the existing value - hashMap.get(2);            // returns 1 - hashMap.remove(2);          // remove the mapping for 2 - hashMap.get(2);            // returns -1 (not found) - -**Note**: - -- All keys and values will be in the range of `[0, 1000000]`. -- The number of operations will be in the range of `[1, 10000]`. -- Please do not use the built-in HashMap library. - - -## 题目大意 - -不使用任何内建的哈希表库设计一个哈希映射具体地说,你的设计应该包含以下的功能: - -- put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。 -- get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回 -1。 -- remove(key):如果映射中存在这个键,删除这个数值对。 - -注意: - -- 所有的值都在 [1, 1000000] 的范围内。 -- 操作的总数目在 [1, 10000] 范围内。 -- 不要使用内建的哈希库。 - - -## 解题思路 - - -- 简单题,设计一个 hashmap 的数据结构,要求有 `put(key, value)`,`get(key)`,`remove(key)`,这 3 个方法。设计一个 map 主要需要处理哈希冲突,一般都是链表法解决冲突。 - - -## 代码 - -```go - -package leetcode - -const Len int = 100000 - -type MyHashMap struct { - content [Len]*HashNode -} - -type HashNode struct { - key int - val int - next *HashNode -} - -func (N *HashNode) Put(key int, value int) { - if N.key == key { - N.val = value - return - } - if N.next == nil { - N.next = &HashNode{key, value, nil} - return - } - N.next.Put(key, value) -} - -func (N *HashNode) Get(key int) int { - if N.key == key { - return N.val - } - if N.next == nil { - return -1 - } - return N.next.Get(key) -} - -func (N *HashNode) Remove(key int) *HashNode { - if N.key == key { - p := N.next - N.next = nil - return p - } - if N.next != nil { - return N.next.Remove(key) - } - return nil -} - -/** Initialize your data structure here. */ -func Constructor706() MyHashMap { - return MyHashMap{} -} - -/** value will always be non-negative. */ -func (this *MyHashMap) Put(key int, value int) { - node := this.content[this.Hash(key)] - if node == nil { - this.content[this.Hash(key)] = &HashNode{key: key, val: value, next: nil} - return - } - node.Put(key, value) -} - -/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */ -func (this *MyHashMap) Get(key int) int { - HashNode := this.content[this.Hash(key)] - if HashNode == nil { - return -1 - } - return HashNode.Get(key) -} - -/** Removes the mapping of the specified value key if this map contains a mapping for the key */ -func (this *MyHashMap) Remove(key int) { - HashNode := this.content[this.Hash(key)] - if HashNode == nil { - return - } - this.content[this.Hash(key)] = HashNode.Remove(key) -} - -func (this *MyHashMap) Hash(value int) int { - return value % Len -} - -/** - * Your MyHashMap object will be instantiated and called as such: - * obj := Constructor(); - * obj.Put(key,value); - * param_2 := obj.Get(key); - * obj.Remove(key); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0707.Design-Linked-List.md b/website/content/ChapterFour/0707.Design-Linked-List.md deleted file mode 100644 index c014e9e6b..000000000 --- a/website/content/ChapterFour/0707.Design-Linked-List.md +++ /dev/null @@ -1,140 +0,0 @@ -# [707. Design Linked List](https://leetcode.com/problems/design-linked-list/) - -## 题目 - -Design your implementation of the linked list. You can choose to use the singly linked list or the doubly linked list. A node in a singly linked list should have two attributes: val and next. val is the value of the current node, and next is a pointer/reference to the next node. If you want to use the doubly linked list, you will need one more attribute prev to indicate the previous node in the linked list. Assume all nodes in the linked list are 0-indexed. - -Implement these functions in your linked list class: - -- get(index) : Get the value of the index-th node in the linked list. If the index is invalid, return -1. -- addAtHead(val) : Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. -- addAtTail(val) : Append a node of value val to the last element of the linked list. -- addAtIndex(index, val) : Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. -- deleteAtIndex(index) : Delete the index-th node in the linked list, if the index is valid. - -**Example**: - -``` - -MyLinkedList linkedList = new MyLinkedList(); -linkedList.addAtHead(1); -linkedList.addAtTail(3); -linkedList.addAtIndex(1, 2); // linked list becomes 1->2->3 -linkedList.get(1); // returns 2 -linkedList.deleteAtIndex(1); // now the linked list is 1->3 -linkedList.get(1); // returns 3 - -``` - -**Note**: - -- All values will be in the range of [1, 1000]. -- The number of operations will be in the range of [1, 1000]. -- Please do not use the built-in LinkedList library. - -## 题目大意 - -这道题比较简单,设计一个链表,实现相关操作即可。 - -## 解题思路 - -这题有一个地方比较坑,题目中 Note 里面写的数值取值范围是 [1, 1000],笔者把 0 当做无效值。结果 case 里面出现了 0 是有效值。case 和题意不符。 - - -## 代码 - -```go - -package leetcode - -type MyLinkedList struct { - Val int - Next *MyLinkedList -} - -/** Initialize your data structure here. */ -func Constructor() MyLinkedList { - return MyLinkedList{Val: -999, Next: nil} -} - -/** Get the value of the index-th node in the linked list. If the index is invalid, return -1. */ -func (this *MyLinkedList) Get(index int) int { - cur := this - for i := 0; cur != nil; i++ { - if i == index { - if cur.Val == -999 { - return -1 - } else { - return cur.Val - } - } - cur = cur.Next - } - return -1 -} - -/** Add a node of value val before the first element of the linked list. After the insertion, the new node will be the first node of the linked list. */ -func (this *MyLinkedList) AddAtHead(val int) { - if this.Val == -999 { - this.Val = val - } else { - tmp := &MyLinkedList{Val: this.Val, Next: this.Next} - this.Val = val - this.Next = tmp - } -} - -/** Append a node of value val to the last element of the linked list. */ -func (this *MyLinkedList) AddAtTail(val int) { - cur := this - for cur.Next != nil { - cur = cur.Next - } - tmp := &MyLinkedList{Val: val, Next: nil} - cur.Next = tmp -} - -/** Add a node of value val before the index-th node in the linked list. If index equals to the length of linked list, the node will be appended to the end of linked list. If index is greater than the length, the node will not be inserted. */ -func (this *MyLinkedList) AddAtIndex(index int, val int) { - cur := this - if index == 0 { - this.AddAtHead(val) - return - } - for i := 0; cur != nil; i++ { - if i == index-1 { - break - } - cur = cur.Next - } - if cur != nil && cur.Val != -999 { - tmp := &MyLinkedList{Val: val, Next: cur.Next} - cur.Next = tmp - } -} - -/** Delete the index-th node in the linked list, if the index is valid. */ -func (this *MyLinkedList) DeleteAtIndex(index int) { - cur := this - for i := 0; cur != nil; i++ { - if i == index-1 { - break - } - cur = cur.Next - } - if cur != nil && cur.Next != nil { - cur.Next = cur.Next.Next - } -} - -/** - * Your MyLinkedList object will be instantiated and called as such: - * obj := Constructor(); - * param_1 := obj.Get(index); - * obj.AddAtHead(val); - * obj.AddAtTail(val); - * obj.AddAtIndex(index,val); - * obj.DeleteAtIndex(index); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0710.Random-Pick-with-Blacklist.md b/website/content/ChapterFour/0710.Random-Pick-with-Blacklist.md deleted file mode 100644 index d796e1e7e..000000000 --- a/website/content/ChapterFour/0710.Random-Pick-with-Blacklist.md +++ /dev/null @@ -1,145 +0,0 @@ -# [710. Random Pick with Blacklist](https://leetcode.com/problems/random-pick-with-blacklist/) - -## 题目 - -Given a blacklist B containing unique integers from [0, N), write a function to return a uniform random integer from [0, N) which is NOT in B. - -Optimize it such that it minimizes the call to system’s Math.random(). - -**Note**: - -1. 1 <= N <= 1000000000 -2. 0 <= B.length < min(100000, N) -3. [0, N) does NOT include N. See interval notation. - - -**Example 1**: - -``` - -Input: -["Solution","pick","pick","pick"] -[[1,[]],[],[],[]] -Output: [null,0,0,0] - -``` - -**Example 2**: - -``` - -Input: -["Solution","pick","pick","pick"] -[[2,[]],[],[],[]] -Output: [null,1,1,1] - -``` - -**Example 3**: - -``` - -Input: -["Solution","pick","pick","pick"] -[[3,[1]],[],[],[]] -Output: [null,0,0,2] - -``` - -**Example 4**: - -``` - -Input: -["Solution","pick","pick","pick"] -[[4,[2]],[],[],[]] -Output: [null,1,3,1] - -``` - - -Explanation of Input Syntax: - -The input is two lists: the subroutines called and their arguments. Solution's constructor has two arguments, N and the blacklist B. pick has no arguments. Arguments are always wrapped with a list, even if there aren't any. - - -## 题目大意 - -给一个数字 N,再给一个黑名单 B,要求在 [0,N) 区间内随机输出一个数字,这个是不在黑名单 B 中的任意一个数字。 - -## 解题思路 - -这道题的 N 的范围特别大,最大是 10 亿。如果利用桶计数,开不出来这么大的数组。考虑到题目要求我们输出的数字是随机的,所以不需要存下所有的白名单的数字。 - -假设 N=10, blacklist=[3, 5, 8, 9] - -![](https://s3-lc-upload.s3.amazonaws.com/users/cafebaby/image_1530657902.png) - - -这一题有点类似 hash 冲突的意思。如果随机访问一个数,这个数正好在黑名单之内,那么就 hash 冲突了,我们就把它映射到另外一个不在黑名单里面的数中。如上图,我们可以将 3,5 重新映射到 7,6 的位置。这样末尾开始的几个数要么是黑名单里面的数,要么就是映射的数字。 - -hash 表总长度应该为 M = N - len(backlist),然后在 M 的长度中扫描是否有在黑名单中的数,如果有,就代表 hash 冲突了。冲突就把这个数字映射到 (M,N) 这个区间范围内。为了提高效率,可以选择这个区间的头部或者尾部开始映射,我选择的是末尾开始映射。从 (M,N) 这个区间的末尾开始往前找,找黑名单不存在的数,找到了就把 [0,M] 区间内冲突的数字映射到这里来。最后 pick 的时候,只需要查看 map 中是否存在映射关系,如果存在就输出 map 中映射之后的值,如果没有就代表没有冲突,直接输出那个 index 即可。 - - - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -import "math/rand" - -type Solution struct { - M int - BlackMap map[int]int -} - -func Constructor710(N int, blacklist []int) Solution { - blackMap := map[int]int{} - for i := 0; i < len(blacklist); i++ { - blackMap[blacklist[i]] = 1 - } - M := N - len(blacklist) - for _, value := range blacklist { - if value < M { - for { - if _, ok := blackMap[N-1]; ok { - N-- - } else { - break - } - } - blackMap[value] = N - 1 - N-- - } - } - return Solution{BlackMap: blackMap, M: M} -} - -func (this *Solution) Pick() int { - idx := rand.Intn(this.M) - if _, ok := this.BlackMap[idx]; ok { - return this.BlackMap[idx] - } - return idx -} - -/** - * Your Solution object will be instantiated and called as such: - * obj := Constructor(N, blacklist); - * param_1 := obj.Pick(); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0713.Subarray-Product-Less-Than-K.md b/website/content/ChapterFour/0713.Subarray-Product-Less-Than-K.md deleted file mode 100644 index f5afc7d1a..000000000 --- a/website/content/ChapterFour/0713.Subarray-Product-Less-Than-K.md +++ /dev/null @@ -1,65 +0,0 @@ -# [713. Subarray Product Less Than K](https://leetcode.com/problems/subarray-product-less-than-k/) - -## 题目 - -Your are given an array of positive integers nums. - -Count and print the number of (contiguous) subarrays where the product of all the elements in the subarray is less than k. - -**Example 1**: - -``` - -Input: nums = [10, 5, 2, 6], k = 100 -Output: 8 -Explanation: The 8 subarrays that have product less than 100 are: [10], [5], [2], [6], [10, 5], [5, 2], [2, 6], [5, 2, 6]. -Note that [10, 5, 2] is not included as the product of 100 is not strictly less than k. - -``` - - -**Note**: - -- 0 < nums.length <= 50000. -- 0 < nums[i] < 1000. -- 0 <= k < 10^6. - -## 题目大意 - -给出一个数组,要求在输出符合条件的窗口数,条件是,窗口中所有数字乘积小于 K 。 - -## 解题思路 - -这道题也是滑动窗口的题目,在窗口滑动的过程中不断累乘,直到乘积大于 k,大于 k 的时候就缩小左窗口。有一种情况还需要单独处理一下,即类似 [100] 这种情况。这种情况窗口内乘积等于 k,不小于 k,左边窗口等于右窗口,这个时候需要左窗口和右窗口同时右移。 - - - - -## 代码 - -```go - -package leetcode - -func numSubarrayProductLessThanK(nums []int, k int) int { - if len(nums) == 0 { - return 0 - } - res, left, right, prod := 0, 0, 0, 1 - for left < len(nums) { - if right < len(nums) && prod*nums[right] < k { - prod = prod * nums[right] - right++ - } else if left == right { - left++ - right++ - } else { - res += right - left - prod = prod / nums[left] - left++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md b/website/content/ChapterFour/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md deleted file mode 100755 index 7bf23833c..000000000 --- a/website/content/ChapterFour/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md +++ /dev/null @@ -1,80 +0,0 @@ -# [714. Best Time to Buy and Sell Stock with Transaction Fee](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/) - - -## 题目 - -Your are given an array of integers `prices`, for which the `i`-th element is the price of a given stock on day `i`; and a non-negative integer `fee` representing a transaction fee. - -You may complete as many transactions as you like, but you need to pay the transaction fee for each transaction. You may not buy more than 1 share of a stock at a time (ie. you must sell the stock share before you buy again.) - -Return the maximum profit you can make. - -**Example 1**: - - Input: prices = [1, 3, 2, 8, 4, 9], fee = 2 - Output: 8 - Explanation: The maximum profit can be achieved by: - Buying at prices[0] = 1 - Selling at prices[3] = 8 - Buying at prices[4] = 4 - Selling at prices[5] = 9 - The total profit is ((8 - 1) - 2) + ((9 - 4) - 2) = 8. - -**Note**: - -- `0 < prices.length <= 50000`. -- `0 < prices[i] < 50000`. -- `0 <= fee < 50000`. - - -## 题目大意 - -给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;非负整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每次交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。要求返回获得利润的最大值。 - - - -## 解题思路 - -- 给定一个数组,表示一支股票在每一天的价格。设计一个交易算法,在这些天进行自动交易,要求:每一天只能进行一次操作;在买完股票后,必须卖了股票,才能再次买入;每次卖了股票以后,需要缴纳一部分的手续费。问如何交易,能让利润最大? -- 这一题是第 121 题、第 122 题、第 309 题的变种题。 -- 这一题的解题思路是 DP,需要维护买和卖的两种状态。`buy[i]` 代表第 `i` 天买入的最大收益,`sell[i]` 代表第 `i` 天卖出的最大收益,状态转移方程是 `buy[i] = max(buy[i-1], sell[i-1]-prices[i])`,`sell[i] = max(sell[i-1], buy[i-1]+prices[i]-fee)`。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" -) - -// 解法一 模拟 DP -func maxProfit714(prices []int, fee int) int { - if len(prices) <= 1 { - return 0 - } - buy, sell := make([]int, len(prices)), make([]int, len(prices)) - for i := range buy { - buy[i] = math.MinInt64 - } - buy[0] = -prices[0] - for i := 1; i < len(prices); i++ { - buy[i] = max(buy[i-1], sell[i-1]-prices[i]) - sell[i] = max(sell[i-1], buy[i-1]+prices[i]-fee) - } - return sell[len(sell)-1] -} - -// 解法二 优化辅助空间的 DP -func maxProfit714_1(prices []int, fee int) int { - sell, buy := 0, -prices[0] - for i := 1; i < len(prices); i++ { - sell = max(sell, buy+prices[i]-fee) - buy = max(buy, sell-prices[i]) - } - return sell -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0715.Range-Module.md b/website/content/ChapterFour/0715.Range-Module.md deleted file mode 100755 index acd403646..000000000 --- a/website/content/ChapterFour/0715.Range-Module.md +++ /dev/null @@ -1,270 +0,0 @@ -# [715. Range Module](https://leetcode.com/problems/range-module/) - - -## 题目 - -A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner. - -- `addRange(int left, int right)` Adds the half-open interval `[left, right)`, tracking every real number in that interval. Adding an interval that partially overlaps with currently tracked numbers should add any numbers in the interval `[left, right)` that are not already tracked. -- `queryRange(int left, int right)` Returns true if and only if every real number in the interval `[left, right)` is currently being tracked. -- `removeRange(int left, int right)` Stops tracking every real number currently being tracked in the interval `[left, right)`. - -**Example 1**: - - addRange(10, 20): null - removeRange(14, 16): null - queryRange(10, 14): true (Every number in [10, 14) is being tracked) - queryRange(13, 15): false (Numbers like 14, 14.03, 14.17 in [13, 15) are not being tracked) - queryRange(16, 17): true (The number 16 in [16, 17) is still being tracked, despite the remove operation) - -**Note**: - -- A half open interval `[left, right)` denotes all real numbers `left <= x < right`. -- `0 < left < right < 10^9` in all calls to `addRange, queryRange, removeRange`. -- The total number of calls to `addRange` in a single test case is at most `1000`. -- The total number of calls to `queryRange` in a single test case is at most `5000`. -- The total number of calls to `removeRange` in a single test case is at most `1000`. - -## 题目大意 - -Range 模块是跟踪数字范围的模块。你的任务是以一种有效的方式设计和实现以下接口。 - -- addRange(int left, int right) 添加半开区间 [left, right),跟踪该区间中的每个实数。添加与当前跟踪的数字部分重叠的区间时,应当添加在区间 [left, right) 中尚未跟踪的任何数字到该区间中。 -- queryRange(int left, int right) 只有在当前正在跟踪区间 [left, right) 中的每一个实数时,才返回 true。 -- removeRange(int left, int right) 停止跟踪区间 [left, right) 中当前正在跟踪的每个实数。 -  - -示例: - -``` -addRange(10, 20): null -removeRange(14, 16): null -queryRange(10, 14): true (区间 [10, 14) 中的每个数都正在被跟踪) -queryRange(13, 15): false (未跟踪区间 [13, 15) 中像 14, 14.03, 14.17 这样的数字) -queryRange(16, 17): true (尽管执行了删除操作,区间 [16, 17) 中的数字 16 仍然会被跟踪) -``` - -提示: - -- 半开区间 [left, right) 表示所有满足 left <= x < right 的实数。 -- 对 addRange, queryRange, removeRange 的所有调用中 0 < left < right < 10^9。 -- 在单个测试用例中,对 addRange 的调用总数不超过 1000 次。 -- 在单个测试用例中,对  queryRange 的调用总数不超过 5000 次。 -- 在单个测试用例中,对 removeRange 的调用总数不超过 1000 次。 - - -## 解题思路 - -- 设计一个数据结构,能完成添加区间 `addRange`,查询区间 `queryRange`,移除区间 `removeRange` 三种操作。查询区间的操作需要更加高效一点。 -- 这一题可以用线段树来解答,但是时间复杂度不高,最优解是用二叉排序树 BST 来解答。先来看线段树。这一题是更新区间内的值,所以需要用到懒惰更新。添加区间可以把区间内的值都赋值为 1 。由于题目中未预先确定区间范围,选用树的形式实现线段树比数组实现更加节约空间(当然用数组也可以,区间最大是 1000,点至多有 2000 个)。移除区间的时候就是把区间内的值都赋值标记为 0 。 -- 类似的题目有:第 699 题,第 218 题,第 732 题。第 715 题是区间更新定值(**不是增减**),第 218 题可以用扫描线,第 732 题和第 699 题类似,也是俄罗斯方块的题目,但是第 732 题的俄罗斯方块的方块会“断裂”。 - -## 代码 - -```go - -package leetcode - -// RangeModule define -type RangeModule struct { - Root *SegmentTreeNode -} - -// SegmentTreeNode define -type SegmentTreeNode struct { - Start, End int - Tracked bool - Lazy int - Left, Right *SegmentTreeNode -} - -// Constructor715 define -func Constructor715() RangeModule { - return RangeModule{&SegmentTreeNode{0, 1e9, false, 0, nil, nil}} -} - -// AddRange define -func (rm *RangeModule) AddRange(left int, right int) { - update(rm.Root, left, right-1, true) -} - -// QueryRange define -func (rm *RangeModule) QueryRange(left int, right int) bool { - return query(rm.Root, left, right-1) -} - -// RemoveRange define -func (rm *RangeModule) RemoveRange(left int, right int) { - update(rm.Root, left, right-1, false) -} - -func lazyUpdate(node *SegmentTreeNode) { - if node.Lazy != 0 { - node.Tracked = node.Lazy == 2 - } - if node.Start != node.End { - if node.Left == nil || node.Right == nil { - m := node.Start + (node.End-node.Start)/2 - node.Left = &SegmentTreeNode{node.Start, m, node.Tracked, 0, nil, nil} - node.Right = &SegmentTreeNode{m + 1, node.End, node.Tracked, 0, nil, nil} - } else if node.Lazy != 0 { - node.Left.Lazy = node.Lazy - node.Right.Lazy = node.Lazy - } - } - node.Lazy = 0 -} - -func update(node *SegmentTreeNode, start, end int, track bool) { - lazyUpdate(node) - if start > end || node == nil || end < node.Start || node.End < start { - return - } - if start <= node.Start && node.End <= end { - // segment completely covered by the update range - node.Tracked = track - if node.Start != node.End { - if track { - node.Left.Lazy = 2 - node.Right.Lazy = 2 - } else { - node.Left.Lazy = 1 - node.Right.Lazy = 1 - } - } - return - } - update(node.Left, start, end, track) - update(node.Right, start, end, track) - node.Tracked = node.Left.Tracked && node.Right.Tracked -} - -func query(node *SegmentTreeNode, start, end int) bool { - lazyUpdate(node) - if start > end || node == nil || end < node.Start || node.End < start { - return true - } - if start <= node.Start && node.End <= end { - // segment completely covered by the update range - return node.Tracked - } - return query(node.Left, start, end) && query(node.Right, start, end) -} - -// 解法二 BST -// type RangeModule struct { -// Root *BSTNode -// } - -// type BSTNode struct { -// Interval []int -// Left, Right *BSTNode -// } - -// func Constructor715() RangeModule { -// return RangeModule{} -// } - -// func (this *RangeModule) AddRange(left int, right int) { -// interval := []int{left, right - 1} -// this.Root = insert(this.Root, interval) -// } - -// func (this *RangeModule) RemoveRange(left int, right int) { -// interval := []int{left, right - 1} -// this.Root = delete(this.Root, interval) -// } - -// func (this *RangeModule) QueryRange(left int, right int) bool { -// return query(this.Root, []int{left, right - 1}) -// } - -// func (this *RangeModule) insert(root *BSTNode, interval []int) *BSTNode { -// if root == nil { -// return &BSTNode{interval, nil, nil} -// } -// if root.Interval[0] <= interval[0] && interval[1] <= root.Interval[1] { -// return root -// } -// if interval[0] < root.Interval[0] { -// root.Left = insert(root.Left, []int{interval[0], min(interval[1], root.Interval[0]-1)}) -// } -// if root.Interval[1] < interval[1] { -// root.Right = insert(root.Right, []int{max(interval[0], root.Interval[1]+1), interval[1]}) -// } -// return root -// } - -// func (this *RangeModule) delete(root *BSTNode, interval []int) *BSTNode { -// if root == nil { -// return nil -// } -// if interval[0] < root.Interval[0] { -// root.Left = delete(root.Left, []int{interval[0], min(interval[1], root.Interval[0]-1)}) -// } -// if root.Interval[1] < interval[1] { -// root.Right = delete(root.Right, []int{max(interval[0], root.Interval[1]+1), interval[1]}) -// } -// if interval[1] < root.Interval[0] || root.Interval[1] < interval[0] { -// return root -// } -// if interval[0] <= root.Interval[0] && root.Interval[1] <= interval[1] { -// if root.Left == nil { -// return root.Right -// } else if root.Right == nil { -// return root.Left -// } else { -// pred := root.Left -// for pred.Right != nil { -// pred = pred.Right -// } -// root.Interval = pred.Interval -// root.Left = delete(root.Left, pred.Interval) -// return root -// } -// } -// if root.Interval[0] < interval[0] && interval[1] < root.Interval[1] { -// left := &BSTNode{[]int{root.Interval[0], interval[0] - 1}, root.Left, nil} -// right := &BSTNode{[]int{interval[1] + 1, root.Interval[1]}, nil, root.Right} -// left.Right = right -// return left -// } -// if interval[0] <= root.Interval[0] { -// root.Interval[0] = interval[1] + 1 -// } -// if root.Interval[1] <= interval[1] { -// root.Interval[1] = interval[0] - 1 -// } -// return root -// } - -// func (this *RangeModule) query(root *BSTNode, interval []int) bool { -// if root == nil { -// return false -// } -// if interval[1] < root.Interval[0] { -// return query(root.Left, interval) -// } -// if root.Interval[1] < interval[0] { -// return query(root.Right, interval) -// } -// left := true -// if interval[0] < root.Interval[0] { -// left = query(root.Left, []int{interval[0], root.Interval[0] - 1}) -// } -// right := true -// if root.Interval[1] < interval[1] { -// right = query(root.Right, []int{root.Interval[1] + 1, interval[1]}) -// } -// return left && right -// } - -/** - * Your RangeModule object will be instantiated and called as such: - * obj := Constructor(); - * obj.AddRange(left,right); - * param_2 := obj.QueryRange(left,right); - * obj.RemoveRange(left,right); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0717.1-bit-and-2-bit-Characters.md b/website/content/ChapterFour/0717.1-bit-and-2-bit-Characters.md deleted file mode 100755 index 499889244..000000000 --- a/website/content/ChapterFour/0717.1-bit-and-2-bit-Characters.md +++ /dev/null @@ -1,65 +0,0 @@ -# [717. 1-bit and 2-bit Characters](https://leetcode.com/problems/1-bit-and-2-bit-characters/) - - -## 题目: - -We have two special characters. The first character can be represented by one bit `0`. The second character can be represented by two bits (`10` or `11`). - -Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero. - -**Example 1**: - - Input: - bits = [1, 0, 0] - Output: True - Explanation: - The only way to decode it is two-bit character and one-bit character. So the last character is one-bit character. - -**Example 2**: - - Input: - bits = [1, 1, 1, 0] - Output: False - Explanation: - The only way to decode it is two-bit character and two-bit character. So the last character is NOT one-bit character. - -**Note**: - -- `1 <= len(bits) <= 1000`. -- `bits[i]` is always `0` or `1`. - -## 题目大意 - -有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。 - -现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。 - -注意: - -- 1 <= len(bits) <= 1000. -- bits[i] 总是0 或 1. - - -## 解题思路 - -- 给出一个数组,数组里面的元素只有 0 和 1,并且数组的最后一个元素一定是 0。有 2 种特殊的字符,第一类字符是 "0",第二类字符是 "11" 和 "10",请判断这个数组最后一个元素是否一定是属于第一类字符? -- 依题意, 0 的来源有 2 处,可以是第一类字符,也可以是第二类字符,1 的来源只有 1 处,一定出自第二类字符。最后一个 0 当前仅当为第一类字符的情况有 2 种,第一种情况,前面出现有 0,但是 0 和 1 配对形成了第二类字符。第二种情况,前面没有出现 0 。这两种情况的共同点是除去最后一个元素,数组中前面所有的1 都“结对子”。所以利用第二类字符的特征,"1X",遍历整个数组,如果遇到 "1",就跳 2 步,因为 1 后面出现什么数字( 0 或者 1 )并不需要关心。如果 `i` 能在 `len(bits) - 1` 的地方`(数组最后一个元素)`停下,那么对应的是情况一或者情况二,前面的 0 都和 1 匹配上了,最后一个 0 一定是第一类字符。如果 `i` 在 `len(bit)` 的位置`(超出数组下标)`停下,说明 `bits[len(bits) - 1] == 1`,这个时候最后一个 0 一定属于第二类字符。 - - -## 代码 - -```go - -package leetcode - -func isOneBitCharacter(bits []int) bool { - var i int - for i = 0; i < len(bits)-1; i++ { - if bits[i] == 1 { - i++ - } - } - return i == len(bits)-1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0718.Maximum-Length-of-Repeated-Subarray.md b/website/content/ChapterFour/0718.Maximum-Length-of-Repeated-Subarray.md deleted file mode 100755 index eec248fe6..000000000 --- a/website/content/ChapterFour/0718.Maximum-Length-of-Repeated-Subarray.md +++ /dev/null @@ -1,123 +0,0 @@ -# [718. Maximum Length of Repeated Subarray](https://leetcode.com/problems/maximum-length-of-repeated-subarray/) - - -## 题目 - -Given two integer arrays `A` and `B`, return the maximum length of an subarray that appears in both arrays. - -**Example 1**: - - Input: - A: [1,2,3,2,1] - B: [3,2,1,4,7] - Output: 3 - Explanation: - The repeated subarray with maximum length is [3, 2, 1]. - -**Note**: - -1. 1 <= len(A), len(B) <= 1000 -2. 0 <= A[i], B[i] < 100 - - -## 题目大意 - -给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。 - - - -## 解题思路 - -- 给出两个数组,求这两个数组中最长相同子串的长度。 -- 这一题最容易想到的是 DP 动态规划的解法。`dp[i][j]` 代表在 A 数组中以 `i` 下标开始的子串与 B 数组中以 `j` 下标开始的子串最长相同子串的长度,状态转移方程为 `dp[i][j] = dp[i+1][j+1] + 1` (当 `A[i] == B[j]`)。这种解法的时间复杂度是 O(n^2),空间复杂度 O(n^2)。 -- 这一题最佳解法是二分搜索 + `Rabin-Karp`。比较相同子串耗时的地方在于,需要一层循环,遍历子串所有字符。但是如果比较两个数字就很快,`O(1)` 的时间复杂度。所以有人就想到了,能不能把字符串也映射成数字呢?这样比较起来就非常快。这个算法就是 `Rabin-Karp` 算法。字符串映射成一个数字不能随意映射,还要求能根据字符串前缀动态增加,比较下一个字符串的时候,可以利用已比较过的前缀,加速之后的字符串比较。在 Rabin-Karp 算法中有一个“码点”的概念。类似于10进制中的进制。具体的算法讲解可以见这篇: - - [基础知识 - Rabin-Karp 算法](https://www.cnblogs.com/golove/p/3234673.html) - - “码点”一般取值为一个素数。在 go 的 `strings` 包里面取值是 16777619。所以这一题也可以直接取这个值。由于这一次要求我们找最长长度,所以把最长长度作为二分搜索的目标。先将数组 A 和数组 B 中的数字都按照二分出来的长度,进行 `Rabin-Karp` hash。对 A 中的 hash 与下标做映射关系,存到 map 中,方便后面快速查找。然后遍历 B 中的 hash,当 hash 一致的时候,再匹配下标。如果下标存在,且拥有相同的前缀,那么就算找到了相同的子串了。最后就是不断的二分,找到最长的结果即可。这个解法的时间复杂度 O(n * log n),空间复杂度 O(n)。 - -## 代码 - -```go - -package leetcode - -const primeRK = 16777619 - -// 解法一 二分搜索 + Rabin-Karp -func findLength(A []int, B []int) int { - low, high := 0, min(len(A), len(B)) - for low < high { - mid := (low + high + 1) >> 1 - if hasRepeated(A, B, mid) { - low = mid - } else { - high = mid - 1 - } - } - return low -} - -func hashSlice(arr []int, length int) []int { - // hash 数组里面记录 arr 比 length 长出去部分的 hash 值 - hash, pl, h := make([]int, len(arr)-length+1), 1, 0 - for i := 0; i < length-1; i++ { - pl *= primeRK - } - for i, v := range arr { - h = h*primeRK + v - if i >= length-1 { - hash[i-length+1] = h - h -= pl * arr[i-length+1] - } - } - return hash -} - -func hasSamePrefix(A, B []int, length int) bool { - for i := 0; i < length; i++ { - if A[i] != B[i] { - return false - } - } - return true -} - -func hasRepeated(A, B []int, length int) bool { - hs := hashSlice(A, length) - hashToOffset := make(map[int][]int, len(hs)) - for i, h := range hs { - hashToOffset[h] = append(hashToOffset[h], i) - } - for i, h := range hashSlice(B, length) { - if offsets, ok := hashToOffset[h]; ok { - for _, offset := range offsets { - if hasSamePrefix(A[offset:], B[i:], length) { - return true - } - } - } - } - return false -} - -// 解法二 DP 动态规划 -func findLength1(A []int, B []int) int { - res, dp := 0, make([][]int, len(A)+1) - for i := range dp { - dp[i] = make([]int, len(B)+1) - } - for i := len(A) - 1; i >= 0; i-- { - for j := len(B) - 1; j >= 0; j-- { - if A[i] == B[j] { - dp[i][j] = dp[i+1][j+1] + 1 - if dp[i][j] > res { - res = dp[i][j] - } - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0719.Find-K-th-Smallest-Pair-Distance.md b/website/content/ChapterFour/0719.Find-K-th-Smallest-Pair-Distance.md deleted file mode 100755 index 836b8922a..000000000 --- a/website/content/ChapterFour/0719.Find-K-th-Smallest-Pair-Distance.md +++ /dev/null @@ -1,97 +0,0 @@ -# [719. Find K-th Smallest Pair Distance](https://leetcode.com/problems/find-k-th-smallest-pair-distance/) - - -## 题目 - -Given an integer array, return the k-th smallest **distance** among all the pairs. The distance of a pair (A, B) is defined as the absolute difference between A and B. - -**Example 1**: - - Input: - nums = [1,3,1] - k = 1 - Output: 0 - Explanation: - Here are all the pairs: - (1,3) -> 2 - (1,1) -> 0 - (3,1) -> 2 - Then the 1st smallest distance pair is (1,1), and its distance is 0. - -**Note**: - -1. `2 <= len(nums) <= 10000`. -2. `0 <= nums[i] < 1000000`. -3. `1 <= k <= len(nums) * (len(nums) - 1) / 2`. - - -## 题目大意 - -给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。 - -提示: - -1. 2 <= len(nums) <= 10000. -2. 0 <= nums[i] < 1000000. -3. 1 <= k <= len(nums) * (len(nums) - 1) / 2. - - - -## 解题思路 - -- 给出一个数组,要求找出第 k 小两两元素之差的值。两两元素之差可能重复,重复的元素之差算多个,不去重。 -- 这一题可以用二分搜索来解答。先把原数组排序,那么最大的差值就是 `nums[len(nums)-1] - nums[0]` ,最小的差值是 0,即在 `[0, nums[len(nums)-1] - nums[0]]` 区间内搜索最终答案。针对每个 `mid`,判断小于等于 `mid` 的差值有多少个。题意就转化为,在数组中找到这样一个数,使得满足 `nums[i] - nums[j] ≤ mid` 条件的组合数等于 `k`。那么如何计算满足两两数的差值小于 mid 的组合总数是本题的关键。 -- 最暴力的方法就是 2 重循环,暴力计数。这个方法效率不高,耗时很长。原因是没有利用数组有序这一条件。实际上数组有序对计算满足条件的组合数有帮助。利用双指针滑动即可计算出组合总数。见解法一。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func smallestDistancePair(nums []int, k int) int { - sort.Ints(nums) - low, high := 0, nums[len(nums)-1]-nums[0] - for low < high { - mid := low + (high-low)>>1 - tmp := findDistanceCount(nums, mid) - if tmp >= k { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -// 解法一 双指针 -func findDistanceCount(nums []int, num int) int { - count, i := 0, 0 - for j := 1; j < len(nums); j++ { - for nums[j]-nums[i] > num && i < j { - i++ - } - count += (j - i) - } - return count -} - -// 解法二 暴力查找 -func findDistanceCount1(nums []int, num int) int { - count := 0 - for i := 0; i < len(nums); i++ { - for j := i + 1; j < len(nums); j++ { - if nums[j]-nums[i] <= num { - count++ - } - } - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0720.Longest-Word-in-Dictionary.md b/website/content/ChapterFour/0720.Longest-Word-in-Dictionary.md deleted file mode 100755 index 8a70177f3..000000000 --- a/website/content/ChapterFour/0720.Longest-Word-in-Dictionary.md +++ /dev/null @@ -1,72 +0,0 @@ -# [720. Longest Word in Dictionary](https://leetcode.com/problems/longest-word-in-dictionary/) - - -## 题目 - -Given a list of strings `words` representing an English Dictionary, find the longest word in `words` that can be built one character at a time by other words in `words`. If there is more than one possible answer, return the longest word with the smallest lexicographical order. - -If there is no answer, return the empty string. - -**Example 1**: - - Input: - words = ["w","wo","wor","worl", "world"] - Output: "world" - Explanation: - The word "world" can be built one character at a time by "w", "wo", "wor", and "worl". - -**Example 2**: - - Input: - words = ["a", "banana", "app", "appl", "ap", "apply", "apple"] - Output: "apple" - Explanation: - Both "apply" and "apple" can be built from other words in the dictionary. However, "apple" is lexicographically smaller than "apply". - -**Note**: - -- All the strings in the input will only contain lowercase letters. -- The length of `words` will be in the range `[1, 1000]`. -- The length of `words[i]` will be in the range `[1, 30]`. - - -## 题目大意 - -给出一个字符串数组 words 组成的一本英语词典。从中找出最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。 - - - -## 解题思路 - - -- 给出一个字符串数组,要求找到长度最长的,并且可以由字符串数组里面其他字符串拼接一个字符组成的字符串。如果存在多个这样的最长的字符串,则输出字典序较小的那个字符串,如果找不到这样的字符串,输出空字符串。 -- 这道题解题思路是先排序,排序完成以后就是字典序从小到大了。之后再用 map 辅助记录即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func longestWord(words []string) string { - sort.Strings(words) - mp := make(map[string]bool) - var res string - for _, word := range words { - size := len(word) - if size == 1 || mp[word[:size-1]] { - if size > len(res) { - res = word - } - mp[word] = true - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0721.Accounts-Merge.md b/website/content/ChapterFour/0721.Accounts-Merge.md deleted file mode 100755 index 352343d96..000000000 --- a/website/content/ChapterFour/0721.Accounts-Merge.md +++ /dev/null @@ -1,149 +0,0 @@ -# [721. Accounts Merge](https://leetcode.com/problems/accounts-merge/) - - -## 题目 - -Given a list `accounts`, each element `accounts[i]` is a list of strings, where the first element `accounts[i][0]` is a name, and the rest of the elements are emailsrepresenting emails of the account. - -Now, we would like to merge these accounts. Two accounts definitely belong to the same person if there is some email that is common to both accounts. Note that even if two accounts have the same name, they may belong to different people as people could have the same name. A person can have any number of accounts initially, but all of their accounts definitely have the same name. - -After merging the accounts, return the accounts in the following format: the first element of each account is the name, and the rest of the elements are emails **in sorted order**. The accounts themselves can be returned in any order. - -**Example 1**: - - Input: - accounts = [["John", "johnsmith@mail.com", "john00@mail.com"], ["John", "johnnybravo@mail.com"], ["John", "johnsmith@mail.com", "john_newyork@mail.com"], ["Mary", "mary@mail.com"]] - Output: [["John", 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com'], ["John", "johnnybravo@mail.com"], ["Mary", "mary@mail.com"]] - Explanation: - The first and third John's are the same person as they have the common email "johnsmith@mail.com". - The second John and Mary are different people as none of their email addresses are used by other accounts. - We could return these lists in any order, for example the answer [['Mary', 'mary@mail.com'], ['John', 'johnnybravo@mail.com'], - ['John', 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com']] would still be accepted. - -**Note**: - -- The length of `accounts` will be in the range `[1, 1000]`. -- The length of `accounts[i]` will be in the range `[1, 10]`. -- The length of `accounts[i][j]` will be in the range `[1, 30]`. - - -## 题目大意 - - -给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该帐户的邮箱地址。现在,我们想合并这些帐户。如果两个帐户都有一些共同的邮件地址,则两个帐户必定属于同一个人。请注意,即使两个帐户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称。一个人最初可以拥有任意数量的帐户,但其所有帐户都具有相同的名称。合并帐户后,按以下格式返回帐户:每个帐户的第一个元素是名称,其余元素是按顺序排列的邮箱地址。accounts 本身可以以任意顺序返回。 - - -注意: - -- accounts 的长度将在 [1,1000] 的范围内。 -- accounts[i] 的长度将在 [1,10] 的范围内。 -- accounts[i][j] 的长度将在 [1,30] 的范围内。 - - - -## 解题思路 - - -- 给出一堆账户和对应的邮箱。要求合并同一个人的多个邮箱账户。如果判断是同一个人呢?如果这个人名和所属的其中之一的邮箱是相同的,就判定这是同一个人的邮箱,那么就合并这些邮箱。 -- 这题的解题思路是并查集。不过如果用暴力合并的方法,时间复杂度非常差。优化方法是先把每组数据都进行编号,人编号,每个邮箱都进行编号。这个映射关系用 `map` 记录起来。如果利用并查集的 `union()` 操作,把这些编号都进行合并。最后把人的编号和对应邮箱的编号拼接起来。 -- 这一题有 2 处比较“坑”的是,不需要合并的用户的邮箱列表也是需要排序和去重的,同一个人的所有邮箱集合都要合并到一起。具体见测试用例。不过题目中也提到了这些点,也不能算题目坑,只能归自己没注意这些边界情况。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 并查集优化搜索解法 -func accountsMerge(accounts [][]string) (r [][]string) { - uf := template.UnionFind{} - uf.Init(len(accounts)) - // emailToID 将所有的 email 邮箱都拆开,拆开与 id(数组下标) 对应 - // idToName 将 id(数组下标) 与 name 对应 - // idToEmails 将 id(数组下标) 与整理好去重以后的 email 组对应 - emailToID, idToName, idToEmails, res := make(map[string]int), make(map[int]string), make(map[int][]string), [][]string{} - for id, acc := range accounts { - idToName[id] = acc[0] - for i := 1; i < len(acc); i++ { - pid, ok := emailToID[acc[i]] - if ok { - uf.Union(id, pid) - } - emailToID[acc[i]] = id - } - } - for email, id := range emailToID { - pid := uf.Find(id) - idToEmails[pid] = append(idToEmails[pid], email) - } - for id, emails := range idToEmails { - name := idToName[id] - sort.Strings(emails) - res = append(res, append([]string{name}, emails...)) - } - return res -} - -// 解法二 并查集暴力解法 -func accountsMerge1(accounts [][]string) [][]string { - if len(accounts) == 0 { - return [][]string{} - } - uf, res, visited := template.UnionFind{}, [][]string{}, map[int]bool{} - uf.Init(len(accounts)) - for i := 0; i < len(accounts); i++ { - for j := i + 1; j < len(accounts); j++ { - if accounts[i][0] == accounts[j][0] { - tmpA, tmpB, flag := accounts[i][1:], accounts[j][1:], false - for j := 0; j < len(tmpA); j++ { - for k := 0; k < len(tmpB); k++ { - if tmpA[j] == tmpB[k] { - flag = true - break - } - } - if flag { - break - } - } - if flag { - uf.Union(i, j) - } - } - } - } - for i := 0; i < len(accounts); i++ { - if visited[i] { - continue - } - emails, account, tmpMap := accounts[i][1:], []string{accounts[i][0]}, map[string]string{} - for j := i + 1; j < len(accounts); j++ { - if uf.Find(j) == uf.Find(i) { - visited[j] = true - for _, v := range accounts[j][1:] { - tmpMap[v] = v - } - } - } - for _, v := range emails { - tmpMap[v] = v - } - emails = []string{} - for key := range tmpMap { - emails = append(emails, key) - } - sort.Strings(emails) - account = append(account, emails...) - res = append(res, account) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0724.Find-Pivot-Index.md b/website/content/ChapterFour/0724.Find-Pivot-Index.md deleted file mode 100644 index 1e93cf475..000000000 --- a/website/content/ChapterFour/0724.Find-Pivot-Index.md +++ /dev/null @@ -1,74 +0,0 @@ -# [724. Find Pivot Index](https://leetcode.com/problems/find-pivot-index/) - - -## 题目 - -Given an array of integers nums, write a method that returns the "pivot" index of this array. - -We define the pivot index as the index where the sum of all the numbers to the left of the index is equal to the sum of all the numbers to the right of the index. - -If no such index exists, we should return -1. If there are multiple pivot indexes, you should return the left-most pivot index. - - - -**Example 1**: - - Input: nums = [1,7,3,6,5,6] - Output: 3 - Explanation: - The sum of the numbers to the left of index 3 (nums[3] = 6) is equal to the sum of numbers to the right of index 3. - Also, 3 is the first index where this occurs. - -**Example 2**: - - Input: nums = [1,2,3] - Output: -1 - Explanation: - There is no index that satisfies the conditions in the problem statement. - -**Constraints**: - -- The length of nums will be in the range [0, 10000]. -- Each element nums[i] will be an integer in the range [-1000, 1000]. - - - -## 题目大意 - -给定一个整数类型的数组 nums,请编写一个能够返回数组 “中心索引” 的方法。我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,那么我们应该返回 -1。如果数组有多个中心索引,那么我们应该返回最靠近左边的那一个。 - - - -## 解题思路 - -- 在数组中,找到一个数,使得它左边的数之和等于它的右边的数之和,如果存在,则返回这个数的下标索引,否作返回 -1。 -- 这里面存在一个等式,只需要满足这个等式即可满足条件:leftSum + num[i] = sum - leftSum => 2 * leftSum + num[i] = sum。 -- 题目提到如果存在多个索引,则返回最左边那个,因此从左开始求和,而不是从右边。 - -## 代码 - -```go - -package leetcode - -// 2 * leftSum + num[i] = sum -// 时间: O(n) -// 空间: O(1) -func pivotIndex(nums []int) int { - if len(nums) <= 0 { - return -1 - } - var sum, leftSum int - for _, num := range nums { - sum += num - } - for index, num := range nums { - if leftSum*2+num == sum { - return index - } - leftSum += num - } - return -1 -} - -``` diff --git a/website/content/ChapterFour/0726.Number-of-Atoms.md b/website/content/ChapterFour/0726.Number-of-Atoms.md deleted file mode 100755 index a9d3cf4a7..000000000 --- a/website/content/ChapterFour/0726.Number-of-Atoms.md +++ /dev/null @@ -1,186 +0,0 @@ -# [726. Number of Atoms](https://leetcode.com/problems/number-of-atoms/) - - -## 题目 - -Given a chemical `formula` (given as a string), return the count of each atom. - -An atomic element always starts with an uppercase character, then zero or more lowercase letters, representing the name. - -1 or more digits representing the count of that element may follow if the count is greater than 1. If the count is 1, no digits will follow. For example, H2O and H2O2 are possible, but H1O2 is impossible. - -Two formulas concatenated together produce another formula. For example, H2O2He3Mg4 is also a formula. - -A formula placed in parentheses, and a count (optionally added) is also a formula. For example, (H2O2) and (H2O2)3 are formulas. - -Given a formula, output the count of all elements as a string in the following form: the first name (in sorted order), followed by its count (if that count is more than 1), followed by the second name (in sorted order), followed by its count (if that count is more than 1), and so on. - -**Example 1**: - - Input: - formula = "H2O" - Output: "H2O" - Explanation: - The count of elements are {'H': 2, 'O': 1}. - -**Example 2**: - - Input: - formula = "Mg(OH)2" - Output: "H2MgO2" - Explanation: - The count of elements are {'H': 2, 'Mg': 1, 'O': 2}. - -**Example 3**: - - Input: - formula = "K4(ON(SO3)2)2" - Output: "K4N2O14S4" - Explanation: - The count of elements are {'K': 4, 'N': 2, 'O': 14, 'S': 4}. - -**Note**: - -- All atom names consist of lowercase letters, except for the first character which is uppercase. -- The length of `formula` will be in the range `[1, 1000]`. -- `formula` will only consist of letters, digits, and round parentheses, and is a valid formula as defined in the problem. - - -## 题目大意 - -给定一个化学式,输出所有原子的数量。格式为:第一个(按字典序)原子的名子,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。 - -原子总是以一个大写字母开始,接着跟随0个或任意个小写字母,表示原子的名字。如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。例如,H2O 和 H2O2 是可行的,但 H1O2 这个表达是不可行的。两个化学式连在一起是新的化学式。例如 H2O2He3Mg4 也是化学式。一个括号中的化学式和数字(可选择性添加)也是化学式。例如 (H2O2) 和 (H2O2)3 是化学式。 - - - -## 解题思路 - - -- 利用栈处理每个化学元素,用 map 记录每个化学元素的个数,最终排序以后输出即可 -- 注意化学元素有些并不是单一字母,比如镁元素是 Mg,所以需要考虑字母的大小写问题。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - "strconv" - "strings" -) - -type atom struct { - name string - cnt int -} - -type atoms []atom - -func (this atoms) Len() int { return len(this) } -func (this atoms) Less(i, j int) bool { return strings.Compare(this[i].name, this[j].name) < 0 } -func (this atoms) Swap(i, j int) { this[i], this[j] = this[j], this[i] } -func (this atoms) String() string { - s := "" - for _, a := range this { - s += a.name - if a.cnt > 1 { - s += strconv.Itoa(a.cnt) - } - } - return s -} - -func countOfAtoms(s string) string { - n := len(s) - if n == 0 { - return "" - } - - stack := make([]string, 0) - for i := 0; i < n; i++ { - c := s[i] - if c == '(' || c == ')' { - stack = append(stack, string(c)) - } else if isUpperLetter(c) { - j := i + 1 - for ; j < n; j++ { - if !isLowerLetter(s[j]) { - break - } - } - stack = append(stack, s[i:j]) - i = j - 1 - } else if isDigital(c) { - j := i + 1 - for ; j < n; j++ { - if !isDigital(s[j]) { - break - } - } - stack = append(stack, s[i:j]) - i = j - 1 - } - } - - cnt, deep := make([]map[string]int, 100), 0 - for i := 0; i < 100; i++ { - cnt[i] = make(map[string]int) - } - for i := 0; i < len(stack); i++ { - t := stack[i] - if isUpperLetter(t[0]) { - num := 1 - if i+1 < len(stack) && isDigital(stack[i+1][0]) { - num, _ = strconv.Atoi(stack[i+1]) - i++ - } - cnt[deep][t] += num - } else if t == "(" { - deep++ - } else if t == ")" { - num := 1 - if i+1 < len(stack) && isDigital(stack[i+1][0]) { - num, _ = strconv.Atoi(stack[i+1]) - i++ - } - for k, v := range cnt[deep] { - cnt[deep-1][k] += v * num - } - cnt[deep] = make(map[string]int) - deep-- - } - } - as := atoms{} - for k, v := range cnt[0] { - as = append(as, atom{name: k, cnt: v}) - } - sort.Sort(as) - return as.String() -} - -func isDigital(v byte) bool { - if v >= '0' && v <= '9' { - return true - } - return false -} - -func isUpperLetter(v byte) bool { - if v >= 'A' && v <= 'Z' { - return true - } - return false -} - -func isLowerLetter(v byte) bool { - if v >= 'a' && v <= 'z' { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0729.My-Calendar-I.md b/website/content/ChapterFour/0729.My-Calendar-I.md deleted file mode 100755 index bc957abac..000000000 --- a/website/content/ChapterFour/0729.My-Calendar-I.md +++ /dev/null @@ -1,180 +0,0 @@ -# [729. My Calendar I](https://leetcode.com/problems/my-calendar-i/) - - -## 题目 - -Implement a `MyCalendar` class to store your events. A new event can be added if adding the event will not cause a double booking. - -Your class will have the method, `book(int start, int end)`. Formally, this represents a booking on the half open interval `[start, end)`, the range of real numbers `x` such that `start <= x < end`. - -A double booking happens when two events have some non-empty intersection (ie., there is some time that is common to both events.) - -For each call to the method `MyCalendar.book`, return `true` if the event can be added to the calendar successfully without causing a double booking. Otherwise, return `false` and do not add the event to the calendar. - -Your class will be called like this: - -`MyCalendar cal = new MyCalendar();` - -`MyCalendar.book(start, end)` - -**Example 1**: - - MyCalendar(); - MyCalendar.book(10, 20); // returns true - MyCalendar.book(15, 25); // returns false - MyCalendar.book(20, 30); // returns true - Explanation: - The first event can be booked. The second can't because time 15 is already booked by another event. - The third event can be booked, as the first event takes every time less than 20, but not including 20. - -**Note**: - -- The number of calls to `MyCalendar.book` per test case will be at most `1000`. -- In calls to `MyCalendar.book(start, end)`, `start` and `end` are integers in the range `[0, 10^9]`. - - - -## 题目大意 - -实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。 - -MyCalendar 有一个 book(int start, int end) 方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,  start <= x < end。 - -当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。 - -每次调用 MyCalendar.book 方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。 - -请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end) - -说明: - -- 每个测试用例,调用 MyCalendar.book 函数最多不超过 100次。 -- 调用函数 MyCalendar.book(start, end) 时, start 和 end 的取值范围为 [0, 10^9]。 - - -## 解题思路 - - -- 要求实现一个日程安排的功能,如果有日程安排冲突了,就返回 false,如果不冲突则返回 ture -- 这一题有多种解法,第一种解法可以用类似第 34 题的解法。先排序每个区间,然后再这个集合中用二分搜索找到最后一个区间的左值比当前要比较的区间左值小的,如果找到,再判断能否插入进去(判断右区间是否比下一个区间的左区间小),此方法时间复杂度 O(n log n) -- 第二种解法是用生成一个 BST 树。在插入树中先排除不能插入的情况,例如区间有重合。然后以区间左值为依据,递归插入,每次插入依次会继续判断区间是否重合。直到不能插入,则返回 fasle。整个查找的时间复杂度是 O(log n)。 - -## 代码 - -```go - -package leetcode - -// 解法一 二叉排序树 -// Event define -type Event struct { - start, end int - left, right *Event -} - -// Insert define -func (e *Event) Insert(curr *Event) bool { - if e.end > curr.start && curr.end > e.start { - return false - } - if curr.start < e.start { - if e.left == nil { - e.left = curr - } else { - return e.left.Insert(curr) - } - } else { - if e.right == nil { - e.right = curr - } else { - return e.right.Insert(curr) - } - } - return true -} - -// MyCalendar define -type MyCalendar struct { - root *Event -} - -// Constructor729 define -func Constructor729() MyCalendar { - return MyCalendar{ - root: nil, - } -} - -// Book define -func (this *MyCalendar) Book(start int, end int) bool { - curr := &Event{start: start, end: end, left: nil, right: nil} - if this.root == nil { - this.root = curr - return true - } - return this.root.Insert(curr) -} - -// 解法二 快排 + 二分 -// MyCalendar define -// type MyCalendar struct { -// calendar []Interval -// } - -// // Constructor729 define -// func Constructor729() MyCalendar { -// calendar := []Interval{} -// return MyCalendar{calendar: calendar} -// } - -// // Book define -// func (this *MyCalendar) Book(start int, end int) bool { -// if len(this.calendar) == 0 { -// this.calendar = append(this.calendar, Interval{Start: start, End: end}) -// return true -// } -// // 快排 -// quickSort(this.calendar, 0, len(this.calendar)-1) -// // 二分 -// pos := searchLastLessInterval(this.calendar, start, end) -// // 如果找到最后一个元素,需要判断 end -// if pos == len(this.calendar)-1 && this.calendar[pos].End <= start { -// this.calendar = append(this.calendar, Interval{Start: start, End: end}) -// return true -// } -// // 如果不是开头和结尾的元素,还需要判断这个区间是否能插入到原数组中(要看起点和终点是否都能插入) -// if pos != len(this.calendar)-1 && pos != -1 && this.calendar[pos].End <= start && this.calendar[pos+1].Start >= end { -// this.calendar = append(this.calendar, Interval{Start: start, End: end}) -// return true -// } -// // 如果元素比开头的元素还要小,要插入到开头 -// if this.calendar[0].Start >= end { -// this.calendar = append(this.calendar, Interval{Start: start, End: end}) -// return true -// } -// return false -// } - -// func searchLastLessInterval(intervals []Interval, start, end int) int { -// low, high := 0, len(intervals)-1 -// for low <= high { -// mid := low + ((high - low) >> 1) -// if intervals[mid].Start <= start { -// if (mid == len(intervals)-1) || (intervals[mid+1].Start > start) { // 找到最后一个小于等于 target 的元素 -// return mid -// } -// low = mid + 1 -// } else { -// high = mid - 1 -// } -// } -// return -1 -// } - -/** - * Your MyCalendar object will be instantiated and called as such: - * obj := Constructor(); - * param_1 := obj.Book(start,end); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0732.My-Calendar-III.md b/website/content/ChapterFour/0732.My-Calendar-III.md deleted file mode 100755 index 5b953911a..000000000 --- a/website/content/ChapterFour/0732.My-Calendar-III.md +++ /dev/null @@ -1,142 +0,0 @@ -# [732. My Calendar III](https://leetcode.com/problems/my-calendar-iii/) - - -## 题目 - -Implement a `MyCalendarThree` class to store your events. A new event can **always** be added. - -Your class will have one method, `book(int start, int end)`. Formally, this represents a booking on the half open interval `[start, end)`, the range of real numbers `x` such that `start <= x < end`. - -A K-booking happens when **K** events have some non-empty intersection (ie., there is some time that is common to all K events.) - -For each call to the method `MyCalendar.book`, return an integer `K` representing the largest integer such that there exists a `K`-booking in the calendar. - -Your class will be called like this: - -`MyCalendarThree cal = new MyCalendarThree();` - -`MyCalendarThree.book(start, end)` - -**Example 1**: - - MyCalendarThree(); - MyCalendarThree.book(10, 20); // returns 1 - MyCalendarThree.book(50, 60); // returns 1 - MyCalendarThree.book(10, 40); // returns 2 - MyCalendarThree.book(5, 15); // returns 3 - MyCalendarThree.book(5, 10); // returns 3 - MyCalendarThree.book(25, 55); // returns 3 - Explanation: - The first two events can be booked and are disjoint, so the maximum K-booking is a 1-booking. - The third event [10, 40) intersects the first event, and the maximum K-booking is a 2-booking. - The remaining events cause the maximum K-booking to be only a 3-booking. - Note that the last event locally causes a 2-booking, but the answer is still 3 because - eg. [10, 20), [10, 40), and [5, 15) are still triple booked. - -**Note**: - -- The number of calls to `MyCalendarThree.book` per test case will be at most `400`. -- In calls to `MyCalendarThree.book(start, end)`, `start` and `end` are integers in the range `[0, 10^9]`. - - -## 题目大意 - -实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排。 - -MyCalendar 有一个 book(int start, int end)方法。它意味着在start到end时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,  start <= x < end。当 K 个日程安排有一些时间上的交叉时(例如K个日程安排都在同一时间内),就会产生 K 次预订。每次调用 MyCalendar.book方法时,返回一个整数 K ,表示最大的 K 次预订。 - -请按照以下步骤调用MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end) - -说明: - -- 每个测试用例,调用 MyCalendar.book 函数最多不超过 400 次。 -- 调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]。 - - - - -## 解题思路 - -- 设计一个日程类,每添加一个日程,实时显示出当前排期中累计日程最多的个数,例如在一段时间内,排了 3 个日程,其他时间内都只有 0,1,2 个日程,则输出 3 。 -- 拿到这个题目以后会立即想到线段树。由于题目中只有增加日程,所以这一题难度不大。这一题和第 699 题也类似,但是有区别,第 699 题中,俄罗斯方块会依次摞起来,而这一题中,俄罗斯方块也就摞起来,但是方块下面如果是空挡,方块会断掉。举个例子:依次增加区间 [10,20],[10,40],[5,15],[5,10],如果是第 699 题的规则,这 [5,10] 的这块砖块会落在 [5,15] 上,从而使得高度为 4,但是这一题是日程,日程不一样,[5,15] 这个区间内有 3 个日程,但是其他部分都没有 3 个日程,所以第三块砖块 [5,15] 中的 [5,10] 会“断裂”,掉下去,第四块砖块还是 [5,10],落在第三块砖块断落下去的位置,它们俩落在一起的高度是 2 。 -- 构造一颗线段树,这里用树来构造,如果用数组需要开辟很大的空间。当区间左右边界和查询边界完全相同的时候再累加技术,否则不加,继续划分区间。以区间的左边界作为划分区间的标准,因为区间左边界是开区间,右边是闭区间。一个区间的计数值以区间左边界的计数为准。还是上面的例子,[5,10) 计数以 5 为标准,count = 2,[10,15) 计数以 10 为标准,count = 3 。还需要再动态维护一个最大值。这个线段树的实现比较简单。 -- 类似的题目有:第 715 题,第 218 题,第 699 题。第 715 题是区间更新定值(**不是增减**),第 218 题可以用扫描线,第 732 题和第 699 题类似,也是俄罗斯方块的题目,但是第 732 题的俄罗斯方块的方块会“断裂”。 - - -## 代码 - -```go - -package leetcode - -// SegmentTree732 define -type SegmentTree732 struct { - start, end, count int - left, right *SegmentTree732 -} - -// MyCalendarThree define -type MyCalendarThree struct { - st *SegmentTree732 - maxHeight int -} - -// Constructor732 define -func Constructor732() MyCalendarThree { - st := &SegmentTree732{ - start: 0, - end: 1e9, - } - return MyCalendarThree{ - st: st, - } -} - -// Book define -func (mct *MyCalendarThree) Book(start int, end int) int { - mct.st.book(start, end, &mct.maxHeight) - return mct.maxHeight -} - -func (st *SegmentTree732) book(start, end int, maxHeight *int) { - if start == end { - return - } - if start == st.start && st.end == end { - st.count++ - if st.count > *maxHeight { - *maxHeight = st.count - } - if st.left == nil { - return - } - } - if st.left == nil { - if start == st.start { - st.left = &SegmentTree732{start: start, end: end, count: st.count} - st.right = &SegmentTree732{start: end, end: st.end, count: st.count} - st.left.book(start, end, maxHeight) - return - } - st.left = &SegmentTree732{start: st.start, end: start, count: st.count} - st.right = &SegmentTree732{start: start, end: st.end, count: st.count} - st.right.book(start, end, maxHeight) - return - } - if start >= st.right.start { - st.right.book(start, end, maxHeight) - } else if end <= st.left.end { - st.left.book(start, end, maxHeight) - } else { - st.left.book(start, st.left.end, maxHeight) - st.right.book(st.right.start, end, maxHeight) - } -} - -/** - * Your MyCalendarThree object will be instantiated and called as such: - * obj := Constructor(); - * param_1 := obj.Book(start,end); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0733.Flood-Fill.md b/website/content/ChapterFour/0733.Flood-Fill.md deleted file mode 100755 index 8fd2bba3f..000000000 --- a/website/content/ChapterFour/0733.Flood-Fill.md +++ /dev/null @@ -1,81 +0,0 @@ -# [733. Flood Fill](https://leetcode.com/problems/flood-fill/) - - -## 题目 - -An `image` is represented by a 2-D array of integers, each integer representing the pixel value of the image (from 0 to 65535). - -Given a coordinate `(sr, sc)` representing the starting pixel (row and column) of the flood fill, and a pixel value `newColor`, "flood fill" the image. - -To perform a "flood fill", consider the starting pixel, plus any pixels connected 4-directionally to the starting pixel of the same color as the starting pixel, plus any pixels connected 4-directionally to those pixels (also with the same color as the starting pixel), and so on. Replace the color of all of the aforementioned pixels with the newColor. - -At the end, return the modified image. - -**Example 1**: - - Input: - image = [[1,1,1],[1,1,0],[1,0,1]] - sr = 1, sc = 1, newColor = 2 - Output: [[2,2,2],[2,2,0],[2,0,1]] - Explanation: - From the center of the image (with position (sr, sc) = (1, 1)), all pixels connected - by a path of the same color as the starting pixel are colored with the new color. - Note the bottom corner is not colored 2, because it is not 4-directionally connected - to the starting pixel. - -**Note**: - -- The length of `image` and `image[0]` will be in the range `[1, 50]`. -- The given starting pixel will satisfy `0 <= sr < image.length` and `0 <= sc < image[0].length`. -- The value of each color in `image[i][j]` and `newColor` will be an integer in `[0, 65535]`. - - -## 题目大意 - -有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。 - -为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有有记录的像素点的颜色值改为新的颜色值。最后返回经过上色渲染后的图像。 - -注意: - -- image 和 image[0] 的长度在范围 [1, 50] 内。 -- 给出的初始点将满足 0 <= sr < image.length 和 0 <= sc < image[0].length。 -- image[i][j] 和 newColor 表示的颜色值在范围 [0, 65535]内。 - - -## 解题思路 - - -- 给出一个二维的图片点阵,每个点阵都有一个数字。给出一个起点坐标,要求从这个起点坐标开始,把所有与这个起点连通的点都染色成 newColor。 -- 这一题是标准的 Flood Fill 算法。可以用 DFS 也可以用 BFS 。 - - -## 代码 - -```go - -package leetcode - -func floodFill(image [][]int, sr int, sc int, newColor int) [][]int { - color := image[sr][sc] - if newColor == color { - return image - } - dfs733(image, sr, sc, newColor) - return image -} - -func dfs733(image [][]int, x, y int, newColor int) { - if image[x][y] == newColor { - return - } - oldColor := image[x][y] - image[x][y] = newColor - for i := 0; i < 4; i++ { - if (x+dir[i][0] >= 0 && x+dir[i][0] < len(image)) && (y+dir[i][1] >= 0 && y+dir[i][1] < len(image[0])) && image[x+dir[i][0]][y+dir[i][1]] == oldColor { - dfs733(image, x+dir[i][0], y+dir[i][1], newColor) - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0735.Asteroid-Collision.md b/website/content/ChapterFour/0735.Asteroid-Collision.md deleted file mode 100644 index 2db714471..000000000 --- a/website/content/ChapterFour/0735.Asteroid-Collision.md +++ /dev/null @@ -1,105 +0,0 @@ -# [735. Asteroid Collision](https://leetcode.com/problems/asteroid-collision/) - -## 题目 - -We are given an array asteroids of integers representing asteroids in a row. - -For each asteroid, the absolute value represents its size, and the sign represents its direction (positive meaning right, negative meaning left). Each asteroid moves at the same speed. - -Find out the state of the asteroids after all collisions. If two asteroids meet, the smaller one will explode. If both are the same size, both will explode. Two asteroids moving in the same direction will never meet. - -**Example 1**: - -``` - -Input: -asteroids = [5, 10, -5] -Output: [5, 10] -Explanation: -The 10 and -5 collide resulting in 10. The 5 and 10 never collide. - -``` - -**Example 2**: - -``` - -Input: -asteroids = [8, -8] -Output: [] -Explanation: -The 8 and -8 collide exploding each other. - -``` - -**Example 3**: - -``` - -Input: -asteroids = [10, 2, -5] -Output: [10] -Explanation: -The 2 and -5 collide resulting in -5. The 10 and -5 collide resulting in 10. - -``` - -**Example 4**: - -``` - -Input: -asteroids = [-2, -1, 1, 2] -Output: [-2, -1, 1, 2] -Explanation: -The -2 and -1 are moving left, while the 1 and 2 are moving right. -Asteroids moving the same direction never meet, so no asteroids will meet each other. - -``` - -**Note**: - -- The length of asteroids will be at most 10000. -- Each asteroid will be a non-zero integer in the range [-1000, 1000].. - -## 题目大意 - -给定一个整数数组 asteroids,表示在同一行的行星。对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。 - -## 解题思路 - -这一题类似第 1047 题。这也是一个类似“对对碰”的游戏,不过这里的碰撞,大行星和小行星碰撞以后,大行星会胜出,小行星直接消失。按照题意的规则来,用栈模拟即可。考虑最终结果: - -1. 所有向左飞的行星都向左,所有向右飞的行星都向右。 -2. 向左飞的行星,如果飞行中没有向右飞行的行星,那么它将安全穿过。 -3. 跟踪所有向右移动到右侧的行星,最右边的一个将是第一个面对向左飞行行星碰撞的。 -4. 如果它幸存下来,继续前进,否则,任何之前的向右的行星都会被逐一被暴露出来碰撞。 - -所以先处理这种情况,一层循环把所有能碰撞的向右飞行的行星都碰撞完。碰撞完以后,如果栈顶行星向左飞,新来的行星向右飞,直接添加进来即可。否则栈顶行星向右飞,大小和向左飞的行星一样大小,两者都撞毁灭,弹出栈顶元素。 - - - - - -## 代码 - -```go - -package leetcode - -func asteroidCollision(asteroids []int) []int { - res := []int{} - for _, v := range asteroids { - for len(res) != 0 && res[len(res)-1] > 0 && res[len(res)-1] < -v { - res = res[:len(res)-1] - } - if len(res) == 0 || v > 0 || res[len(res)-1] < 0 { - res = append(res, v) - } else if v < 0 && res[len(res)-1] == -v { - res = res[:len(res)-1] - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0739.Daily-Temperatures.md b/website/content/ChapterFour/0739.Daily-Temperatures.md deleted file mode 100644 index 9fef4be8f..000000000 --- a/website/content/ChapterFour/0739.Daily-Temperatures.md +++ /dev/null @@ -1,59 +0,0 @@ -# [739. Daily Temperatures](https://leetcode.com/problems/daily-temperatures/) - -## 题目 - - -Given a list of daily temperatures T, return a list such that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead. - -For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0]. - -**Note**: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100]. - - -## 题目大意 - -给出一个温度数组,要求输出比当天温度高的在未来的哪一天,输出未来第几天的天数。例如比 73 度高的在未来第 1 天出现,比 75 度高的在未来第 4 天出现。 - -## 解题思路 - -这道题根据题意正常处理就可以了。2 层循环。另外一种做法是单调栈,维护一个单调递减的单调栈即可。 - - - - -## 代码 - -```go - -package leetcode - -// 解法一 普通做法 -func dailyTemperatures(T []int) []int { - res, j := make([]int, len(T)), 0 - for i := 0; i < len(T); i++ { - for j = i + 1; j < len(T); j++ { - if T[j] > T[i] { - res[i] = j - i - break - } - } - } - return res -} - -// 解法二 单调栈 -func dailyTemperatures1(T []int) []int { - res := make([]int, len(T)) - var toCheck []int - for i, t := range T { - for len(toCheck) > 0 && T[toCheck[len(toCheck)-1]] < t { - idx := toCheck[len(toCheck)-1] - res[idx] = i - idx - toCheck = toCheck[:len(toCheck)-1] - } - toCheck = append(toCheck, i) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0744.Find-Smallest-Letter-Greater-Than-Target.md b/website/content/ChapterFour/0744.Find-Smallest-Letter-Greater-Than-Target.md deleted file mode 100755 index fc6e62086..000000000 --- a/website/content/ChapterFour/0744.Find-Smallest-Letter-Greater-Than-Target.md +++ /dev/null @@ -1,92 +0,0 @@ -# [744. Find Smallest Letter Greater Than Target](https://leetcode.com/problems/find-smallest-letter-greater-than-target/) - - -## 题目 - -Given a list of sorted characters `letters` containing only lowercase letters, and given a target letter `target`, find the smallest element in the list that is larger than the given target. - -Letters also wrap around. For example, if the target is `target = 'z'` and `letters = ['a', 'b']`, the answer is `'a'`. - -**Examples**: - - Input: - letters = ["c", "f", "j"] - target = "a" - Output: "c" - - Input: - letters = ["c", "f", "j"] - target = "c" - Output: "f" - - Input: - letters = ["c", "f", "j"] - target = "d" - Output: "f" - - Input: - letters = ["c", "f", "j"] - target = "g" - Output: "j" - - Input: - letters = ["c", "f", "j"] - target = "j" - Output: "c" - - Input: - letters = ["c", "f", "j"] - target = "k" - Output: "c" - -**Note**: - -1. `letters` has a length in range `[2, 10000]`. -2. `letters` consists of lowercase letters, and contains at least 2 unique letters. -3. `target` is a lowercase letter. - - -## 题目大意 - -给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。 - -数组里字母的顺序是循环的。举个例子,如果目标字母target = 'z' 并且有序数组为 letters = ['a', 'b'],则答案返回 'a'。 - -注: - -1. letters长度范围在[2, 10000]区间内。 -2. letters 仅由小写字母组成,最少包含两个不同的字母。 -3. 目标字母target 是一个小写字母。 - - - -## 解题思路 - -- 给出一个字节数组,在这个字节数组中查找在 target 后面的第一个字母。数组是环形的。 -- 这一题也是二分搜索的题目,先在数组里面查找 target,如果找到了,取这个字母的后一个字母。如果没有找到,就取 low 下标的那个字母。注意数组是环形的,所以最后结果需要对下标取余。 - - -## 代码 - -```go - -package leetcode - -func nextGreatestLetter(letters []byte, target byte) byte { - low, high := 0, len(letters)-1 - for low <= high { - mid := low + (high-low)>>1 - if letters[mid] > target { - high = mid - 1 - } else { - low = mid + 1 - } - } - find := letters[low%len(letters)] - if find <= target { - return letters[0] - } - return find -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0745.Prefix-and-Suffix-Search.md b/website/content/ChapterFour/0745.Prefix-and-Suffix-Search.md deleted file mode 100755 index 705aa2171..000000000 --- a/website/content/ChapterFour/0745.Prefix-and-Suffix-Search.md +++ /dev/null @@ -1,98 +0,0 @@ -# [745. Prefix and Suffix Search](https://leetcode.com/problems/prefix-and-suffix-search/) - - -## 题目 - -Given many `words`, `words[i]` has weight `i`. - -Design a class `WordFilter` that supports one function, `WordFilter.f(String prefix, String suffix)`. It will return the word with given `prefix` and `suffix` with maximum weight. If no word exists, return -1. - -**Examples**: - - Input: - WordFilter(["apple"]) - WordFilter.f("a", "e") // returns 0 - WordFilter.f("b", "") // returns -1 - -**Note**: - -1. `words` has length in range `[1, 15000]`. -2. For each test case, up to `words.length` queries `WordFilter.f` may be made. -3. `words[i]` has length in range `[1, 10]`. -4. `prefix, suffix` have lengths in range `[0, 10]`. -5. `words[i]` and `prefix, suffix` queries consist of lowercase letters only. - - -## 题目大意 - -给定多个 words,words[i] 的权重为 i 。设计一个类 WordFilter 实现函数WordFilter.f(String prefix, String suffix)。这个函数将返回具有前缀 prefix 和后缀suffix 的词的最大权重。如果没有这样的词,返回 -1。 - - - -## 解题思路 - - -- 要求实现一个 `WordFilter` ,它具有字符串匹配的功能,可以匹配出前缀和后缀都满足条件的字符串下标,如果找得到,返回下标,如果找不到,则返回 -1 。 -- 这一题有 2 种解题思路。第一种是先把这个 `WordFilter` 结构里面的字符串全部预处理一遍,将它的前缀,后缀的所有组合都枚举出来放在 map 中,之后匹配的时候只需要按照自己定义的规则查找 key 就可以了。初始化时间复杂度 `O(N * L^2)`,查找时间复杂度 `O(1)`,空间复杂度 `O(N * L^2)`。其中 `N` 是输入的字符串数组的长度,`L` 是输入字符串数组中字符串的最大长度。第二种思路是直接遍历字符串每个下标,依次用字符串的前缀匹配方法和后缀匹配方法,依次匹配。初始化时间复杂度 `O(1)`,查找时间复杂度 `O(N * L)`,空间复杂度 `O(1)`。其中 `N` 是输入的字符串数组的长度,`L` 是输入字符串数组中字符串的最大长度。 - - - -## 代码 - -```go - -package leetcode - -import "strings" - -// 解法一 查找时间复杂度 O(1) -type WordFilter struct { - words map[string]int -} - -func Constructor745(words []string) WordFilter { - wordsMap := make(map[string]int, len(words)*5) - for k := 0; k < len(words); k++ { - for i := 0; i <= 10 && i <= len(words[k]); i++ { - for j := len(words[k]); 0 <= j && len(words[k])-10 <= j; j-- { - ps := words[k][:i] + "#" + words[k][j:] - wordsMap[ps] = k - } - } - } - return WordFilter{words: wordsMap} -} - -func (this *WordFilter) F(prefix string, suffix string) int { - ps := prefix + "#" + suffix - if index, ok := this.words[ps]; ok { - return index - } - return -1 -} - -// 解法二 查找时间复杂度 O(N * L) -type WordFilter_ struct { - input []string -} - -func Constructor_745_(words []string) WordFilter_ { - return WordFilter_{input: words} -} - -func (this *WordFilter_) F_(prefix string, suffix string) int { - for i := len(this.input) - 1; i >= 0; i-- { - if strings.HasPrefix(this.input[i], prefix) && strings.HasSuffix(this.input[i], suffix) { - return i - } - } - return -1 -} - -/** - * Your WordFilter object will be instantiated and called as such: - * obj := Constructor(words); - * param_1 := obj.F(prefix,suffix); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0746.Min-Cost-Climbing-Stairs.md b/website/content/ChapterFour/0746.Min-Cost-Climbing-Stairs.md deleted file mode 100755 index 2abd334b8..000000000 --- a/website/content/ChapterFour/0746.Min-Cost-Climbing-Stairs.md +++ /dev/null @@ -1,71 +0,0 @@ -# [746. Min Cost Climbing Stairs](https://leetcode.com/problems/min-cost-climbing-stairs/) - - -## 题目 - -On a staircase, the `i`-th step has some non-negative cost `cost[i]` assigned (0 indexed). - -Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top of the floor, and you can either start from the step with index 0, or the step with index 1. - -**Example 1**: - - Input: cost = [10, 15, 20] - Output: 15 - Explanation: Cheapest is start on cost[1], pay that cost and go to the top. - -**Example 2**: - - Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] - Output: 6 - Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3]. - -**Note**: - -1. `cost` will have a length in the range `[2, 1000]`. -2. Every `cost[i]` will be an integer in the range `[0, 999]`. - - -## 题目大意 - -数组的每个索引做为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost\[i\] (索引从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯。您需要找到达到楼层顶部的最低花费。在开始时,你可以选择从索引为 0 或 1 的元素作为初始阶梯。 - - -## 解题思路 - - -- 这一题算是第 70 题的加强版。依旧是爬楼梯的问题,解题思路也是 DP。在爬楼梯的基础上增加了一个新的条件,每层楼梯都有一个 cost 花费,问上到最终楼层,花费最小值是多少。 -- `dp[i]` 代表上到第 n 层的最小花费,状态转移方程是 `dp[i] = cost[i] + min(dp[i-2], dp[i-1])`,最终第 n 层的最小花费是 `min(dp[n-2], dp[n-1])` 。 -- 由于每层的花费只和前两层有关系,所以每次 DP 迭代的时候只需要 2 个临时变量即可。可以用这种方式来优化辅助空间。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 DP -func minCostClimbingStairs(cost []int) int { - dp := make([]int, len(cost)) - dp[0], dp[1] = cost[0], cost[1] - for i := 2; i < len(cost); i++ { - dp[i] = cost[i] + min(dp[i-2], dp[i-1]) - } - return min(dp[len(cost)-2], dp[len(cost)-1]) -} - -// 解法二 DP 优化辅助空间 -func minCostClimbingStairs1(cost []int) int { - var cur, last int - for i := 2; i < len(cost)+1; i++ { - if last+cost[i-1] > cur+cost[i-2] { - cur, last = last, cur+cost[i-2] - } else { - cur, last = last, last+cost[i-1] - } - } - return last -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0748.Shortest-Completing-Word.md b/website/content/ChapterFour/0748.Shortest-Completing-Word.md deleted file mode 100755 index ec0267e33..000000000 --- a/website/content/ChapterFour/0748.Shortest-Completing-Word.md +++ /dev/null @@ -1,102 +0,0 @@ -# [748. Shortest Completing Word](https://leetcode.com/problems/shortest-completing-word/) - - -## 题目 - -Find the minimum length word from a given dictionary `words`, which has all the letters from the string `licensePlate`. Such a word is said to complete the given string `licensePlate` - -Here, for letters we ignore case. For example, `"P"` on the `licensePlate` still matches `"p"` on the word. - -It is guaranteed an answer exists. If there are multiple answers, return the one that occurs first in the array. - -The license plate might have the same letter occurring multiple times. For example, given a `licensePlate` of `"PP"`, the word `"pair"` does not complete the `licensePlate`, but the word `"supper"` does. - -**Example 1**: - - Input: licensePlate = "1s3 PSt", words = ["step", "steps", "stripe", "stepple"] - Output: "steps" - Explanation: The smallest length word that contains the letters "S", "P", "S", and "T". - Note that the answer is not "step", because the letter "s" must occur in the word twice. - Also note that we ignored case for the purposes of comparing whether a letter exists in the word. - -**Example 2**: - - Input: licensePlate = "1s3 456", words = ["looks", "pest", "stew", "show"] - Output: "pest" - Explanation: There are 3 smallest length words that contains the letters "s". - We return the one that occurred first. - -**Note**: - -1. `licensePlate` will be a string with length in range `[1, 7]`. -2. `licensePlate` will contain digits, spaces, or letters (uppercase or lowercase). -3. `words` will have a length in the range `[10, 1000]`. -4. Every `words[i]` will consist of lowercase letters, and have length in range `[1, 15]`. - - -## 题目大意 - -如果单词列表(words)中的一个单词包含牌照(licensePlate)中所有的字母,那么我们称之为完整词。在所有完整词中,最短的单词我们称之为最短完整词。 - -单词在匹配牌照中的字母时不区分大小写,比如牌照中的 "P" 依然可以匹配单词中的 "p" 字母。我们保证一定存在一个最短完整词。当有多个单词都符合最短完整词的匹配条件时取单词列表中最靠前的一个。牌照中可能包含多个相同的字符,比如说:对于牌照 "PP",单词 "pair" 无法匹配,但是 "supper" 可以匹配。 - -注意: - -- 牌照(licensePlate)的长度在区域[1, 7]中。 -- 牌照(licensePlate)将会包含数字、空格、或者字母(大写和小写)。 -- 单词列表(words)长度在区间 [10, 1000] 中。 -- 每一个单词 words[i] 都是小写,并且长度在区间 [1, 15] 中。 - - - -## 解题思路 - - -- 给出一个数组,要求找出能包含 `licensePlate` 字符串中所有字符的最短长度的字符串。如果最短长度的字符串有多个,输出 word 下标小的那个。这一题也是简单题,不过有 2 个需要注意的点,第一点,`licensePlate` 中可能包含 `Unicode` 任意的字符,所以要先把字母的字符筛选出来,第二点是题目中保证了一定存在一个最短的单词能满足题意,并且忽略大小写。具体做法按照题意模拟即可。 - - -## 代码 - -```go - -package leetcode - -import "unicode" - -func shortestCompletingWord(licensePlate string, words []string) string { - lp := genCnter(licensePlate) - var ret string - for _, w := range words { - if match(lp, w) { - if len(w) < len(ret) || ret == "" { - ret = w - } - } - } - return ret -} - -func genCnter(lp string) [26]int { - cnter := [26]int{} - for _, ch := range lp { - if unicode.IsLetter(ch) { - cnter[unicode.ToLower(ch)-'a']++ - } - } - return cnter -} - -func match(lp [26]int, w string) bool { - m := [26]int{} - for _, ch := range w { - m[ch-'a']++ - } - for k, v := range lp { - if m[k] < v { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0753.Cracking-the-Safe.md b/website/content/ChapterFour/0753.Cracking-the-Safe.md deleted file mode 100644 index 39c79a48d..000000000 --- a/website/content/ChapterFour/0753.Cracking-the-Safe.md +++ /dev/null @@ -1,92 +0,0 @@ -# [753. Cracking the Safe](https://leetcode.com/problems/cracking-the-safe/) - - - -## 题目 - -There is a box protected by a password. The password is a sequence of `n` digits where each digit can be one of the first `k` digits `0, 1, ..., k-1`. - -While entering a password, the last `n` digits entered will automatically be matched against the correct password. - -For example, assuming the correct password is `"345"`, if you type `"012345"`, the box will open because the correct password matches the suffix of the entered password. - -Return any password of **minimum length** that is guaranteed to open the box at some point of entering it. - -**Example 1**: - -``` -Input: n = 1, k = 2 -Output: "01" -Note: "10" will be accepted too. -``` - -**Example 2**: - -``` -Input: n = 2, k = 2 -Output: "00110" -Note: "01100", "10011", "11001" will be accepted too. -``` - -**Note**: - -1. `n` will be in the range `[1, 4]`. -2. `k` will be in the range `[1, 10]`. -3. `k^n` will be at most `4096`. - - -## 题目大意 - -有一个需要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, ..., k-1 中的一个 。你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果匹配,则能够打开保险箱。举个例子,假设密码是 "345",你可以输入 "012345" 来打开它,只是你输入了 6 个字符.请返回一个能打开保险箱的最短字符串。 - -提示: - -- n 的范围是 [1, 4]。 -- k 的范围是 [1, 10]。 -- k^n 最大可能为 4096。 - - -## 解题思路 - -- 给出 2 个数字 n 和 k,n 代表密码是 n 位数,k 代表密码是 k 位。保险箱会记住最后 n 位输入。返回一个能打开保险箱的最短字符串。 -- 看到题目中的数据范围,数据范围很小,所以可以考虑用 DFS。想解开保险箱,当然是暴力破解,枚举所有可能。题目要求我们输出一个最短的字符串,这里是本题的关键,为何有最短呢?这里有贪心的思想。如果下一次递归可以利用上一次的 n-1 位,那么最终输出的字符串肯定是最短的。(笔者这里就不证明了),例如,例子 2 中,最短的字符串是 00,01,11,10。每次尝试都利用前一次的 n-1 位。想通了这个问题,利用 DFS 暴力回溯即可。 - -## 代码 - -```go -const number = "0123456789" - -func crackSafe(n int, k int) string { - if n == 1 { - return number[:k] - } - visit, total := map[string]bool{}, int(math.Pow(float64(k), float64(n))) - str := make([]byte, 0, total+n-1) - for i := 1; i != n; i++ { - str = append(str, '0') - } - dfsCrackSafe(total, n, k, &str, &visit) - return string(str) -} - -func dfsCrackSafe(depth, n, k int, str *[]byte, visit *map[string]bool) bool { - if depth == 0 { - return true - } - for i := 0; i != k; i++ { - *str = append(*str, byte('0'+i)) - cur := string((*str)[len(*str)-n:]) - if _, ok := (*visit)[cur]; ok != true { - (*visit)[cur] = true - if dfsCrackSafe(depth-1, n, k, str, visit) { - // 只有这里不需要删除 - return true - } - delete(*visit, cur) - } - // 删除 - *str = (*str)[0 : len(*str)-1] - } - return false -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0756.Pyramid-Transition-Matrix.md b/website/content/ChapterFour/0756.Pyramid-Transition-Matrix.md deleted file mode 100755 index 1b158131c..000000000 --- a/website/content/ChapterFour/0756.Pyramid-Transition-Matrix.md +++ /dev/null @@ -1,92 +0,0 @@ -# [756. Pyramid Transition Matrix](https://leetcode.com/problems/pyramid-transition-matrix/) - - -## 题目 - -We are stacking blocks to form a pyramid. Each block has a color which is a one letter string. - -We are allowed to place any color block `C` on top of two adjacent blocks of colors `A` and `B`, if and only if `ABC` is an allowed triple. - -We start with a bottom row of `bottom`, represented as a single string. We also start with a list of allowed triples `allowed`. Each allowed triple is represented as a string of length 3. - -Return true if we can build the pyramid all the way to the top, otherwise false. - -**Example 1**: - - Input: bottom = "BCD", allowed = ["BCG", "CDE", "GEA", "FFF"] - Output: true - Explanation: - We can stack the pyramid like this: - A - / \ - G E - / \ / \ - B C D - - We are allowed to place G on top of B and C because BCG is an allowed triple. Similarly, we can place E on top of C and D, then A on top of G and E. - -**Example 2**: - - Input: bottom = "AABA", allowed = ["AAA", "AAB", "ABA", "ABB", "BAC"] - Output: false - Explanation: - We can't stack the pyramid to the top. - Note that there could be allowed triples (A, B, C) and (A, B, D) with C != D. - -**Note**: - -1. `bottom` will be a string with length in range `[2, 8]`. -2. `allowed` will have length in range `[0, 200]`. -3. Letters in all strings will be chosen from the set `{'A', 'B', 'C', 'D', 'E', 'F', 'G'}`. - - -## 题目大意 - -现在,我们用一些方块来堆砌一个金字塔。 每个方块用仅包含一个字母的字符串表示,例如 “Z”。使用三元组表示金字塔的堆砌规则如下: - -(A, B, C) 表示,“C” 为顶层方块,方块 “A”、“B” 分别作为方块 “C” 下一层的的左、右子块。当且仅当(A, B, C)是被允许的三元组,我们才可以将其堆砌上。 - -初始时,给定金字塔的基层 bottom,用一个字符串表示。一个允许的三元组列表 allowed,每个三元组用一个长度为 3 的字符串表示。如果可以由基层一直堆到塔尖返回 true,否则返回 false。 - - - -## 解题思路 - -- 这一题是一道 DFS 的题目。题目给出金字塔的底座字符串。然后还会给一个字符串数组,字符串数组里面代表的字符串的砖块。砖块是 3 个字符串组成的。前两个字符代表的是砖块的底边,后一个字符代表的是砖块的顶部。问给出的字符能拼成一个金字塔么?金字塔的特点是顶端就一个字符。 - -- 这一题用 DFS 深搜每个砖块,从底层砖块开始逐渐往上层码。每递归一层,新一层底部的砖块都会变。当递归到了一层底部只有 2 个字符,顶部只有一个字符的时候,就到金字塔顶端了,就算是完成了。这一题为了挑选合适的砖块,需要把每个砖块底部的 2 个字符作为 key 放进 map 中,加速查找。题目中也给出了特殊情况,相同底部可能存在多种砖块,所以一个 key 可能对应多个 value 的情况,即可能存在多个顶部砖块的情况。这种情况在递归遍历中需要考虑。 - - -## 代码 - -```go - -package leetcode - -func pyramidTransition(bottom string, allowed []string) bool { - pyramid := make(map[string][]string) - for _, v := range allowed { - pyramid[v[:len(v)-1]] = append(pyramid[v[:len(v)-1]], string(v[len(v)-1])) - } - return dfsT(bottom, "", pyramid) -} - -func dfsT(bottom, above string, pyramid map[string][]string) bool { - if len(bottom) == 2 && len(above) == 1 { - return true - } - if len(bottom) == len(above)+1 { - return dfsT(above, "", pyramid) - } - base := bottom[len(above) : len(above)+2] - if data, ok := pyramid[base]; ok { - for _, key := range data { - if dfsT(bottom, above+key, pyramid) { - return true - } - } - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0762.Prime-Number-of-Set-Bits-in-Binary-Representation.md b/website/content/ChapterFour/0762.Prime-Number-of-Set-Bits-in-Binary-Representation.md deleted file mode 100755 index 8c01e90f6..000000000 --- a/website/content/ChapterFour/0762.Prime-Number-of-Set-Bits-in-Binary-Representation.md +++ /dev/null @@ -1,78 +0,0 @@ -# [762. Prime Number of Set Bits in Binary Representation](https://leetcode.com/problems/prime-number-of-set-bits-in-binary-representation/) - - -## 题目 - -Given two integers `L` and `R`, find the count of numbers in the range `[L, R]` (inclusive) having a prime number of set bits in their binary representation. - -(Recall that the number of set bits an integer has is the number of `1`s present when written in binary. For example, `21` written in binary is `10101` which has 3 set bits. Also, 1 is not a prime.) - -**Example 1**: - - Input: L = 6, R = 10 - Output: 4 - Explanation: - 6 -> 110 (2 set bits, 2 is prime) - 7 -> 111 (3 set bits, 3 is prime) - 9 -> 1001 (2 set bits , 2 is prime) - 10->1010 (2 set bits , 2 is prime) - -**Example 2**: - - Input: L = 10, R = 15 - Output: 5 - Explanation: - 10 -> 1010 (2 set bits, 2 is prime) - 11 -> 1011 (3 set bits, 3 is prime) - 12 -> 1100 (2 set bits, 2 is prime) - 13 -> 1101 (3 set bits, 3 is prime) - 14 -> 1110 (3 set bits, 3 is prime) - 15 -> 1111 (4 set bits, 4 is not prime) - -**Note**: - -1. `L, R` will be integers `L <= R` in the range `[1, 10^6]`. -2. `R - L` will be at most 10000. - - -## 题目大意 - -给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数。(注意,计算置位代表二进制表示中1的个数。例如 21 的二进制表示 10101 有 3 个计算置位。还有,1 不是质数。) - - -注意: - -- L, R 是 L <= R 且在 [1, 10^6] 中的整数。 -- R - L 的最大值为 10000。 - - - -## 解题思路 - - -- 题目给出 `[L, R]` 区间,在这个区间内的每个整数的二进制表示中 1 的个数如果是素数,那么最终结果就加一,问最终结果是多少?这一题是一个组合题,判断一个数的二进制位有多少位 1,是第 191 题。题目中限定了区间最大不超过 10^6 ,所以 1 的位数最大是 19 位,也就是说素数最大就是 19 。那么素数可以有限枚举出来。最后按照题目的意思累积结果就可以了。 - - -## 代码 - -```go - -package leetcode - -import "math/bits" - -func countPrimeSetBits(L int, R int) int { - counter := 0 - for i := L; i <= R; i++ { - if isPrime(bits.OnesCount(uint(i))) { - counter++ - } - } - return counter -} - -func isPrime(x int) bool { - return x == 2 || x == 3 || x == 5 || x == 7 || x == 11 || x == 13 || x == 17 || x == 19 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0763.Partition-Labels.md b/website/content/ChapterFour/0763.Partition-Labels.md deleted file mode 100644 index 76bf1b3f7..000000000 --- a/website/content/ChapterFour/0763.Partition-Labels.md +++ /dev/null @@ -1,92 +0,0 @@ -# [763. Partition Labels](https://leetcode.com/problems/partition-labels/) - -## 题目 - -A string S of lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts. - - - -**Example 1**: - - -``` - -Input: S = "ababcbacadefegdehijhklij" -Output: [9,7,8] -Explanation: -The partition is "ababcbaca", "defegde", "hijhklij". -This is a partition so that each letter appears in at most one part. -A partition like "ababcbacadefegde", "hijhklij" is incorrect, because it splits S into less parts. - -``` - -**Note**: - -- S will have length in range [1, 500]. -- S will consist of lowercase letters ('a' to 'z') only. - - -## 题目大意 - -这道题考察的是滑动窗口的问题。 - -给出一个字符串,要求输出满足条件窗口的长度,条件是在这个窗口内,字母中出现在这一个窗口内,不出现在其他窗口内。 - -## 解题思路 - -这一题有 2 种思路,第一种思路是先记录下每个字母的出现次数,然后对滑动窗口中的每个字母判断次数是否用尽为 0,如果这个窗口内的所有字母次数都为 0,这个窗口就是符合条件的窗口。时间复杂度为 O(n^2) - -另外一种思路是记录下每个字符最后一次出现的下标,这样就不用记录次数。在每个滑动窗口中,依次判断每个字母最后一次出现的位置,如果在一个下标内,所有字母的最后一次出现的位置都包含进来了,那么这个下标就是这个满足条件的窗口大小。时间复杂度为 O(n^2) - - -## 代码 - -```go - -package leetcode - -// 解法一 -func partitionLabels(S string) []int { - var lastIndexOf [26]int - for i, v := range S { - lastIndexOf[v-'a'] = i - } - - var arr []int - for start, end := 0, 0; start < len(S); start = end + 1 { - end = lastIndexOf[S[start]-'a'] - for i := start; i < end; i++ { - if end < lastIndexOf[S[i]-'a'] { - end = lastIndexOf[S[i]-'a'] - } - } - arr = append(arr, end-start+1) - } - return arr -} - -// 解法二 -func partitionLabels1(S string) []int { - visit, counter, res, sum, lastLength := make([]int, 26), map[byte]int{}, []int{}, 0, 0 - for i := 0; i < len(S); i++ { - counter[S[i]]++ - } - - for i := 0; i < len(S); i++ { - counter[S[i]]-- - visit[S[i]-'a'] = 1 - sum = 0 - for j := 0; j < 26; j++ { - if visit[j] == 1 { - sum += counter[byte('a'+j)] - } - } - if sum == 0 { - res = append(res, i+1-lastLength) - lastLength += i + 1 - lastLength - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0765.Couples-Holding-Hands.md b/website/content/ChapterFour/0765.Couples-Holding-Hands.md deleted file mode 100755 index 035512fe7..000000000 --- a/website/content/ChapterFour/0765.Couples-Holding-Hands.md +++ /dev/null @@ -1,93 +0,0 @@ -# [765. Couples Holding Hands](https://leetcode.com/problems/couples-holding-hands/) - - -## 题目 - -N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum number of swaps so that every couple is sitting side by side. A swap consists of choosing **any** two people, then they stand up and switch seats. - -The people and seats are represented by an integer from `0` to `2N-1`, the couples are numbered in order, the first couple being `(0, 1)`, the second couple being `(2, 3)`, and so on with the last couple being `(2N-2, 2N-1)`. - -The couples' initial seating is given by `row[i]` being the value of the person who is initially sitting in the i-th seat. - -**Example 1**: - - Input: row = [0, 2, 1, 3] - Output: 1 - Explanation: We only need to swap the second (row[1]) and third (row[2]) person. - -**Example 2**: - - Input: row = [3, 2, 0, 1] - Output: 0 - Explanation: All couples are already seated side by side. - -**Note**: - -1. `len(row)` is even and in the range of `[4, 60]`. -2. `row` is guaranteed to be a permutation of `0...len(row)-1`. - - -## 题目大意 - -N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手。 计算最少交换座位的次数,以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人,让他们站起来交换座位。人和座位用 0 到 2N-1 的整数表示,情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2N-2, 2N-1)。这些情侣的初始座位 row[i] 是由最初始坐在第 i 个座位上的人决定的。 - -说明: - -1. len(row) 是偶数且数值在 [4, 60]范围内。 -2. 可以保证 row 是序列 0...len(row)-1 的一个全排列。 - - -## 解题思路 - -- 给出一个数组,数组里面两两相邻的元素代表一对情侣。情侣编号是从 0 开始的:0 和 1 是情侣,2 和 3 是情侣……这些情侣坐在一排,但是并非成对坐着一起的,问如何用最小的次数交换座位以后,情侣能两两坐在一起。 -- 这道题的突破口是如何找到最小的交换次数。乍一想可能没有思路。直觉告诉我们,这种难题,很可能最后推出来的结论,或者公式是一个很简单的式子。(事实此题确实是这种情况)先不考虑最小交换次数,用正常的方法来处理这道题。举个例子:【3 1 4 0 2 5】,从数组 0 下标开始往后扫。 - - 初始状态 - - 集合 0:0,1 - 集合 1:2,3 - 集合 2:4,5 - - 3 和 1 不是情侣,将 3 和 1 所在集合 `union()` 起来。3 所在集合是 1 ,1 所在集合是 0,将 0 和 1 号集合 `union()` 起来。因为情侣 0 和情侣 1 是集合 0 ,情侣 2 和情侣 3 是集合 1,以此类推。 - - 集合 0 和 1:0,1,2,3 - 集合 2:4,5 - -- 继续往后扫,4 和 0 不在同一个集合,4 在集合 3,0 在集合 0,那么把它们 `union()` 起来。 - - 集合 0 和 1 和 2:0,1,2,3,4,5 - - 在上面集合合并的过程中,合并了 2 次。那么就代表最少需要交换 2 次。也可以通过 `len(row)/2 - uf.count` 来计算。`len(row)/2` 是初始集合总数,`uf.count` 是最后剩下的集合数,两者相减就是中间交换的次数。 - -- 最后实现的代码非常简单。并查集先相邻的两两元素 `union()` 在一起。然后扫原数组,每次扫相邻的两个,通过这两个元素值所在集合,进行 `union()`。扫完以后就可以得到最后的答案。 -- 回过头来看这道题,为什么我们从数组开头往后依次调整每一对情侣,这样交换的次数是最少的呢?其实这个方法的思想是贪心思想。从头开始往后一对一对的调整,就是可以最终做到次数最少。(具体证明笔者不会)交换到最后,最后一对情侣一定是正确的,无须交换。(因为前面每一对都调整完了,最后一对一定是正确的) - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func minSwapsCouples(row []int) int { - if len(row)&1 == 1 { - return 0 - } - uf := template.UnionFind{} - uf.Init(len(row)) - for i := 0; i < len(row)-1; i = i + 2 { - uf.Union(i, i+1) - } - for i := 0; i < len(row)-1; i = i + 2 { - if uf.Find(row[i]) != uf.Find(row[i+1]) { - uf.Union(row[i], row[i+1]) - } - } - return len(row)/2 - uf.TotalCount() -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0766.Toeplitz-Matrix.md b/website/content/ChapterFour/0766.Toeplitz-Matrix.md deleted file mode 100755 index a595e632b..000000000 --- a/website/content/ChapterFour/0766.Toeplitz-Matrix.md +++ /dev/null @@ -1,79 +0,0 @@ -# [766. Toeplitz Matrix](https://leetcode.com/problems/toeplitz-matrix/) - - -## 题目 - -A matrix is *Toeplitz* if every diagonal from top-left to bottom-right has the same element. - -Now given an `M x N` matrix, return `True` if and only if the matrix is *Toeplitz*. - -**Example 1**: - - Input: - matrix = [ - [1,2,3,4], - [5,1,2,3], - [9,5,1,2] - ] - Output: True - Explanation: - In the above grid, the diagonals are: - "[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]". - In each diagonal all elements are the same, so the answer is True. - -**Example 2**: - - Input: - matrix = [ - [1,2], - [2,2] - ] - Output: False - Explanation: - The diagonal "[1, 2]" has different elements. - -**Note**: - -1. `matrix` will be a 2D array of integers. -2. `matrix` will have a number of rows and columns in range `[1, 20]`. -3. `matrix[i][j]` will be integers in range `[0, 99]`. - -**Follow up**: - -1. What if the matrix is stored on disk, and the memory is limited such that you can only load at most one row of the matrix into the memory at once? -2. What if the matrix is so large that you can only load up a partial row into the memory at once? - - -## 题目大意 - -如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True。 - - - -## 解题思路 - - -- 给出一个矩阵,要求判断矩阵所有对角斜线上的数字是否都是一个数字。 -- 水题,直接循环判断即可。 - - - -## 代码 - -```go - -package leetcode - -func isToeplitzMatrix(matrix [][]int) bool { - rows, columns := len(matrix), len(matrix[0]) - for i := 1; i < rows; i++ { - for j := 1; j < columns; j++ { - if matrix[i-1][j-1] != matrix[i][j] { - return false - } - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0767.Reorganize-String.md b/website/content/ChapterFour/0767.Reorganize-String.md deleted file mode 100644 index 45388be33..000000000 --- a/website/content/ChapterFour/0767.Reorganize-String.md +++ /dev/null @@ -1,149 +0,0 @@ -# [767. Reorganize String](https://leetcode.com/problems/reorganize-string/) - -## 题目 - -Given a string S, check if the letters can be rearranged so that two characters that are adjacent to each other are not the same. - -If possible, output any possible result. If not possible, return the empty string. - -**Example 1**: - -``` - -Input: S = "aab" -Output: "aba" - -``` - -**Example 2**: - -``` - -Input: S = "aaab" -Output: "" - -``` - -**Note**: - -S will consist of lowercase letters and have length in range [1, 500]. - - -## 题目大意 - -给定一个字符串,要求重新排列字符串,让字符串两两字符不相同,如果可以实现,即输出最终的字符串,如果不能让两两不相同,则输出空字符串。 - -## 解题思路 - -这道题有 2 种做法。第一种做法是先统计每个字符的出现频率次数,按照频率次数从高往低排序。具体做法就是第 451 题了。如果有一个字母的频次次数超过了 (len(string)+1)/2 那么就返回空字符串。否则输出最终满足题意的字符串。按照频次排序以后,用 2 个指针,一个从 0 开始,另外一个从中间位置开始,依次取出一个字符拼接起来。 - -第二种做法是用优先队列,结点是一个结构体,结构体有 2 个字段,一个字段记录是哪个字符,另一个字段记录是这个字符的频次。按照频次的多作为优先级高,用大根堆建立优先队列。注意,这样建立成功的优先队列,重复字母只有一个结点,频次记录在结构体的频次字段中。额外还需要一个辅助队列。优先队列每次都出队一个优先级最高的,然后频次减一,最终结果加上这个字符。然后将这个结点入队。入队的意义是检测这个结点的频次有没有减到 0,如果还不为 0 ,再插入优先队列中。 - -```c - string reorganizeString(string S) { - vector mp(26); - int n = S.size(); - for (char c: S) - ++mp[c-'a']; - priority_queue> pq; - for (int i = 0; i < 26; ++i) { - if (mp[i] > (n+1)/2) return ""; - if (mp[i]) pq.push({mp[i], i+'a'}); - } - queue> myq; - string ans; - while (!pq.empty() || myq.size() > 1) { - if (myq.size() > 1) { // 注意这里要大于 1,如果是等于 1 的话,频次大的元素一直在输出了,答案就不对了。 - auto cur = myq.front(); - myq.pop(); - if (cur.first != 0) pq.push(cur); - } - if (!pq.empty()) { - auto cur = pq.top(); - pq.pop(); - ans += cur.second; - cur.first--; - myq.push(cur); - } - } - return ans; - } -``` - - - - - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func reorganizeString(S string) string { - fs := frequencySort767(S) - if fs == "" { - return "" - } - bs := []byte(fs) - ans := "" - j := (len(bs)-1)/2 + 1 - for i := 0; i <= (len(bs)-1)/2; i++ { - ans += string(bs[i]) - if j < len(bs) { - ans += string(bs[j]) - } - j++ - } - return ans -} - -func frequencySort767(s string) string { - if s == "" { - return "" - } - sMap := map[byte]int{} - cMap := map[int][]byte{} - sb := []byte(s) - for _, b := range sb { - sMap[b]++ - if sMap[b] > (len(sb)+1)/2 { - return "" - } - } - for key, value := range sMap { - cMap[value] = append(cMap[value], key) - } - - var keys []int - for k := range cMap { - keys = append(keys, k) - } - sort.Sort(sort.Reverse(sort.IntSlice(keys))) - res := make([]byte, 0) - for _, k := range keys { - for i := 0; i < len(cMap[k]); i++ { - for j := 0; j < k; j++ { - res = append(res, cMap[k][i]) - } - } - } - return string(res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0771.Jewels-and-Stones.md b/website/content/ChapterFour/0771.Jewels-and-Stones.md deleted file mode 100755 index e5490bedd..000000000 --- a/website/content/ChapterFour/0771.Jewels-and-Stones.md +++ /dev/null @@ -1,74 +0,0 @@ -# [771. Jewels and Stones](https://leetcode.com/problems/jewels-and-stones/) - - - -## 题目 - -You're given strings `J` representing the types of stones that are jewels, and `S` representing the stones you have. Each character in `S` is a type of stone you have. You want to know how many of the stones you have are also jewels. - -The letters in `J` are guaranteed distinct, and all characters in `J` and `S` are letters. Letters are case sensitive, so `"a"` is considered a different type of stone from `"A"`. - -**Example 1**: - - Input: J = "aA", S = "aAAbbbb" - Output: 3 - -**Example 2**: - - Input: J = "z", S = "ZZ" - Output: 0 - -**Note**: - -- `S` and `J` will consist of letters and have length at most 50. -- The characters in `J` are distinct. - - -## 题目大意 - -给定字符串 J 代表石头中宝石的类型,和字符串 S 代表你拥有的石头。S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 - -J 中的字母不重复,J 和 S 中的所有字符都是字母。字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。 - - - -## 解题思路 - - -- 给出 2 个字符串,要求在 S 字符串中找出在 J 字符串里面出现的字符个数。这是一道简单题。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -// 解法一 -func numJewelsInStones(J string, S string) int { - count := 0 - for i := range S { - if strings.Contains(J, string(S[i])) { - count++ - } - } - return count -} - -// 解法二 -func numJewelsInStones1(J string, S string) int { - cache, result := make(map[rune]bool), 0 - for _, r := range J { - cache[r] = true - } - for _, r := range S { - if _, ok := cache[r]; ok { - result++ - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0778.Swim-in-Rising-Water.md b/website/content/ChapterFour/0778.Swim-in-Rising-Water.md deleted file mode 100755 index 7153069f3..000000000 --- a/website/content/ChapterFour/0778.Swim-in-Rising-Water.md +++ /dev/null @@ -1,132 +0,0 @@ -# [778. Swim in Rising Water](https://leetcode.com/problems/swim-in-rising-water/) - - -## 题目 - -On an N x N `grid`, each square `grid[i][j]` represents the elevation at that point `(i,j)`. - -Now rain starts to fall. At time `t`, the depth of the water everywhere is `t`. You can swim from a square to another 4-directionally adjacent square if and only if the elevation of both squares individually are at most `t`. You can swim infinite distance in zero time. Of course, you must stay within the boundaries of the grid during your swim. - -You start at the top left square `(0, 0)`. What is the least time until you can reach the bottom right square `(N-1, N-1)`? - -**Example 1**: - - Input: [[0,2],[1,3]] - Output: 3 - Explanation: - At time 0, you are in grid location (0, 0). - You cannot go anywhere else because 4-directionally adjacent neighbors have a higher elevation than t = 0. - - You cannot reach point (1, 1) until time 3. - When the depth of water is 3, we can swim anywhere inside the grid. - -**Example 2**: - - Input: [[0,1,2,3,4],[24,23,22,21,5],[12,13,14,15,16],[11,17,18,19,20],[10,9,8,7,6]] - Output: 16 - Explanation: - 0 1 2 3 4 - 24 23 22 21 5 - 12 13 14 15 16 - 11 17 18 19 20 - 10 9 8 7 6 - - The final route is marked in bold. - We need to wait until time 16 so that (0, 0) and (4, 4) are connected. - -**Note**: - -1. `2 <= N <= 50`. -2. grid[i][j] is a permutation of [0, ..., N*N - 1]. - -## 题目大意 - - -在一个 N x N 的坐标方格 grid 中,每一个方格的值 grid[i][j] 表示在位置 (i,j) 的平台高度。现在开始下雨了。当时间为 t 时,此时雨水导致水池中任意位置的水位为 t 。你可以从一个平台游向四周相邻的任意一个平台,但是前提是此时水位必须同时淹没这两个平台。假定你可以瞬间移动无限距离,也就是默认在方格内部游动是不耗时的。当然,在你游泳的时候你必须待在坐标方格里面。 - -你从坐标方格的左上平台 (0,0) 出发。最少耗时多久你才能到达坐标方格的右下平台 (N-1, N-1)? - -提示: - -- 2 <= N <= 50. -- grid[i][j] 位于区间 [0, ..., N*N - 1] 内。 - - -## 解题思路 - -- 给出一个 grid[i][j] 方格,每个格子里面表示游泳池里面平台的高度。t 时刻,游泳池中的水的高度是 t。只有水的高度到达了平台的高度以后才能游过去。问从 (0,0) 开始,最短多长时间能到达 (N-1, N-1) 。 -- 这一题有多种解法。第一种解题思路是利用 DFS + 二分。DFS 是用来遍历是否可达。利用时间(即当前水淹过的高度)来判断是否能到达终点 (N-1, N-1) 点。二分用来搜索最终结果的时间。为什么会考虑用二分加速呢?原因是:时间从 0 - max 依次递增。max 是游泳池最高的平台高度。当时间从 0 增加到 max 以后,肯定能到达终点 (N-1, N-1) 点,因为水比所有平台都要高了。想快速找到一个时间 t 能使得 (0,0) 点和 (N-1, N-1) 点之间连通,那么就想到用二分加速了。判断是否取中值的条件是 (0,0) 点和 (N-1, N-1) 点之间是否连通。 -- 第二种解题思路是并查集。只要是 (0,0) 点和 (N-1, N-1) 点没有连通,即不能游到终点,那么就开始 `union()` 操作,由于起点是 (0,0),所以向右边 `i + 1` 和向下边 `j + 1` 开始尝试。每尝试完一轮,时间会加 1 秒,即高度会加一。直到 (0,0) 点和 (N-1, N-1) 点刚好连通,那么这个时间点就是最终要求的。 - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 DFS + 二分 -func swimInWater(grid [][]int) int { - row, col, flags, minWait, maxWait := len(grid), len(grid[0]), make([][]int, len(grid)), 0, 0 - for i, row := range grid { - flags[i] = make([]int, len(row)) - for j := 0; j < col; j++ { - flags[i][j] = -1 - if row[j] > maxWait { - maxWait = row[j] - } - } - } - for minWait < maxWait { - midWait := (minWait + maxWait) / 2 - addFlags(grid, flags, midWait, 0, 0) - if flags[row-1][col-1] == midWait { - maxWait = midWait - } else { - minWait = midWait + 1 - } - } - return minWait -} - -func addFlags(grid [][]int, flags [][]int, flag int, row int, col int) { - if row < 0 || col < 0 || row >= len(grid) || col >= len(grid[0]) { - return - } - if grid[row][col] > flag || flags[row][col] == flag { - return - } - flags[row][col] = flag - addFlags(grid, flags, flag, row-1, col) - addFlags(grid, flags, flag, row+1, col) - addFlags(grid, flags, flag, row, col-1) - addFlags(grid, flags, flag, row, col+1) -} - -// 解法二 并查集(并不是此题的最优解) -func swimInWater1(grid [][]int) int { - n, uf, res := len(grid), template.UnionFind{}, 0 - uf.Init(n * n) - for uf.Find(0) != uf.Find(n*n-1) { - for i := 0; i < n; i++ { - for j := 0; j < n; j++ { - if grid[i][j] > res { - continue - } - if i < n-1 && grid[i+1][j] <= res { - uf.Union(i*n+j, i*n+j+n) - } - if j < n-1 && grid[i][j+1] <= res { - uf.Union(i*n+j, i*n+j+1) - } - } - } - res++ - } - return res - 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0781.Rabbits-in-Forest.md b/website/content/ChapterFour/0781.Rabbits-in-Forest.md deleted file mode 100755 index 61aa4555a..000000000 --- a/website/content/ChapterFour/0781.Rabbits-in-Forest.md +++ /dev/null @@ -1,69 +0,0 @@ -# [781. Rabbits in Forest](https://leetcode.com/problems/rabbits-in-forest/) - - -## 题目 - -In a forest, each rabbit has some color. Some subset of rabbits (possibly all of them) tell you how many other rabbits have the same color as them. Those `answers` are placed in an array. - -Return the minimum number of rabbits that could be in the forest. - -**Examples**: - - Input: answers = [1, 1, 2] - Output: 5 - Explanation: - The two rabbits that answered "1" could both be the same color, say red. - The rabbit than answered "2" can't be red or the answers would be inconsistent. - Say the rabbit that answered "2" was blue. - Then there should be 2 other blue rabbits in the forest that didn't answer into the array. - The smallest possible number of rabbits in the forest is therefore 5: 3 that answered plus 2 that didn't. - - Input: answers = [10, 10, 10] - Output: 11 - - Input: answers = [] - Output: 0 - -**Note**: - -1. `answers` will have length at most `1000`. -2. Each `answers[i]` will be an integer in the range `[0, 999]`. - - -## 题目大意 - -森林中,每个兔子都有颜色。其中一些兔子(可能是全部)告诉你还有多少其他的兔子和自己有相同的颜色。我们将这些回答放在 answers 数组里。返回森林中兔子的最少数量。 - -说明: - -- answers 的长度最大为1000。 -- answers[i] 是在 [0, 999] 范围内的整数。 - - -## 解题思路 - - -- 给出一个数组,数组里面代表的是每个兔子说自己同类还有多少个。要求输出总共有多少只兔子。数字中可能兔子汇报的人数小于总兔子数。 -- 这一题关键在于如何划分不同种类的兔子,有可能相同种类的兔子的个数是一样的,比如 `[2,2,2,2,2,2]`,这其实是 3 个种类,总共 6 只兔子。用 map 去重相同种类的兔子,不断的减少,当有种类的兔子为 0 以后,还有该种类的兔子报数,需要当做另外一个种类的兔子来看待。 - - -## 代码 - -```go - -package leetcode - -func numRabbits(ans []int) int { - total, m := 0, make(map[int]int) - for _, v := range ans { - if m[v] == 0 { - m[v] += v - total += v + 1 - } else { - m[v]-- - } - } - return total -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0784.Letter-Case-Permutation.md b/website/content/ChapterFour/0784.Letter-Case-Permutation.md deleted file mode 100755 index 323b4e63e..000000000 --- a/website/content/ChapterFour/0784.Letter-Case-Permutation.md +++ /dev/null @@ -1,120 +0,0 @@ -# [784. Letter Case Permutation](https://leetcode.com/problems/letter-case-permutation/) - - -## 题目 - -Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create. - -**Examples**: - - Input: S = "a1b2" - Output: ["a1b2", "a1B2", "A1b2", "A1B2"] - - Input: S = "3z4" - Output: ["3z4", "3Z4"] - - Input: S = "12345" - Output: ["12345"] - -**Note**: - -- `S` will be a string with length between `1` and `12`. -- `S` will consist only of letters or digits. - - -## 题目大意 - - -给定一个字符串 S,通过将字符串 S 中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。 - -## 解题思路 - - -- 输出一个字符串中字母变大写,小写的所有组合。 -- DFS 深搜或者 BFS 广搜都可以。 - - -## 代码 - -```go - -package leetcode - -import ( - "strings" -) - -// 解法一,DFS 深搜 -func letterCasePermutation(S string) []string { - if len(S) == 0 { - return []string{} - } - res, pos, c := []string{}, []int{}, []int{} - SS := strings.ToLower(S) - for i := 0; i < len(SS); i++ { - if isLowerLetter(SS[i]) { - pos = append(pos, i) - } - } - for i := 0; i <= len(pos); i++ { - findLetterCasePermutation(SS, pos, i, 0, c, &res) - } - return res -} - -func findLetterCasePermutation(s string, pos []int, target, index int, c []int, res *[]string) { - if len(c) == target { - b := []byte(s) - for _, v := range c { - b[pos[v]] -= 'a' - 'A' - } - *res = append(*res, string(b)) - return - } - for i := index; i < len(pos)-(target-len(c))+1; i++ { - c = append(c, i) - findLetterCasePermutation(s, pos, target, i+1, c, res) - c = c[:len(c)-1] - } -} - -// 解法二,先讲第一个字母变大写,然后依次把后面的字母变大写。最终的解数组中答案是翻倍增长的 -// 第一步: -// [mqe] -> [mqe, Mqe] -// 第二步: -// [mqe, Mqe] -> [mqe Mqe mQe MQe] -// 第二步: -// [mqe Mqe mQe MQe] -> [mqe Mqe mQe MQe mqE MqE mQE MQE] - -func letterCasePermutation1(S string) []string { - res := make([]string, 0, 1<= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') -} - -func toUpper(s string, i int) string { - b := []byte(s) - b[i] -= 'a' - 'A' - return string(b) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0786.K-th-Smallest-Prime-Fraction.md b/website/content/ChapterFour/0786.K-th-Smallest-Prime-Fraction.md deleted file mode 100755 index 9646d5af7..000000000 --- a/website/content/ChapterFour/0786.K-th-Smallest-Prime-Fraction.md +++ /dev/null @@ -1,119 +0,0 @@ -# [786. K-th Smallest Prime Fraction](https://leetcode.com/problems/k-th-smallest-prime-fraction/) - - -## 题目 - -A sorted list `A` contains 1, plus some number of primes. Then, for every p < q in the list, we consider the fraction p/q. - -What is the `K`-th smallest fraction considered? Return your answer as an array of ints, where `answer[0] = p` and `answer[1] = q`. - -**Examples**: - - Input: A = [1, 2, 3, 5], K = 3 - Output: [2, 5] - Explanation: - The fractions to be considered in sorted order are: - 1/5, 1/3, 2/5, 1/2, 3/5, 2/3. - The third fraction is 2/5. - - Input: A = [1, 7], K = 1 - Output: [1, 7] - -**Note**: - -- `A` will have length between `2` and `2000`. -- Each `A[i]` will be between `1` and `30000`. -- `K` will be between `1` and `A.length * (A.length - 1) / 2`. - - -## 题目大意 - -一个已排序好的表 A,其包含 1 和其他一些素数.  当列表中的每一个 p float64(mid)*float64(A[j]) { - j++ - } - count += n - j - if j < n && q*A[i] > p*A[j] { - p = A[i] - q = A[j] - } - } - if count == K { - return []int{p, q} - } else if count < K { - low = mid - } else { - high = mid - } - } -} - -// 解法二 暴力解法,时间复杂度 O(n^2) -func kthSmallestPrimeFraction1(A []int, K int) []int { - if len(A) == 0 || (len(A)*(len(A)-1))/2 < K { - return []int{} - } - fractions := []Fraction{} - for i := 0; i < len(A); i++ { - for j := i + 1; j < len(A); j++ { - fractions = append(fractions, Fraction{molecule: A[i], denominator: A[j]}) - } - } - sort.Sort(SortByFraction(fractions)) - return []int{fractions[K-1].molecule, fractions[K-1].denominator} -} - -// Fraction define -type Fraction struct { - molecule int - denominator int -} - -// SortByFraction define -type SortByFraction []Fraction - -func (a SortByFraction) Len() int { return len(a) } -func (a SortByFraction) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a SortByFraction) Less(i, j int) bool { - return a[i].molecule*a[j].denominator < a[j].molecule*a[i].denominator -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0793.Preimage-Size-of-Factorial-Zeroes-Function.md b/website/content/ChapterFour/0793.Preimage-Size-of-Factorial-Zeroes-Function.md deleted file mode 100755 index b784e0465..000000000 --- a/website/content/ChapterFour/0793.Preimage-Size-of-Factorial-Zeroes-Function.md +++ /dev/null @@ -1,106 +0,0 @@ -# [793. Preimage Size of Factorial Zeroes Function](https://leetcode.com/problems/preimage-size-of-factorial-zeroes-function/) - - -## 题目 - -Let `f(x)` be the number of zeroes at the end of `x!`. (Recall that `x! = 1 * 2 * 3 * ... * x`, and by convention, `0! = 1`.) - -For example, `f(3) = 0` because 3! = 6 has no zeroes at the end, while `f(11) = 2` because 11! = 39916800 has 2 zeroes at the end. Given `K`, find how many non-negative integers `x` have the property that `f(x) = K`. - -**Example 1**: - - Input: K = 0 - Output: 5 - Explanation: 0!, 1!, 2!, 3!, and 4! end with K = 0 zeroes. - -**Example 2**: - - Input: K = 5 - Output: 0 - Explanation: There is no x such that x! ends in K = 5 zeroes. - -**Note**: - -- `K` will be an integer in the range `[0, 10^9]`. - - -## 题目大意 - - -f(x) 是 x! 末尾是0的数量。(回想一下 x! = 1 * 2 * 3 * ... * x,且0! = 1) - -例如, f(3) = 0 ,因为3! = 6的末尾没有0;而 f(11) = 2 ,因为11!= 39916800末端有2个0。给定 K,找出多少个非负整数x ,有 f(x) = K 的性质。 - -注意: - -- K 是范围在 [0, 10^9] 的整数。 - - -## 解题思路 - -- 给出一个数 K,要求有多少个 n 能使得 n!末尾 0 的个数等于 K。 -- 这一题是基于第 172 题的逆过程加强版。第 172 题是给出 `n`,求得末尾 0 的个数。由第 172 题可以知道,`n!`末尾 0 的个数取决于因子 5 的个数。末尾可能有 `K` 个 0,那么 `n` 最多可以等于 `5 * K`,在 `[0, 5* K]` 区间内二分搜索,判断 `mid` 末尾 0 的个数,如果能找到 `K`,那么就范围 5,如果找不到这个 `K`,返回 0 。为什么答案取值只有 0 和 5 呢?因为当 `n` 增加 5 以后,因子 5 的个数又加一了,末尾又可以多 1 个或者多个 0(如果加 5 以后,有多个 5 的因子,例如 25,125,就有可能末尾增加多个 0)。所以有效的 `K` 值对应的 `n` 的范围区间就是 5 。反过来,无效的 `K` 值对应的 `n` 是 0。`K` 在 `5^n` 的分界线处会发生跳变,所有有些值取不到。例如,`n` 在 `[0,5)` 内取值,`K = 0`;`n` 在 `[5,10)` 内取值,`K = 1`;`n` 在 `[10,15)` 内取值,`K = 2`;`n` 在 `[15,20)` 内取值,`K = 3`;`n` 在 `[20,25)` 内取值,`K = 4`;`n` 在 `[25,30)` 内取值,`K = 6`,因为 25 提供了 2 个 5,也就提供了 2 个 0,所以 `K` 永远无法取值等于 5,即当 `K = 5` 时,找不到任何的 `n` 与之对应。 -- 这一题也可以用数学的方法解题。见解法二。这个解法的灵感来自于:n!末尾 0 的个数等于 [1,n] 所有数的因子 5 的个数总和。其次此题的结果一定只有 0 和 5 (分析见上一种解法)。有了这两个结论以后,就可以用数学的方法推导了。首先 n 可以表示为 5 进制的形式 -

- -

- 上面式子中,所有有因子 5 的个数为: -

- -

- - 这个总数就即是 K。针对不同的 n,an 的通项公式不同,所以表示的 K 的系数也不同。cn 的通项公式呢? -

- -

-

- -

- - 由上面这个递推还能推出通项公式(不过这题不适用通项公式,是用递推公式更方便): -

- -

- 判断 K 是否能表示成两个数列的表示形式,等价于判断 K 是否能转化为以 Cn 为基的变进制数。到此,转化成类似第 483 题了。代码实现不难,见解法二。 - - -## 代码 - -```go - -package leetcode - -// 解法一 二分搜索 -func preimageSizeFZF(K int) int { - low, high := 0, 5*K - for low <= high { - mid := low + (high-low)>>1 - k := trailingZeroes(mid) - if k == K { - return 5 - } else if k > K { - high = mid - 1 - } else { - low = mid + 1 - } - } - return 0 -} - -// 解法二 数学方法 -func preimageSizeFZF1(K int) int { - base := 0 - for base < K { - base = base*5 + 1 - } - for K > 0 { - base = (base - 1) / 5 - if K/base == 5 { - return 0 - } - K %= base - } - return 5 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0802.Find-Eventual-Safe-States.md b/website/content/ChapterFour/0802.Find-Eventual-Safe-States.md deleted file mode 100644 index f6879f300..000000000 --- a/website/content/ChapterFour/0802.Find-Eventual-Safe-States.md +++ /dev/null @@ -1,73 +0,0 @@ -# [802. Find Eventual Safe States](https://leetcode.com/problems/find-eventual-safe-states/) - - - -## 题目 - -In a directed graph, we start at some node and every turn, walk along a directed edge of the graph. If we reach a node that is terminal (that is, it has no outgoing directed edges), we stop. - -Now, say our starting node is *eventually safe* if and only if we must eventually walk to a terminal node. More specifically, there exists a natural number `K` so that for any choice of where to walk, we must have stopped at a terminal node in less than `K` steps. - -Which nodes are eventually safe? Return them as an array in sorted order. - -The directed graph has `N` nodes with labels `0, 1, ..., N-1`, where `N` is the length of `graph`. The graph is given in the following form: `graph[i]` is a list of labels `j` such that `(i, j)` is a directed edge of the graph. - -``` -Example: -Input: graph = [[1,2],[2,3],[5],[0],[5],[],[]] -Output: [2,4,5,6] -Here is a diagram of the above graph. -``` - -![https://s3-lc-upload.s3.amazonaws.com/uploads/2018/03/17/picture1.png](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/03/17/picture1.png) - -**Note**: - -- `graph` will have length at most `10000`. -- The number of edges in the graph will not exceed `32000`. -- Each `graph[i]` will be a sorted list of different integers, chosen within the range `[0, graph.length - 1]`. - -## 题目大意 - -在有向图中, 我们从某个节点和每个转向处开始, 沿着图的有向边走。 如果我们到达的节点是终点 (即它没有连出的有向边), 我们停止。现在, 如果我们最后能走到终点,那么我们的起始节点是最终安全的。 更具体地说, 存在一个自然数 K,  无论选择从哪里开始行走, 我们走了不到 K 步后必能停止在一个终点。哪些节点最终是安全的? 结果返回一个有序的数组。 - -提示: - -- graph 节点数不超过 10000. -- 图的边数不会超过 32000. -- 每个 graph[i] 被排序为不同的整数列表, 在区间 [0, graph.length - 1] 中选取。 - - -## 解题思路 - -- 给出一个有向图,要求找出所有“安全”节点。“安全”节点的定义是:存在一个自然数 K, 无论选择从哪里开始行走, 我们走了不到 K 步后必能停止在一个终点。 -- 这一题可以用拓扑排序,也可以用 DFS 染色来解答。这里用 DFS 来解答。对于每个节点,我们有 3 种染色的方法:白色 0 号节点表示该节点还没有被访问过;灰色 1 号节点表示该节点在栈中(这一轮搜索中被访问过)或者在环中;黑色 2 号节点表示该节点的所有相连的节点都被访问过,且该节点不在环中。当我们第一次访问一个节点时,我们把它从白色变成灰色,并继续搜索与它相连的节点。如果在搜索过程中我们遇到一个灰色的节点,那么说明找到了一个环,此时退出搜索,所有的灰色节点保持不变(即从任意一个灰色节点开始,都能走到环中),如果搜索过程中,我们没有遇到灰色的节点,那么在回溯到当前节点时,我们把它从灰色变成黑色,即表示它是一个安全的节点。 - -## 代码 - -```go -func eventualSafeNodes(graph [][]int) []int { - res, color := []int{}, make([]int, len(graph)) - for i := range graph { - if dfsEventualSafeNodes(graph, i, color) { - res = append(res, i) - } - } - return res -} - -// colors: WHITE 0, GRAY 1, BLACK 2; -func dfsEventualSafeNodes(graph [][]int, idx int, color []int) bool { - if color[idx] > 0 { - return color[idx] == 2 - } - color[idx] = 1 - for i := range graph[idx] { - if !dfsEventualSafeNodes(graph, graph[idx][i], color) { - return false - } - } - color[idx] = 2 - return true -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0803.Bricks-Falling-When-Hit.md b/website/content/ChapterFour/0803.Bricks-Falling-When-Hit.md deleted file mode 100755 index 6f5335eda..000000000 --- a/website/content/ChapterFour/0803.Bricks-Falling-When-Hit.md +++ /dev/null @@ -1,125 +0,0 @@ -# [803. Bricks Falling When Hit](https://leetcode.com/problems/bricks-falling-when-hit/) - - -## 题目 - -We have a grid of 1s and 0s; the 1s in a cell represent bricks. A brick will not drop if and only if it is directly connected to the top of the grid, or at least one of its (4-way) adjacent bricks will not drop. - -We will do some erasures sequentially. Each time we want to do the erasure at the location (i, j), the brick (if it exists) on that location will disappear, and then some other bricks may drop because of that erasure. - -Return an array representing the number of bricks that will drop after each erasure in sequence. - -**Example 1**: - - Input: - grid = [[1,0,0,0],[1,1,1,0]] - hits = [[1,0]] - Output: [2] - Explanation: - If we erase the brick at (1, 0), the brick at (1, 1) and (1, 2) will drop. So we should return 2. - -**Example 2**: - - Input: - grid = [[1,0,0,0],[1,1,0,0]] - hits = [[1,1],[1,0]] - Output: [0,0] - Explanation: - When we erase the brick at (1, 0), the brick at (1, 1) has already disappeared due to the last move. So each erasure will cause no bricks dropping. Note that the erased brick (1, 0) will not be counted as a dropped brick. - -**Note**: - -- The number of rows and columns in the grid will be in the range [1, 200]. -- The number of erasures will not exceed the area of the grid. -- It is guaranteed that each erasure will be different from any other erasure, and located inside the grid. -- An erasure may refer to a location with no brick - if it does, no bricks drop. - - -## 题目大意 - -我们有一组包含1和0的网格;其中1表示砖块。 当且仅当一块砖直接连接到网格的顶部,或者它至少有一块相邻(4 个方向之一)砖块不会掉落时,它才不会落下。我们会依次消除一些砖块。每当我们消除 (i, j) 位置时, 对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这个消除而落下。返回一个数组表示每次消除操作对应落下的砖块数目。 - - -注意: - -- 网格的行数和列数的范围是[1, 200]。 -- 消除的数字不会超过网格的区域。 -- 可以保证每次的消除都不相同,并且位于网格的内部。 -- 一个消除的位置可能没有砖块,如果这样的话,就不会有砖块落下。 - - - -## 解题思路 - - -- 有一些砖块连接在天花板上,问,如果打掉某个砖块,会掉落几块砖块?打掉的每个砖块不参与计数。 -- 这一题可以用并查集和 DFS 求解。不过尝试用 DFS 的同学就会知道,这一题卡时间卡的很紧。用 DFS 虽然能 AC,但是耗时非常长。用并查集也必须进行秩压缩,不然耗时也非常长。另外,如果用了并查集,每个集合的总数单独统计,不随着 union() 操作,也会导致超时,笔者在这里被 LTE 了多次,最后只能重写 UnionFind 并查集类,将统计操作和 union() 操作写在一起,这一题才 faster than 100.00% AC。 -- 拿到题以后,首先尝试暴力解法,按照顺序打掉砖块,每次打掉砖块以后,都重建并查集。题目要求每次掉落几块砖块,实际上比较每次和天花板连通的砖块个数变化了多少块就可以了。那么解法就出来了,先把和天花板连通的砖块都 union() 起来,记录这个集合中砖块的个数 `count`,然后每次打掉一个砖块以后,重建并查集,计算与天花板连通的砖块的个数 `newCount`,`newCount - count -1` 就是最终答案(打掉的那块砖块不计算其中),提交代码以后,发现 TLE。 -- 出现 TLE 以后一般思路都是对的,只是时间复杂度过高,需要优化。很明显,需要优化的地方是每次都重建了新的并查集,有没有办法能在上一次状态上进行变更,不用重建并查集呢?如果正向的打掉砖块,那么每次还需要以这个砖块为起点进行 DFS,时间复杂度还是很高。如果反向考虑呢?先把所有要打掉的砖块都打掉,构建打掉这些砖块以后剩下与天花板连通的并查集。然后反向添加打掉的砖块,每次添加一块就刷新一次它周围的 4 个砖块,不用 DFS,这样时间复杂度优化了很多。最后在按照 `newCount - count -1` 方式计算最终答案。注意每次还原一个砖块的时候需要染色回原有砖块的颜色 `1` 。优化成这样的做法,基本不会 TLE 了,如果计算 count 是单独计算的,还是会 TLE。如果没有进行秩压缩,时间会超过 1500 ms,所以这一题想拿到 100%,每步优化都要做好。最终 100% 的答案见代码。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func hitBricks(grid [][]int, hits [][]int) []int { - if len(hits) == 0 { - return []int{} - } - uf, m, n, res, oriCount := template.UnionFindCount{}, len(grid), len(grid[0]), make([]int, len(hits)), 0 - uf.Init(m*n + 1) - // 先将要打掉的砖块染色 - for _, hit := range hits { - if grid[hit[0]][hit[1]] == 1 { - grid[hit[0]][hit[1]] = 2 - } - } - for i := 0; i < m; i++ { - for j := 0; j < n; j++ { - if grid[i][j] == 1 { - getUnionFindFromGrid(grid, i, j, uf) - } - } - } - oriCount = uf.Count()[uf.Find(m*n)] - for i := len(hits) - 1; i >= 0; i-- { - if grid[hits[i][0]][hits[i][1]] == 2 { - grid[hits[i][0]][hits[i][1]] = 1 - getUnionFindFromGrid(grid, hits[i][0], hits[i][1], uf) - } - nowCount := uf.Count()[uf.Find(m*n)] - if nowCount-oriCount > 0 { - res[i] = nowCount - oriCount - 1 - } else { - res[i] = 0 - } - oriCount = nowCount - } - return res -} - -func isInGrid(grid [][]int, x, y int) bool { - return x >= 0 && x < len(grid) && y >= 0 && y < len(grid[0]) -} - -func getUnionFindFromGrid(grid [][]int, x, y int, uf template.UnionFindCount) { - m, n := len(grid), len(grid[0]) - if x == 0 { - uf.Union(m*n, x*n+y) - } - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - if isInGrid(grid, nx, ny) && grid[nx][ny] == 1 { - uf.Union(nx*n+ny, x*n+y) - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0811.Subdomain-Visit-Count.md b/website/content/ChapterFour/0811.Subdomain-Visit-Count.md deleted file mode 100755 index 69840bd97..000000000 --- a/website/content/ChapterFour/0811.Subdomain-Visit-Count.md +++ /dev/null @@ -1,143 +0,0 @@ -# [811. Subdomain Visit Count](https://leetcode.com/problems/subdomain-visit-count/) - - -## 题目 - -A website domain like "discuss.leetcode.com" consists of various subdomains. At the top level, we have "com", at the next level, we have "leetcode.com", and at the lowest level, "discuss.leetcode.com". When we visit a domain like "discuss.leetcode.com", we will also visit the parent domains "leetcode.com" and "com" implicitly. - -Now, call a "count-paired domain" to be a count (representing the number of visits this domain received), followed by a space, followed by the address. An example of a count-paired domain might be "9001 discuss.leetcode.com". - -We are given a list `cpdomains` of count-paired domains. We would like a list of count-paired domains, (in the same format as the input, and in any order), that explicitly counts the number of visits to each subdomain. - -**Example 1**: - - Input: - ["9001 discuss.leetcode.com"] - Output: - ["9001 discuss.leetcode.com", "9001 leetcode.com", "9001 com"] - Explanation: - We only have one website domain: "discuss.leetcode.com". As discussed above, the subdomain "leetcode.com" and "com" will also be visited. So they will all be visited 9001 times. - -**Example 2**: - - Input: - ["900 google.mail.com", "50 yahoo.com", "1 intel.mail.com", "5 wiki.org"] - Output: - ["901 mail.com","50 yahoo.com","900 google.mail.com","5 wiki.org","5 org","1 intel.mail.com","951 com"] - Explanation: - We will visit "google.mail.com" 900 times, "yahoo.com" 50 times, "intel.mail.com" once and "wiki.org" 5 times. For the subdomains, we will visit "mail.com" 900 + 1 = 901 times, "com" 900 + 50 + 1 = 951 times, and "org" 5 times. - -**Notes**: - -- The length of `cpdomains` will not exceed `100`. -- The length of each domain name will not exceed `100`. -- Each address will have either 1 or 2 "." characters. -- The input count in any count-paired domain will not exceed `10000`. -- The answer output can be returned in any order. - - -## 题目大意 - - -一个网站域名,如 "discuss.leetcode.com",包含了多个子域名。作为顶级域名,常用的有 "com",下一级则有 "leetcode.com",最低的一级为 "discuss.leetcode.com"。当我们访问域名 "discuss.leetcode.com" 时,也同时访问了其父域名 "leetcode.com" 以及顶级域名 "com"。给定一个带访问次数和域名的组合,要求分别计算每个域名被访问的次数。其格式为访问次数+空格+地址,例如:"9001 discuss.leetcode.com"。 - -接下来会给出一组访问次数和域名组合的列表 cpdomains 。要求解析出所有域名的访问次数,输出格式和输入格式相同,不限定先后顺序。 - - - -## 解题思路 - - -- 这一题是简单题,统计每个 domain 的出现频次。每个域名根据层级,一级一级的累加频次,比如 `discuss.leetcode.com`、`discuss.leetcode.com` 这个域名频次为 1,`leetcode.com` 这个域名频次为 1,`com` 这个域名频次为 1。用 map 依次统计每个 domain 出现的频次,按照格式要求输出。 - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" - "strings" -) - -// 解法一 -func subdomainVisits(cpdomains []string) []string { - result := make([]string, 0) - if len(cpdomains) == 0 { - return result - } - domainCountMap := make(map[string]int, 0) - for _, domain := range cpdomains { - countDomain := strings.Split(domain, " ") - allDomains := strings.Split(countDomain[1], ".") - temp := make([]string, 0) - for i := len(allDomains) - 1; i >= 0; i-- { - temp = append([]string{allDomains[i]}, temp...) - ld := strings.Join(temp, ".") - count, _ := strconv.Atoi(countDomain[0]) - if val, ok := domainCountMap[ld]; !ok { - domainCountMap[ld] = count - } else { - domainCountMap[ld] = count + val - } - } - } - for k, v := range domainCountMap { - t := strings.Join([]string{strconv.Itoa(v), k}, " ") - result = append(result, t) - } - return result -} - -// 解法二 -func subdomainVisits1(cpdomains []string) []string { - out := make([]string, 0) - var b strings.Builder - domains := make(map[string]int, 0) - for _, v := range cpdomains { - splitDomain(v, domains) - } - for k, v := range domains { - b.WriteString(strconv.Itoa(v)) - b.WriteString(" ") - b.WriteString(k) - out = append(out, b.String()) - b.Reset() - } - return out -} - -func splitDomain(domain string, domains map[string]int) { - visits := 0 - var e error - subdomains := make([]string, 0) - for i, v := range domain { - if v == ' ' { - visits, e = strconv.Atoi(domain[0:i]) - if e != nil { - panic(e) - } - break - } - } - for i := len(domain) - 1; i >= 0; i-- { - if domain[i] == '.' { - subdomains = append(subdomains, domain[i+1:]) - } else if domain[i] == ' ' { - subdomains = append(subdomains, domain[i+1:]) - break - } - } - for _, v := range subdomains { - count, ok := domains[v] - if ok { - domains[v] = count + visits - } else { - domains[v] = visits - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0812.Largest-Triangle-Area.md b/website/content/ChapterFour/0812.Largest-Triangle-Area.md deleted file mode 100644 index 426826f15..000000000 --- a/website/content/ChapterFour/0812.Largest-Triangle-Area.md +++ /dev/null @@ -1,70 +0,0 @@ -# [812. Largest Triangle Area](https://leetcode.com/problems/largest-triangle-area/) - - -## 题目 - -You have a list of points in the plane. Return the area of the largest triangle that can be formed by any 3 of the points. - -``` -Example: -Input: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] -Output: 2 -Explanation: -The five points are show in the figure below. The red triangle is the largest. -``` - -![https://s3-lc-upload.s3.amazonaws.com/uploads/2018/04/04/1027.png](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/04/04/1027.png) - -**Notes**: - -- `3 <= points.length <= 50`. -- No points will be duplicated. -- `-50 <= points[i][j] <= 50`. -- Answers within `10^-6` of the true value will be accepted as correct. - -## 题目大意 - -给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。 - -## 解题思路 - -- 给出一组点的坐标,要求找出能组成三角形面积最大的点集合,输出这个最大面积。 -- 数学题。按照数学定义,分别计算这些能构成三角形的点形成的三角形面积,最终输出最大面积即可。 - -## 代码 - -```go - -package leetcode - -func largestTriangleArea(points [][]int) float64 { - maxArea, n := 0.0, len(points) - for i := 0; i < n; i++ { - for j := i + 1; j < n; j++ { - for k := j + 1; k < n; k++ { - maxArea = max(maxArea, area(points[i], points[j], points[k])) - } - } - } - return maxArea -} - -func area(p1, p2, p3 []int) float64 { - return abs(p1[0]*p2[1]+p2[0]*p3[1]+p3[0]*p1[1]-p1[0]*p3[1]-p2[0]*p1[1]-p3[0]*p2[1]) / 2 -} - -func abs(num int) float64 { - if num < 0 { - num = -num - } - return float64(num) -} - -func max(a, b float64) float64 { - if a > b { - return a - } - return b -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0815.Bus-Routes.md b/website/content/ChapterFour/0815.Bus-Routes.md deleted file mode 100755 index bddbd3b07..000000000 --- a/website/content/ChapterFour/0815.Bus-Routes.md +++ /dev/null @@ -1,88 +0,0 @@ -# [815. Bus Routes](https://leetcode.com/problems/bus-routes/) - - -## 题目 - -We have a list of bus routes. Each `routes[i]` is a bus route that the i-th bus repeats forever. For example if `routes[0] = [1, 5, 7]`, this means that the first bus (0-th indexed) travels in the sequence 1->5->7->1->5->7->1->... forever. - -We start at bus stop `S` (initially not on a bus), and we want to go to bus stop `T`. Travelling by buses only, what is the least number of buses we must take to reach our destination? Return -1 if it is not possible. - -**Example**: - - Input: - routes = [[1, 2, 7], [3, 6, 7]] - S = 1 - T = 6 - Output: 2 - Explanation: - The best strategy is take the first bus to the bus stop 7, then take the second bus to the bus stop 6. - -**Note**: - -- `1 <= routes.length <= 500`. -- `1 <= routes[i].length <= 500`. -- `0 <= routes[i][j] < 10 ^ 6`. - - -## 题目大意 - -我们有一系列公交路线。每一条路线 routes[i] 上都有一辆公交车在上面循环行驶。例如,有一条路线 routes[0] = [1, 5, 7],表示第一辆 (下标为0) 公交车会一直按照 1->5->7->1->5->7->1->... 的车站路线行驶。假设我们从 S 车站开始(初始时不在公交车上),要去往 T 站。 期间仅可乘坐公交车,求出最少乘坐的公交车数量。返回 -1 表示不可能到达终点车站。 - - -说明: - -- 1 <= routes.length <= 500. -- 1 <= routes[i].length <= 500. -- 0 <= routes[i][j] < 10 ^ 6. - - -## 解题思路 - -- 给出一些公交路线,公交路径代表经过的哪些站。现在给出起点和终点站,问最少需要换多少辆公交车才能从起点到终点? -- 这一题可以转换成图论的问题,将每个站台看成顶点,公交路径看成每个顶点的边。同一个公交的边染色相同。题目即可转化为从顶点 S 到顶点 T 需要经过最少多少条不同的染色边。用 BFS 即可轻松解决。从起点 S 开始,不断的扩展它能到达的站点。用 visited 数组防止放入已经可达的站点引起的环。用 map 存储站点和公交车的映射关系(即某个站点可以由哪些公交车到达),BFS 的过程中可以用这个映射关系,拿到公交车的其他站点信息,从而扩张队列里面的可达站点。一旦扩展出现了终点 T,就可以返回结果了。 - - -## 代码 - -```go - -package leetcode - -func numBusesToDestination(routes [][]int, S int, T int) int { - if S == T { - return 0 - } - // vertexMap 中 key 是站点,value 是公交车数组,代表这些公交车路线可以到达此站点 - vertexMap, visited, queue, res := map[int][]int{}, make([]bool, len(routes)), []int{}, 0 - for i := 0; i < len(routes); i++ { - for _, v := range routes[i] { - tmp := vertexMap[v] - tmp = append(tmp, i) - vertexMap[v] = tmp - } - } - queue = append(queue, S) - for len(queue) > 0 { - res++ - qlen := len(queue) - for i := 0; i < qlen; i++ { - vertex := queue[0] - queue = queue[1:] - for _, bus := range vertexMap[vertex] { - if visited[bus] == true { - continue - } - visited[bus] = true - for _, v := range routes[bus] { - if v == T { - return res - } - queue = append(queue, v) - } - } - } - } - return -1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0817.Linked-List-Components.md b/website/content/ChapterFour/0817.Linked-List-Components.md deleted file mode 100644 index a04153712..000000000 --- a/website/content/ChapterFour/0817.Linked-List-Components.md +++ /dev/null @@ -1,109 +0,0 @@ -# [817. Linked List Components](https://leetcode.com/problems/linked-list-components/) - -## 题目 - -We are given head, the head node of a linked list containing unique integer values. - -We are also given the list G, a subset of the values in the linked list. - -Return the number of connected components in G, where two values are connected if they appear consecutively in the linked list. - -**Example 1**: - -``` - -Input: -head: 0->1->2->3 -G = [0, 1, 3] -Output: 2 -Explanation: -0 and 1 are connected, so [0, 1] and [3] are the two connected components. - -``` - -**Example 2**: - -``` - -Input: -head: 0->1->2->3->4 -G = [0, 3, 1, 4] -Output: 2 -Explanation: -0 and 1 are connected, 3 and 4 are connected, so [0, 1] and [3, 4] are the two connected components. - -``` - -**Note**: - -- If N is the length of the linked list given by head, 1 <= N <= 10000. -- The value of each node in the linked list will be in the range [0, N - 1]. -- 1 <= G.length <= 10000. -- G is a subset of all values in the linked list. - - - -## 题目大意 - -这道题题目的意思描述的不是很明白,我提交了几次 WA 以后才悟懂题意。 - -这道题的意思是,在 G 中能组成多少组子链表,这些子链表的要求是能在原链表中是有序的。 - -## 解题思路 - -这个问题再抽象一下就成为这样:在原链表中去掉 G 中不存在的数,会被切断成几段链表。例如,将原链表中 G 中存在的数标为 0,不存在的数标为 1 。原链表标识为 0-0-0-1-0-1-1-0-0-1-0-1,那么这样原链表被断成了 4 段。只要在链表中找 0-1 组合就可以认为是一段,因为这里必定会有一段生成。 - -考虑末尾的情况,0-1,1-0,0-0,1-1,这 4 种情况的特征都是,末尾一位只要是 0,都会新产生一段。所以链表末尾再单独判断一次,是 0 就再加一。 - - - - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func numComponents(head *ListNode, G []int) int { - if head.Next == nil { - return 1 - } - gMap := toMap(G) - count := 0 - cur := head - - for cur != nil { - if _, ok := gMap[cur.Val]; ok { - if cur.Next == nil { // 末尾存在,直接加一 - count++ - } else { - if _, ok = gMap[cur.Next.Val]; !ok { - count++ - } - } - } - cur = cur.Next - } - return count -} - -func toMap(G []int) map[int]int { - GMap := make(map[int]int, 0) - for _, value := range G { - GMap[value] = 0 - } - return GMap -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0819.Most-Common-Word.md b/website/content/ChapterFour/0819.Most-Common-Word.md deleted file mode 100755 index e37b45ee4..000000000 --- a/website/content/ChapterFour/0819.Most-Common-Word.md +++ /dev/null @@ -1,89 +0,0 @@ -# [819. Most Common Word](https://leetcode.com/problems/most-common-word/) - - -## 题目 - -Given a paragraph and a list of banned words, return the most frequent word that is not in the list of banned words. It is guaranteed there is at least one word that isn't banned, and that the answer is unique. - -Words in the list of banned words are given in lowercase, and free of punctuation. Words in the paragraph are not case sensitive. The answer is in lowercase. - -**Example**: - - Input: - paragraph = "Bob hit a ball, the hit BALL flew far after it was hit." - banned = ["hit"] - Output: "ball" - Explanation: - "hit" occurs 3 times, but it is a banned word. - "ball" occurs twice (and no other word does), so it is the most frequent non-banned word in the paragraph. - Note that words in the paragraph are not case sensitive, - that punctuation is ignored (even if adjacent to words, such as "ball,"), - and that "hit" isn't the answer even though it occurs more because it is banned. - -**Note**: - -- `1 <= paragraph.length <= 1000`. -- `0 <= banned.length <= 100`. -- `1 <= banned[i].length <= 10`. -- The answer is unique, and written in lowercase (even if its occurrences in `paragraph` may have uppercase symbols, and even if it is a proper noun.) -- `paragraph` only consists of letters, spaces, or the punctuation symbols `!?',;.` -- There are no hyphens or hyphenated words. -- Words only consist of letters, never apostrophes or other punctuation symbols. - - -## 题目大意 - - -给定一个段落 (paragraph) 和一个禁用单词列表 (banned)。返回出现次数最多,同时不在禁用列表中的单词。题目保证至少有一个词不在禁用列表中,而且答案唯一。 - -禁用列表中的单词用小写字母表示,不含标点符号。段落中的单词不区分大小写。答案都是小写字母。 - - -## 解题思路 - -- 给出一段话和一个 banned 的字符串,要求输出这段话中出现频次最高的并且不出现在 banned 数组里面的字符串,答案唯一。这题是简单题,依次统计每个单词的频次,然后从 map 中删除 banned 里面的单词,取出剩下频次最高的单词即可。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func mostCommonWord(paragraph string, banned []string) string { - freqMap, start := make(map[string]int), -1 - for i, c := range paragraph { - if c == ' ' || c == '!' || c == '?' || c == '\'' || c == ',' || c == ';' || c == '.' { - if start > -1 { - word := strings.ToLower(paragraph[start:i]) - freqMap[word]++ - } - start = -1 - } else { - if start == -1 { - start = i - } - } - } - if start != -1 { - word := strings.ToLower(paragraph[start:]) - freqMap[word]++ - } - // Strip the banned words from the freqmap - for _, bannedWord := range banned { - delete(freqMap, bannedWord) - } - // Find most freq word - mostFreqWord, mostFreqCount := "", 0 - for word, freq := range freqMap { - if freq > mostFreqCount { - mostFreqWord = word - mostFreqCount = freq - } - } - return mostFreqWord -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0826.Most-Profit-Assigning-Work.md b/website/content/ChapterFour/0826.Most-Profit-Assigning-Work.md deleted file mode 100644 index 33059b959..000000000 --- a/website/content/ChapterFour/0826.Most-Profit-Assigning-Work.md +++ /dev/null @@ -1,107 +0,0 @@ -# [826. Most Profit Assigning Work](https://leetcode.com/problems/most-profit-assigning-work/) - -## 题目 - -We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith job. - -Now we have some workers. worker[i] is the ability of the ith worker, which means that this worker can only complete a job with difficulty at most worker[i]. - -Every worker can be assigned at most one job, but one job can be completed multiple times. - -For example, if 3 people attempt the same job that pays $1, then the total profit will be $3. If a worker cannot complete any job, his profit is $0. - -What is the most profit we can make? - - -**Example 1**: - - -``` - -Input: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7] -Output: 100 -Explanation: Workers are assigned jobs of difficulty [4,4,6,6] and they get profit of [20,20,30,30] seperately. - -``` - -**Note**: - -- 1 <= difficulty.length = profit.length <= 10000 -- 1 <= worker.length <= 10000 -- difficulty[i], profit[i], worker[i] are in range [1, 10^5] - - -## 题目大意 - -这道题考察的是滑动窗口的问题,也是排序相关的问题。 - -给出一组任务,每个任务都有一定的难度,每个任务也都有完成以后对应的收益(完成难的任务不一定收益最高)。有一批工人,每个人能处理的任务难度不同。要求输出这批工人完成任务以后的最大收益。 - -## 解题思路 - -先将任务按照难度排序,工人也按照能处理任务难度的能力排序。用一个数组记录下,每个 i 下标,当前能达到的最大收益。计算这个收益只需要从下标为 1 开始,依次比较自己和前一个的收益即可(因为排过序,难度是依次递增的)。有了这个难度依次递增,并且记录了最大收益的数组以后,就可以计算最终结果了。遍历一遍工人数组,如果工人的能力大于任务的难度,就加上这个最大收益。遍历完工人数组,最终结果就是最大收益。 - - - - -## 代码 - -```go - -package leetcode - -import ( - "fmt" - "sort" -) - -// Task define -type Task struct { - Difficulty int - Profit int -} - -// Tasks define -type Tasks []Task - -// Len define -func (p Tasks) Len() int { return len(p) } - -// Swap define -func (p Tasks) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -// SortByDiff define -type SortByDiff struct{ Tasks } - -// Less define -func (p SortByDiff) Less(i, j int) bool { - return p.Tasks[i].Difficulty < p.Tasks[j].Difficulty -} - -func maxProfitAssignment(difficulty []int, profit []int, worker []int) int { - if len(difficulty) == 0 || len(profit) == 0 || len(worker) == 0 { - return 0 - } - tasks, res, index := []Task{}, 0, 0 - for i := 0; i < len(difficulty); i++ { - tasks = append(tasks, Task{Difficulty: difficulty[i], Profit: profit[i]}) - } - sort.Sort(SortByDiff{tasks}) - sort.Ints(worker) - for i := 1; i < len(tasks); i++ { - tasks[i].Profit = max(tasks[i].Profit, tasks[i-1].Profit) - } - fmt.Printf("tasks = %v worker = %v\n", tasks, worker) - for _, w := range worker { - for index < len(difficulty) && w >= tasks[index].Difficulty { - index++ - } - fmt.Printf("tasks【index】 = %v\n", tasks[index]) - if index > 0 { - res += tasks[index-1].Profit - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0832.Flipping-an-Image.md b/website/content/ChapterFour/0832.Flipping-an-Image.md deleted file mode 100644 index 81b8ccc97..000000000 --- a/website/content/ChapterFour/0832.Flipping-an-Image.md +++ /dev/null @@ -1,63 +0,0 @@ -# [832. Flipping an Image](https://leetcode.com/problems/flipping-an-image/) - - -## 题目 - -Given a binary matrix `A`, we want to flip the image horizontally, then invert it, and return the resulting image. - -To flip an image horizontally means that each row of the image is reversed. For example, flipping `[1, 1, 0]` horizontally results in `[0, 1, 1]`. - -To invert an image means that each `0` is replaced by `1`, and each `1` is replaced by `0`. For example, inverting `[0, 1, 1]` results in `[1, 0, 0]`. - -**Example 1**: - -``` -Input: [[1,1,0],[1,0,1],[0,0,0]] -Output: [[1,0,0],[0,1,0],[1,1,1]] -Explanation: First reverse each row: [[0,1,1],[1,0,1],[0,0,0]]. -Then, invert the image: [[1,0,0],[0,1,0],[1,1,1]] -``` - -**Example 2**: - -``` -Input: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]] -Output: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]] -Explanation: First reverse each row: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]. -Then invert the image: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]] -``` - -**Notes**: - -- `1 <= A.length = A[0].length <= 20` -- `0 <= A[i][j] <= 1` - -## 题目大意 - -给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果。水平翻转图片就是将图片的每一行都进行翻转,即逆序。例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, 1]。反转图片的意思是图片中的 0 全部被 1 替换, 1 全部被 0 替换。例如,反转 [0, 1, 1] 的结果是 [1, 0, 0]。 - - -## 解题思路 - -- 给定一个二进制矩阵,要求先水平翻转,然后再反转( 1→0 , 0→1 )。 -- 简单题,按照题意先水平翻转,再反转即可。 - -## 代码 - -```go - -package leetcode - -func flipAndInvertImage(A [][]int) [][]int { - for i := 0; i < len(A); i++ { - for a, b := 0, len(A[i])-1; a < b; a, b = a+1, b-1 { - A[i][a], A[i][b] = A[i][b], A[i][a] - } - for a := 0; a < len(A[i]); a++ { - A[i][a] = (A[i][a] + 1) % 2 - } - } - return A -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0834.Sum-of-Distances-in-Tree.md b/website/content/ChapterFour/0834.Sum-of-Distances-in-Tree.md deleted file mode 100755 index b0390a4aa..000000000 --- a/website/content/ChapterFour/0834.Sum-of-Distances-in-Tree.md +++ /dev/null @@ -1,101 +0,0 @@ -# [834. Sum of Distances in Tree](https://leetcode.com/problems/sum-of-distances-in-tree/) - - -## 题目 - -An undirected, connected tree with `N` nodes labelled `0...N-1` and `N-1edges` are given. - -The `i`th edge connects nodes `edges[i][0]` and `edges[i][1]` together. - -Return a list `ans`, where `ans[i]` is the sum of the distances between node `i`and all other nodes. - -**Example 1**: - - Input: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]] - Output: [8,12,6,10,10,10] - Explanation: - Here is a diagram of the given tree: - 0 - / \ - 1 2 - /|\ - 3 4 5 - We can see that dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5) - equals 1 + 1 + 2 + 2 + 2 = 8. Hence, answer[0] = 8, and so on. - -**Note**: `1 <= N <= 10000` - -## 题目大意 - -给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1 条边。第 i 条边连接节点 edges[i][0] 和 edges[i][1] 。返回一个表示节点 i 与其他所有节点距离之和的列表 ans。 - -说明: 1 <= N <= 10000 - - - -## 解题思路 - -- 给出 N 个节点和这些节点之间的一些边的关系。要求求出分别以 x 为根节点到所有节点路径和。 -- 这一题虽说描述的是求树的路径,但是完全可以当做图来做,因为并不是二叉树,是多叉树。这一题的解题思路是先一次 DFS 求出以 0 为根节点到各个节点的路径和(不以 0 为节点也可以,可以取任意节点作为开始)。第二次 DFS 求出从 0 根节点转换到其他各个节点的路径和。由于第一次计算出来以 0 为节点的路径和是正确的,所以计算其他节点为根节点的路径和只需要转换一下就可以得到正确结果。经过 2 次 DFS 之后就可以得到所有节点以自己为根节点到所有节点的路径和了。 -- 如何从以 0 为根节点到其他所有节点的路径和转换到以其他节点为根节点到所有节点的路径和呢?从 0 节点换成 x 节点,只需要在 0 到所有节点的路径和基础上增增减减就可以了。增加的是 x 节点到除去以 x 为根节点所有子树以外的节点的路径,有多少个节点就增加多少条路径。减少的是 0 到以 x 为根节点所有子树节点的路径和,包含 0 到 x 根节点,有多少节点就减少多少条路径。所以在第一次 DFS 中需要计算好每个节点以自己为根节点的子树总数和(包含自己在内),这样在第二次 DFS 中可以直接拿来做转换。具体细节的实现见代码。 - - - -## 代码 - -```go - -package leetcode - -func sumOfDistancesInTree(N int, edges [][]int) []int { - // count[i] 中存储的是以 i 为根节点,所有子树结点和根节点的总数 - tree, visited, count, res := make([][]int, N), make([]bool, N), make([]int, N), make([]int, N) - for _, e := range edges { - i, j := e[0], e[1] - tree[i] = append(tree[i], j) - tree[j] = append(tree[j], i) - } - deepFirstSearch(0, visited, count, res, tree) - // 重置访问状态,再进行一次 DFS - visited = make([]bool, N) - // 进入第二次 DFS 之前,只有 res[0] 里面存的是正确的值,因为第一次 DFS 计算出了以 0 为根节点的所有路径和 - // 第二次 DFS 的目的是把以 0 为根节点的路径和转换成以 n 为根节点的路径和 - deepSecondSearch(0, visited, count, res, tree) - - return res -} - -func deepFirstSearch(root int, visited []bool, count, res []int, tree [][]int) { - visited[root] = true - for _, n := range tree[root] { - if visited[n] { - continue - } - deepFirstSearch(n, visited, count, res, tree) - count[root] += count[n] - // root 节点到 n 的所有路径和 = 以 n 为根节点到所有子树的路径和 res[n] + root 到 count[n] 中每个节点的个数(root 节点和以 n 为根节点的每个节点都增加一条路径) - // root 节点和以 n 为根节点的每个节点都增加一条路径 = 以 n 为根节点,子树节点数和根节点数的总和,即 count[n] - res[root] += res[n] + count[n] - } - count[root]++ -} - -// 从 root 开始,把 root 节点的子节点,依次设置成新的根节点 -func deepSecondSearch(root int, visited []bool, count, res []int, tree [][]int) { - N := len(visited) - visited[root] = true - for _, n := range tree[root] { - if visited[n] { - continue - } - // 根节点从 root 变成 n 后 - // res[root] 存储的是以 root 为根节点到所有节点的路径总长度 - // 1. root 到 n 节点增加的路径长度 = root 节点和以 n 为根节点的每个节点都增加一条路径 = 以 n 为根节点,子树节点数和根节点数的总和,即 count[n] - // 2. n 到以 n 为根节点的所有子树节点以外的节点增加的路径长度 = n 节点和非 n 为根节点子树的每个节点都增加一条路径 = N - count[n] - // 所以把根节点从 root 转移到 n,需要增加的路径是上面👆第二步计算的,需要减少的路径是上面👆第一步计算的 - res[n] = res[root] + (N - count[n]) - count[n] - deepSecondSearch(n, visited, count, res, tree) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0836.Rectangle-Overlap.md b/website/content/ChapterFour/0836.Rectangle-Overlap.md deleted file mode 100755 index 2cce0169b..000000000 --- a/website/content/ChapterFour/0836.Rectangle-Overlap.md +++ /dev/null @@ -1,54 +0,0 @@ -# [836. Rectangle Overlap](https://leetcode.com/problems/rectangle-overlap/) - - -## 题目 - -A rectangle is represented as a list `[x1, y1, x2, y2]`, where `(x1, y1)` are the coordinates of its bottom-left corner, and `(x2, y2)` are the coordinates of its top-right corner. - -Two rectangles overlap if the area of their intersection is positive. To be clear, two rectangles that only touch at the corner or edges do not overlap. - -Given two (axis-aligned) rectangles, return whether they overlap. - -**Example 1**: - - Input: rec1 = [0,0,2,2], rec2 = [1,1,3,3] - Output: true - -**Example 2**: - - Input: rec1 = [0,0,1,1], rec2 = [1,0,2,1] - Output: false - -**Notes**: - -1. Both rectangles `rec1` and `rec2` are lists of 4 integers. -2. All coordinates in rectangles will be between `-10^9` and `10^9`. - - -## 题目大意 - -矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形,判断它们是否重叠并返回结果。 - -说明: - -1. 两个矩形 rec1 和 rec2 都以含有四个整数的列表的形式给出。 -2. 矩形中的所有坐标都处于 -10^9 和 10^9 之间。 - - -## 解题思路 - -- 给出两个矩形的坐标,判断两个矩形是否重叠。 -- 几何题,按照几何方法判断即可。 - - -## 代码 - -```go - -package leetcode - -func isRectangleOverlap(rec1 []int, rec2 []int) bool { - return rec1[0] < rec2[2] && rec2[0] < rec1[2] && rec1[1] < rec2[3] && rec2[1] < rec1[3] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0838.Push-Dominoes.md b/website/content/ChapterFour/0838.Push-Dominoes.md deleted file mode 100644 index 7acc9ce53..000000000 --- a/website/content/ChapterFour/0838.Push-Dominoes.md +++ /dev/null @@ -1,144 +0,0 @@ -# [838. Push Dominoes](https://leetcode.com/problems/push-dominoes/) - -## 题目 - -There are N dominoes in a line, and we place each domino vertically upright. - -In the beginning, we simultaneously push some of the dominoes either to the left or to the right. - -![](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/05/18/domino.png) - - -After each second, each domino that is falling to the left pushes the adjacent domino on the left. - -Similarly, the dominoes falling to the right push their adjacent dominoes standing on the right. - -When a vertical domino has dominoes falling on it from both sides, it stays still due to the balance of the forces. - -For the purposes of this question, we will consider that a falling domino expends no additional force to a falling or already fallen domino. - -Given a string "S" representing the initial state. S[i] = 'L', if the i-th domino has been pushed to the left; S[i] = 'R', if the i-th domino has been pushed to the right; S[i] = '.', if the i-th domino has not been pushed. - -Return a string representing the final state. - - -**Example 1**: - -``` - -Input: ".L.R...LR..L.." -Output: "LL.RR.LLRRLL.." - -``` - -**Example 2**: - -``` - -Input: "RR.L" -Output: "RR.L" -Explanation: The first domino expends no additional force on the second domino. - -``` - - -**Note**: - -- 0 <= N <= 10^5 -- String dominoes contains only 'L', 'R' and '.' - - -## 题目大意 - -这道题是一个道模拟题,考察的也是滑动窗口的问题。 - -给出一个字符串,L 代表这个多米诺骨牌会往左边倒,R 代表这个多米诺骨牌会往右边倒,问最终这些牌倒下去以后,情况是如何的,输出最终情况的字符串。 - -## 解题思路 - -这道题可以预先在初始字符串头和尾都添加一个字符串,左边添加 L,右边添加 R,辅助判断。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 -func pushDominoes(dominoes string) string { - d := []byte(dominoes) - for i := 0; i < len(d); { - j := i + 1 - for j < len(d)-1 && d[j] == '.' { - j++ - } - push(d[i : j+1]) - i = j - } - return string(d) -} - -func push(d []byte) { - first, last := 0, len(d)-1 - switch d[first] { - case '.', 'L': - if d[last] == 'L' { - for ; first < last; first++ { - d[first] = 'L' - } - } - case 'R': - if d[last] == '.' || d[last] == 'R' { - for ; first <= last; first++ { - d[first] = 'R' - } - } else if d[last] == 'L' { - for first < last { - d[first] = 'R' - d[last] = 'L' - first++ - last-- - } - } - } -} - -// 解法二 -func pushDominoes1(dominoes string) string { - dominoes = "L" + dominoes + "R" - res := "" - for i, j := 0, 1; j < len(dominoes); j++ { - if dominoes[j] == '.' { - continue - } - if i > 0 { - res += string(dominoes[i]) - } - middle := j - i - 1 - if dominoes[i] == dominoes[j] { - for k := 0; k < middle; k++ { - res += string(dominoes[i]) - } - } else if dominoes[i] == 'L' && dominoes[j] == 'R' { - for k := 0; k < middle; k++ { - res += string('.') - } - } else { - for k := 0; k < middle/2; k++ { - res += string('R') - } - for k := 0; k < middle%2; k++ { - res += string('.') - } - for k := 0; k < middle/2; k++ { - res += string('L') - } - } - i = j - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0839.Similar-String-Groups.md b/website/content/ChapterFour/0839.Similar-String-Groups.md deleted file mode 100755 index 217ee2da3..000000000 --- a/website/content/ChapterFour/0839.Similar-String-Groups.md +++ /dev/null @@ -1,98 +0,0 @@ -# [839. Similar String Groups](https://leetcode.com/problems/similar-string-groups/) - - -## 题目 - -Two strings `X` and `Y` are similar if we can swap two letters (in different positions) of `X`, so that it equals `Y`. - -For example, `"tars"` and `"rats"` are similar (swapping at positions `0` and `2`), and `"rats"` and `"arts"` are similar, but `"star"` is not similar to `"tars"`, `"rats"`, or `"arts"`. - -Together, these form two connected groups by similarity: `{"tars", "rats", "arts"}` and `{"star"}`. Notice that `"tars"` and `"arts"` are in the same group even though they are not similar. Formally, each group is such that a word is in the group if and only if it is similar to at least one other word in the group. - -We are given a list `A` of strings. Every string in `A` is an anagram of every other string in `A`. How many groups are there? - -**Example 1**: - - Input: ["tars","rats","arts","star"] - Output: 2 - -**Note**: - -1. `A.length <= 2000` -2. `A[i].length <= 1000` -3. `A.length * A[i].length <= 20000` -4. All words in `A` consist of lowercase letters only. -5. All words in `A` have the same length and are anagrams of each other. -6. The judging time limit has been increased for this question. - - -## 题目大意 - -如果我们交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似。 - -例如,"tars" 和 "rats" 是相似的 (交换 0 与 2 的位置); "rats" 和 "arts" 也是相似的,但是 "star" 不与 "tars","rats",或 "arts" 相似。 - -总之,它们通过相似性形成了两个关联组:{"tars", "rats", "arts"} 和 {"star"}。注意,"tars" 和 "arts" 是在同一组中,即使它们并不相似。形式上,对每个组而言,要确定一个单词在组中,只需要这个词和该组中至少一个单词相似。我们给出了一个不包含重复的字符串列表 A。列表中的每个字符串都是 A 中其它所有字符串的一个字母异位词。请问 A 中有多少个相似字符串组? - - -提示: - -- A.length <= 2000 -- A[i].length <= 1000 -- A.length * A[i].length <= 20000 -- A 中的所有单词都只包含小写字母。 -- A 中的所有单词都具有相同的长度,且是彼此的字母异位词。 -- 此问题的判断限制时间已经延长。 - - -备注: - -- 字母异位词[anagram],一种把某个字符串的字母的位置(顺序)加以改换所形成的新词。 - - - - -## 解题思路 - - -- 给出一个字符串数组,要求找出这个数组中,"不相似"的字符串有多少种。相似的字符串的定义是:如果 A 和 B 字符串只需要交换一次字母的位置就能变成两个相等的字符串,那么 A 和 B 是相似的。 -- 这一题的解题思路是用并查集。先将题目中的“相似”的定义转换一下,A 和 B 相似的意思是,A 和 B 中只有 2 个字符不相等,其他字符都相等,这样交换一次才能完全相等。有没有可能这两个字符交换了也不相等呢?这种情况不用考虑,因为题目中提到了给的字符串都是 `anagram` 的(`anagram` 的意思是,字符串的任意排列组合)。那么这题就比较简单了,只需要判断每两个字符串是否“相似”,如果相似就 `union()`,最后看并查集中有几个集合即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func numSimilarGroups(A []string) int { - uf := template.UnionFind{} - uf.Init(len(A)) - for i := 0; i < len(A); i++ { - for j := i + 1; j < len(A); j++ { - if isSimilar(A[i], A[j]) { - uf.Union(i, j) - } - } - } - return uf.TotalCount() -} - -func isSimilar(a, b string) bool { - var n int - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - n++ - if n > 2 { - return false - } - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0841.Keys-and-Rooms.md b/website/content/ChapterFour/0841.Keys-and-Rooms.md deleted file mode 100644 index 69d1da3a2..000000000 --- a/website/content/ChapterFour/0841.Keys-and-Rooms.md +++ /dev/null @@ -1,80 +0,0 @@ -# [841. Keys and Rooms](https://leetcode.com/problems/keys-and-rooms/) - - - -## 题目 - -There are `N` rooms and you start in room `0`. Each room has a distinct number in `0, 1, 2, ..., N-1`, and each room may have some keys to access the next room. - -Formally, each room `i` has a list of keys `rooms[i]`, and each key `rooms[i][j]` is an integer in `[0, 1, ..., N-1]` where `N = rooms.length`. A key `rooms[i][j] = v` opens the room with number `v`. - -Initially, all the rooms start locked (except for room `0`). - -You can walk back and forth between rooms freely. - -Return `true` if and only if you can enter every room. - -**Example 1**: - -``` -Input: [[1],[2],[3],[]] -Output: true -Explanation: -We start in room 0, and pick up key 1. -We then go to room 1, and pick up key 2. -We then go to room 2, and pick up key 3. -We then go to room 3. Since we were able to go to every room, we return true. -``` - -**Example 2**: - -``` -Input: [[1,3],[3,0,1],[2],[0]] -Output: false -Explanation: We can't enter the room with number 2. -``` - -**Note**: - -1. `1 <= rooms.length <= 1000` -2. `0 <= rooms[i].length <= 1000` -3. The number of keys in all rooms combined is at most `3000`. - - -## 题目大意 - -有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。 - -在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返回 true,否则返回 false。 - -提示: - -- 1 <= rooms.length <= 1000 -- 0 <= rooms[i].length <= 1000 -- 所有房间中的钥匙数量总计不超过 3000。 - -## 解题思路 - -- 给出一个房间数组,每个房间里面装了一些钥匙。0 号房间默认是可以进入的,房间进入顺序没有要求,问最终能否进入所有房间。 -- 用 DFS 依次深搜所有房间的钥匙,如果都能访问到,最终输出 true。这题算是 DFS 里面的简单题。 - -## 代码 - -```go -func canVisitAllRooms(rooms [][]int) bool { - visited := make(map[int]bool) - visited[0] = true - dfsVisitAllRooms(rooms, visited, 0) - return len(rooms) == len(visited) -} - -func dfsVisitAllRooms(es [][]int, visited map[int]bool, from int) { - for _, to := range es[from] { - if visited[to] { - continue - } - visited[to] = true - dfsVisitAllRooms(es, visited, to) - } -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0842.Split-Array-into-Fibonacci-Sequence.md b/website/content/ChapterFour/0842.Split-Array-into-Fibonacci-Sequence.md deleted file mode 100755 index 9bb286ec4..000000000 --- a/website/content/ChapterFour/0842.Split-Array-into-Fibonacci-Sequence.md +++ /dev/null @@ -1,135 +0,0 @@ -# [842. Split Array into Fibonacci Sequence](https://leetcode.com/problems/split-array-into-fibonacci-sequence/) - - -## 题目 - -Given a string `S` of digits, such as `S = "123456579"`, we can split it into a *Fibonacci-like sequence* `[123, 456, 579].` - -Formally, a Fibonacci-like sequence is a list `F` of non-negative integers such that: - -- `0 <= F[i] <= 2^31 - 1`, (that is, each integer fits a 32-bit signed integer type); -- `F.length >= 3`; -- and `F[i] + F[i+1] = F[i+2]` for all `0 <= i < F.length - 2`. - -Also, note that when splitting the string into pieces, each piece must not have extra leading zeroes, except if the piece is the number 0 itself. - -Return any Fibonacci-like sequence split from `S`, or return `[]` if it cannot be done. - -**Example 1**: - - Input: "123456579" - Output: [123,456,579] - -**Example 2**: - - Input: "11235813" - Output: [1,1,2,3,5,8,13] - -**Example 3**: - - Input: "112358130" - Output: [] - Explanation: The task is impossible. - -**Example 4**: - - Input: "0123" - Output: [] - Explanation: Leading zeroes are not allowed, so "01", "2", "3" is not valid. - -**Example 5**: - - Input: "1101111" - Output: [110, 1, 111] - Explanation: The output [11, 0, 11, 11] would also be accepted. - -**Note**: - -1. `1 <= S.length <= 200` -2. `S` contains only digits. - - -## 题目大意 - -给定一个数字字符串 S,比如 S = "123456579",我们可以将它分成斐波那契式的序列 [123, 456, 579]。斐波那契式序列是一个非负整数列表 F,且满足: - -- 0 <= F[i] <= 2^31 - 1,(也就是说,每个整数都符合 32 位有符号整数类型); -- F.length >= 3; -- 对于所有的0 <= i < F.length - 2,都有 F[i] + F[i+1] = F[i+2] 成立。 - -另外,请注意,将字符串拆分成小块时,每个块的数字一定不要以零开头,除非这个块是数字 0 本身。返回从 S 拆分出来的所有斐波那契式的序列块,如果不能拆分则返回 []。 - - - -## 解题思路 - - -- 这一题是第 306 题的加强版。第 306 题要求判断字符串是否满足斐波那契数列形式。这一题要求输出按照斐波那契数列形式分割之后的数字数组。 -- 这一题思路和第 306 题基本一致,需要注意的是题目中的一个限制条件,`0 <= F[i] <= 2^31 - 1`,注意这个条件,笔者开始没注意,后面输出解就出现错误了,可以看笔者的测试文件用例的最后两组数据,这两组都是可以分解成斐波那契数列的,但是由于分割以后的数字都大于了 `2^31 - 1`,所以这些解都不能要! -- 这一题也要特别注意剪枝条件,没有剪枝条件,时间复杂度特别高,加上合理的剪枝条件以后,0ms 通过。 - - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" - "strings" -) - -func splitIntoFibonacci(S string) []int { - if len(S) < 3 { - return []int{} - } - res, isComplete := []int{}, false - for firstEnd := 0; firstEnd < len(S)/2; firstEnd++ { - if S[0] == '0' && firstEnd > 0 { - break - } - first, _ := strconv.Atoi(S[:firstEnd+1]) - if first >= 1<<31 { // 题目要求每个数都要小于 2^31 - 1 = 2147483647,此处剪枝很关键! - break - } - for secondEnd := firstEnd + 1; max(firstEnd, secondEnd-firstEnd) <= len(S)-secondEnd; secondEnd++ { - if S[firstEnd+1] == '0' && secondEnd-firstEnd > 1 { - break - } - second, _ := strconv.Atoi(S[firstEnd+1 : secondEnd+1]) - if second >= 1<<31 { // 题目要求每个数都要小于 2^31 - 1 = 2147483647,此处剪枝很关键! - break - } - findRecursiveCheck(S, first, second, secondEnd+1, &res, &isComplete) - } - } - return res -} - -//Propagate for rest of the string -func findRecursiveCheck(S string, x1 int, x2 int, left int, res *[]int, isComplete *bool) { - if x1 >= 1<<31 || x2 >= 1<<31 { // 题目要求每个数都要小于 2^31 - 1 = 2147483647,此处剪枝很关键! - return - } - if left == len(S) { - if !*isComplete { - *isComplete = true - *res = append(*res, x1) - *res = append(*res, x2) - } - return - } - if strings.HasPrefix(S[left:], strconv.Itoa(x1+x2)) && !*isComplete { - *res = append(*res, x1) - findRecursiveCheck(S, x2, x1+x2, left+len(strconv.Itoa(x1+x2)), res, isComplete) - return - } - if len(*res) > 0 && !*isComplete { - *res = (*res)[:len(*res)-1] - } - return -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0844.Backspace-String-Compare.md b/website/content/ChapterFour/0844.Backspace-String-Compare.md deleted file mode 100644 index fb758f3b0..000000000 --- a/website/content/ChapterFour/0844.Backspace-String-Compare.md +++ /dev/null @@ -1,111 +0,0 @@ -# [844. Backspace String Compare](https://leetcode.com/problems/backspace-string-compare/) - -## 题目 - -Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character. - - -**Example 1**: - -``` - -Input: S = "ab#c", T = "ad#c" -Output: true -Explanation: Both S and T become "ac". - -``` - -**Example 2**: - -``` - -Input: S = "ab##", T = "c#d#" -Output: true -Explanation: Both S and T become "". - -``` - -**Example 3**: - -``` - -Input: S = "a##c", T = "#a#c" -Output: true -Explanation: Both S and T become "c". - -``` - -**Example 4**: - -``` - -Input: S = "a#c", T = "b" -Output: false -Explanation: S becomes "c" while T becomes "b". - -``` - - -**Note**: - -- 1 <= S.length <= 200 -- 1 <= T.length <= 200 -- S and T only contain lowercase letters and '#' characters. - - -**Follow up**: - -- Can you solve it in O(N) time and O(1) space? - -## 题目大意 - - -给 2 个字符串,如果遇到 # 号字符,就回退一个字符。问最终的 2 个字符串是否完全一致。 - -## 解题思路 - -这一题可以用栈的思想来模拟,遇到 # 字符就回退一个字符。不是 # 号就入栈一个字符。比较最终 2 个字符串即可。 - - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -func backspaceCompare(S string, T string) bool { - s := make([]rune, 0) - for _, c := range S { - if c == '#' { - if len(s) > 0 { - s = s[:len(s)-1] - } - } else { - s = append(s, c) - } - } - s2 := make([]rune, 0) - for _, c := range T { - if c == '#' { - if len(s2) > 0 { - s2 = s2[:len(s2)-1] - } - } else { - s2 = append(s2, c) - } - } - return string(s) == string(s2) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0845.Longest-Mountain-in-Array.md b/website/content/ChapterFour/0845.Longest-Mountain-in-Array.md deleted file mode 100644 index 0f44f6739..000000000 --- a/website/content/ChapterFour/0845.Longest-Mountain-in-Array.md +++ /dev/null @@ -1,91 +0,0 @@ -# [845. Longest Mountain in Array](https://leetcode.com/problems/longest-mountain-in-array/) - -## 题目 - -Let's call any (contiguous) subarray B (of A) a mountain if the following properties hold: - -- B.length >= 3 -- There exists some 0 < i < B.length - 1 such that B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1] -(Note that B could be any subarray of A, including the entire array A.) - -Given an array A of integers, return the length of the longest mountain. - -Return 0 if there is no mountain. - - - - -**Example 1**: - -``` - -Input: [2,1,4,7,3,2,5] -Output: 5 -Explanation: The largest mountain is [1,4,7,3,2] which has length 5. - -``` - -**Example 2**: - -``` - -Input: [2,2,2] -Output: 0 -Explanation: There is no mountain. - -``` - -**Note**: - -- 0 <= A.length <= 10000 -- 0 <= A[i] <= 10000 - - -**Follow up**: - -- Can you solve it using only one pass? -- Can you solve it in O(1) space? - -## 题目大意 - -这道题考察的是滑动窗口的问题。 - -给出一个数组,要求求出这个数组里面“山”最长的长度。“山”的意思是,从一个数开始逐渐上升,到顶以后,逐渐下降。 - -## 解题思路 - -这道题解题思路也是滑动窗口,只不过在滑动的过程中多判断一个上升和下降的状态即可。 - - - -## 代码 - -```go - -package leetcode - -func longestMountain(A []int) int { - left, right, res, isAscending := 0, 0, 0, true - for left < len(A) { - if right+1 < len(A) && ((isAscending == true && A[right+1] > A[left] && A[right+1] > A[right]) || (right != left && A[right+1] < A[right])) { - if A[right+1] < A[right] { - isAscending = false - } - right++ - } else { - if right != left && isAscending == false { - res = max(res, right-left+1) - } - left++ - if right < left { - right = left - } - if right == left { - isAscending = true - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0850.Rectangle-Area-II.md b/website/content/ChapterFour/0850.Rectangle-Area-II.md deleted file mode 100755 index 29dbe94e4..000000000 --- a/website/content/ChapterFour/0850.Rectangle-Area-II.md +++ /dev/null @@ -1,293 +0,0 @@ -# [850. Rectangle Area II](https://leetcode.com/problems/rectangle-area-ii/) - - -## 题目 - -We are given a list of (axis-aligned) `rectangles`. Each `rectangle[i] = [x1, y1, x2, y2]` , where (x1, y1) are the coordinates of the bottom-left corner, and (x2, y2) are the coordinates of the top-right corner of the `i`th rectangle. - -Find the total area covered by all `rectangles` in the plane. Since the answer may be too large, **return it modulo 10^9 + 7**. - -![](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/06/06/rectangle_area_ii_pic.png) - -**Example 1**: - - Input: [[0,0,2,2],[1,0,2,3],[1,0,3,1]] - Output: 6 - Explanation: As illustrated in the picture. - -**Example 2**: - - Input: [[0,0,1000000000,1000000000]] - Output: 49 - Explanation: The answer is 10^18 modulo (10^9 + 7), which is (10^9)^2 = (-7)^2 = 49. - -**Note**: - -- `1 <= rectangles.length <= 200` -- `rectanges[i].length = 4` -- `0 <= rectangles[i][j] <= 10^9` -- The total area covered by all rectangles will never exceed `2^63 - 1` and thus will fit in a 64-bit signed integer. - - -## 题目大意 - -我们给出了一个(轴对齐的)矩形列表 rectangles。 对于 rectangle[i] = [x1, y1, x2, y2],其中(x1,y1)是矩形 i 左下角的坐标,(x2,y2)是该矩形右上角的坐标。找出平面中所有矩形叠加覆盖后的总面积。由于答案可能太大,请返回它对 10 ^ 9 + 7 取模的结果。 - -提示: - -- 1 <= rectangles.length <= 200 -- rectanges[i].length = 4 -- 0 <= rectangles[i][j] <= 10^9 -- 矩形叠加覆盖后的总面积不会超越 2^63 - 1 ,这意味着可以用一个 64 位有符号整数来保存面积结果。 - - -## 解题思路 - - -- 在二维坐标系中给出一些矩形,要求这些矩形合并之后的面积。由于矩形有重叠,所以需要考虑合并以后的面积。矩形的坐标值也会很大。 -- 这一题给人的感觉很像第 218 题,求天际线的过程也是有楼挡楼,重叠的情况。不过那一题只用求天际线的拐点,所以我们可以对区间做“右边界减一”的处理,防止两个相邻区间因为共点,而导致结果错误。但是这一题如果还是用相同的做法,就会出错,因为“右边界减一”以后,面积会少一部分,最终得到的结果也是偏小的。所以这一题要将线段树改造一下。 -- 思路是先讲 Y 轴上的坐标离线化,转换成线段树。将矩形的 2 条边变成扫描线,左边是入边,右边是出边。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_8.png) - -- 再从左往右遍历每条扫描线,并对 Y 轴上的线段树进行 update。X 轴上的每个坐标区间 * query 线段树总高度的结果 = 区间面积。最后将 X 轴对应的每个区间面积加起来,就是最终矩形合并以后的面积。如下图中间的图。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_9.png) - - 需要注意的一点是,**每次 query 的结果并不一定是连续线段**。如上图最右边的图,中间有一段是可能出现镂空的。这种情况看似复杂,其实很简单,因为每段线段树的线段代表的权值高度是不同的,每次 query 最大高度得到的结果已经考虑了中间可能有镂空的情况了。 - -- 具体做法,先把各个矩形在 Y 轴方向上离散化,这里的**线段树叶子节点不再是一个点了,而是一个区间长度为 1 的区间段**。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_0.png) - - 每个叶子节点也不再是存储一个 int 值,而是存 2 个值,一个是 count 值,用来记录这条区间被覆盖的次数,另一个值是 val 值,用来反映射该线段长度是多少,因为 Y 轴被离散化了,区间坐标间隔都是 1,但是实际 Y 轴的高度并不是 1 ,所以用 val 来反映射原来的高度。 - -- 初始化线段树,叶子节点的 count = 0,val 根据题目给的 Y 坐标进行计算。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_1.png) - -- 从左往右遍历每个扫描线。每条扫面线都把对应 update 更新到叶子节点。pushUp 的时候需要合并每个区间段的高度 val 值。如果有区间没有被覆盖,那么这个区间高度 val 为 0,这也就处理了可能“中间镂空”的情况。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_2.png) - - func (sat *SegmentAreaTree) pushUp(treeIndex, leftTreeIndex, rightTreeIndex int) { - newCount, newValue := sat.merge(sat.tree[leftTreeIndex].count, sat.tree[rightTreeIndex].count), 0 - if sat.tree[leftTreeIndex].count > 0 && sat.tree[rightTreeIndex].count > 0 { - newValue = sat.merge(sat.tree[leftTreeIndex].val, sat.tree[rightTreeIndex].val) - } else if sat.tree[leftTreeIndex].count > 0 && sat.tree[rightTreeIndex].count == 0 { - newValue = sat.tree[leftTreeIndex].val - } else if sat.tree[leftTreeIndex].count == 0 && sat.tree[rightTreeIndex].count > 0 { - newValue = sat.tree[rightTreeIndex].val - } - sat.tree[treeIndex] = SegmentItem{count: newCount, val: newValue} - } - -- 扫描每一个扫描线,先 pushDown 到叶子节点,再 pushUp 到根节点。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_3.png) - - ![](https://img.halfrost.com/Leetcode/leetcode_850_4.png) - - ![](https://img.halfrost.com/Leetcode/leetcode_850_5.png) - - ![](https://img.halfrost.com/Leetcode/leetcode_850_6.png) - -- 遍历到倒数第 2 根扫描线的时候就能得到结果了。因为最后一根扫描线 update 以后,整个线段树全部都归为初始化状态了。 - - ![](https://img.halfrost.com/Leetcode/leetcode_850_7.png) - -- 这一题是线段树扫面线解法的经典题。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func rectangleArea(rectangles [][]int) int { - sat, res := SegmentAreaTree{}, 0 - posXMap, posX, posYMap, posY, lines := discretization850(rectangles) - tmp := make([]int, len(posYMap)) - for i := 0; i < len(tmp)-1; i++ { - tmp[i] = posY[i+1] - posY[i] - } - sat.Init(tmp, func(i, j int) int { - return i + j - }) - for i := 0; i < len(posY)-1; i++ { - tmp[i] = posY[i+1] - posY[i] - } - for i := 0; i < len(posX)-1; i++ { - for _, v := range lines[posXMap[posX[i]]] { - sat.Update(posYMap[v.start], posYMap[v.end], v.state) - } - res += ((posX[i+1] - posX[i]) * sat.Query(0, len(posY)-1)) % 1000000007 - } - return res % 1000000007 -} - -func discretization850(positions [][]int) (map[int]int, []int, map[int]int, []int, map[int][]LineItem) { - tmpXMap, tmpYMap, posXArray, posXMap, posYArray, posYMap, lines := map[int]int{}, map[int]int{}, []int{}, map[int]int{}, []int{}, map[int]int{}, map[int][]LineItem{} - for _, pos := range positions { - tmpXMap[pos[0]]++ - tmpXMap[pos[2]]++ - } - for k := range tmpXMap { - posXArray = append(posXArray, k) - } - sort.Ints(posXArray) - for i, pos := range posXArray { - posXMap[pos] = i - } - - for _, pos := range positions { - tmpYMap[pos[1]]++ - tmpYMap[pos[3]]++ - tmp1 := lines[posXMap[pos[0]]] - tmp1 = append(tmp1, LineItem{start: pos[1], end: pos[3], state: 1}) - lines[posXMap[pos[0]]] = tmp1 - tmp2 := lines[posXMap[pos[2]]] - tmp2 = append(tmp2, LineItem{start: pos[1], end: pos[3], state: -1}) - lines[posXMap[pos[2]]] = tmp2 - } - for k := range tmpYMap { - posYArray = append(posYArray, k) - } - sort.Ints(posYArray) - for i, pos := range posYArray { - posYMap[pos] = i - } - return posXMap, posXArray, posYMap, posYArray, lines -} - -// LineItem define -type LineItem struct { // 垂直于 x 轴的线段 - start, end, state int // state = 1 代表进入,-1 代表离开 -} - -// SegmentItem define -type SegmentItem struct { - count int - val int -} - -// SegmentAreaTree define -type SegmentAreaTree struct { - data []int - tree []SegmentItem - left, right int - merge func(i, j int) int -} - -// Init define -func (sat *SegmentAreaTree) Init(nums []int, oper func(i, j int) int) { - sat.merge = oper - data, tree := make([]int, len(nums)), make([]SegmentItem, 4*len(nums)) - for i := 0; i < len(nums); i++ { - data[i] = nums[i] - } - sat.data, sat.tree = data, tree - if len(nums) > 0 { - sat.buildSegmentTree(0, 0, len(nums)-1) - } -} - -// 在 treeIndex 的位置创建 [left....right] 区间的线段树 -func (sat *SegmentAreaTree) buildSegmentTree(treeIndex, left, right int) { - if left == right-1 { - sat.tree[treeIndex] = SegmentItem{count: 0, val: sat.data[left]} - return - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, sat.leftChild(treeIndex), sat.rightChild(treeIndex) - sat.buildSegmentTree(leftTreeIndex, left, midTreeIndex) - sat.buildSegmentTree(rightTreeIndex, midTreeIndex, right) - sat.pushUp(treeIndex, leftTreeIndex, rightTreeIndex) -} - -func (sat *SegmentAreaTree) pushUp(treeIndex, leftTreeIndex, rightTreeIndex int) { - newCount, newValue := sat.merge(sat.tree[leftTreeIndex].count, sat.tree[rightTreeIndex].count), 0 - if sat.tree[leftTreeIndex].count > 0 && sat.tree[rightTreeIndex].count > 0 { - newValue = sat.merge(sat.tree[leftTreeIndex].val, sat.tree[rightTreeIndex].val) - } else if sat.tree[leftTreeIndex].count > 0 && sat.tree[rightTreeIndex].count == 0 { - newValue = sat.tree[leftTreeIndex].val - } else if sat.tree[leftTreeIndex].count == 0 && sat.tree[rightTreeIndex].count > 0 { - newValue = sat.tree[rightTreeIndex].val - } - sat.tree[treeIndex] = SegmentItem{count: newCount, val: newValue} -} - -func (sat *SegmentAreaTree) leftChild(index int) int { - return 2*index + 1 -} - -func (sat *SegmentAreaTree) rightChild(index int) int { - return 2*index + 2 -} - -// 查询 [left....right] 区间内的值 - -// Query define -func (sat *SegmentAreaTree) Query(left, right int) int { - if len(sat.data) > 0 { - return sat.queryInTree(0, 0, len(sat.data)-1, left, right) - } - return 0 -} - -func (sat *SegmentAreaTree) queryInTree(treeIndex, left, right, queryLeft, queryRight int) int { - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, sat.leftChild(treeIndex), sat.rightChild(treeIndex) - if left > queryRight || right < queryLeft { // segment completely outside range - return 0 // represents a null node - } - if queryLeft <= left && queryRight >= right { // segment completely inside range - if sat.tree[treeIndex].count > 0 { - return sat.tree[treeIndex].val - } - return 0 - } - if queryLeft > midTreeIndex { - return sat.queryInTree(rightTreeIndex, midTreeIndex, right, queryLeft, queryRight) - } else if queryRight <= midTreeIndex { - return sat.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, queryRight) - } - // merge query results - return sat.merge(sat.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, midTreeIndex), - sat.queryInTree(rightTreeIndex, midTreeIndex, right, midTreeIndex, queryRight)) -} - -// Update define -func (sat *SegmentAreaTree) Update(updateLeft, updateRight, val int) { - if len(sat.data) > 0 { - sat.updateInTree(0, 0, len(sat.data)-1, updateLeft, updateRight, val) - } -} - -func (sat *SegmentAreaTree) updateInTree(treeIndex, left, right, updateLeft, updateRight, val int) { - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, sat.leftChild(treeIndex), sat.rightChild(treeIndex) - if left > right || left >= updateRight || right <= updateLeft { // 由于叶子节点的区间不在是 left == right 所以这里判断需要增加等号的判断 - return // out of range. escape. - } - - if updateLeft <= left && right <= updateRight { // segment is fully within update range - if left == right-1 { - sat.tree[treeIndex].count = sat.merge(sat.tree[treeIndex].count, val) - } - if left != right-1 { // update lazy[] for children - sat.updateInTree(leftTreeIndex, left, midTreeIndex, updateLeft, updateRight, val) - sat.updateInTree(rightTreeIndex, midTreeIndex, right, updateLeft, updateRight, val) - sat.pushUp(treeIndex, leftTreeIndex, rightTreeIndex) - } - return - } - sat.updateInTree(leftTreeIndex, left, midTreeIndex, updateLeft, updateRight, val) - sat.updateInTree(rightTreeIndex, midTreeIndex, right, updateLeft, updateRight, val) - // merge updates - sat.pushUp(treeIndex, leftTreeIndex, rightTreeIndex) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0851.Loud-and-Rich.md b/website/content/ChapterFour/0851.Loud-and-Rich.md deleted file mode 100644 index 26351328b..000000000 --- a/website/content/ChapterFour/0851.Loud-and-Rich.md +++ /dev/null @@ -1,108 +0,0 @@ -# [851. Loud and Rich](https://leetcode.com/problems/loud-and-rich/) - - - -## 题目 - -In a group of N people (labelled `0, 1, 2, ..., N-1`), each person has different amounts of money, and different levels of quietness. - -For convenience, we'll call the person with label `x`, simply "person `x`". - -We'll say that `richer[i] = [x, y]` if person `x` definitely has more money than person `y`. Note that `richer` may only be a subset of valid observations. - -Also, we'll say `quiet = q` if person x has quietness `q`. - -Now, return `answer`, where `answer = y` if `y` is the least quiet person (that is, the person `y` with the smallest value of `quiet[y]`), among all people who definitely have equal to or more money than person `x`. - -**Example 1**: - -``` -Input: richer = [[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet = [3,2,5,4,6,1,7,0] -Output: [5,5,2,5,4,5,6,7] -Explanation: -answer[0] = 5. -Person 5 has more money than 3, which has more money than 1, which has more money than 0. -The only person who is quieter (has lower quiet[x]) is person 7, but -it isn't clear if they have more money than person 0. - -answer[7] = 7. -Among all people that definitely have equal to or more money than person 7 -(which could be persons 3, 4, 5, 6, or 7), the person who is the quietest (has lower quiet[x]) -is person 7. - -The other answers can be filled out with similar reasoning. -``` - -**Note**: - -1. `1 <= quiet.length = N <= 500` -2. `0 <= quiet[i] < N`, all `quiet[i]` are different. -3. `0 <= richer.length <= N * (N-1) / 2` -4. `0 <= richer[i][j] < N` -5. `richer[i][0] != richer[i][1]` -6. `richer[i]`'s are all different. -7. The observations in `richer` are all logically consistent. - -## 题目大意 - -在一组 N 个人(编号为 0, 1, 2, ..., N-1)中,每个人都有不同数目的钱,以及不同程度的安静(quietness)。为了方便起见,我们将编号为 x 的人简称为 "person x "。如果能够肯定 person x 比 person y 更有钱的话,我们会说 richer[i] = [x, y] 。注意 richer 可能只是有效观察的一个子集。另外,如果 person x 的安静程度为 q ,我们会说 quiet[x] = q 。现在,返回答案 answer ,其中 answer[x] = y 的前提是,在所有拥有的钱不少于 person x 的人中,person y 是最安静的人(也就是安静值 quiet[y] 最小的人)。 - -提示: - -- 1 <= quiet.length = N <= 500 -- 0 <= quiet[i] < N,所有 quiet[i] 都不相同。 -- 0 <= richer.length <= N * (N-1) / 2 -- 0 <= richer[i][j] < N -- richer[i][0] != richer[i][1] -- richer[i] 都是不同的。 -- 对 richer 的观察在逻辑上是一致的。 - - -## 解题思路 - -- 给出 2 个数组,richer 和 quiet,要求输出 answer,其中 answer = y 的前提是,在所有拥有的钱不少于 x 的人中,y 是最安静的人(也就是安静值 quiet[y] 最小的人) -- 由题意可知,`richer` 构成了一个有向无环图,首先使用字典建立图的关系,找到比当前下标编号富有的所有的人。然后使用广度优先层次遍历,不断的使用富有的人,但是安静值更小的人更新子节点即可。 -- 这一题还可以用拓扑排序来解答。将 `richer` 中描述的关系看做边,如果 `x > y`,则 `x` 指向 `y`。将 `quiet` 看成权值。用一个数组记录答案,初始时 `ans[i] = i`。然后对原图做拓扑排序,对于每一条边,如果发现 `quiet[ans[v]] > quiet[ans[u]]`,则 `ans[v]` 的答案为 `ans[u]`。时间复杂度即为拓扑排序的时间复杂度为 `O(m+n)`。空间复杂度需要 `O(m)` 的数组建图,需要 `O(n)` 的数组记录入度以及存储队列,所以空间复杂度为 `O(m+n)`。 - -## 代码 - -```go -func loudAndRich(richer [][]int, quiet []int) []int { - edges := make([][]int, len(quiet)) - for i := range edges { - edges[i] = []int{} - } - indegrees := make([]int, len(quiet)) - for _, edge := range richer { - n1, n2 := edge[0], edge[1] - edges[n1] = append(edges[n1], n2) - indegrees[n2]++ - } - res := make([]int, len(quiet)) - for i := range res { - res[i] = i - } - queue := []int{} - for i, v := range indegrees { - if v == 0 { - queue = append(queue, i) - } - } - for len(queue) > 0 { - nexts := []int{} - for _, n1 := range queue { - for _, n2 := range edges[n1] { - indegrees[n2]-- - if quiet[res[n2]] > quiet[res[n1]] { - res[n2] = res[n1] - } - if indegrees[n2] == 0 { - nexts = append(nexts, n2) - } - } - } - queue = nexts - } - return res -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0852.Peak-Index-in-a-Mountain-Array.md b/website/content/ChapterFour/0852.Peak-Index-in-a-Mountain-Array.md deleted file mode 100755 index ea6ae9421..000000000 --- a/website/content/ChapterFour/0852.Peak-Index-in-a-Mountain-Array.md +++ /dev/null @@ -1,91 +0,0 @@ -# [852. Peak Index in a Mountain Array](https://leetcode.com/problems/peak-index-in-a-mountain-array/) - - -## 题目 - -Let's call an array `A` a *mountain* if the following properties hold: - -- `A.length >= 3` -- There exists some `0 < i < A.length - 1` such that `A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]` - -Given an array that is definitely a mountain, return any `i` such that `A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]`. - -**Example 1**: - - Input: [0,1,0] - Output: 1 - -**Example 2**: - - Input: [0,2,1,0] - Output: 1 - -**Note**: - -1. `3 <= A.length <= 10000` -2. `0 <= A[i] <= 10^6` -3. A is a mountain, as defined above. - - -## 题目大意 - -我们把符合下列属性的数组 A 称作山脉: - -- A.length >= 3 -- 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] -给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i 的值。 - -提示: - -- 3 <= A.length <= 10000 -- 0 <= A[i] <= 10^6 -- A 是如上定义的山脉 - - - -## 解题思路 - -- 给出一个数组,数组里面存在有且仅有一个“山峰”,(山峰的定义是,下标 `i` 比 `i-1`、`i+1` 位置上的元素都要大),找到这个“山峰”,并输出其中一个山峰的下标。 -- 这一题直接用二分搜索即可,数组中的元素算基本有序。判断是否为山峰的条件为比较左右两个数,如果当前的数比左右两个数都大,即找到了山峰。其他的情况都在山坡上。这一题有两种写法,第一种写法是标准的二分写法,第二种写法是变形的二分写法。 - - -## 代码 - -```go - -package leetcode - -// 解法一 二分 -func peakIndexInMountainArray(A []int) int { - low, high := 0, len(A)-1 - for low <= high { - mid := low + (high-low)>>1 - if A[mid] > A[mid+1] && A[mid] > A[mid-1] { - return mid - } - if A[mid] > A[mid+1] && A[mid] < A[mid-1] { - high = mid - 1 - } - if A[mid] < A[mid+1] && A[mid] > A[mid-1] { - low = mid + 1 - } - } - return 0 -} - -// 解法二 二分 -func peakIndexInMountainArray1(A []int) int { - low, high := 0, len(A)-1 - for low < high { - mid := low + (high-low)>>1 - // 如果 mid 较大,则左侧存在峰值,high = m,如果 mid + 1 较大,则右侧存在峰值,low = mid + 1 - if A[mid] > A[mid+1] { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0853.Car-Fleet.md b/website/content/ChapterFour/0853.Car-Fleet.md deleted file mode 100755 index b28efdbd7..000000000 --- a/website/content/ChapterFour/0853.Car-Fleet.md +++ /dev/null @@ -1,98 +0,0 @@ -# [853. Car Fleet](https://leetcode.com/problems/car-fleet/) - - -## 题目 - -`N` cars are going to the same destination along a one lane road. The destination is `target` miles away. - -Each car `i` has a constant speed `speed[i]` (in miles per hour), and initial position `position[i]` miles towards the target along the road. - -A car can never pass another car ahead of it, but it can catch up to it, and drive bumper to bumper at the same speed. - -The distance between these two cars is ignored - they are assumed to have the same position. - -A *car fleet* is some non-empty set of cars driving at the same position and same speed. Note that a single car is also a car fleet. - -If a car catches up to a car fleet right at the destination point, it will still be considered as one car fleet. - -How many car fleets will arrive at the destination? - -**Example 1**: - - Input: target = 12, position = [10,8,0,5,3], speed = [2,4,1,1,3] - Output: 3 - Explanation: - The cars starting at 10 and 8 become a fleet, meeting each other at 12. - The car starting at 0 doesn't catch up to any other car, so it is a fleet by itself. - The cars starting at 5 and 3 become a fleet, meeting each other at 6. - Note that no other cars meet these fleets before the destination, so the answer is 3. - -**Note**: - -1. `0 <= N <= 10 ^ 4` -2. `0 < target <= 10 ^ 6` -3. `0 < speed[i] <= 10 ^ 6` -4. `0 <= position[i] < target` -5. All initial positions are different. - - -## 题目大意 - -N  辆车沿着一条车道驶向位于 target 英里之外的共同目的地。每辆车 i 以恒定的速度 speed[i] (英里/小时),从初始位置 position[i] (英里) 沿车道驶向目的地。 - -一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车以相同的速度紧接着行驶。此时,我们会忽略这两辆车之间的距离,也就是说,它们被假定处于相同的位置。车队 是一些由行驶在相同位置、具有相同速度的车组成的非空集合。注意,一辆车也可以是一个车队。即便一辆车在目的地才赶上了一个车队,它们仍然会被视作是同一个车队。 - - 问最后会有多少车队到达目的地? - - - -## 解题思路 - - -- 根据每辆车距离终点和速度,计算每辆车到达终点的时间,并按照距离从大到小排序(position 越大代表距离终点越近) -- 从头往后扫描排序以后的数组,时间一旦大于前一个 car 的时间,就会生成一个新的 car fleet,最终计数加一即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -type car struct { - time float64 - position int -} - -// ByPosition define -type ByPosition []car - -func (a ByPosition) Len() int { return len(a) } -func (a ByPosition) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a ByPosition) Less(i, j int) bool { return a[i].position > a[j].position } - -func carFleet(target int, position []int, speed []int) int { - n := len(position) - if n <= 1 { - return n - } - cars := make([]car, n) - for i := 0; i < n; i++ { - cars[i] = car{float64(target-position[i]) / float64(speed[i]), position[i]} - } - sort.Sort(ByPosition(cars)) - fleet, lastTime := 0, 0.0 - for i := 0; i < len(cars); i++ { - if cars[i].time > lastTime { - lastTime = cars[i].time - fleet++ - } - } - return fleet -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0856.Score-of-Parentheses.md b/website/content/ChapterFour/0856.Score-of-Parentheses.md deleted file mode 100644 index 9d5c8758e..000000000 --- a/website/content/ChapterFour/0856.Score-of-Parentheses.md +++ /dev/null @@ -1,102 +0,0 @@ -# [856. Score of Parentheses](https://leetcode.com/problems/score-of-parentheses/) - -## 题目 - -Given a balanced parentheses string S, compute the score of the string based on the following rule: - -() has score 1 -AB has score A + B, where A and B are balanced parentheses strings. -(A) has score 2 * A, where A is a balanced parentheses string. - - -**Example 1**: - -``` - -Input: "()" -Output: 1 - -``` - -**Example 2**: - -``` - -Input: "(())" -Output: 2 - -``` - -**Example 3**: - -``` - -Input: "()()" -Output: 2 - -``` - -**Example 4**: - -``` - -Input: "(()(()))" -Output: 6 - -``` - - -**Note**: - -1. S is a balanced parentheses string, containing only ( and ). -2. 2 <= S.length <= 50 - -## 题目大意 - -按照以下规则计算括号的分数:() 代表 1 分。AB 代表 A + B,A 和 B 分别是已经满足匹配规则的括号组。(A) 代表 2 * A,其中 A 也是已经满足匹配规则的括号组。给出一个括号字符串,要求按照这些规则计算出括号的分数值。 - - -## 解题思路 - -按照括号匹配的原则,一步步的计算每个组合的分数入栈。遇到题目中的 3 种情况,取出栈顶元素算分数。 - - -## 代码 - -```go - -package leetcode - -func scoreOfParentheses(S string) int { - res, stack, top, temp := 0, []int{}, -1, 0 - for _, s := range S { - if s == '(' { - stack = append(stack, -1) - top++ - } else { - temp = 0 - for stack[top] != -1 { - temp += stack[top] - stack = stack[:len(stack)-1] - top-- - } - stack = stack[:len(stack)-1] - top-- - if temp == 0 { - stack = append(stack, 1) - top++ - } else { - stack = append(stack, temp*2) - top++ - } - } - } - for len(stack) != 0 { - res += stack[top] - stack = stack[:len(stack)-1] - top-- - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0862.Shortest-Subarray-with-Sum-at-Least-K.md b/website/content/ChapterFour/0862.Shortest-Subarray-with-Sum-at-Least-K.md deleted file mode 100644 index 469ca3bd7..000000000 --- a/website/content/ChapterFour/0862.Shortest-Subarray-with-Sum-at-Least-K.md +++ /dev/null @@ -1,90 +0,0 @@ -# [862. Shortest Subarray with Sum at Least K](https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/) - - - -## 题目 - -Return the **length** of the shortest, non-empty, contiguous subarray of `A` with sum at least `K`. - -If there is no non-empty subarray with sum at least `K`, return `-1`. - -**Example 1**: - -``` -Input: A = [1], K = 1 -Output: 1 -``` - -**Example 2**: - -``` -Input: A = [1,2], K = 4 -Output: -1 -``` - -**Example 3**: - -``` -Input: A = [2,-1,2], K = 3 -Output: 3 -``` - -**Note**: - -1. `1 <= A.length <= 50000` -2. `-10 ^ 5 <= A[i] <= 10 ^ 5` -3. `1 <= K <= 10 ^ 9` - -## 题目大意 - -返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。如果没有和至少为 K 的非空子数组,返回 -1 。 - -提示: - -- 1 <= A.length <= 50000 -- -10 ^ 5 <= A[i] <= 10 ^ 5 -- 1 <= K <= 10 ^ 9 - - -## 解题思路 - -- 给出一个数组,要求找出一个最短的,非空的,连续的子序列且累加和至少为 k 。 -- 由于给的数组里面可能存在负数,所以子数组的累加和不会随着数组的长度增加而增加。题目中要求区间和,理所应当需要利用 `prefixSum` 前缀和,先计算出 `prefixSum` 前缀和。 -- 简化一下题目的要求,即能否找到 `prefixSum[y] - prefixSum[x] ≥ K` ,且 `y - x` 的差值最小。如果固定的 `y`,那么对于 `x`,`x` 越大,`y - x` 的差值就越小(因为 `x` 越逼近 `y`)。所以想求区间 `[x, y]` 的最短距离,需要保证 `y` 尽量小,`x` 尽量大,这样 `[x, y]` 区间距离最小。那么有以下 2 点“常识”一定成立: - 1. 如果 `x1 < x2` ,并且 `prefixSum[x2] ≤ prefixSum[x1]`,说明结果一定不会取 `x1`。因为如果 `prefixSum[x1] ≤ prefixSum[y] - k`,那么 `prefixSum[x2] ≤ prefixSum[x1] ≤ prefixSum[y] - k`,`x2` 也能满足题意,并且 `x2` 比 `x1` 更加接近 `y`,最优解一定优先考虑 `x2`。 - 2. 在确定了 `x` 以后,以后就不用再考虑 `x` 了,因为如果 `y2 > y1`,且 `y2` 的时候取 `x` 还是一样的,那么算距离的话,`y2 - x` 显然大于 `y1 - x`,这样的话肯定不会是最短的距离。 -- 从上面这两个常识来看,可以用双端队列 `deque` 来处理 `prefixSum`。`deque` 中存储的是递增的 `x` 下标,为了满足常识一。从双端队列的开头开始遍历,假如区间和之差大于等于 `K`,就移除队首元素并更新结果 `res`。队首移除元素,直到不满足 `prefixSum[i]-prefixSum[deque[0]] >= K` 这一不等式,是为了满足常识二。之后的循环是此题的精髓,从双端队列的末尾开始往前遍历,假如当前区间和 `prefixSum[i]` 小于等于队列末尾的区间和,则移除队列末尾元素。为什么这样处理呢?因为若数组都是正数,那么长度越长,区间和一定越大,则 `prefixSum[i]` 一定大于所有双端队列中的区间和,但由于可能存在负数,从而使得长度变长,区间总和反而减少了,之前的区间和之差值都没有大于等于 `K`(< K),现在的更不可能大于等于 `K`,这个结束位置可以直接淘汰,不用进行计算。循环结束后将当前位置加入双端队列即可。遇到新下标在队尾移除若干元素,这一行为,也是为了满足常识一。 -- 由于所有下标都只进队列一次,也最多 pop 出去一次,所以时间复杂度 O(n),空间复杂度 O(n)。 - -## 代码 - -```go -func shortestSubarray(A []int, K int) int { - res, prefixSum := len(A)+1, make([]int, len(A)+1) - for i := 0; i < len(A); i++ { - prefixSum[i+1] = prefixSum[i] + A[i] - } - // deque 中保存递增的 prefixSum 下标 - deque := []int{} - for i := range prefixSum { - // 下面这个循环希望能找到 [deque[0], i] 区间内累加和 >= K,如果找到了就更新答案 - for len(deque) > 0 && prefixSum[i]-prefixSum[deque[0]] >= K { - length := i - deque[0] - if res > length { - res = length - } - // 找到第一个 deque[0] 能满足条件以后,就移除它,因为它是最短长度的子序列了 - deque = deque[1:] - } - // 下面这个循环希望能保证 prefixSum[deque[i]] 递增 - for len(deque) > 0 && prefixSum[i] <= prefixSum[deque[len(deque)-1]] { - deque = deque[:len(deque)-1] - } - deque = append(deque, i) - } - if res <= len(A) { - return res - } - return -1 -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0863.All-Nodes-Distance-K-in-Binary-Tree.md b/website/content/ChapterFour/0863.All-Nodes-Distance-K-in-Binary-Tree.md deleted file mode 100644 index 4ea32b206..000000000 --- a/website/content/ChapterFour/0863.All-Nodes-Distance-K-in-Binary-Tree.md +++ /dev/null @@ -1,96 +0,0 @@ -# [863. All Nodes Distance K in Binary Tree](https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/) - - - -## 题目 - -We are given a binary tree (with root node `root`), a `target` node, and an integer value `K`. - -Return a list of the values of all nodes that have a distance `K` from the `target` node. The answer can be returned in any order. - -**Example 1**: - -``` -Input: root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2 - -Output: [7,4,1] - -Explanation: -The nodes that are a distance 2 from the target node (with value 5) -have values 7, 4, and 1. -``` - -![https://s3-lc-upload.s3.amazonaws.com/uploads/2018/06/28/sketch0.png](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/06/28/sketch0.png) - -**Note**: - -1. The given tree is non-empty. -2. Each node in the tree has unique values `0 <= node.val <= 500`. -3. The `target` node is a node in the tree. -4. `0 <= K <= 1000`. - -## 题目大意 - -给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。 - -提示: - -- 给定的树是非空的。 -- 树上的每个结点都具有唯一的值 0 <= node.val <= 500 。 -- 目标结点 target 是树上的结点。 -- 0 <= K <= 1000. - - -## 解题思路 - -- 给出一颗树和一个目标节点 target,一个距离 K,要求找到所有距离目标节点 target 的距离是 K 的点。 -- 这一题用 DFS 的方法解题。先找到当前节点距离目标节点的距离,如果在左子树中找到了 target,距离当前节点的距离 > 0,则还需要在它的右子树中查找剩下的距离。如果是在右子树中找到了 target,反之同理。如果当前节点就是目标节点,那么就可以直接记录这个点。否则每次遍历一个点,距离都减一。 - -## 代码 - -```go -func distanceK(root *TreeNode, target *TreeNode, K int) []int { - visit := []int{} - findDistanceK(root, target, K, &visit) - return visit -} - -func findDistanceK(root, target *TreeNode, K int, visit *[]int) int { - if root == nil { - return -1 - } - if root == target { - findChild(root, K, visit) - return K - 1 - } - leftDistance := findDistanceK(root.Left, target, K, visit) - if leftDistance == 0 { - findChild(root, leftDistance, visit) - } - if leftDistance > 0 { - findChild(root.Right, leftDistance-1, visit) - return leftDistance - 1 - } - rightDistance := findDistanceK(root.Right, target, K, visit) - if rightDistance == 0 { - findChild(root, rightDistance, visit) - } - if rightDistance > 0 { - findChild(root.Left, rightDistance-1, visit) - return rightDistance - 1 - } - return -1 -} - -func findChild(root *TreeNode, K int, visit *[]int) { - if root == nil { - return - } - if K == 0 { - *visit = append(*visit, root.Val) - } else { - findChild(root.Left, K-1, visit) - findChild(root.Right, K-1, visit) - } -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0864.Shortest-Path-to-Get-All-Keys.md b/website/content/ChapterFour/0864.Shortest-Path-to-Get-All-Keys.md deleted file mode 100755 index d6d65b49c..000000000 --- a/website/content/ChapterFour/0864.Shortest-Path-to-Get-All-Keys.md +++ /dev/null @@ -1,231 +0,0 @@ -# [864. Shortest Path to Get All Keys](https://leetcode.com/problems/shortest-path-to-get-all-keys/) - - -## 题目 - -We are given a 2-dimensional `grid`. `"."` is an empty cell, `"#"` is a wall, `"@"` is the starting point, (`"a"`, `"b"`, ...) are keys, and (`"A"`, `"B"`, ...) are locks. - -We start at the starting point, and one move consists of walking one space in one of the 4 cardinal directions. We cannot walk outside the grid, or walk into a wall. If we walk over a key, we pick it up. We can't walk over a lock unless we have the corresponding key. - -For some 1 <= K <= 6, there is exactly one lowercase and one uppercase letter of the first `K` letters of the English alphabet in the grid. This means that there is exactly one key for each lock, and one lock for each key; and also that the letters used to represent the keys and locks were chosen in the same order as the English alphabet. - -Return the lowest number of moves to acquire all keys. If it's impossible, return `-1`. - -**Example 1**: - - Input: ["@.a.#","###.#","b.A.B"] - Output: 8 - -**Example 2**: - - Input: ["@..aA","..B#.","....b"] - Output: 6 - -**Note**: - -1. `1 <= grid.length <= 30` -2. `1 <= grid[0].length <= 30` -3. `grid[i][j]` contains only `'.'`, `'#'`, `'@'`, `'a'-'f'` and `'A'-'F'` -4. The number of keys is in `[1, 6]`. Each key has a different letter and opens exactly one lock. - - -## 题目大意 - -给定一个二维网格 grid。 "." 代表一个空房间, "#" 代表一堵墙, "@" 是起点,("a", "b", ...)代表钥匙,("A", "B", ...)代表锁。 - -我们从起点开始出发,一次移动是指向四个基本方向之一行走一个单位空间。我们不能在网格外面行走,也无法穿过一堵墙。如果途经一个钥匙,我们就把它捡起来。除非我们手里有对应的钥匙,否则无法通过锁。 - -假设 K 为钥匙/锁的个数,且满足 1 <= K <= 6,字母表中的前 K 个字母在网格中都有自己对应的一个小写和一个大写字母。换言之,每个锁有唯一对应的钥匙,每个钥匙也有唯一对应的锁。另外,代表钥匙和锁的字母互为大小写并按字母顺序排列。 - -返回获取所有钥匙所需要的移动的最少次数。如果无法获取所有钥匙,返回 -1 。 - -提示: - -1. 1 <= grid.length <= 30 -2. 1 <= grid[0].length <= 30 -3. grid[i][j] 只含有 '.', '#', '@', 'a'-'f' 以及 'A'-'F' -4. 钥匙的数目范围是 [1, 6],每个钥匙都对应一个不同的字母,正好打开一个对应的锁。 - - -## 解题思路 - - -- 给出一个地图,在图中有钥匙和锁,当锁在没有钥匙的时候不能通行,问从起点 @ 开始,到最终获得所有钥匙,最短需要走多少步。 -- 这一题可以用 BFS 来解答。由于钥匙的种类比较多,所以 visited 数组需要 3 个维度,一个是 x 坐标,一个是 y 坐标,最后一个是当前获取钥匙的状态。每把钥匙都有获取了和没有获取两种状态,题目中说最多有 6 把钥匙,那么排列组合最多是 2^6 = 64 种状态。用一个十进制数的二进制位来压缩这些状态,二进制位分别来表示这些钥匙是否已经获取了。既然钥匙的状态可以压缩,其实 x 和 y 的坐标也可以一并压缩到这个数中。BFS 中存的数字是坐标 + 钥匙状态的状态。在 BFS 遍历的过程中,用 visited 数组来过滤遍历过的情况,来保证走的路是最短的。其他的情况无非是判断锁的状态,是否能通过,判断钥匙获取状态。 -- 这一题不知道是否能用 DFS 来解答。我实现了一版,但是在 18 / 35 这组 case 上超时了,具体 case 见测试文件第一个 case。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - "strings" -) - -// 解法一 BFS,利用状态压缩来过滤筛选状态 -func shortestPathAllKeys(grid []string) int { - if len(grid) == 0 { - return 0 - } - board, visited, startx, starty, res, fullKeys := make([][]byte, len(grid)), make([][][]bool, len(grid)), 0, 0, 0, 0 - for i := 0; i < len(grid); i++ { - board[i] = make([]byte, len(grid[0])) - } - for i, g := range grid { - board[i] = []byte(g) - for _, v := range g { - if v == 'a' || v == 'b' || v == 'c' || v == 'd' || v == 'e' || v == 'f' { - fullKeys |= (1 << uint(v-'a')) - } - } - if strings.Contains(g, "@") { - startx, starty = i, strings.Index(g, "@") - } - } - for i := 0; i < len(visited); i++ { - visited[i] = make([][]bool, len(board[0])) - } - for i := 0; i < len(board); i++ { - for j := 0; j < len(board[0]); j++ { - visited[i][j] = make([]bool, 64) - } - } - queue := []int{} - queue = append(queue, (starty<<16)|(startx<<8)) - visited[startx][starty][0] = true - for len(queue) != 0 { - qLen := len(queue) - for i := 0; i < qLen; i++ { - state := queue[0] - queue = queue[1:] - starty, startx = state>>16, (state>>8)&0xFF - keys := state & 0xFF - if keys == fullKeys { - return res - } - for i := 0; i < 4; i++ { - newState := keys - nx := startx + dir[i][0] - ny := starty + dir[i][1] - if !isInBoard(board, nx, ny) { - continue - } - if board[nx][ny] == '#' { - continue - } - flag, canThroughLock := keys&(1<<(board[nx][ny]-'A')), false - if flag != 0 { - canThroughLock = true - } - if isLock(board, nx, ny) && !canThroughLock { - continue - } - if isKey(board, nx, ny) { - newState |= (1 << (board[nx][ny] - 'a')) - } - if visited[nx][ny][newState] { - continue - } - queue = append(queue, (ny<<16)|(nx<<8)|newState) - visited[nx][ny][newState] = true - } - } - res++ - } - return -1 -} - -// 解法二 DFS,但是超时了,剪枝条件不够强 -func shortestPathAllKeys1(grid []string) int { - if len(grid) == 0 { - return 0 - } - board, visited, startx, starty, res, fullKeys := make([][]byte, len(grid)), make([][][]bool, len(grid)), 0, 0, math.MaxInt64, 0 - for i := 0; i < len(grid); i++ { - board[i] = make([]byte, len(grid[0])) - } - for i, g := range grid { - board[i] = []byte(g) - for _, v := range g { - if v == 'a' || v == 'b' || v == 'c' || v == 'd' || v == 'e' || v == 'f' { - fullKeys |= (1 << uint(v-'a')) - } - } - if strings.Contains(g, "@") { - startx, starty = i, strings.Index(g, "@") - } - } - for i := 0; i < len(visited); i++ { - visited[i] = make([][]bool, len(board[0])) - } - for i := 0; i < len(board); i++ { - for j := 0; j < len(board[0]); j++ { - visited[i][j] = make([]bool, 64) - } - } - searchKeys(board, &visited, fullKeys, 0, (starty<<16)|(startx<<8), &res, []int{}) - if res == math.MaxInt64 { - return -1 - } - return res - 1 -} - -func searchKeys(board [][]byte, visited *[][][]bool, fullKeys, step, state int, res *int, path []int) { - y, x := state>>16, (state>>8)&0xFF - keys := state & 0xFF - - if keys == fullKeys { - *res = min(*res, step) - return - } - - flag, canThroughLock := keys&(1<<(board[x][y]-'A')), false - if flag != 0 { - canThroughLock = true - } - newState := keys - //fmt.Printf("x = %v y = %v fullKeys = %v keys = %v step = %v res = %v path = %v state = %v\n", x, y, fullKeys, keys, step, *res, path, state) - if (board[x][y] != '#' && !isLock(board, x, y)) || (isLock(board, x, y) && canThroughLock) { - if isKey(board, x, y) { - newState |= (1 << uint(board[x][y]-'a')) - } - (*visited)[x][y][newState] = true - path = append(path, x) - path = append(path, y) - - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - if isInBoard(board, nx, ny) && !(*visited)[nx][ny][newState] { - searchKeys(board, visited, fullKeys, step+1, (ny<<16)|(nx<<8)|newState, res, path) - } - } - (*visited)[x][y][keys] = false - path = path[:len(path)-1] - path = path[:len(path)-1] - } -} - -func isLock(board [][]byte, x, y int) bool { - if (board[x][y] == 'A') || (board[x][y] == 'B') || - (board[x][y] == 'C') || (board[x][y] == 'D') || - (board[x][y] == 'E') || (board[x][y] == 'F') { - return true - } - return false -} - -func isKey(board [][]byte, x, y int) bool { - if (board[x][y] == 'a') || (board[x][y] == 'b') || - (board[x][y] == 'c') || (board[x][y] == 'd') || - (board[x][y] == 'e') || (board[x][y] == 'f') { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0867.Transpose-Matrix.md b/website/content/ChapterFour/0867.Transpose-Matrix.md deleted file mode 100755 index 379b9b25b..000000000 --- a/website/content/ChapterFour/0867.Transpose-Matrix.md +++ /dev/null @@ -1,57 +0,0 @@ -# [867. Transpose Matrix](https://leetcode.com/problems/transpose-matrix/) - - -## 题目 - -Given a matrix `A`, return the transpose of `A`. - -The transpose of a matrix is the matrix flipped over it's main diagonal, switching the row and column indices of the matrix. - -**Example 1**: - - Input: [[1,2,3],[4,5,6],[7,8,9]] - Output: [[1,4,7],[2,5,8],[3,6,9]] - -**Example 2**: - - Input: [[1,2,3],[4,5,6]] - Output: [[1,4],[2,5],[3,6]] - -**Note**: - -1. `1 <= A.length <= 1000` -2. `1 <= A[0].length <= 1000` - - -## 题目大意 - -给定一个矩阵 A, 返回 A 的转置矩阵。矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。 - - -## 解题思路 - - -- 给出一个矩阵,顺时针旋转 90° -- 解题思路很简单,直接模拟即可。 - - -## 代码 - -```go - -package leetcode - -func transpose(A [][]int) [][]int { - row, col, result := len(A), len(A[0]), make([][]int, len(A[0])) - for i := range result { - result[i] = make([]int, row) - } - for i := 0; i < row; i++ { - for j := 0; j < col; j++ { - result[j][i] = A[i][j] - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0872.Leaf-Similar-Trees.md b/website/content/ChapterFour/0872.Leaf-Similar-Trees.md deleted file mode 100644 index 900b7e746..000000000 --- a/website/content/ChapterFour/0872.Leaf-Similar-Trees.md +++ /dev/null @@ -1,62 +0,0 @@ -# [872. Leaf-Similar Trees](https://leetcode.com/problems/leaf-similar-trees/) - - - -## 题目 - -Consider all the leaves of a binary tree. From left to right order, the values of those leaves form a *leaf value sequence.* - -![https://s3-lc-upload.s3.amazonaws.com/uploads/2018/07/16/tree.png](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/07/16/tree.png) - -For example, in the given tree above, the leaf value sequence is `(6, 7, 4, 9, 8)`. - -Two binary trees are considered *leaf-similar* if their leaf value sequence is the same. - -Return `true` if and only if the two given trees with head nodes `root1` and `root2` are leaf-similar. - -**Note**: - -- Both of the given trees will have between `1` and `100` nodes. - -## 题目大意 - -请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。举个例子,如上图所示,给定一颗叶值序列为 (6, 7, 4, 9, 8) 的树。如果有两颗二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。如果给定的两个头结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。 - -提示: - -- 给定的两颗树可能会有 1 到 200 个结点。 -- 给定的两颗树上的值介于 0 到 200 之间。 - -## 解题思路 - -- 给出 2 棵树,如果 2 棵树的叶子节点组成的数组是完全一样的,那么就认为这 2 棵树是“叶子相似”的。给出任何 2 棵树判断这 2 棵树是否是“叶子相似”的。 -- 简单题,分别 DFS 遍历 2 棵树,把叶子节点都遍历出来,然后分别比较叶子节点组成的数组是否完全一致即可。 - -## 代码 - -```go -func leafSimilar(root1 *TreeNode, root2 *TreeNode) bool { - leaf1, leaf2 := []int{}, []int{} - dfsLeaf(root1, &leaf1) - dfsLeaf(root2, &leaf2) - if len(leaf1) != len(leaf2) { - return false - } - for i := range leaf1 { - if leaf1[i] != leaf2[i] { - return false - } - } - return true -} - -func dfsLeaf(root *TreeNode, leaf *[]int) { - if root != nil { - if root.Left == nil && root.Right == nil { - *leaf = append(*leaf, root.Val) - } - dfsLeaf(root.Left, leaf) - dfsLeaf(root.Right, leaf) - } -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0875.Koko-Eating-Bananas.md b/website/content/ChapterFour/0875.Koko-Eating-Bananas.md deleted file mode 100755 index f2c7c411c..000000000 --- a/website/content/ChapterFour/0875.Koko-Eating-Bananas.md +++ /dev/null @@ -1,101 +0,0 @@ -# [875. Koko Eating Bananas](https://leetcode.com/problems/koko-eating-bananas/) - - -## 题目 - -Koko loves to eat bananas. There are `N` piles of bananas, the `i`-th pile has `piles[i]` bananas. The guards have gone and will come back in `H` hours. - -Koko can decide her bananas-per-hour eating speed of `K`. Each hour, she chooses some pile of bananas, and eats K bananas from that pile. If the pile has less than `K` bananas, she eats all of them instead, and won't eat any more bananas during this hour. - -Koko likes to eat slowly, but still wants to finish eating all the bananas before the guards come back. - -Return the minimum integer `K` such that she can eat all the bananas within `H` hours. - -**Example 1**: - - Input: piles = [3,6,7,11], H = 8 - Output: 4 - -**Example 2**: - - Input: piles = [30,11,23,4,20], H = 5 - Output: 30 - -**Example 3**: - - Input: piles = [30,11,23,4,20], H = 6 - Output: 23 - -**Note**: - -- `1 <= piles.length <= 10^4` -- `piles.length <= H <= 10^9` -- `1 <= piles[i] <= 10^9` - - -## 题目大意 - - -珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 - -珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。   - -珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。 - -返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。 - -提示: - -- 1 <= piles.length <= 10^4 -- piles.length <= H <= 10^9 -- 1 <= piles[i] <= 10^9 - - - -## 解题思路 - - -- 给出一个数组,数组里面每个元素代表的是每个香蕉🍌串上香蕉的个数。koko 以 `k 个香蕉/小时`的速度吃这些香蕉。守卫会在 `H 小时`以后回来。问 k 至少为多少,能在守卫回来之前吃完所有的香蕉。当香蕉的个数小于 k 的时候,这个小时只能吃完这些香蕉,不能再吃其他串上的香蕉了。 -- 这一题可以用二分搜索来解答。在 `[0 , max(piles)]` 的范围内搜索,二分的过程都是常规思路。判断是否左右边界如果划分的时候需要注意题目中给的限定条件。当香蕉个数小于 k 的时候,那个小时不能再吃其他香蕉了。 - - -## 代码 - -```go - -package leetcode - -import "math" - -func minEatingSpeed(piles []int, H int) int { - low, high := 1, maxInArr(piles) - for low < high { - mid := low + (high-low)>>1 - if !isPossible(piles, mid, H) { - low = mid + 1 - } else { - high = mid - } - } - return low -} - -func isPossible(piles []int, h, H int) bool { - res := 0 - for _, p := range piles { - res += int(math.Ceil(float64(p) / float64(h))) - } - return res <= H -} - -func maxInArr(xs []int) int { - res := 0 - for _, x := range xs { - if res < x { - res = x - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0876.Middle-of-the-Linked-List.md b/website/content/ChapterFour/0876.Middle-of-the-Linked-List.md deleted file mode 100644 index b9f801fd2..000000000 --- a/website/content/ChapterFour/0876.Middle-of-the-Linked-List.md +++ /dev/null @@ -1,82 +0,0 @@ -# [876. Middle of the Linked List](https://leetcode.com/problems/middle-of-the-linked-list/) - -## 题目 - -Given a non-empty, singly linked list with head node head, return a middle node of linked list. - -If there are two middle nodes, return the second middle node. - -**Example 1**: - -``` - -Input: [1,2,3,4,5] -Output: Node 3 from this list (Serialization: [3,4,5]) -The returned node has value 3. (The judge's serialization of this node is [3,4,5]). -Note that we returned a ListNode object ans, such that: -ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL. - -``` - -**Example 2**: - -``` - -Input: [1,2,3,4,5,6] -Output: Node 4 from this list (Serialization: [4,5,6]) -Since the list has two middle nodes with values 3 and 4, we return the second one. - -``` - -**Note**: - -- The number of nodes in the given list will be between 1 and 100. - -## 题目大意 - -输出链表中间结点。这题在前面题目中反复出现了很多次了。 - -如果链表长度是奇数,输出中间结点是中间结点。如果链表长度是双数,输出中间结点是中位数后面的那个结点。 - -## 解题思路 - -这道题有一个很简单的做法,用 2 个指针只遍历一次就可以找到中间节点。一个指针每次移动 2 步,另外一个指针每次移动 1 步,当快的指针走到终点的时候,慢的指针就是中间节点。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -func middleNode(head *ListNode) *ListNode { - if head == nil || head.Next == nil { - return head - } - p1 := head - p2 := head - for p2.Next != nil && p2.Next.Next != nil { - p1 = p1.Next - p2 = p2.Next.Next - } - length := 0 - cur := head - for cur != nil { - length++ - cur = cur.Next - } - if length%2 == 0 { - return p1.Next - } - return p1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0878.Nth-Magical-Number.md b/website/content/ChapterFour/0878.Nth-Magical-Number.md deleted file mode 100755 index d78c5ed96..000000000 --- a/website/content/ChapterFour/0878.Nth-Magical-Number.md +++ /dev/null @@ -1,81 +0,0 @@ -# [878. Nth Magical Number](https://leetcode.com/problems/nth-magical-number/) - - -## 题目 - -A positive integer is *magical* if it is divisible by either A or B. - -Return the N-th magical number. Since the answer may be very large, **return it modulo** `10^9 + 7`. - -**Example 1**: - - Input: N = 1, A = 2, B = 3 - Output: 2 - -**Example 2**: - - Input: N = 4, A = 2, B = 3 - Output: 6 - -**Example 3**: - - Input: N = 5, A = 2, B = 4 - Output: 10 - -**Example 4**: - - Input: N = 3, A = 6, B = 4 - Output: 8 - -**Note**: - -1. `1 <= N <= 10^9` -2. `2 <= A <= 40000` -3. `2 <= B <= 40000` - - -## 题目大意 - - -如果正整数可以被 A 或 B 整除,那么它是神奇的。返回第 N 个神奇数字。由于答案可能非常大,返回它模 10^9 + 7 的结果。 - - -提示: - -1. 1 <= N <= 10^9 -2. 2 <= A <= 40000 -3. 2 <= B <= 40000 - - -## 解题思路 - - -- 给出 3 个数字,a,b,n。要求输出可以整除 a 或者整除 b 的第 n 个数。 -- 这一题是第 1201 题的缩水版,代码和解题思路也基本不变,这一题的二分搜索的区间是 `[min(A, B),N * min(A, B)] = [2, 10 ^ 14]`。其他代码和第 1201 题一致,思路见第 1201 题。 - - -## 代码 - -```go - -package leetcode - -func nthMagicalNumber(N int, A int, B int) int { - low, high := int64(0), int64(1*1e14) - for low < high { - mid := low + (high-low)>>1 - if calNthMagicalCount(mid, int64(A), int64(B)) < int64(N) { - low = mid + 1 - } else { - high = mid - } - } - return int(low) % 1000000007 -} - -func calNthMagicalCount(num, a, b int64) int64 { - ab := a * b / gcd(a, b) - return num/a + num/b - num/ab -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0880.Decoded-String-at-Index.md b/website/content/ChapterFour/0880.Decoded-String-at-Index.md deleted file mode 100644 index 960564387..000000000 --- a/website/content/ChapterFour/0880.Decoded-String-at-Index.md +++ /dev/null @@ -1,104 +0,0 @@ -# [880. Decoded String at Index](https://leetcode.com/problems/decoded-string-at-index/) - -## 题目 - -An encoded string S is given. To find and write the decoded string to a tape, the encoded string is read one character at a time and the following steps are taken: - -If the character read is a letter, that letter is written onto the tape. -If the character read is a digit (say d), the entire current tape is repeatedly written d-1 more times in total. -Now for some encoded string S, and an index K, find and return the K-th letter (1 indexed) in the decoded string. - - - -**Example 1**: - -``` - -Input: S = "leet2code3", K = 10 -Output: "o" -Explanation: -The decoded string is "leetleetcodeleetleetcodeleetleetcode". -The 10th letter in the string is "o". - -``` - -**Example 2**: - -``` - -Input: S = "ha22", K = 5 -Output: "h" -Explanation: -The decoded string is "hahahaha". The 5th letter is "h". - -``` - -**Example 3**: - -``` - -Input: S = "a2345678999999999999999", K = 1 -Output: "a" -Explanation: -The decoded string is "a" repeated 8301530446056247680 times. The 1st letter is "a". - -``` - -**Note**: - -1. 2 <= S.length <= 100 -2. S will only contain lowercase letters and digits 2 through 9. -3. S starts with a letter. -4. 1 <= K <= 10^9 -5. The decoded string is guaranteed to have less than 2^63 letters. - -## 题目大意 - -给定一个编码字符串 S。为了找出解码字符串并将其写入磁带,从编码字符串中每次读取一个字符,并采取以下步骤: - -- 如果所读的字符是字母,则将该字母写在磁带上。 -- 如果所读的字符是数字(例如 d),则整个当前磁带总共会被重复写 d-1 次。 - -现在,对于给定的编码字符串 S 和索引 K,查找并返回解码字符串中的第 K 个字母。 - - -## 解题思路 - -按照题意,扫描字符串扫到数字的时候,开始重复字符串,这里可以用递归。注意在重复字符串的时候到第 K 个字符的时候就可以返回了,不要等所有字符都扩展完成,这样会超时。d 有可能超大。 - - -## 代码 - -```go - -package leetcode - -func isLetter(char byte) bool { - if char >= 'a' && char <= 'z' { - return true - } - return false -} - -func decodeAtIndex(S string, K int) string { - length := 0 - for i := 0; i < len(S); i++ { - if isLetter(S[i]) { - length++ - if length == K { - return string(S[i]) - } - } else { - if length*int(S[i]-'0') >= K { - if K%length != 0 { - return decodeAtIndex(S[:i], K%length) - } - return decodeAtIndex(S[:i], length) - } - length *= int(S[i] - '0') - } - } - return "" -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0881.Boats-to-Save-People.md b/website/content/ChapterFour/0881.Boats-to-Save-People.md deleted file mode 100644 index 2af2b88d5..000000000 --- a/website/content/ChapterFour/0881.Boats-to-Save-People.md +++ /dev/null @@ -1,90 +0,0 @@ -# [881. Boats to Save People](https://leetcode.com/problems/boats-to-save-people/) - -## 题目 - -The i-th person has weight people[i], and each boat can carry a maximum weight of limit. - -Each boat carries at most 2 people at the same time, provided the sum of the weight of those people is at most limit. - -Return the minimum number of boats to carry every given person. (It is guaranteed each person can be carried by a boat.) - - -**Example 1**: - -``` - -Input: people = [1,2], limit = 3 -Output: 1 -Explanation: 1 boat (1, 2) - -``` - - -**Example 2**: - -``` - -Input: people = [3,2,2,1], limit = 3 -Output: 3 -Explanation: 3 boats (1, 2), (2) and (3) - -``` - - -**Example 3**: - -``` - -Input: people = [3,5,3,4], limit = 5 -Output: 4 -Explanation: 4 boats (3), (3), (4), (5) - -``` - -**Note**: - -- 1 <= people.length <= 50000 -- 1 <= people[i] <= limit <= 30000 - - -## 题目大意 - -给出人的重量数组,和一个船最大载重量 limit。一个船最多装 2 个人。要求输出装下所有人,最小需要多少艘船。 - -## 解题思路 - -先对人的重量进行排序,然后用 2 个指针分别指向一前一后,一起计算这两个指针指向的重量之和,如果小于 limit,左指针往右移动,并且右指针往左移动。如果大于等于 limit,右指针往左移动。每次指针移动,需要船的个数都要 ++。 - - - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func numRescueBoats(people []int, limit int) int { - sort.Ints(people) - left, right, res := 0, len(people)-1, 0 - for left <= right { - if left == right { - res++ - return res - } - if people[left]+people[right] <= limit { - left++ - right-- - } else { - right-- - } - res++ - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0884.Uncommon-Words-from-Two-Sentences.md b/website/content/ChapterFour/0884.Uncommon-Words-from-Two-Sentences.md deleted file mode 100755 index 66fc23b03..000000000 --- a/website/content/ChapterFour/0884.Uncommon-Words-from-Two-Sentences.md +++ /dev/null @@ -1,66 +0,0 @@ -# [884. Uncommon Words from Two Sentences](https://leetcode.com/problems/uncommon-words-from-two-sentences/) - - -## 题目 - -We are given two sentences `A` and `B`. (A *sentence* is a string of space separated words. Each *word* consists only of lowercase letters.) - -A word is *uncommon* if it appears exactly once in one of the sentences, and does not appear in the other sentence. - -Return a list of all uncommon words. - -You may return the list in any order. - -**Example 1**: - - Input: A = "this apple is sweet", B = "this apple is sour" - Output: ["sweet","sour"] - -**Example 2**: - - Input: A = "apple apple", B = "banana" - Output: ["banana"] - -**Note**: - -1. `0 <= A.length <= 200` -2. `0 <= B.length <= 200` -3. `A` and `B` both contain only spaces and lowercase letters. - - -## 题目大意 - -给定两个句子 A 和 B 。(句子是一串由空格分隔的单词。每个单词仅由小写字母组成。) - -如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。返回所有不常用单词的列表。您可以按任何顺序返回列表。 - - -## 解题思路 - -- 找出 2 个句子中不同的单词,将它们俩都打印出来。简单题,先将 2 个句子的单词都拆开放入 map 中进行词频统计,不同的两个单词的词频肯定都为 1,输出它们即可。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func uncommonFromSentences(A string, B string) []string { - m, res := map[string]int{}, []string{} - for _, s := range []string{A, B} { - for _, word := range strings.Split(s, " ") { - m[word]++ - } - } - for key := range m { - if m[key] == 1 { - res = append(res, key) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0885.Spiral-Matrix-III.md b/website/content/ChapterFour/0885.Spiral-Matrix-III.md deleted file mode 100755 index 0a80d2e00..000000000 --- a/website/content/ChapterFour/0885.Spiral-Matrix-III.md +++ /dev/null @@ -1,84 +0,0 @@ -# [885. Spiral Matrix III](https://leetcode.com/problems/spiral-matrix-iii/) - - -## 题目 - -On a 2 dimensional grid with `R` rows and `C` columns, we start at `(r0, c0)` facing east. - -Here, the north-west corner of the grid is at the first row and column, and the south-east corner of the grid is at the last row and column. - -Now, we walk in a clockwise spiral shape to visit every position in this grid. - -Whenever we would move outside the boundary of the grid, we continue our walk outside the grid (but may return to the grid boundary later.) - -Eventually, we reach all `R * C` spaces of the grid. - -Return a list of coordinates representing the positions of the grid in the order they were visited. - -**Example 1**: - - Input: R = 1, C = 4, r0 = 0, c0 = 0 - Output: [[0,0],[0,1],[0,2],[0,3]] - -![](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/08/24/example_1.png) - -**Example 2**: - - Input: R = 5, C = 6, r0 = 1, c0 = 4 - Output: [[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4], - [3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1], - [0,1],[4,0],[3,0],[2,0],[1,0],[0,0]] - -![](https://s3-lc-upload.s3.amazonaws.com/uploads/2018/08/24/example_2.png) - -**Note**: - -1. `1 <= R <= 100` -2. `1 <= C <= 100` -3. `0 <= r0 < R` -4. `0 <= c0 < C` - - -## 题目大意 - -在 R 行 C 列的矩阵上,我们从 (r0, c0) 面朝东面开始。这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。现在,我们以顺时针按螺旋状行走,访问此网格中的每个位置。每当我们移动到网格的边界之外时,我们会继续在网格之外行走(但稍后可能会返回到网格边界)。最终,我们到过网格的所有 R * C 个空间。 - -要求输出按照访问顺序返回表示网格位置的坐标列表。 - - -## 解题思路 - - -- 给出一个二维数组的行 `R`,列 `C`,以及这个数组中的起始点 `(r0,c0)`。从这个起始点开始出发,螺旋的访问数组中各个点,输出途径经过的每个坐标。注意每个螺旋的步长在变长,第一个螺旋是 1 步,第二个螺旋是 1 步,第三个螺旋是 2 步,第四个螺旋是 2 步……即 1,1,2,2,3,3,4,4,5……这样的步长。 -- 这一题是第 59 题的加强版。除了有螺旋以外,还加入了步长的限制。步长其实是有规律的,第 0 次移动的步长是 `0/2+1`,第 1 次移动的步长是 `1/2+1`,第 n 次移动的步长是 `n/2+1`。其他的做法和第 59 题一致。 - - - -## 代码 - -```go - -package leetcode - -func spiralMatrixIII(R int, C int, r0 int, c0 int) [][]int { - res, round, spDir := [][]int{}, 0, [][]int{ - []int{0, 1}, // 朝右 - []int{1, 0}, // 朝下 - []int{0, -1}, // 朝左 - []int{-1, 0}, // 朝上 - } - res = append(res, []int{r0, c0}) - for i := 0; len(res) < R*C; i++ { - for j := 0; j < i/2+1; j++ { - r0 += spDir[round%4][0] - c0 += spDir[round%4][1] - if 0 <= r0 && r0 < R && 0 <= c0 && c0 < C { - res = append(res, []int{r0, c0}) - } - } - round++ - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0887.Super-Egg-Drop.md b/website/content/ChapterFour/0887.Super-Egg-Drop.md deleted file mode 100755 index a79b60859..000000000 --- a/website/content/ChapterFour/0887.Super-Egg-Drop.md +++ /dev/null @@ -1,155 +0,0 @@ -# [887. Super Egg Drop](https://leetcode.com/problems/super-egg-drop/) - - -## 题目 - -You are given `K` eggs, and you have access to a building with `N` floors from `1` to `N`. - -Each egg is identical in function, and if an egg breaks, you cannot drop it again. - -You know that there exists a floor `F` with `0 <= F <= N` such that any egg dropped at a floor higher than `F` will break, and any egg dropped at or below floor `F` will not break. - -Each *move*, you may take an egg (if you have an unbroken one) and drop it from any floor `X` (with `1 <= X <= N`). - -Your goal is to know **with certainty** what the value of `F` is. - -What is the minimum number of moves that you need to know with certainty what `F` is, regardless of the initial value of `F`? - -**Example 1**: - - Input: K = 1, N = 2 - Output: 2 - Explanation: - Drop the egg from floor 1. If it breaks, we know with certainty that F = 0. - Otherwise, drop the egg from floor 2. If it breaks, we know with certainty that F = 1. - If it didn't break, then we know with certainty F = 2. - Hence, we needed 2 moves in the worst case to know what F is with certainty. - -**Example 2**: - - Input: K = 2, N = 6 - Output: 3 - -**Example 3**: - - Input: K = 3, N = 14 - Output: 4 - -**Note**: - -1. `1 <= K <= 100` -2. `1 <= N <= 10000` - - -## 题目大意 - -你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。你的目标是确切地知道 F 的值是多少。无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少? - - -提示: - -1. 1 <= K <= 100 -2. 1 <= N <= 10000 - - -## 解题思路 - -- 给出 `K` 个鸡蛋,`N` 层楼,要求确定安全楼层 `F` 需要最小步数 `t`。 -- 这一题是微软的经典面试题。拿到题最容易想到的是二分搜索。但是仔细分析以后会发现单纯的二分是不对的。不断的二分确实能找到最终安全的楼层,但是这里没有考虑到 `K` 个鸡蛋。鸡蛋数的限制会导致二分搜索无法找到最终楼层。题目要求要在保证能找到最终安全楼层的情况下,找到最小步数。所以单纯的二分搜索并不能解答这道题。 -- 这一题如果按照题意正向考虑,动态规划的状态转移方程是 `searchTime(K, N) = max( searchTime(K-1, X-1), searchTime(K, N-X) )`。其中 `X` 是丢鸡蛋的楼层。随着 `X` 从 `[1,N]`,都能计算出一个 `searchTime` 的值,在所有这 `N` 个值之中,取最小值就是本题的答案了。这个解法可以 AC 这道题。不过这个解法不细展开了。时间复杂度 `O(k*N^2)`。 -

- -

- -- 换个角度来看这个问题,定义 `dp[k][m]` 代表 `K` 个鸡蛋,`M` 次移动能检查的最大楼层。考虑某一步 `t` 应该在哪一层丢鸡蛋呢?一个正确的选择是在 `dp[k-1][t-1] + 1` 层丢鸡蛋,结果分两种情况: - 1. 如果鸡蛋碎了,我们首先排除了该层以上的所有楼层(不管这个楼有多高),而对于剩下的 `dp[k-1][t-1]` 层楼,我们一定能用 `k-1` 个鸡蛋在 `t-1` 步内求解。因此这种情况下,我们总共可以求解无限高的楼层。可见,这是一种非常好的情况,但并不总是发生。 - 2. 如果鸡蛋没碎,我们首先排除了该层以下的 `dp[k-1][t-1]` 层楼,此时我们还有 `k` 个蛋和 `t-1` 步,那么我们去该层以上的楼层继续测得 `dp[k][t-1]` 层楼。因此这种情况下,我们总共可以求解 `dp[k-1][t-1] + 1 + dp[k][t-1]` 层楼。 -- 在所有 `m` 步中只要有一次出现了第一种情况,那么我们就可以求解无限高的楼层。但题目要求我们能保证一定能找到安全楼层,所以每次丢鸡蛋的情况应该按照最差情况来,即每次都是第二种情况。于是得到转状态转移方程: `dp[k][m] = dp[k-1][m-1] + dp[k][m-1] + 1` 。这个方程可以压缩到一维,因为每个新的状态只和上一行和左一列有关。那么每一行从右往左更新,即 `dp[i] += 1 + dp[i-1]`。时间复杂度 `O(K * log N)`,空间复杂度 `O(N)`。 -- 可能会有人有疑问,如果最初选择不在 `dp[k-1][t-1] + 1` 层丢鸡蛋会怎么样呢?选择在更低的层或者更高的层丢鸡蛋会怎样呢? - 1. 如果在更低的楼层丢鸡蛋也能保证找到安全楼层。那么得到的结果一定不是最小步数。因为这次丢鸡蛋没有充分的展现鸡蛋和移动次数的潜力,最终求解一定会有鸡蛋和步数剩余,即不是能探测的最大楼层了。 - 2. 如果在更高的楼层丢鸡蛋,假设是第 `dp[k-1][t-1] + 2` 层丢鸡蛋,如果这次鸡蛋碎了,剩下 `k-1` 个鸡蛋和 `t-1` 步只能保证验证 `dp[k-1][t-1]` 的楼层,这里还剩**第** `dp[k-1][t-1]+ 1` 的楼层,不能保证最终一定能找到安全楼层了。 -- 用反证法就能得出每一步都应该在第 `dp[k-1][t-1] + 1` 层丢鸡蛋。 -- 这道题还可以用二分搜索来解答。回到上面分析的状态转移方程:`dp[k][m] = dp[k-1][m-1] + dp[k][m-1] + 1` 。用数学方法来解析这个递推关系。令 `f(t,k)` 为 `t` 和 `k` 的函数,题目所要求能测到最大楼层是 `N` 的最小步数,即要求出 `f(t,k) ≥ N` 时候的最小 `t`。由状态转移方程可以知道:`f(t,k) = f(t-1,k) + f(t-1,k-1) + 1`,当 `k = 1` 的时候,对应一个鸡蛋的情况,`f(t,1) = t`,当 `t = 1` 的时候,对应一步的情况,`f(1,k) = 1`。有状态转移方程得: -

- -

- -- 令 `g(t,k) = f(t,k) - f(t,k-1)`,可以得到: - -

- -

- -- 可以知道 `g(t,k)` 是一个杨辉三角,即二项式系数: - -

- -

- -- 利用裂项相消的方法: -

- -

- -- 于是可以得到: -

- -

- -- 其中: -

- -

- -- 于是针对每一项的二项式常数,都可以由前一项乘以一个分数得到下一项。 -

- -

- -- 利用二分搜索,不断的二分 `t`,直到逼近找到 `f(t,k) ≥ N` 时候最小的 `t`。时间复杂度 `O(K * log N)`,空间复杂度 `O(1)`。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 二分搜索 -func superEggDrop(K int, N int) int { - low, high := 1, N - for low < high { - mid := low + (high-low)>>1 - if counterF(K, N, mid) >= N { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -// 计算二项式和,特殊的第一项 C(t,0) = 1 -func counterF(k, n, mid int) int { - res, sum := 1, 0 - for i := 1; i <= k && sum < n; i++ { - res *= mid - i + 1 - res /= i - sum += res - } - return sum -} - -// 解法二 动态规划 DP -func superEggDrop1(K int, N int) int { - dp, step := make([]int, K+1), 0 - for ; dp[K] < N; step++ { - for i := K; i > 0; i-- { - dp[i] = (1 + dp[i] + dp[i-1]) - } - } - return step -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0888.Fair-Candy-Swap.md b/website/content/ChapterFour/0888.Fair-Candy-Swap.md deleted file mode 100644 index 79a2c2bc1..000000000 --- a/website/content/ChapterFour/0888.Fair-Candy-Swap.md +++ /dev/null @@ -1,110 +0,0 @@ -# [888. Fair Candy Swap](https://leetcode.com/problems/fair-candy-swap/) - - -## 题目 - -Alice and Bob have candy bars of different sizes: `A[i]` is the size of the `i`-th bar of candy that Alice has, and `B[j]` is the size of the `j`-th bar of candy that Bob has. - -Since they are friends, they would like to exchange one candy bar each so that after the exchange, they both have the same total amount of candy. (*The total amount of candy a person has is the sum of the sizes of candy bars they have*.) - -Return an integer array `ans` where `ans[0]` is the size of the candy bar that Alice must exchange, and `ans[1]` is the size of the candy bar that Bob must exchange. - -If there are multiple answers, you may return any one of them. It is guaranteed an answer exists. - -**Example 1**: - -``` -Input: A = [1,1], B = [2,2] -Output: [1,2] -``` - -**Example 2**: - -``` -Input: A = [1,2], B = [2,3] -Output: [1,2] -``` - -**Example 3**: - -``` -Input: A = [2], B = [1,3] -Output: [2,3] -``` - -**Example 4**: - -``` -Input: A = [1,2,5], B = [2,4] -Output: [5,4] -``` - -**Note**: - -- `1 <= A.length <= 10000` -- `1 <= B.length <= 10000` -- `1 <= A[i] <= 100000` -- `1 <= B[i] <= 100000` -- It is guaranteed that Alice and Bob have different total amounts of candy. -- It is guaranteed there exists an answer. - - -## 题目大意 - -爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 块糖的大小,B[j] 是鲍勃拥有的第 j 块糖的大小。因为他们是朋友,所以他们想交换一个糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。如果有多个答案,你可以返回其中任何一个。保证答案存在。 - -提示: - -- 1 <= A.length <= 10000 -- 1 <= B.length <= 10000 -- 1 <= A[i] <= 100000 -- 1 <= B[i] <= 100000 -- 保证爱丽丝与鲍勃的糖果总量不同。 -- 答案肯定存在。 - - -## 解题思路 - -- 两人交换糖果,使得两人糖果相等。要求输出一个数组,里面分别包含两人必须交换的糖果大小。 -- 首先这一题肯定了一定有解,其次只允许交换一次。有了这两个前提,使本题变成简单题。先计算出为了使得交换以后两个相同的糖果数,A 需要增加或者减少的糖果数 diff。然后遍历 B ,看 A 中是否存在一个元素,能使得 B 做了对应交换 diff 以后,两人糖果相等。(此题前提保证了一定能找到)。最后输出 A 中的这个元素和遍历到 B 的这个元素,即是两人要交换的糖果数。 - -## 代码 - -```go - -package leetcode - -func fairCandySwap(A []int, B []int) []int { - hDiff, aMap := diff(A, B)/2, make(map[int]int, len(A)) - for _, a := range A { - aMap[a] = a - } - for _, b := range B { - if a, ok := aMap[hDiff+b]; ok { - return []int{a, b} - } - } - return nil -} - -func diff(A []int, B []int) int { - diff, maxLen := 0, max(len(A), len(B)) - for i := 0; i < maxLen; i++ { - if i < len(A) { - diff += A[i] - } - if i < len(B) { - diff -= B[i] - } - } - return diff -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0891.Sum-of-Subsequence-Widths.md b/website/content/ChapterFour/0891.Sum-of-Subsequence-Widths.md deleted file mode 100644 index 9e5f04794..000000000 --- a/website/content/ChapterFour/0891.Sum-of-Subsequence-Widths.md +++ /dev/null @@ -1,68 +0,0 @@ -# [891. Sum of Subsequence Widths](https://leetcode.com/problems/sum-of-subsequence-widths/) - -## 题目 - -Given an array of integers A, consider all non-empty subsequences of A. - -For any sequence S, let the width of S be the difference between the maximum and minimum element of S. - -Return the sum of the widths of all subsequences of A. - -As the answer may be very large, return the answer modulo 10^9 + 7. - - - -**Example 1**: - -``` - -Input: [2,1,3] -Output: 6 -Explanation: -Subsequences are [1], [2], [3], [2,1], [2,3], [1,3], [2,1,3]. -The corresponding widths are 0, 0, 0, 1, 1, 2, 2. -The sum of these widths is 6. - -``` - -**Note**: - -- 1 <= A.length <= 20000 -- 1 <= A[i] <= 20000 - - -## 题目大意 - -给定一个整数数组 A ,考虑 A 的所有非空子序列。对于任意序列 S ,设 S 的宽度是 S 的最大元素和最小元素的差。返回 A 的所有子序列的宽度之和。由于答案可能非常大,请返回答案模 10^9+7。 - - -## 解题思路 - -- 理解题意以后,可以发现,数组内元素的顺序并不影响最终求得的所有子序列的宽度之和。 - - [2,1,3]:[1],[2],[3],[2,1],[2,3],[1,3],[2,1,3] - [1,2,3]:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3] - 针对每个 A[i] 而言,A[i] 对最终结果的贡献是在子序列的左右两边的时候才有贡献,当 A[i] 位于区间中间的时候,不影响最终结果。先对 A[i] 进行排序,排序以后,有 i 个数 <= A[i],有 n - i - 1 个数 >= A[i]。所以 A[i] 会在 2^i 个子序列的右边界出现,2^(n-i-1) 个左边界出现。那么 A[i] 对最终结果的贡献是 A[i] * 2^i - A[i] * 2^(n-i-1) 。举个例子,[1,4,5,7],A[2] = 5,那么 5 作为右边界的子序列有 2^2 = 4 个,即 [5],[1,5],[4,5],[1,4,5],5 作为左边界的子序列有 2^(4-2-1) = 2 个,即 [5],[5,7]。A[2] = 5 对最终结果的影响是 5 * 2^2 - 5 * 2^(4-2-1) = 10 。 -- 题目要求所有子序列的宽度之和,也就是求每个区间最大值减去最小值的总和。那么 `Ans = SUM{ A[i]*2^i - A[n-i-1] * 2^(n-i-1) }`,其中 `0 <= i < n`。需要注意的是 2^i 可能非常大,所以在计算中就需要去 mod 了,而不是最后计算完了再 mod。注意取模的结合律:`(a * b) % c = (a % c) * (b % c) % c`。 - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func sumSubseqWidths(A []int) int { - sort.Ints(A) - res, mod, n, p := 0, 1000000007, len(A), 1 - for i := 0; i < n; i++ { - res = (res + (A[i]-A[n-1-i])*p) % mod - p = (p << 1) % mod - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0892.Surface-Area-of-3D-Shapes.md b/website/content/ChapterFour/0892.Surface-Area-of-3D-Shapes.md deleted file mode 100644 index bcb6ad517..000000000 --- a/website/content/ChapterFour/0892.Surface-Area-of-3D-Shapes.md +++ /dev/null @@ -1,108 +0,0 @@ -# [892. Surface Area of 3D Shapes](https://leetcode.com/problems/surface-area-of-3d-shapes/) - - -## 题目 - -On a `N * N` grid, we place some `1 * 1 * 1` cubes. - -Each value `v = grid[i][j]` represents a tower of `v` cubes placed on top of grid cell `(i, j)`. - -Return the total surface area of the resulting shapes. - -**Example 1**: - -``` -Input: [[2]] -Output: 10 -``` - -**Example 2**: - -``` -Input: [[1,2],[3,4]] -Output: 34 -``` - -**Example 3**: - -``` -Input: [[1,0],[0,2]] -Output: 16 -``` - -**Example 4**: - -``` -Input: [[1,1,1],[1,0,1],[1,1,1]] -Output: 32 -``` - -**Example 5**: - -``` -Input: [[2,2,2],[2,1,2],[2,2,2]] -Output: 46 -``` - -**Note**: - -- `1 <= N <= 50` -- `0 <= grid[i][j] <= 50` - -## 题目大意 - -在 N * N 的网格上,我们放置一些 1 * 1 * 1  的立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。 - - -## 解题思路 - -- 给定一个网格数组,数组里面装的是立方体叠放在所在的单元格,求最终这些叠放的立方体的表面积。 -- 简单题。按照题目意思,找到叠放时,重叠的面,然后用总表面积减去这些重叠的面积即为最终答案。 - -## 代码 - -```go - -package leetcode - -func surfaceArea(grid [][]int) int { - area := 0 - for i := 0; i < len(grid); i++ { - for j := 0; j < len(grid[0]); j++ { - if grid[i][j] == 0 { - continue - } - area += grid[i][j]*4 + 2 - // up - if i > 0 { - m := min(grid[i][j], grid[i-1][j]) - area -= m - } - // down - if i < len(grid)-1 { - m := min(grid[i][j], grid[i+1][j]) - area -= m - } - // left - if j > 0 { - m := min(grid[i][j], grid[i][j-1]) - area -= m - } - // right - if j < len(grid[i])-1 { - m := min(grid[i][j], grid[i][j+1]) - area -= m - } - } - } - return area -} - -func min(a, b int) int { - if a > b { - return b - } - return a -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0895.Maximum-Frequency-Stack.md b/website/content/ChapterFour/0895.Maximum-Frequency-Stack.md deleted file mode 100644 index bd1c20607..000000000 --- a/website/content/ChapterFour/0895.Maximum-Frequency-Stack.md +++ /dev/null @@ -1,113 +0,0 @@ -# [895. Maximum Frequency Stack](https://leetcode.com/problems/maximum-frequency-stack/) - -## 题目 - -Implement FreqStack, a class which simulates the operation of a stack-like data structure. - -FreqStack has two functions: - -push(int x), which pushes an integer x onto the stack. -pop(), which removes and returns the most frequent element in the stack. -If there is a tie for most frequent element, the element closest to the top of the stack is removed and returned. - - -**Example 1**: - -``` - -Input: -["FreqStack","push","push","push","push","push","push","pop","pop","pop","pop"], -[[],[5],[7],[5],[7],[4],[5],[],[],[],[]] -Output: [null,null,null,null,null,null,null,5,7,5,4] -Explanation: -After making six .push operations, the stack is [5,7,5,7,4,5] from bottom to top. Then: - -pop() -> returns 5, as 5 is the most frequent. -The stack becomes [5,7,5,7,4]. - -pop() -> returns 7, as 5 and 7 is the most frequent, but 7 is closest to the top. -The stack becomes [5,7,5,4]. - -pop() -> returns 5. -The stack becomes [5,7,4]. - -pop() -> returns 4. -The stack becomes [5,7]. - -``` - -**Note**: - -- Calls to FreqStack.push(int x) will be such that 0 <= x <= 10^9. -- It is guaranteed that FreqStack.pop() won't be called if the stack has zero elements. -- The total number of FreqStack.push calls will not exceed 10000 in a single test case. -- The total number of FreqStack.pop calls will not exceed 10000 in a single test case. -- The total number of FreqStack.push and FreqStack.pop calls will not exceed 150000 across all test cases. - -## 题目大意 - -实现 FreqStack,模拟类似栈的数据结构的操作的一个类。 - -FreqStack 有两个函数: - -- push(int x),将整数 x 推入栈中。 -- pop(),它移除并返回栈中出现最频繁的元素。如果最频繁的元素不只一个,则移除并返回最接近栈顶的元素。 - - -## 解题思路 - -FreqStack 里面保存频次的 map 和相同频次 group 的 map。push 的时候动态的维护 x 的频次,并更新到对应频次的 group 中。pop 的时候对应减少频次字典里面的频次,并更新到对应频次的 group 中。 - - - -## 代码 - -```go - -package leetcode - -type FreqStack struct { - freq map[int]int - group map[int][]int - maxfreq int -} - -func Constructor895() FreqStack { - hash := make(map[int]int) - maxHash := make(map[int][]int) - return FreqStack{freq: hash, group: maxHash} -} - -func (this *FreqStack) Push(x int) { - if _, ok := this.freq[x]; ok { - this.freq[x]++ - } else { - this.freq[x] = 1 - } - f := this.freq[x] - if f > this.maxfreq { - this.maxfreq = f - } - - this.group[f] = append(this.group[f], x) -} - -func (this *FreqStack) Pop() int { - tmp := this.group[this.maxfreq] - x := tmp[len(tmp)-1] - this.group[this.maxfreq] = this.group[this.maxfreq][:len(this.group[this.maxfreq])-1] - this.freq[x]-- - if len(this.group[this.maxfreq]) == 0 { - this.maxfreq-- - } - return x -} - -/** - * Your FreqStack object will be instantiated and called as such: - * obj := Constructor(); - * obj.Push(x); - * param_2 := obj.Pop(); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0896.Monotonic-Array.md b/website/content/ChapterFour/0896.Monotonic-Array.md deleted file mode 100644 index afd6b08d4..000000000 --- a/website/content/ChapterFour/0896.Monotonic-Array.md +++ /dev/null @@ -1,99 +0,0 @@ -# [896. Monotonic Array](https://leetcode.com/problems/monotonic-array/) - - -## 题目 - -An array is *monotonic* if it is either monotone increasing or monotone decreasing. - -An array `A` is monotone increasing if for all `i <= j`, `A[i] <= A[j]`. An array `A` is monotone decreasing if for all `i <= j`, `A[i] >= A[j]`. - -Return `true` if and only if the given array `A` is monotonic. - -**Example 1**: - -``` -Input: [1,2,2,3] -Output: true -``` - -**Example 2**: - -``` -Input: [6,5,4,4] -Output: true -``` - -**Example 3**: - -``` -Input: [1,3,2] -Output: false -``` - -**Example 4**: - -``` -Input: [1,2,4,5] -Output: true -``` - -**Example 5**: - -``` -Input: [1,1,1] -Output: true -``` - -**Note**: - -1. `1 <= A.length <= 50000` -2. `-100000 <= A[i] <= 100000` - -## 题目大意 - -如果数组是单调递增或单调递减的,那么它是单调的。如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的。 如果对于所有 i <= j,A[i]> = A[j],那么数组 A 是单调递减的。当给定的数组 A 是单调数组时返回 true,否则返回 false。 - - -## 解题思路 - -- 判断给定的数组是不是单调(单调递增或者单调递减)的。 -- 简单题,按照题意循环判断即可。 - -## 代码 - -```go - -package leetcode - -func isMonotonic(A []int) bool { - if len(A) <= 1 { - return true - } - if A[0] < A[1] { - return inc(A[1:]) - } - if A[0] > A[1] { - return dec(A[1:]) - } - return inc(A[1:]) || dec(A[1:]) -} - -func inc(A []int) bool { - for i := 0; i < len(A)-1; i++ { - if A[i] > A[i+1] { - return false - } - } - return true -} - -func dec(A []int) bool { - for i := 0; i < len(A)-1; i++ { - if A[i] < A[i+1] { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0898.Bitwise-ORs-of-Subarrays.md b/website/content/ChapterFour/0898.Bitwise-ORs-of-Subarrays.md deleted file mode 100755 index 259871f11..000000000 --- a/website/content/ChapterFour/0898.Bitwise-ORs-of-Subarrays.md +++ /dev/null @@ -1,143 +0,0 @@ -# [898. Bitwise ORs of Subarrays](https://leetcode.com/problems/bitwise-ors-of-subarrays/) - - -## 题目 - -We have an array `A` of non-negative integers. - -For every (contiguous) subarray `B = [A[i], A[i+1], ..., A[j]]` (with `i <= j`), we take the bitwise OR of all the elements in `B`, obtaining a result `A[i] | A[i+1] | ... | A[j]`. - -Return the number of possible results. (Results that occur more than once are only counted once in the final answer.) - -**Example 1**: - - Input: [0] - Output: 1 - Explanation: - There is only one possible result: 0. - -**Example 2**: - - Input: [1,1,2] - Output: 3 - Explanation: - The possible subarrays are [1], [1], [2], [1, 1], [1, 2], [1, 1, 2]. - These yield the results 1, 1, 2, 1, 3, 3. - There are 3 unique values, so the answer is 3. - -**Example 3**: - - Input: [1,2,4] - Output: 6 - Explanation: - The possible results are 1, 2, 3, 4, 6, and 7. - -**Note**: - -1. `1 <= A.length <= 50000` -2. `0 <= A[i] <= 10^9` - - -## 题目大意 - -我们有一个非负整数数组 A。对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i <= j),我们对 B 中的每个元素进行按位或操作,获得结果 A[i] | A[i+1] | ... | A[j]。返回可能结果的数量。(多次出现的结果在最终答案中仅计算一次。) - - - -## 解题思路 - -- 给出一个数组,要求求出这个数组所有的子数组中,每个集合内所有数字取 `|` 运算以后,不同结果的种类数。 -- 这道题可以这样考虑,第一步,先考虑所有的子数组如何得到,以 `[001, 011, 100, 110, 101]` 为例,所有的子数组集合如下: - -```c - [001] - [001 011] [011] - [001 011 100] [011 100] [100] - [001 011 100 110] [011 100 110] [100 110] [110] - [001 011 100 110 101] [011 100 110 101] [100 110 101] [110 101] [101] -``` - -可以发现,从左往右遍历原数组,每次新来的一个元素,依次加入到之前已经生成过的集合中,再以自己为单独集合。这样就可以生成原数组的所有子集。 - -- 第二步,将每一行的子集内的所有元素都进行 `|` 运算,得到: - -```c - 001 - 011 011 - 111 111 100 - 111 111 110 110 - 111 111 111 111 101 -``` - -- 第三步,去重: - -```c - 001 - 011 - 111 100 - 111 110 - 111 101 -``` - -由于二进制位不超过 32 位,所以这里每一行最多不会超过 32 个数。所以最终时间复杂度不会超过 O(32 N),即 O(K * N)。最后将这每一行的数字都放入最终的 map 中去重即可。 - - -## 代码 - -```go - -package leetcode - -// 解法一 array 优化版 -func subarrayBitwiseORs(A []int) int { - res, cur, isInMap := []int{}, []int{}, make(map[int]bool) - cur = append(cur, 0) - for _, v := range A { - var cur2 []int - for _, vv := range cur { - tmp := v | vv - if !inSlice(cur2, tmp) { - cur2 = append(cur2, tmp) - } - } - if !inSlice(cur2, v) { - cur2 = append(cur2, v) - } - cur = cur2 - for _, vv := range cur { - if _, ok := isInMap[vv]; !ok { - isInMap[vv] = true - res = append(res, vv) - } - } - } - return len(res) -} - -func inSlice(A []int, T int) bool { - for _, v := range A { - if v == T { - return true - } - } - return false -} - -// 解法二 map 版 -func subarrayBitwiseORs1(A []int) int { - res, t := map[int]bool{}, map[int]bool{} - for _, num := range A { - r := map[int]bool{} - r[num] = true - for n := range t { - r[(num | n)] = true - } - t = r - for n := range t { - res[n] = true - } - } - return len(res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0901.Online-Stock-Span.md b/website/content/ChapterFour/0901.Online-Stock-Span.md deleted file mode 100644 index 582fa43f5..000000000 --- a/website/content/ChapterFour/0901.Online-Stock-Span.md +++ /dev/null @@ -1,111 +0,0 @@ -# [901. Online Stock Span](https://leetcode.com/problems/online-stock-span/) - -## 题目 - -Write a class StockSpanner which collects daily price quotes for some stock, and returns the span of that stock's price for the current day. - -The span of the stock's price today is defined as the maximum number of consecutive days (starting from today and going backwards) for which the price of the stock was less than or equal to today's price. - -For example, if the price of a stock over the next 7 days were [100, 80, 60, 70, 60, 75, 85], then the stock spans would be [1, 1, 1, 2, 1, 4, 6]. - - - -**Example 1**: - -``` - -Input: ["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]] -Output: [null,1,1,1,2,1,4,6] -Explanation: -First, S = StockSpanner() is initialized. Then: -S.next(100) is called and returns 1, -S.next(80) is called and returns 1, -S.next(60) is called and returns 1, -S.next(70) is called and returns 2, -S.next(60) is called and returns 1, -S.next(75) is called and returns 4, -S.next(85) is called and returns 6. - -Note that (for example) S.next(75) returned 4, because the last 4 prices -(including today's price of 75) were less than or equal to today's price. - -``` - -**Note**: - -1. Calls to StockSpanner.next(int price) will have 1 <= price <= 10^5. -2. There will be at most 10000 calls to StockSpanner.next per test case. -3. There will be at most 150000 calls to StockSpanner.next across all test cases. -4. The total time limit for this problem has been reduced by 75% for C++, and 50% for all other languages. - -## 题目大意 - -编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。 - -今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。 - -例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。 - - - -## 解题思路 - -这一题就是单调栈的题目。维护一个单调递增的下标。 - -## 总结 - -单调栈类似的题 - -496. Next Greater Element I -497. Next Greater Element II -498. Daily Temperatures -499. Sum of Subarray Minimums -500. Largest Rectangle in Histogram - -## 代码 - -```go - -package leetcode - -import "fmt" - -// node pair -type Node struct { - Val int - res int -} - -// slice -type StockSpanner struct { - Item []Node -} - -func Constructor901() StockSpanner { - stockSpanner := StockSpanner{make([]Node, 0)} - return stockSpanner -} - -// need refactor later -func (this *StockSpanner) Next(price int) int { - res := 1 - if len(this.Item) == 0 { - this.Item = append(this.Item, Node{price, res}) - return res - } - for len(this.Item) > 0 && this.Item[len(this.Item)-1].Val <= price { - res = res + this.Item[len(this.Item)-1].res - this.Item = this.Item[:len(this.Item)-1] - } - this.Item = append(this.Item, Node{price, res}) - fmt.Printf("this.Item = %v\n", this.Item) - return res -} - -/** - * Your StockSpanner object will be instantiated and called as such: - * obj := Constructor(); - * param_1 := obj.Next(price); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0904.Fruit-Into-Baskets.md b/website/content/ChapterFour/0904.Fruit-Into-Baskets.md deleted file mode 100644 index c3786ae76..000000000 --- a/website/content/ChapterFour/0904.Fruit-Into-Baskets.md +++ /dev/null @@ -1,115 +0,0 @@ -# [904. Fruit Into Baskets](https://leetcode.com/problems/fruit-into-baskets/) - -## 题目 - -In a row of trees, the i-th tree produces fruit with type tree[i]. - -You start at any tree of your choice, then repeatedly perform the following steps: - -1. Add one piece of fruit from this tree to your baskets. If you cannot, stop. -2. Move to the next tree to the right of the current tree. If there is no tree to the right, stop. - -Note that you do not have any choice after the initial choice of starting tree: you must perform step 1, then step 2, then back to step 1, then step 2, and so on until you stop. - -You have two baskets, and each basket can carry any quantity of fruit, but you want each basket to only carry one type of fruit each. - -What is the total amount of fruit you can collect with this procedure? - - -**Example 1**: - -``` -Input: [1,2,1] -Output: 3 -Explanation: We can collect [1,2,1]. - -``` - -**Example 2**: - -``` - -Input: [0,1,2,2] -Output: 3 -Explanation: We can collect [1,2,2]. -If we started at the first tree, we would only collect [0, 1]. - -``` - -**Example 3**: - -``` - -Input: [1,2,3,2,2] -Output: 4 -Explanation: We can collect [2,3,2,2]. -If we started at the first tree, we would only collect [1, 2]. - -``` - -**Example 4**: - -``` - -Input: [3,3,3,1,2,1,1,2,3,3,4] -Output: 5 -Explanation: We can collect [1,2,1,1,2]. -If we started at the first tree or the eighth tree, we would only collect 4 fruits. - -``` - -**Note**: - -- 1 <= tree.length <= 40000 -- 0 <= tree[i] < tree.length - -## 题目大意 - -这道题考察的是滑动窗口的问题。 - -给出一个数组,数组里面的数字代表每个果树上水果的种类,1 代表一号水果,不同数字代表的水果不同。现在有 2 个篮子,每个篮子只能装一个种类的水果,这就意味着只能选 2 个不同的数字。摘水果只能从左往右摘,直到右边没有水果可以摘就停下。问可以连续摘水果的最长区间段的长度。 - - -## 解题思路 - -简化一下题意,给出一段数字,要求找出包含 2 个不同数字的最大区间段长度。这个区间段内只能包含这 2 个不同数字,可以重复,但是不能包含其他数字。 - -用典型的滑动窗口的处理方法处理即可。 - - - - -## 代码 - -```go - -package leetcode - -func totalFruit(tree []int) int { - if len(tree) == 0 { - return 0 - } - left, right, counter, res, freq := 0, 0, 1, 1, map[int]int{} - freq[tree[0]]++ - for left < len(tree) { - if right+1 < len(tree) && ((counter > 0 && tree[right+1] != tree[left]) || (tree[right+1] == tree[left] || freq[tree[right+1]] > 0)) { - if counter > 0 && tree[right+1] != tree[left] { - counter-- - } - right++ - freq[tree[right]]++ - } else { - if counter == 0 || (counter > 0 && right == len(tree)-1) { - res = max(res, right-left+1) - } - freq[tree[left]]-- - if freq[tree[left]] == 0 { - counter++ - } - left++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0907.Sum-of-Subarray-Minimums.md b/website/content/ChapterFour/0907.Sum-of-Subarray-Minimums.md deleted file mode 100644 index 7c5374d43..000000000 --- a/website/content/ChapterFour/0907.Sum-of-Subarray-Minimums.md +++ /dev/null @@ -1,124 +0,0 @@ -# [907. Sum of Subarray Minimums](https://leetcode.com/problems/sum-of-subarray-minimums/) - -## 题目 - -Given an array of integers A, find the sum of min(B), where B ranges over every (contiguous) subarray of A. - -Since the answer may be large, return the answer modulo 10^9 + 7. - - - -**Example 1**: - -``` - -Input: [3,1,2,4] -Output: 17 -Explanation: Subarrays are [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4]. -Minimums are 3, 1, 2, 4, 1, 1, 2, 1, 1, 1. Sum is 17. - -``` - -**Note**: - -1. 1 <= A.length <= 30000 -2. 1 <= A[i] <= 30000 - - -## 题目大意 - -给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组。 - -由于答案可能很大,因此返回答案模 10^9 + 7。 - - -## 解题思路 - -- 首先想到的是暴力解法,用两层循环,分别枚举每个连续的子区间,区间内用一个元素记录区间内最小值。每当区间起点发生变化的时候,最终结果都加上上次遍历区间找出的最小值。当整个数组都扫完一遍以后,最终结果模上 10^9+7。 -- 上面暴力解法时间复杂度特别大,因为某个区间的最小值可能是很多区间的最小值,但是我们暴力枚举所有区间,导致要遍历的区间特别多。优化点就在如何减少遍历的区间。第二种思路是用 2 个单调栈。想得到思路是 `res = sum(A[i] * f(i))`,其中 f(i) 是子区间的数,A[i] 是这个子区间内的最小值。为了得到 f(i) 我们需要找到 left[i] 和 right[i],left[i] 是 A[i] 左边严格大于 A[i](> 关系)的区间长度。right[i] 是 A[i] 右边非严格大于(>= 关系)的区间长度。left[i] + 1 等于以 A[i] 结尾的子数组数目,A[i] 是唯一的最小值;right[i] + 1 等于以 A[i] 开始的子数组数目,A[i] 是第一个最小值。于是有 `f(i) = (left[i] + 1) * (right[i] + 1)`。例如对于 [3,1,4,2,5,3,3,1] 中的“2”,我们找到的串就为[4,2,5,3,3],2 左边有 1 个数比 2 大且相邻,2 右边有 3 个数比 2 大且相邻,所以 2 作为最小值的串有 2 * 4 = 8 种。用排列组合的思维也能分析出来,2 的左边可以拿 0,1,…… m 个,总共 (m + 1) 种,同理右边可以拿 0,1,…… n 个,总共 (n + 1) 种,所以总共 (m + 1)(n + 1)种。只要计算出了 f(i),这个题目就好办了。以 [3,1,2,4] 为例,left[i] + 1 = [1,2,1,1],right[i] + 1 = [1,3,2,1],对应 i 位的乘积是 f[i] = [1 * 1,2 * 3,1 * 2,1 * 1] = [1,6,2,1],最终要求的最小值的总和 res = 3 * 1 + 1 * 6 + 2 * 2 + 4 * 1 = 17。 -- **看到这种 mod1e9+7 的题目,首先要想到的就是dp**。最终的优化解即是利用 DP + 单调栈。单调栈维护数组中的值逐渐递增的对应下标序列。定义 `dp[i + 1]` 代表以 A[i] 结尾的子区间内最小值的总和。状态转移方程是 `dp[i + 1] = dp[prev + 1] + (i - prev) * A[i]`,其中 prev 是比 A[i] 小的前一个数,由于我们维护了一个单调栈,所以 prev 就是栈顶元素。(i - prev) * A[i] 代表在还没有出现 prev 之前,这些区间内都是 A[i] 最小,那么这些区间有 i - prev 个,所以最小值总和应该是 (i - prev) * A[i]。再加上 dp[prev + 1] 就是 dp[i + 1] 的最小值总和了。以 [3, 1, 2, 4, 3] 为例,当 i = 4, 所有以 A[4] 为结尾的子区间有: - - [3] - [4, 3] - [2, 4, 3] - [1, 2, 4, 3] - [3, 1, 2, 4, 3] - 在这种情况下, stack.peek() = 2, A[2] = 2。前两个子区间 [3] and [4, 3], 最小值的总和 = (i - stack.peek()) * A[i] = 6。后 3 个子区间是 [2, 4, 3], [1, 2, 4, 3] 和 [3, 1, 2, 4, 3], 它们都包含 2,2 是比 3 小的前一个数,所以 dp[i + 1] = dp[stack.peek() + 1] = dp[2 + 1] = dp[3] = dp[2 + 1]。即需要求 i = 2 的时候 dp[i + 1] 的值。继续递推,比 2 小的前一个值是 1,A[1] = 1。dp[3] = dp[1 + 1] + (2 - 1) * A[2]= dp[2] + 2。dp[2] = dp[1 + 1],当 i = 1 的时候,prev = -1,即没有人比 A[1] 更小了,所以 dp[2] = dp[1 + 1] = dp[-1 + 1] + (1 - (-1)) * A[1] = 0 + 2 * 1 = 2。迭代回去,dp[3] = dp[2] + 2 = 2 + 2 = 4。dp[stack.peek() + 1] = dp[2 + 1] = dp[3] = 4。所以 dp[i + 1] = 4 + 6 = 10。 -- 与这一题相似的解题思路的题目有第 828 题,第 891 题。 - -## 代码 - -```go - -package leetcode - -// 解法一 最快的解是 DP + 单调栈 -func sumSubarrayMins(A []int) int { - stack, dp, res, mod := []int{}, make([]int, len(A)+1), 0, 1000000007 - stack = append(stack, -1) - - for i := 0; i < len(A); i++ { - for stack[len(stack)-1] != -1 && A[i] <= A[stack[len(stack)-1]] { - stack = stack[:len(stack)-1] - } - dp[i+1] = (dp[stack[len(stack)-1]+1] + (i-stack[len(stack)-1])*A[i]) % mod - stack = append(stack, i) - res += dp[i+1] - res %= mod - } - return res -} - -type pair struct { - val int - count int -} - -// 解法二 用两个单调栈 -func sumSubarrayMins1(A []int) int { - res, n, mod := 0, len(A), 1000000007 - lefts, rights, leftStack, rightStack := make([]int, n), make([]int, n), []*pair{}, []*pair{} - for i := 0; i < n; i++ { - count := 1 - for len(leftStack) != 0 && leftStack[len(leftStack)-1].val > A[i] { - count += leftStack[len(leftStack)-1].count - leftStack = leftStack[:len(leftStack)-1] - } - leftStack = append(leftStack, &pair{val: A[i], count: count}) - lefts[i] = count - } - - for i := n - 1; i >= 0; i-- { - count := 1 - for len(rightStack) != 0 && rightStack[len(rightStack)-1].val >= A[i] { - count += rightStack[len(rightStack)-1].count - rightStack = rightStack[:len(rightStack)-1] - } - rightStack = append(rightStack, &pair{val: A[i], count: count}) - rights[i] = count - } - - for i := 0; i < n; i++ { - res = (res + A[i]*lefts[i]*rights[i]) % mod - } - return res -} - -// 解法三 暴力解法,中间很多重复判断子数组的情况 -func sumSubarrayMins2(A []int) int { - res, mod := 0, 1000000007 - for i := 0; i < len(A); i++ { - stack := []int{} - stack = append(stack, A[i]) - for j := i; j < len(A); j++ { - if stack[len(stack)-1] >= A[j] { - stack = stack[:len(stack)-1] - stack = append(stack, A[j]) - } - res += stack[len(stack)-1] - } - } - return res % mod -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0911.Online-Election.md b/website/content/ChapterFour/0911.Online-Election.md deleted file mode 100755 index 63a73bb66..000000000 --- a/website/content/ChapterFour/0911.Online-Election.md +++ /dev/null @@ -1,99 +0,0 @@ -# [911. Online Election](https://leetcode.com/problems/online-election/) - - -## 题目 - -In an election, the `i`-th vote was cast for `persons[i]` at time `times[i]`. - -Now, we would like to implement the following query function: `TopVotedCandidate.q(int t)` will return the number of the person that was leading the election at time `t`. - -Votes cast at time `t` will count towards our query. In the case of a tie, the most recent vote (among tied candidates) wins. - -**Example 1**: - - Input: ["TopVotedCandidate","q","q","q","q","q","q"], [[[0,1,1,0,0,1,0],[0,5,10,15,20,25,30]],[3],[12],[25],[15],[24],[8]] - Output: [null,0,1,1,0,0,1] - Explanation: - At time 3, the votes are [0], and 0 is leading. - At time 12, the votes are [0,1,1], and 1 is leading. - At time 25, the votes are [0,1,1,0,0,1], and 1 is leading (as ties go to the most recent vote.) - This continues for 3 more queries at time 15, 24, and 8. - -**Note**: - -1. `1 <= persons.length = times.length <= 5000` -2. `0 <= persons[i] <= persons.length` -3. `times` is a strictly increasing array with all elements in `[0, 10^9]`. -4. `TopVotedCandidate.q` is called at most `10000` times per test case. -5. `TopVotedCandidate.q(int t)` is always called with `t >= times[0]`. - - -## 题目大意 - -在选举中,第 i 张票是在时间为 times[i] 时投给 persons[i] 的。 - -现在,我们想要实现下面的查询函数: TopVotedCandidate.q(int t) 将返回在 t 时刻主导选举的候选人的编号。 - -在 t 时刻投出的选票也将被计入我们的查询之中。在平局的情况下,最近获得投票的候选人将会获胜。 - -提示: - -1. 1 <= persons.length = times.length <= 5000 -2. 0 <= persons[i] <= persons.length -3. times 是严格递增的数组,所有元素都在 [0, 10^9] 范围中。 -4. 每个测试用例最多调用 10000 次 TopVotedCandidate.q。 -5. TopVotedCandidate.q(int t) 被调用时总是满足 t >= times[0]。 - - - - -## 解题思路 - -- 给出一个 2 个数组,分别代表第 `i` 人在第 `t` 时刻获得的票数。需要实现一个查询功能的函数,查询在任意 `t` 时刻,输出谁的选票领先。 -- `persons[]` 数组里面装的是获得选票人的编号,`times[]` 数组里面对应的是每个选票的时刻。`times[]` 数组默认是有序的,从小到大排列。先计算出每个时刻哪个人选票领先,放在一个数组中,实现查询函数的时候,只需要先对 `times[]` 数组二分搜索,找到比查询时间 `t` 小的最大时刻 `i`,再在选票领先的数组里面输出对应时刻领先的人的编号即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -// TopVotedCandidate define -type TopVotedCandidate struct { - persons []int - times []int -} - -// Constructor911 define -func Constructor911(persons []int, times []int) TopVotedCandidate { - leaders, votes := make([]int, len(persons)), make([]int, len(persons)) - leader := persons[0] - for i := 0; i < len(persons); i++ { - p := persons[i] - votes[p]++ - if votes[p] >= votes[leader] { - leader = p - } - leaders[i] = leader - } - return TopVotedCandidate{persons: leaders, times: times} -} - -// Q define -func (tvc *TopVotedCandidate) Q(t int) int { - i := sort.Search(len(tvc.times), func(p int) bool { return tvc.times[p] > t }) - return tvc.persons[i-1] -} - -/** - * Your TopVotedCandidate object will be instantiated and called as such: - * obj := Constructor(persons, times); - * param_1 := obj.Q(t); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0914.X-of-a-Kind-in-a-Deck-of-Cards.md b/website/content/ChapterFour/0914.X-of-a-Kind-in-a-Deck-of-Cards.md deleted file mode 100644 index 02c8ebddd..000000000 --- a/website/content/ChapterFour/0914.X-of-a-Kind-in-a-Deck-of-Cards.md +++ /dev/null @@ -1,105 +0,0 @@ -# [914. X of a Kind in a Deck of Cards](https://leetcode.com/problems/x-of-a-kind-in-a-deck-of-cards/) - - -## 题目 - -In a deck of cards, each card has an integer written on it. - -Return `true` if and only if you can choose `X >= 2` such that it is possible to split the entire deck into 1 or more groups of cards, where: - -- Each group has exactly `X` cards. -- All the cards in each group have the same integer. - -**Example 1**: - -``` -Input: deck = [1,2,3,4,4,3,2,1] -Output: true -Explanation: Possible partition [1,1],[2,2],[3,3],[4,4]. -``` - -**Example 2**: - -``` -Input: deck = [1,1,1,2,2,2,3,3] -Output: false´ -Explanation: No possible partition. -``` - -**Example 3**: - -``` -Input: deck = [1] -Output: false -Explanation: No possible partition. -``` - -**Example 4**: - -``` -Input: deck = [1,1] -Output: true -Explanation: Possible partition [1,1]. -``` - -**Example 5**: - -``` -Input: deck = [1,1,2,2,2,2] -Output: true -Explanation: Possible partition [1,1],[2,2],[2,2]. -``` - -**Constraints**: - -- `1 <= deck.length <= 10^4` -- `0 <= deck[i] < 10^4` - -## 题目大意 - -给定一副牌,每张牌上都写着一个整数。此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组: - -- 每组都有 X 张牌。 -- 组内所有的牌上都写着相同的整数。 - -仅当你可选的 X >= 2 时返回 true。 - - -## 解题思路 - -- 给定一副牌,要求选出数字 X,使得每组都有 X 张牌,每组牌的数字都相同。当 X ≥ 2 的时候,输出 true。 -- 通过分析题目,我们可以知道,只有当 X 为所有 count 的约数,即所有 count 的最大公约数的约数时,才存在可能的分组。因此我们只要求出所有 count 的最大公约数 g,判断 g 是否大于等于 2 即可,如果大于等于 2,则满足条件,否则不满足。 -- 时间复杂度:O(NlogC),其中 N 是卡牌的个数,C 是数组 deck 中数的范围,在本题中 C 的值为 10000。求两个数最大公约数的复杂度是 O(logC),需要求最多 N - 1 次。空间复杂度:O(N + C) 或 O(N)。 - -## 代码 - -```go - -package leetcode - -func hasGroupsSizeX(deck []int) bool { - if len(deck) < 2 { - return false - } - m, g := map[int]int{}, -1 - for _, d := range deck { - m[d]++ - } - for _, v := range m { - if g == -1 { - g = v - } else { - g = gcd(g, v) - } - } - return g >= 2 -} - -func gcd(a, b int) int { - if a == 0 { - return b - } - return gcd(b%a, a) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0918.Maximum-Sum-Circular-Subarray.md b/website/content/ChapterFour/0918.Maximum-Sum-Circular-Subarray.md deleted file mode 100755 index 1b60e16e3..000000000 --- a/website/content/ChapterFour/0918.Maximum-Sum-Circular-Subarray.md +++ /dev/null @@ -1,101 +0,0 @@ -# [918. Maximum Sum Circular Subarray](https://leetcode.com/problems/maximum-sum-circular-subarray/) - - -## 题目 - -Given a **circular array** **C** of integers represented by `A`, find the maximum possible sum of a non-empty subarray of **C**. - -Here, a *circular array* means the end of the array connects to the beginning of the array. (Formally, `C[i] = A[i]` when `0 <= i < A.length`, and `C[i+A.length] = C[i]` when `i >= 0`.) - -Also, a subarray may only include each element of the fixed buffer `A` at most once. (Formally, for a subarray `C[i], C[i+1], ..., C[j]`, there does not exist `i <= k1, k2 <= j` with `k1 % A.length = k2 % A.length`.) - -**Example 1**: - - Input: [1,-2,3,-2] - Output: 3 - Explanation: Subarray [3] has maximum sum 3 - -**Example 2**: - - Input: [5,-3,5] - Output: 10 - Explanation: Subarray [5,5] has maximum sum 5 + 5 = 10 - -**Example 3**: - - Input: [3,-1,2,-1] - Output: 4 - Explanation: Subarray [2,-1,3] has maximum sum 2 + (-1) + 3 = 4 - -**Example 4**: - - Input: [3,-2,2,-3] - Output: 3 - Explanation: Subarray [3] and [3,-2,2] both have maximum sum 3 - -**Example 5**: - - Input: [-2,-3,-1] - Output: -1 - Explanation: Subarray [-1] has maximum sum -1 - -**Note**: - -1. `-30000 <= A[i] <= 30000` -2. `1 <= A.length <= 30000` - - -## 题目大意 - -给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当0 <= i < A.length 时 C[i] = A[i],而当 i >= 0 时 C[i+A.length] = C[i]) - -此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。(形式上,对于子数组 C[i], C[i+1], ..., C[j],不存在 i <= k1, k2 <= j 其中 k1 % A.length = k2 % A.length) - -提示: - -- -30000 <= A[i] <= 30000 -- 1 <= A.length <= 30000 - - -## 解题思路 - - -- 给出一个环形数组,要求出这个环形数组中的连续子数组的最大和。 -- 拿到这题最先想到的思路是把这个数组再拼接一个,在这两个数组中查找连续子数组的最大和。这种做法是错误的,例如在 `[5,-3,5]` 这个数组中会得出 `7` 的结果,但是实际结果是 `10` 。那么这题怎么做呢?仔细分析可以得到,环形数组的最大连续子段和有两种情况,第一种情况是这个连续子段就出现在数组中, 不存在循环衔接的情况。针对这种情况就比较简单,用 `kadane` 算法(也是动态规划的思想),`O(n)` 的时间复杂度就可以求出结果。第二种情况是这个连续的子段出现在跨数组的情况,即会出现首尾相连的情况。要想找到这样一个连续子段,可以反向考虑。想找到跨段的连续子段,那么这个数组剩下的这一段就是不跨段的连续子段。想要跨段的子段和最大,那么剩下的这段连续子段和最小。如果能找到这个数组的每个元素取相反数组成的数组中的最大连续子段和,那么反过来就能找到原数组的连续子段和最小。举个例子:`[1,2,-3,-4,5]` ,取它的每个元素的相反数 `[-1,-2,3,4,-5]`,构造的数组中最大连续子段和是 `3 + 4 = 7`,由于取了相反数,所以可以得到原数组中最小连续子段和是 `-7` 。所以跨段的最大连续子段和就是剩下的那段 `[1,2,5]`。 -- 还有一些边界的情况,例如,`[1,2,-2,-3,5,5,-4,6]` 和 `[1,2,-2,-3,5,5,-4,8]`,所以还需要比较一下情况一和情况二的值,它们两者最大值才是最终环形数组的连续子数组的最大和。 - - -## 代码 - -```go - -package leetcode - -import "math" - -func maxSubarraySumCircular(A []int) int { - n, sum := len(A), 0 - for _, v := range A { - sum += v - } - kad := kadane(A) - for i := 0; i < n; i++ { - A[i] = -A[i] - } - negativeMax := kadane(A) - if sum+negativeMax <= 0 { - return kad - } - return max(kad, sum+negativeMax) -} - -func kadane(a []int) int { - n, MaxEndingHere, maxSoFar := len(a), a[0], math.MinInt32 - for i := 1; i < n; i++ { - MaxEndingHere = max(a[i], MaxEndingHere+a[i]) - maxSoFar = max(MaxEndingHere, maxSoFar) - } - return maxSoFar -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0920.Number-of-Music-Playlists.md b/website/content/ChapterFour/0920.Number-of-Music-Playlists.md deleted file mode 100755 index b0efa478d..000000000 --- a/website/content/ChapterFour/0920.Number-of-Music-Playlists.md +++ /dev/null @@ -1,85 +0,0 @@ -# [920. Number of Music Playlists](https://leetcode.com/problems/number-of-music-playlists/) - - -## 题目 - -Your music player contains `N` different songs and she wants to listen to `L` ****(not necessarily different) songs during your trip. You create a playlist so that: - -- Every song is played at least once -- A song can only be played again only if `K` other songs have been played - -Return the number of possible playlists. **As the answer can be very large, return it modulo `10^9 + 7`**. - -**Example 1**: - - Input: N = 3, L = 3, K = 1 - Output: 6 - Explanation: There are 6 possible playlists. [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]. - -**Example 2**: - - Input: N = 2, L = 3, K = 0 - Output: 6 - Explanation: There are 6 possible playlists. [1, 1, 2], [1, 2, 1], [2, 1, 1], [2, 2, 1], [2, 1, 2], [1, 2, 2] - -**Example 3**: - - Input: N = 2, L = 3, K = 1 - Output: 2 - Explanation: There are 2 possible playlists. [1, 2, 1], [2, 1, 2] - -**Note**: - -1. `0 <= K < N <= L <= 100` - -## 题目大意 - -你的音乐播放器里有 N 首不同的歌,在旅途中,你的旅伴想要听 L 首歌(不一定不同,即,允许歌曲重复)。请你为她按如下规则创建一个播放列表: - -- 每首歌至少播放一次。 -- 一首歌只有在其他 K 首歌播放完之后才能再次播放。 - -返回可以满足要求的播放列表的数量。由于答案可能非常大,请返回它模 10^9 + 7 的结果。 - -提示: - -- 0 <= K < N <= L <= 100 - - - - -## 解题思路 - -- 简化抽象一下题意,给 N 个数,要求从这 N 个数里面组成一个长度为 L 的序列,并且相同元素的间隔不能小于 K 个数。问总共有多少组组成方法。 -- 一拿到题,会觉得这一题是三维 DP,因为存在 3 个变量,但是实际考虑一下,可以降一维。我们先不考虑 K 的限制,只考虑 N 和 L。定义 `dp[i][j]` 代表播放列表里面有 `i` 首歌,其中包含 `j` 首不同的歌曲,那么题目要求的最终解存在 `dp[L][N]` 中。考虑 `dp[i][j]` 的递归公式,音乐列表当前需要组成 `i` 首歌,有 2 种方式可以得到,由 `i - 1` 首歌的列表中添加一首列表中**不存在**的新歌曲,或者由 `i - 1` 首歌的列表中添加一首列表中**已经存在**的歌曲。即,`dp[i][j]` 可以由 `dp[i - 1][j - 1]` 得到,也可以由 `dp[i - 1][j]` 得到。如果是第一种情况,添加一首新歌,那么新歌有 N - ( j - 1 ) 首,如果是第二种情况,添加一首已经存在的歌,歌有 j 首,所以状态转移方程是 `dp[i][j] = dp[i - 1][j - 1] * ( N - ( j - 1 ) ) + dp[i - 1][j] * j` 。但是这个方程是在不考虑 K 的限制条件下得到的,距离满足题意还差一步。接下来需要考虑加入 K 这个限制条件以后,状态转移方程该如何推导。 -- 如果是添加一首新歌,是不受 K 限制的,所以 `dp[i - 1][j - 1] * ( N - ( j - 1 ) )` 这里不需要变化。如果是添加一首存在的歌曲,这个时候就会受到 K 的限制了。如果当前播放列表里面的歌曲有 `j` 首,并且 `j > K`,那么选择歌曲只能从 `j - K` 里面选,因为不能选择 `j - 1` 到 `j - k` 的这些歌,选择了就不满足重复的歌之间间隔不能小于 `K` 的限制条件了。那 j ≤ K 呢?这个时候一首歌都不能选,因为歌曲数都没有超过 K,当然不能再选择重复的歌曲。(选择了就再次不满足重复的歌之间间隔不能小于 `K` 的限制条件了)。经过上述分析,可以得到最终的状态转移方程: - -![](https://img.halfrost.com/Leetcode/leetcode_920.gif) - -- 上面的式子可以合并简化成下面这个式子:`dp[i][j] = dp[i - 1][j - 1]*(N - (j - 1)) + dp[i-1][j]*max(j-K, 0)`,递归初始值 `dp[0][0] = 1`。 - - -## 代码 - -```go - -package leetcode - -func numMusicPlaylists(N int, L int, K int) int { - dp, mod := make([][]int, L+1), 1000000007 - for i := 0; i < L+1; i++ { - dp[i] = make([]int, N+1) - } - dp[0][0] = 1 - for i := 1; i <= L; i++ { - for j := 1; j <= N; j++ { - dp[i][j] = (dp[i-1][j-1] * (N - (j - 1))) % mod - if j > K { - dp[i][j] = (dp[i][j] + (dp[i-1][j]*(j-K))%mod) % mod - } - } - } - return dp[L][N] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0921.Minimum-Add-to-Make-Parentheses-Valid.md b/website/content/ChapterFour/0921.Minimum-Add-to-Make-Parentheses-Valid.md deleted file mode 100644 index 8952fe952..000000000 --- a/website/content/ChapterFour/0921.Minimum-Add-to-Make-Parentheses-Valid.md +++ /dev/null @@ -1,88 +0,0 @@ -# [921. Minimum Add to Make Parentheses Valid](https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/) - -## 题目 - -Given a string S of '(' and ')' parentheses, we add the minimum number of parentheses ( '(' or ')', and in any positions ) so that the resulting parentheses string is valid. - -Formally, a parentheses string is valid if and only if: - -- It is the empty string, or -- It can be written as AB (A concatenated with B), where A and B are valid strings, or -- It can be written as (A), where A is a valid string. -Given a parentheses string, return the minimum number of parentheses we must add to make the resulting string valid. - - - -**Example 1**: - -``` - -Input: "())" -Output: 1 - -``` - -**Example 2**: - -``` - -Input: "(((" -Output: 3 - -``` - -**Example 3**: - -``` - -Input: "()" -Output: 0 - -``` - -**Example 4**: - -``` - -Input: "()))((" -Output: 4 - -``` - -**Note**: - -1. S.length <= 1000 -2. S only consists of '(' and ')' characters. - -## 题目大意 - -给一个括号的字符串,如果能在这个括号字符串中的任意位置添加括号,问能使得这串字符串都能完美匹配的最少添加数是多少。 - -## 解题思路 - -这题也是栈的题目,利用栈进行括号匹配。最后栈里剩下几个括号,就是最少需要添加的数目。 - -## 代码 - -```go - -package leetcode - -func minAddToMakeValid(S string) int { - if len(S) == 0 { - return 0 - } - stack := make([]rune, 0) - for _, v := range S { - if v == '(' { - stack = append(stack, v) - } else if (v == ')') && len(stack) > 0 && stack[len(stack)-1] == '(' { - stack = stack[:len(stack)-1] - } else { - stack = append(stack, v) - } - } - return len(stack) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0922.Sort-Array-By-Parity-II.md b/website/content/ChapterFour/0922.Sort-Array-By-Parity-II.md deleted file mode 100644 index ca915fd94..000000000 --- a/website/content/ChapterFour/0922.Sort-Array-By-Parity-II.md +++ /dev/null @@ -1,61 +0,0 @@ -# [922. Sort Array By Parity II](https://leetcode.com/problems/sort-array-by-parity-ii/) - -## 题目 - -Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even. - -Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is even. - -You may return any answer array that satisfies this condition. - - -**Example 1**: - -``` - -Input: [4,2,5,7] -Output: [4,5,2,7] -Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted. - -``` - -**Note**: - -- 2 <= A.length <= 20000 -- A.length % 2 == 0 -- 0 <= A[i] <= 1000 - -## 题目大意 - -要求数组中奇数下标位置上放奇数,偶数下标位置上放偶数。 - -## 解题思路 - -这题比较简单,用两个下标控制奇数,偶数放置在哪个下标即可。奇数奇数之间,偶数偶数之间的顺序可以是无序的。 - -## 代码 - -```go - -package leetcode - -func sortArrayByParityII(A []int) []int { - if len(A) == 0 || len(A)%2 != 0 { - return []int{} - } - res := make([]int, len(A)) - oddIndex := 1 - evenIndex := 0 - for i := 0; i < len(A); i++ { - if A[i]%2 == 0 { - res[evenIndex] = A[i] - evenIndex += 2 - } else { - res[oddIndex] = A[i] - oddIndex += 2 - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0923.3Sum-With-Multiplicity.md b/website/content/ChapterFour/0923.3Sum-With-Multiplicity.md deleted file mode 100644 index 0673f0de4..000000000 --- a/website/content/ChapterFour/0923.3Sum-With-Multiplicity.md +++ /dev/null @@ -1,102 +0,0 @@ -# [923. 3Sum With Multiplicity](https://leetcode.com/problems/3sum-with-multiplicity/) - -## 题目 - -Given an integer array A, and an integer target, return the number of tuples i, j, k such that i < j < k and A[i] + A[j] + A[k] == target. - -As the answer can be very large, return it modulo 10^9 + 7. - - -**Example 1**: - -``` - -Input: A = [1,1,2,2,3,3,4,4,5,5], target = 8 -Output: 20 -Explanation: -Enumerating by the values (A[i], A[j], A[k]): -(1, 2, 5) occurs 8 times; -(1, 3, 4) occurs 8 times; -(2, 2, 4) occurs 2 times; -(2, 3, 3) occurs 2 times. - -``` - - -**Example 2**: - -``` - -Input: A = [1,1,2,2,2,2], target = 5 -Output: 12 -Explanation: -A[i] = 1, A[j] = A[k] = 2 occurs 12 times: -We choose one 1 from [1,1] in 2 ways, -and two 2s from [2,2,2,2] in 6 ways. - -``` - - -**Note**: - -- 3 <= A.length <= 3000 -- 0 <= A[i] <= 100 -- 0 <= target <= 300 - - -## 题目大意 - -这道题是第 15 题的升级版。给出一个数组,要求找到 3 个数相加的和等于 target 的解组合的个数,并且要求 i < j < k。解的组合个数不需要去重,相同数值不同下标算不同解(这里也是和第 15 题的区别) - -## 解题思路 - -这一题大体解法和第 15 题一样的,只不过算所有解组合的时候需要一点排列组合的知识,如果取 3 个一样的数,需要计算 C n 3,去 2 个相同的数字的时候,计算 C n 2,取一个数字就正常计算。最后所有解的个数都加起来就可以了。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func threeSumMulti(A []int, target int) int { - mod := 1000000007 - counter := map[int]int{} - for _, value := range A { - counter[value]++ - } - - uniqNums := []int{} - for key := range counter { - uniqNums = append(uniqNums, key) - } - sort.Ints(uniqNums) - - res := 0 - for i := 0; i < len(uniqNums); i++ { - ni := counter[uniqNums[i]] - if (uniqNums[i]*3 == target) && counter[uniqNums[i]] >= 3 { - res += ni * (ni - 1) * (ni - 2) / 6 - } - for j := i + 1; j < len(uniqNums); j++ { - nj := counter[uniqNums[j]] - if (uniqNums[i]*2+uniqNums[j] == target) && counter[uniqNums[i]] > 1 { - res += ni * (ni - 1) / 2 * nj - } - if (uniqNums[j]*2+uniqNums[i] == target) && counter[uniqNums[j]] > 1 { - res += nj * (nj - 1) / 2 * ni - } - c := target - uniqNums[i] - uniqNums[j] - if c > uniqNums[j] && counter[c] > 0 { - res += ni * nj * counter[c] - } - } - } - return res % mod -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0924.Minimize-Malware-Spread.md b/website/content/ChapterFour/0924.Minimize-Malware-Spread.md deleted file mode 100755 index ce5c89702..000000000 --- a/website/content/ChapterFour/0924.Minimize-Malware-Spread.md +++ /dev/null @@ -1,105 +0,0 @@ -# [924. Minimize Malware Spread](https://leetcode.com/problems/minimize-malware-spread/) - - -## 题目 - -In a network of nodes, each node `i` is directly connected to another node `j` if and only if `graph[i][j] = 1`. - -Some nodes `initial` are initially infected by malware. Whenever two nodes are directly connected and at least one of those two nodes is infected by malware, both nodes will be infected by malware. This spread of malware will continue until no more nodes can be infected in this manner. - -Suppose `M(initial)` is the final number of nodes infected with malware in the entire network, after the spread of malware stops. - -We will remove one node from the initial list. Return the node that if removed, would minimize `M(initial)`. If multiple nodes could be removed to minimize `M(initial)`, return such a node with the smallest index. - -Note that if a node was removed from the `initial` list of infected nodes, it may still be infected later as a result of the malware spread. - -**Example 1**: - - Input: graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1] - Output: 0 - -**Example 2**: - - Input: graph = [[1,0,0],[0,1,0],[0,0,1]], initial = [0,2] - Output: 0 - -**Example 3**: - - Input: graph = [[1,1,1],[1,1,1],[1,1,1]], initial = [1,2] - Output: 1 - -**Note**: - -1. `1 < graph.length = graph[0].length <= 300` -2. `0 <= graph[i][j] == graph[j][i] <= 1` -3. `graph[i][i] = 1` -4. `1 <= initial.length < graph.length` -5. `0 <= initial[i] < graph.length` - - -## 题目大意 - -在节点网络中,只有当 graph[i][j] = 1 时,每个节点 i 能够直接连接到另一个节点 j。一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。我们可以从初始列表中删除一个节点。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。请注意,如果某个节点已从受感染节点的列表 initial 中删除,它以后可能仍然因恶意软件传播而受到感染。 - - -提示: - -- 1 < graph.length = graph[0].length <= 300 -- 0 <= graph[i][j] == graph[j][i] <= 1 -- graph[i][i] = 1 -- 1 <= initial.length < graph.length -- 0 <= initial[i] < graph.length - - -## 解题思路 - - -- 给出一个节点之间的关系图,如果两个节点是连通的,那么病毒软件就会感染到连通的所有节点。现在如果想移除一个病毒节点,能最大减少感染,请问移除哪个节点?如果多个节点都能减少感染量,优先移除序号偏小的那个节点。 -- 这一题一看就是考察的并查集。利用节点的连通关系,把题目中给的所有节点都 `union()` 起来,然后依次统计每个集合内有多少个点。最后扫描一次 initial 数组,选出这个数组中节点小的并且所在集合节点多,这个节点就是最终答案。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - - "github.com/halfrost/LeetCode-Go/template" -) - -func minMalwareSpread(graph [][]int, initial []int) int { - if len(initial) == 0 { - return 0 - } - uf, minIndex, count, countMap := template.UnionFind{}, 0, math.MinInt64, map[int]int{} - uf.Init(len(graph)) - for i := range graph { - for j := range graph[i] { - if i == j { - break - } - if graph[i][j] == 1 { - uf.Union(i, j) - } - } - } - for i := 0; i < len(graph); i++ { - countMap[uf.Find(i)]++ - } - for _, v := range initial { - tmp := countMap[uf.Find(v)] - if count == tmp && minIndex > v { - minIndex = v - } - if count < tmp { - minIndex = v - count = tmp - } - } - return minIndex -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0927.Three-Equal-Parts.md b/website/content/ChapterFour/0927.Three-Equal-Parts.md deleted file mode 100755 index 311b8c493..000000000 --- a/website/content/ChapterFour/0927.Three-Equal-Parts.md +++ /dev/null @@ -1,113 +0,0 @@ -# [927. Three Equal Parts](https://leetcode.com/problems/three-equal-parts/) - - -## 题目 - -Given an array `A` of `0`s and `1`s, divide the array into 3 non-empty parts such that all of these parts represent the same binary value. - -If it is possible, return **any** `[i, j]` with `i+1 < j`, such that: - -- `A[0], A[1], ..., A[i]` is the first part; -- `A[i+1], A[i+2], ..., A[j-1]` is the second part, and -- `A[j], A[j+1], ..., A[A.length - 1]` is the third part. -- All three parts have equal binary value. - -If it is not possible, return `[-1, -1]`. - -Note that the entire part is used when considering what binary value it represents. For example, `[1,1,0]` represents `6` in decimal, not `3`. Also, leading zeros are allowed, so `[0,1,1]` and `[1,1]` represent the same value. - -**Example 1**: - - Input: [1,0,1,0,1] - Output: [0,3] - -**Example 2**: - - Input: [1,1,0,1,1] - Output: [-1,-1] - -**Note**: - -1. `3 <= A.length <= 30000` -2. `A[i] == 0` or `A[i] == 1` - - -## 题目大意 - -给定一个由 0 和 1 组成的数组 A,将数组分成 3 个非空的部分,使得所有这些部分表示相同的二进制值。如果可以做到,请返回任何 [i, j],其中 i+1 < j,这样一来: - -- A[0], A[1], ..., A[i] 组成第一部分; -- A[i+1], A[i+2], ..., A[j-1] 作为第二部分; -- A[j], A[j+1], ..., A[A.length - 1] 是第三部分。 -- 这三个部分所表示的二进制值相等。 - -如果无法做到,就返回 [-1, -1]。 - -注意,在考虑每个部分所表示的二进制时,应当将其看作一个整体。例如,[1,1,0] 表示十进制中的 6,而不会是 3。此外,前导零也是被允许的,所以 [0,1,1] 和 [1,1] 表示相同的值。 - -提示: - -1. 3 <= A.length <= 30000 -2. A[i] == 0 或 A[i] == 1 - - -## 解题思路 - -- 给出一个数组,数组里面只包含 0 和 1,要求找到 2 个分割点,使得分成的 3 个子数组的二进制是完全一样的。 -- 这一题的解题思路不难,按照题意模拟即可。先统计 1 的个数 total,然后除以 3 就是每段 1 出现的个数。有一些特殊情况需要额外判断一下,例如没有 1 的情况,那么只能首尾分割。1 个个数不是 3 的倍数,也无法分割成满足题意。然后找到第一个 1 的下标,然后根据 total/3 找到 mid,第一个分割点。再往后移动,找到第二个分割点。找到这 3 个点以后,同步的移动这 3 个点,移动中判断这 3 个下标对应的数值是否相等,如果都相等,并且最后一个点能移动到末尾,就算找到了满足题意的解了。 - - -## 代码 - -```go - -package leetcode - -func threeEqualParts(A []int) []int { - n, ones, i, count := len(A), 0, 0, 0 - for _, a := range A { - ones += a - } - if ones == 0 { - return []int{0, n - 1} - } - if ones%3 != 0 { - return []int{-1, -1} - } - k := ones / 3 - for i < n { - if A[i] == 1 { - break - } - i++ - } - start, j := i, i - for j < n { - count += A[j] - if count == k+1 { - break - } - j++ - } - mid := j - j, count = 0, 0 - for j < n { - count += A[j] - if count == 2*k+1 { - break - } - j++ - } - end := j - for end < n && A[start] == A[mid] && A[mid] == A[end] { - start++ - mid++ - end++ - } - if end == n { - return []int{start - 1, mid} - } - return []int{-1, -1} -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0928.Minimize-Malware-Spread-II.md b/website/content/ChapterFour/0928.Minimize-Malware-Spread-II.md deleted file mode 100755 index 4d83986bb..000000000 --- a/website/content/ChapterFour/0928.Minimize-Malware-Spread-II.md +++ /dev/null @@ -1,137 +0,0 @@ -# [928. Minimize Malware Spread II](https://leetcode.com/problems/minimize-malware-spread-ii/) - - -## 题目 - -(This problem is the same as *Minimize Malware Spread*, with the differences bolded.) - -In a network of nodes, each node `i` is directly connected to another node `j` if and only if `graph[i][j] = 1`. - -Some nodes `initial` are initially infected by malware. Whenever two nodes are directly connected and at least one of those two nodes is infected by malware, both nodes will be infected by malware. This spread of malware will continue until no more nodes can be infected in this manner. - -Suppose `M(initial)` is the final number of nodes infected with malware in the entire network, after the spread of malware stops. - -We will remove one node from the initial list, **completely removing it and any connections from this node to any other node**. Return the node that if removed, would minimize `M(initial)`. If multiple nodes could be removed to minimize `M(initial)`, return such a node with the smallest index. - -**Example 1**: - - Input: graph = [[1,1,0],[1,1,0],[0,0,1]], initial = [0,1] - Output: 0 - -**Example 2**: - - Input: graph = [[1,1,0],[1,1,1],[0,1,1]], initial = [0,1] - Output: 1 - -**Example 3**: - - Input: graph = [[1,1,0,0],[1,1,1,0],[0,1,1,1],[0,0,1,1]], initial = [0,1] - Output: 1 - -**Note**: - -1. `1 < graph.length = graph[0].length <= 300` -2. `0 <= graph[i][j] == graph[j][i] <= 1` -3. `graph[i][i] = 1` -4. `1 <= initial.length < graph.length` -5. `0 <= initial[i] < graph.length` - - -## 题目大意 - -(这个问题与 尽量减少恶意软件的传播 是一样的,不同之处用粗体表示。)在节点网络中,只有当 graph[i][j] = 1 时,每个节点 i 能够直接连接到另一个节点 j。一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件感染。这种恶意软件的传播将继续,直到没有更多的节点可以被这种方式感染。假设 M(initial) 是在恶意软件停止传播之后,整个网络中感染恶意软件的最终节点数。我们可以从初始列表中删除一个节点,并完全移除该节点以及从该节点到任何其他节点的任何连接。如果移除这一节点将最小化 M(initial), 则返回该节点。如果有多个节点满足条件,就返回索引最小的节点。 - -提示: - -- 1 < graph.length = graph[0].length <= 300 -- 0 <= graph[i][j] == graph[j][i] <= 1 -- graph[i][i] = 1 -- 1 <= initial.length < graph.length -- 0 <= initial[i] < graph.length - - -## 解题思路 - - -- 这一题是第 924 题的加强版。给出一个节点之间的关系图,如果两个节点是连通的,那么病毒软件就会感染到连通的所有节点。现在如果想**完全彻底**移除一个病毒节点,能最大减少感染,请问移除哪个节点?如果多个节点都能减少感染量,优先移除序号偏小的那个节点。这一题的输入输出要求和第 924 题是完全一样的,区别在于第 924 题实际上是要求把一个病毒节点变成非病毒节点,而这道题是完全删除一个病毒节点以及它连接的所有边。 -- 这一题考察的是并查集。当然用 DFS 也可以解答这一题。并查集的做法如下,首先先将所有的病毒节点去掉,然后将所有连通块合并成一个节点。因为一个连通集合中的节点,要么全部被感染,要么全部不被感染,所以可以把每个集合整体考虑。然后统计所有集合直接相邻的病毒节点的个数。对于一个集合来说: - 1. 如果直接相邻的病毒节点的个数为 0,则一定不会被感染,忽略这种情况; - 2. 如果直接相邻的病毒节点的个数为 1,则将该病毒节点删除后,整个连通块就可以避免被感染,这种情况是我们寻找的答案; - 3. 如果直接相邻的病毒节点的个数大于等于2,则不管删除哪个病毒节点,该连通块都仍会被感染,忽略这种情况; -- 所以只需在所有第二种连通块(直接相邻的病毒节点的个数为 1 的连通块)中,找出节点个数最多的连通块,与它相邻的病毒节点就是我们要删除的节点;如果有多个连通块节点个数相同,再找出与之对应的编号最小的病毒节点即可。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - - "github.com/halfrost/LeetCode-Go/template" -) - -func minMalwareSpread2(graph [][]int, initial []int) int { - if len(initial) == 0 { - return 0 - } - uf, minIndex, count, countMap, malwareMap, infectMap := template.UnionFind{}, initial[0], math.MinInt64, map[int]int{}, map[int]int{}, map[int]map[int]int{} - for _, v := range initial { - malwareMap[v]++ - } - uf.Init(len(graph)) - for i := range graph { - for j := range graph[i] { - if i == j { - break - } - if graph[i][j] == 1 && malwareMap[i] == 0 && malwareMap[j] == 0 { - uf.Union(i, j) - } - } - } - for i := 0; i < len(graph); i++ { - countMap[uf.Find(i)]++ - } - // 记录每个集合和直接相邻病毒节点的个数 - for _, i := range initial { - for j := 0; j < len(graph); j++ { - if malwareMap[j] == 0 && graph[i][j] == 1 { - p := uf.Find(j) - if _, ok := infectMap[p]; ok { - infectMap[p][i] = i - } else { - tmp := map[int]int{} - tmp[i] = i - infectMap[p] = tmp - } - } - } - } - // 选出病毒节点中序号最小的 - for _, v := range initial { - minIndex = min(minIndex, v) - } - for i, v := range infectMap { - // 找出只和一个病毒节点相连通的 - if len(v) == 1 { - tmp := countMap[uf.Find(i)] - keys := []int{} - for k := range v { - keys = append(keys, k) - } - if count == tmp && minIndex > keys[0] { - minIndex = keys[0] - } - if count < tmp { - minIndex = keys[0] - count = tmp - } - } - } - return minIndex -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0930.Binary-Subarrays-With-Sum.md b/website/content/ChapterFour/0930.Binary-Subarrays-With-Sum.md deleted file mode 100644 index 161579ce6..000000000 --- a/website/content/ChapterFour/0930.Binary-Subarrays-With-Sum.md +++ /dev/null @@ -1,65 +0,0 @@ -# [930. Binary Subarrays With Sum](https://leetcode.com/problems/binary-subarrays-with-sum/) - -## 题目 - -In an array A of 0s and 1s, how many non-empty subarrays have sum S? - - - -**Example 1**: - -``` - -Input: A = [1,0,1,0,1], S = 2 -Output: 4 -Explanation: -The 4 subarrays are bolded below: -[1,0,1,0,1] -[1,0,1,0,1] -[1,0,1,0,1] -[1,0,1,0,1] - -``` - - -**Note**: - -- A.length <= 30000 -- 0 <= S <= A.length -- A[i] is either 0 or 1. - - -## 题目大意 - -给定一个数组,数组里面的元素只有 0 和 1 两种。问这个数组有多少个和为 S 的子数组。 - -## 解题思路 - -这道题也是滑动窗口的题目。不断的加入右边的值,直到总和等于 S。[i,j] 区间内的和可以等于 [0,j] 的和减去 [0,i-1] 的和。在 freq 中不断的记下能使得和为 sum 的组合方法数,例如 freq[1] = 2 ,代表和为 1 有两种组合方法,(可能是 1 和 1,0 或者 0,1,这道题只管组合总数,没要求输出具体的组合对)。这道题的做法就是不断的累加,如果遇到比 S 多的情况,多出来的值就在 freq 中查表,看多出来的值可能是由几种情况构成的。一旦和与 S 相等以后,之后比 S 多出来的情况会越来越多(因为在不断累积,总和只会越来越大),不断的查 freq 表就可以了。 - - -## 代码 - -```go - -package leetcode - -import "fmt" - -func numSubarraysWithSum(A []int, S int) int { - freq, sum, res := make([]int, len(A)+1), 0, 0 - freq[0] = 1 - for _, v := range A { - t := sum + v - S - if t >= 0 { - // 总和有多余的,需要减去 t,除去的方法有 freq[t] 种 - res += freq[t] - } - sum += v - freq[sum]++ - fmt.Printf("freq = %v sum = %v res = %v t = %v\n", freq, sum, res, t) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0933.Number-of-Recent-Calls.md b/website/content/ChapterFour/0933.Number-of-Recent-Calls.md deleted file mode 100644 index 02b2340ce..000000000 --- a/website/content/ChapterFour/0933.Number-of-Recent-Calls.md +++ /dev/null @@ -1,74 +0,0 @@ -# [933. Number of Recent Calls](https://leetcode.com/problems/number-of-recent-calls/) - - - -## 题目 - -Write a class `RecentCounter` to count recent requests. - -It has only one method: `ping(int t)`, where t represents some time in milliseconds. - -Return the number of `ping`s that have been made from 3000 milliseconds ago until now. - -Any ping with time in `[t - 3000, t]` will count, including the current ping. - -It is guaranteed that every call to `ping` uses a strictly larger value of `t` than before. - -**Example 1**: - -``` -Input: inputs = ["RecentCounter","ping","ping","ping","ping"], inputs = [[],[1],[100],[3001],[3002]] -Output: [null,1,2,3,3] -``` - -**Note**: - -1. Each test case will have at most `10000` calls to `ping`. -2. Each test case will call `ping` with strictly increasing values of `t`. -3. Each call to ping will have `1 <= t <= 10^9`. - - -## 题目大意 - -写一个 RecentCounter 类来计算最近的请求。它只有一个方法:ping(int t),其中 t 代表以毫秒为单位的某个时间。返回从 3000 毫秒前到现在的 ping 数。任何处于 [t - 3000, t] 时间范围之内的 ping 都将会被计算在内,包括当前(指 t 时刻)的 ping。保证每次对 ping 的调用都使用比之前更大的 t 值。 -  -提示: - -- 每个测试用例最多调用 10000 次 ping。 -- 每个测试用例会使用严格递增的 t 值来调用 ping。 -- 每次调用 ping 都有 1 <= t <= 10^9。 - - -## 解题思路 - -- 要求设计一个类,可以用 `ping(t)` 的方法,计算 [t-3000, t] 区间内的 ping 数。t 是毫秒。 -- 这一题比较简单,`ping()` 方法用二分搜索即可。 - -## 代码 - -```go -type RecentCounter struct { - list []int -} - -func Constructor933() RecentCounter { - return RecentCounter{ - list: []int{}, - } -} - -func (this *RecentCounter) Ping(t int) int { - this.list = append(this.list, t) - index := sort.Search(len(this.list), func(i int) bool { return this.list[i] >= t-3000 }) - if index < 0 { - index = -index - 1 - } - return len(this.list) - index -} - -/** - * Your RecentCounter object will be instantiated and called as such: - * obj := Constructor(); - * param_1 := obj.Ping(t); - */ -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0942.DI-String-Match.md b/website/content/ChapterFour/0942.DI-String-Match.md deleted file mode 100755 index 485dee18f..000000000 --- a/website/content/ChapterFour/0942.DI-String-Match.md +++ /dev/null @@ -1,73 +0,0 @@ -# [942. DI String Match](https://leetcode.com/problems/di-string-match/) - - -## 题目 - -Given a string `S` that **only** contains "I" (increase) or "D" (decrease), let `N = S.length`. - -Return **any** permutation `A` of `[0, 1, ..., N]` such that for all `i = 0, ..., N-1`: - -- If `S[i] == "I"`, then `A[i] < A[i+1]` -- If `S[i] == "D"`, then `A[i] > A[i+1]` - -**Example 1**: - - Input: "IDID" - Output: [0,4,1,3,2] - -**Example 2**: - - Input: "III" - Output: [0,1,2,3] - -**Example 3**: - - Input: "DDI" - Output: [3,2,0,1] - -**Note**: - -1. `1 <= S.length <= 10000` -2. `S` only contains characters `"I"` or `"D"`. - - -## 题目大意 - -给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length。返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i = 0, ..., N-1,都有: - -- 如果 S[i] == "I",那么 A[i] < A[i+1] -- 如果 S[i] == "D",那么 A[i] > A[i+1] - - - -## 解题思路 - - -- 给出一个字符串,字符串中只有字符 `"I"` 和字符 `"D"`。字符 `"I"` 代表 `A[i] < A[i+1]`,字符 `"D"` 代表 `A[i] > A[i+1]` ,要求找到满足条件的任意组合。 -- 这一题也是水题,取出字符串长度即是最大数的数值,然后按照题意一次排出最终数组即可。 - - - -## 代码 - -```go - -package leetcode - -func diStringMatch(S string) []int { - result, maxNum, minNum, index := make([]int, len(S)+1), len(S), 0, 0 - for _, ch := range S { - if ch == 'I' { - result[index] = minNum - minNum++ - } else { - result[index] = maxNum - maxNum-- - } - index++ - } - result[index] = minNum - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0946.Validate-Stack-Sequences.md b/website/content/ChapterFour/0946.Validate-Stack-Sequences.md deleted file mode 100644 index f69621d28..000000000 --- a/website/content/ChapterFour/0946.Validate-Stack-Sequences.md +++ /dev/null @@ -1,68 +0,0 @@ -# [946. Validate Stack Sequences](https://leetcode.com/problems/validate-stack-sequences/) - -## 题目 - -Given two sequences pushed and popped with distinct values, return true if and only if this could have been the result of a sequence of push and pop operations on an initially empty stack. - - - -**Example 1**: - -``` - -Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1] -Output: true -Explanation: We might do the following sequence: -push(1), push(2), push(3), push(4), pop() -> 4, -push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1 - -``` - -**Example 2**: - -``` - -Input: pushed = [1,2,3,4,5], popped = [4,3,5,1,2] -Output: false -Explanation: 1 cannot be popped before 2. - -``` - -**Note**: - -1. 0 <= pushed.length == popped.length <= 1000 -2. 0 <= pushed[i], popped[i] < 1000 -3. pushed is a permutation of popped. -4. pushed and popped have distinct values. - -## 题目大意 - -给 2 个数组,一个数组里面代表的是 push 的顺序,另一个数组里面代表的是 pop 的顺序。问按照这样的顺序操作以后,最终能否把栈清空? - -## 解题思路 - -这一题也是靠栈操作的题目,按照 push 数组的顺序先把压栈,然后再依次在 pop 里面找栈顶元素,找到了就 pop,直到遍历完 pop 数组,最终如果遍历完了 pop 数组,就代表清空了整个栈了。 - -## 代码 - -```go - -package leetcode - -import "fmt" - -func validateStackSequences(pushed []int, popped []int) bool { - stack, j, N := []int{}, 0, len(pushed) - for _, x := range pushed { - stack = append(stack, x) - fmt.Printf("stack = %v j = %v\n", stack, j) - for len(stack) != 0 && j < N && stack[len(stack)-1] == popped[j] { - stack = stack[0 : len(stack)-1] - j++ - } - fmt.Printf("*****stack = %v j = %v\n", stack, j) - } - return j == N -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0947.Most-Stones-Removed-with-Same-Row-or-Column.md b/website/content/ChapterFour/0947.Most-Stones-Removed-with-Same-Row-or-Column.md deleted file mode 100755 index 886bb0361..000000000 --- a/website/content/ChapterFour/0947.Most-Stones-Removed-with-Same-Row-or-Column.md +++ /dev/null @@ -1,82 +0,0 @@ -# [947. Most Stones Removed with Same Row or Column](https://leetcode.com/problems/most-stones-removed-with-same-row-or-column/) - - -## 题目 - -On a 2D plane, we place stones at some integer coordinate points. Each coordinate point may have at most one stone. - -Now, a *move* consists of removing a stone that shares a column or row with another stone on the grid. - -What is the largest possible number of moves we can make? - -**Example 1**: - - Input: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]] - Output: 5 - -**Example 2**: - - Input: stones = [[0,0],[0,2],[1,1],[2,0],[2,2]] - Output: 3 - -**Example 3**: - - Input: stones = [[0,0]] - Output: 0 - -**Note**: - -1. `1 <= stones.length <= 1000` -2. `0 <= stones[i][j] < 10000` - - -## 题目大意 - -在二维平面上,我们将石头放置在一些整数坐标点上。每个坐标点上最多只能有一块石头。现在,move 操作将会移除与网格上的某一块石头共享一列或一行的一块石头。我们最多能执行多少次 move 操作? - -提示: - -- 1 <= stones.length <= 1000 -- 0 <= stones[i][j] < 10000 - - -## 解题思路 - - -- 给出一个数组,数组中的元素是一系列的坐标点。现在可以移除一些坐标点,移除必须满足:移除的这个点,在相同的行或者列上有一个点。问最终可以移除多少个点。移除到最后必然有些点独占一行,那么这些点都不能被移除。 -- 这一题的解题思路是并查集。把所有共行或者共列的点都 `union()` 起来。不同集合之间是不能相互移除的。反证法:如果能移除,代表存在共行或者共列的情况,那么肯定是同一个集合了,这样就不满足不同集合了。最终剩下的点就是集合的个数,每个集合只会留下一个点。所以移除的点就是点的总数减去集合的个数 `len(stones) - uf.totalCount()`。 -- 如果暴力合并集合,时间复杂度也非常差,可以由优化的地方。再遍历所有点的过程中,可以把遍历过的行和列存起来。这里可以用 map 来记录,key 为行号,value 为上一次遍历过的点的序号。同样,列也可以用 map 存起来,key 为列号,value 为上一次遍历过的点的序号。经过这样的优化以后,时间复杂度会提高不少。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func removeStones(stones [][]int) int { - if len(stones) <= 1 { - return 0 - } - uf, rowMap, colMap := template.UnionFind{}, map[int]int{}, map[int]int{} - uf.Init(len(stones)) - for i := 0; i < len(stones); i++ { - if _, ok := rowMap[stones[i][0]]; ok { - uf.Union(rowMap[stones[i][0]], i) - } else { - rowMap[stones[i][0]] = i - } - if _, ok := colMap[stones[i][1]]; ok { - uf.Union(colMap[stones[i][1]], i) - } else { - colMap[stones[i][1]] = i - } - } - return len(stones) - uf.TotalCount() -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0949.Largest-Time-for-Given-Digits.md b/website/content/ChapterFour/0949.Largest-Time-for-Given-Digits.md deleted file mode 100644 index 02f0bf435..000000000 --- a/website/content/ChapterFour/0949.Largest-Time-for-Given-Digits.md +++ /dev/null @@ -1,78 +0,0 @@ -# [949. Largest Time for Given Digits](https://leetcode.com/problems/largest-time-for-given-digits/) - - -## 题目 - -Given an array of 4 digits, return the largest 24 hour time that can be made. - -The smallest 24 hour time is 00:00, and the largest is 23:59. Starting from 00:00, a time is larger if more time has elapsed since midnight. - -Return the answer as a string of length 5. If no valid time can be made, return an empty string. - -**Example 1**: - -``` -Input: [1,2,3,4] -Output: "23:41" -``` - -**Example 2**: - -``` -Input: [5,5,5,5] -Output: "" -``` - -**Note**: - -1. `A.length == 4` -2. `0 <= A[i] <= 9` - -## 题目大意 - -给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。最小的 24 小时制时间是 00:00,而最大的是 23:59。从 00:00 (午夜)开始算起,过得越久,时间越大。以长度为 5 的字符串返回答案。如果不能确定有效时间,则返回空字符串。 - -## 解题思路 - -- 给出 4 个数字,要求返回一个字符串,代表由这 4 个数字能组成的最大 24 小时制的时间。 -- 简单题,这一题直接暴力枚举就可以了。依次检查给出的 4 个数字每个排列组合是否是时间合法的。例如检查 10 * A[i] + A[j] 是不是小于 24, 10 * A[k] + A[l] 是不是小于 60。如果合法且比目前存在的最大时间更大,就更新这个最大时间。 - -## 代码 - -```go - -package leetcode - -import "fmt" - -func largestTimeFromDigits(A []int) string { - flag, res := false, 0 - for i := 0; i < 4; i++ { - for j := 0; j < 4; j++ { - if i == j { - continue - } - for k := 0; k < 4; k++ { - if i == k || j == k { - continue - } - l := 6 - i - j - k - hour := A[i]*10 + A[j] - min := A[k]*10 + A[l] - if hour < 24 && min < 60 { - if hour*60+min >= res { - res = hour*60 + min - flag = true - } - } - } - } - } - if flag { - return fmt.Sprintf("%02d:%02d", res/60, res%60) - } else { - return "" - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0952.Largest-Component-Size-by-Common-Factor.md b/website/content/ChapterFour/0952.Largest-Component-Size-by-Common-Factor.md deleted file mode 100755 index d37262bce..000000000 --- a/website/content/ChapterFour/0952.Largest-Component-Size-by-Common-Factor.md +++ /dev/null @@ -1,119 +0,0 @@ -# [952. Largest Component Size by Common Factor](https://leetcode.com/problems/largest-component-size-by-common-factor/) - - -## 题目 - -Given a non-empty array of unique positive integers `A`, consider the following graph: - -- There are `A.length` nodes, labelled `A[0]` to `A[A.length - 1];` -- There is an edge between `A[i]` and `A[j]` if and only if `A[i]`and `A[j]` share a common factor greater than 1. - -Return the size of the largest connected component in the graph. - -**Example 1**: - - Input: [4,6,15,35] - Output: 4 - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/01/ex1.png) - -**Example 2**: - - Input: [20,50,9,63] - Output: 2 - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/01/ex2.png) - -**Example 3**: - - Input: [2,3,6,7,4,12,21,39] - Output: 8 - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/01/ex3.png) - -**Note**: - -1. `1 <= A.length <= 20000` -2. `1 <= A[i] <= 100000` - - -## 题目大意 - -给定一个由不同正整数的组成的非空数组 A,考虑下面的图: - -有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记; -只有当 A[i] 和 A[j] 共用一个大于 1 的公因数时,A[i] 和 A[j] 之间才有一条边。 -返回图中最大连通组件的大小。 - -提示: - -1. 1 <= A.length <= 20000 -2. 1 <= A[i] <= 100000 - -## 解题思路 - -- 给出一个数组,数组中的元素如果每两个元素有公约数,那么这两个元素可以算有关系。所有有关系的数可以放在一个集合里,问这个数组里面有关系的元素组成的集合里面最多有多少个元素。 -- 这一题读完题直觉就是用并查集来解题。首先可以用暴力的解法尝试。用 2 层循环,两两比较有没有公约数,如果有公约数就 `union()` 到一起。提交以后出现 TLE,其实看一下数据规模就知道会超时,`1 <= A.length <= 20000`。注意到 `1 <= A[i] <= 100000`,开根号以后最后才 316.66666,这个规模的数不大。所以把每个数小于根号自己的因子都找出来,例如 `6 = 2 * 3`,`15 = 3 * 5`,那么把 6 和 2,6 和 3 都 `union()`,15 和 3,15 和 5 都 `union()`,最终遍历所有的集合,找到最多元素的集合,输出它包含的元素值。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -// 解法一 并查集 UnionFind -func largestComponentSize(A []int) int { - maxElement, uf, countMap, res := 0, template.UnionFind{}, map[int]int{}, 1 - for _, v := range A { - maxElement = max(maxElement, v) - } - uf.Init(maxElement + 1) - for _, v := range A { - for k := 2; k*k <= v; k++ { - if v%k == 0 { - uf.Union(v, k) - uf.Union(v, v/k) - } - } - } - for _, v := range A { - countMap[uf.Find(v)]++ - res = max(res, countMap[uf.Find(v)]) - } - return res -} - -// 解法二 UnionFindCount -func largestComponentSize1(A []int) int { - uf, factorMap := template.UnionFindCount{}, map[int]int{} - uf.Init(len(A)) - for i, v := range A { - for k := 2; k*k <= v; k++ { - if v%k == 0 { - if _, ok := factorMap[k]; !ok { - factorMap[k] = i - } else { - uf.Union(i, factorMap[k]) - } - if _, ok := factorMap[v/k]; !ok { - factorMap[v/k] = i - } else { - uf.Union(i, factorMap[v/k]) - } - } - } - if _, ok := factorMap[v]; !ok { - factorMap[v] = i - } else { - uf.Union(i, factorMap[v]) - } - } - return uf.MaxUnionCount() -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0953.Verifying-an-Alien-Dictionary.md b/website/content/ChapterFour/0953.Verifying-an-Alien-Dictionary.md deleted file mode 100755 index ff648c14e..000000000 --- a/website/content/ChapterFour/0953.Verifying-an-Alien-Dictionary.md +++ /dev/null @@ -1,81 +0,0 @@ -# [953. Verifying an Alien Dictionary](https://leetcode.com/problems/verifying-an-alien-dictionary/) - - -## 题目 - -In an alien language, surprisingly they also use english lowercase letters, but possibly in a different `order`. The `order`of the alphabet is some permutation of lowercase letters. - -Given a sequence of `words` written in the alien language, and the `order` of the alphabet, return `true` if and only if the given `words` are sorted lexicographicaly in this alien language. - -**Example 1**: - - Input: words = ["hello","leetcode"], order = "hlabcdefgijkmnopqrstuvwxyz" - Output: true - Explanation: As 'h' comes before 'l' in this language, then the sequence is sorted. - -**Example 2**: - - Input: words = ["word","world","row"], order = "worldabcefghijkmnpqstuvxyz" - Output: false - Explanation: As 'd' comes after 'l' in this language, then words[0] > words[1], hence the sequence is unsorted. - -**Example 3**: - - Input: words = ["apple","app"], order = "abcdefghijklmnopqrstuvwxyz" - Output: false - Explanation: The first three characters "app" match, and the second string is shorter (in size.) According to lexicographical rules "apple" > "app", because 'l' > '∅', where '∅' is defined as the blank character which is less than any other character (More info). - -**Note**: - -1. `1 <= words.length <= 100` -2. `1 <= words[i].length <= 20` -3. `order.length == 26` -4. All characters in `words[i]` and `order` are english lowercase letters. - - -## 题目大意 - -某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。给定一组用外星语书写的单词 words,以及其字母表的顺序 order,只有当给定的单词在这种外星语中按字典序排列时,返回 true;否则,返回 false。 - - - -## 解题思路 - - -- 这一题是简单题。给出一个字符串数组,判断把字符串数组里面字符串是否是按照 order 的排序排列的。order 是给出个一个字符串排序。这道题的解法是把 26 个字母的顺序先存在 map 中,然后依次遍历判断字符串数组里面字符串的大小。 - - -## 代码 - -```go - -package leetcode - -func isAlienSorted(words []string, order string) bool { - if len(words) < 2 { - return true - } - hash := make(map[byte]int) - for i := 0; i < len(order); i++ { - hash[order[i]] = i - } - for i := 0; i < len(words)-1; i++ { - pointer, word, wordplus := 0, words[i], words[i+1] - for pointer < len(word) && pointer < len(wordplus) { - if hash[word[pointer]] > hash[wordplus[pointer]] { - return false - } - if hash[word[pointer]] < hash[wordplus[pointer]] { - break - } else { - pointer = pointer + 1 - } - } - if pointer < len(word) && pointer >= len(wordplus) { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0959.Regions-Cut-By-Slashes.md b/website/content/ChapterFour/0959.Regions-Cut-By-Slashes.md deleted file mode 100755 index c560cc59b..000000000 --- a/website/content/ChapterFour/0959.Regions-Cut-By-Slashes.md +++ /dev/null @@ -1,150 +0,0 @@ -# [959. Regions Cut By Slashes](https://leetcode.com/problems/regions-cut-by-slashes/) - - -## 题目 - -In a N x N `grid` composed of 1 x 1 squares, each 1 x 1 square consists of a `/`, `\`, or blank space. These characters divide the square into contiguous regions. - -(Note that backslash characters are escaped, so a `\` is represented as `"\\"`.) - -Return the number of regions. - -**Example 1**: - - Input: - [ - " /", - "/ " - ] - Output: 2 - Explanation: The 2x2 grid is as follows: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/1.png) - -**Example 2**: - - Input: - [ - " /", - " " - ] - Output: 1 - Explanation: The 2x2 grid is as follows: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/2.png) - -**Example 3**: - - Input: - [ - "\\/", - "/\\" - ] - Output: 4 - Explanation: (Recall that because \ characters are escaped, "\\/" refers to \/, and "/\\" refers to /\.) - The 2x2 grid is as follows: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/3.png) - -**Example 4**: - - Input: - [ - "/\\", - "\\/" - ] - Output: 5 - Explanation: (Recall that because \ characters are escaped, "/\\" refers to /\, and "\\/" refers to \/.) - The 2x2 grid is as follows: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/4.png) - -**Example 5**: - - Input: - [ - "//", - "/ " - ] - Output: 3 - Explanation: The 2x2 grid is as follows: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/12/15/5.png) - -**Note**: - -1. `1 <= grid.length == grid[0].length <= 30` -2. `grid[i][j]` is either `'/'`, `'\'`, or `' '`. - - -## 题目大意 - -在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。(请注意,反斜杠字符是转义的,因此 \ 用 "\\" 表示)返回区域的数目。 - - -提示: - -- 1 <= grid.length == grid[0].length <= 30 -- grid[i][j] 是 '/'、'\'、或 ' '。 - -## 解题思路 - - -- 给出一个字符串,代表的是 `N x N` 正方形中切分的情况,有 2 种切分的情况 `'\'` 和 `'/'` ,即从左上往右下切和从右上往左下切。问按照给出的切分方法,能把 `N x N` 正方形切成几部分? -- 这一题解题思路是并查集。先将每个 `1*1` 的正方形切分成下图的样子。分成 4 小块。然后按照题目给的切分图来合并各个小块。 - -![](https://img.halfrost.com/Leetcode/leetcode_959.png) - -- 遇到 `'\\'`,就把第 0 块和第 1 块 `union()` 起来,第 2 块和第 3 块 `union()` 起来;遇到 `'/'`,就把第 0 块和第 3 块 `union()` 起来,第 2 块和第 1 块 `union()` 起来;遇到 `' '`,就把第 0 块和第 1 块 `union()` 起来,第 2 块和第 1 块 `union()` 起来,第 2 块和第 3 块 `union()` 起来,即 4 块都 `union()` 起来;最后还需要记得上一行和下一行还需要 `union()`,即本行的第 2 块和下一行的第 0 块 `union()` 起来;左边一列和右边一列也需要 `union()`。即本列的第 1 块和右边一列的第 3 块 `union()` 起来。最后计算出集合总个数就是最终答案了。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func regionsBySlashes(grid []string) int { - size := len(grid) - uf := template.UnionFind{} - uf.Init(4 * size * size) - for i := 0; i < size; i++ { - for j := 0; j < size; j++ { - switch grid[i][j] { - case '\\': - uf.Union(getFaceIdx(size, i, j, 0), getFaceIdx(size, i, j, 1)) - uf.Union(getFaceIdx(size, i, j, 2), getFaceIdx(size, i, j, 3)) - case '/': - uf.Union(getFaceIdx(size, i, j, 0), getFaceIdx(size, i, j, 3)) - uf.Union(getFaceIdx(size, i, j, 2), getFaceIdx(size, i, j, 1)) - case ' ': - uf.Union(getFaceIdx(size, i, j, 0), getFaceIdx(size, i, j, 1)) - uf.Union(getFaceIdx(size, i, j, 2), getFaceIdx(size, i, j, 1)) - uf.Union(getFaceIdx(size, i, j, 2), getFaceIdx(size, i, j, 3)) - } - if i < size-1 { - uf.Union(getFaceIdx(size, i, j, 2), getFaceIdx(size, i+1, j, 0)) - } - if j < size-1 { - uf.Union(getFaceIdx(size, i, j, 1), getFaceIdx(size, i, j+1, 3)) - } - } - } - count := 0 - for i := 0; i < 4*size*size; i++ { - if uf.Find(i) == i { - count++ - } - } - return count -} - -func getFaceIdx(size, i, j, k int) int { - return 4*(i*size+j) + k -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0961.N-Repeated-Element-in-Size-2N-Array.md b/website/content/ChapterFour/0961.N-Repeated-Element-in-Size-2N-Array.md deleted file mode 100755 index a9e53e779..000000000 --- a/website/content/ChapterFour/0961.N-Repeated-Element-in-Size-2N-Array.md +++ /dev/null @@ -1,60 +0,0 @@ -# [961. N-Repeated Element in Size 2N Array](https://leetcode.com/problems/n-repeated-element-in-size-2n-array/) - - -## 题目 - -In a array `A` of size `2N`, there are `N+1` unique elements, and exactly one of these elements is repeated N times. - -Return the element repeated `N` times. - -**Example 1**: - - Input: [1,2,3,3] - Output: 3 - -**Example 2**: - - Input: [2,1,2,5,3,2] - Output: 2 - -**Example 3**: - - Input: [5,1,5,2,5,3,5,4] - Output: 5 - -**Note**: - -1. `4 <= A.length <= 10000` -2. `0 <= A[i] < 10000` -3. `A.length` is even - - -## 题目大意 - -在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。返回重复了 N 次的那个元素。 - - -## 解题思路 - - -- 简单题。数组中有 2N 个数,有 N + 1 个数是不重复的,这之中有一个数重复了 N 次,请找出这个数。解法非常简单,把所有数都存入 map 中,如果遇到存在的 key 就返回这个数。 - - -## 代码 - -```go - -package leetcode - -func repeatedNTimes(A []int) int { - kv := make(map[int]struct{}) - for _, val := range A { - if _, ok := kv[val]; ok { - return val - } - kv[val] = struct{}{} - } - return 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0968.Binary-Tree-Cameras.md b/website/content/ChapterFour/0968.Binary-Tree-Cameras.md deleted file mode 100755 index d9873a5bb..000000000 --- a/website/content/ChapterFour/0968.Binary-Tree-Cameras.md +++ /dev/null @@ -1,103 +0,0 @@ -# [968. Binary Tree Cameras](https://leetcode.com/problems/binary-tree-cameras/) - -## 题目 - -Given a binary tree, we install cameras on the nodes of the tree. - -Each camera at a node can monitor **its parent, itself, and its immediate children**. - -Calculate the minimum number of cameras needed to monitor all nodes of the tree. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2018/12/29/bst_cameras_01.png](https://assets.leetcode.com/uploads/2018/12/29/bst_cameras_01.png) - - Input: [0,0,null,0,0] - Output: 1 - Explanation: One camera is enough to monitor all nodes if placed as shown. - -**Example 2**: - -![https://assets.leetcode.com/uploads/2018/12/29/bst_cameras_02.png](https://assets.leetcode.com/uploads/2018/12/29/bst_cameras_02.png) - - Input: [0,0,null,0,null,0,null,null,0] - Output: 2 - Explanation: At least two cameras are needed to monitor all nodes of the tree. The above image shows one of the valid configurations of camera placement. - -**Note**: - -1. The number of nodes in the given tree will be in the range `[1, 1000]`. -2. **Every** node has value 0. - - -## 题目大意 - -给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。 - -提示: - -1. 给定树的节点数的范围是 [1, 1000]。 -2. 每个节点的值都是 0。 - - - -## 解题思路 - -- 给出一棵树,要求在这个树上面放摄像头,一个摄像头最多可以监视 4 个节点,2 个孩子,本身节点,还有父亲节点。问最少放多少个摄像头可以覆盖树上的所有节点。 -- 这一题可以用贪心思想来解题。先将节点分为 3 类,第一类,叶子节点,第二类,包含叶子节点的节点,第三类,其中一个叶子节点上放了摄像头的。按照这个想法,将树的每个节点染色,如下图。 - -![](https://img.halfrost.com/Leetcode/leetcode_968_1.png) - -- 所有包含叶子节点的节点,可以放一个摄像头,这个可以覆盖至少 3 个节点,如果还有父节点的话,可以覆盖 4 个节点。所以贪心的策略是从最下层的叶子节点开始往上“染色”,先把最下面的一层 1 染色。标 1 的节点都是要放一个摄像头的。如果叶子节点中包含 1 的节点,那么再将这个节点染成 2 。如下图的黄色节点。黄色节点代表的是不用放摄像头的节点,因为它被叶子节点的摄像头覆盖了。出现了 2 的节点以后,再往上的节点又再次恢复成叶子节点 0 。如此类推,直到推到根节点。 - -![](https://img.halfrost.com/Leetcode/leetcode_968_2.png) - -- 最后根节点还需要注意多种情况,根节点可能是叶子节点 0,那么最终答案还需要 + 1,因为需要在根节点上放一个摄像头,不然根节点覆盖不到了。根节点也有可能是 1 或者 2,这两种情况都不需要增加摄像头了,以为都覆盖到了。按照上述的方法,递归即可得到答案。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -type status int - -const ( - isLeaf status = iota - parentofLeaf - isMonitoredWithoutCamera -) - -func minCameraCover(root *TreeNode) int { - res := 0 - if minCameraCoverDFS(root, &res) == isLeaf { - res++ - } - return res -} - -func minCameraCoverDFS(root *TreeNode, res *int) status { - if root == nil { - return 2 - } - left, right := minCameraCoverDFS(root.Left, res), minCameraCoverDFS(root.Right, res) - if left == isLeaf || right == isLeaf { - *res++ - return parentofLeaf - } else if left == parentofLeaf || right == parentofLeaf { - return isMonitoredWithoutCamera - } else { - return isLeaf - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0969.Pancake-Sorting.md b/website/content/ChapterFour/0969.Pancake-Sorting.md deleted file mode 100644 index 68288d5c2..000000000 --- a/website/content/ChapterFour/0969.Pancake-Sorting.md +++ /dev/null @@ -1,96 +0,0 @@ -# [969. Pancake Sorting](https://leetcode.com/problems/pancake-sorting/) - -## 题目 - -Given an array A, we can perform a pancake flip: We choose some positive integer k <= A.length, then reverse the order of the first k elements of A. We want to perform zero or more pancake flips (doing them one after another in succession) to sort the array A. - -Return the k-values corresponding to a sequence of pancake flips that sort A. Any valid answer that sorts the array within 10 * A.length flips will be judged as correct. - -**Example 1**: - -``` - -Input: [3,2,4,1] -Output: [4,2,4,3] -Explanation: -We perform 4 pancake flips, with k values 4, 2, 4, and 3. -Starting state: A = [3, 2, 4, 1] -After 1st flip (k=4): A = [1, 4, 2, 3] -After 2nd flip (k=2): A = [4, 1, 2, 3] -After 3rd flip (k=4): A = [3, 2, 1, 4] -After 4th flip (k=3): A = [1, 2, 3, 4], which is sorted. - -``` - -**Example 2**: - -``` - -Input: [1,2,3] -Output: [] -Explanation: The input is already sorted, so there is no need to flip anything. -Note that other answers, such as [3, 3], would also be accepted. - -``` - -**Note**: - -- 1 <= A.length <= 100 -- A[i] is a permutation of [1, 2, ..., A.length] - -## 题目大意 - -给定一个数组,要求输出“煎饼排序”的步骤,使得最终数组是从小到大有序的。“煎饼排序”,每次排序都反转前 n 个数,n 小于数组的长度。 - -## 解题思路 - -这道题的思路是,每次找到当前数组中无序段中最大的值,(初始的时候,整个数组相当于都是无序段),将最大值的下标 i 进行“煎饼排序”,前 i 个元素都反转一遍。这样最大值就到了第一个位置了。然后紧接着再进行一次数组总长度 n 的“煎饼排序”,目的是使最大值到数组最后一位,这样它的位置就归位了。那么数组的无序段为 n-1 。然后用这个方法不断的循环,直至数组中每个元素都到了排序后最终的位置下标上了。最终数组就有序了。 - -这道题有一个特殊点在于,数组里面的元素都是自然整数,那么最终数组排序完成以后,数组的长度就是最大值。所以找最大值也不需要遍历一次数组了,直接取出长度就是最大值。 - - -## 代码 - -```go - -package leetcode - -func pancakeSort(A []int) []int { - if len(A) == 0 { - return []int{} - } - right := len(A) - var ( - ans []int - ) - for right > 0 { - idx := find(A, right) - if idx != right-1 { - reverse969(A, 0, idx) - reverse969(A, 0, right-1) - ans = append(ans, idx+1, right) - } - right-- - } - - return ans -} - -func reverse969(nums []int, l, r int) { - for l < r { - nums[l], nums[r] = nums[r], nums[l] - l++ - r-- - } -} - -func find(nums []int, t int) int { - for i, num := range nums { - if num == t { - return i - } - } - return -1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0970.Powerful-Integers.md b/website/content/ChapterFour/0970.Powerful-Integers.md deleted file mode 100755 index 9de409549..000000000 --- a/website/content/ChapterFour/0970.Powerful-Integers.md +++ /dev/null @@ -1,88 +0,0 @@ -# [970. Powerful Integers](https://leetcode.com/problems/powerful-integers/) - - -## 题目 - -Given two positive integers `x` and `y`, an integer is *powerful* if it is equal to `x^i + y^j` for some integers `i >= 0` and `j >= 0`. - -Return a list of all *powerful* integers that have value less than or equal to `bound`. - -You may return the answer in any order. In your answer, each value should occur at most once. - -**Example 1**: - - Input: x = 2, y = 3, bound = 10 - Output: [2,3,4,5,7,9,10] - Explanation: - 2 = 2^0 + 3^0 - 3 = 2^1 + 3^0 - 4 = 2^0 + 3^1 - 5 = 2^1 + 3^1 - 7 = 2^2 + 3^1 - 9 = 2^3 + 3^0 - 10 = 2^0 + 3^2 - -**Example 2**: - - Input: x = 3, y = 5, bound = 15 - Output: [2,4,6,8,10,14] - -**Note**: - -- `1 <= x <= 100` -- `1 <= y <= 100` -- `0 <= bound <= 10^6` - - -## 题目大意 - -给定两个正整数 x 和 y,如果某一整数等于 x^i + y^j,其中整数 i >= 0 且 j >= 0,那么我们认为该整数是一个强整数。返回值小于或等于 bound 的所有强整数组成的列表。你可以按任何顺序返回答案。在你的回答中,每个值最多出现一次。 - - -## 解题思路 - - -- 简答题,题目要求找出满足 `x^i + y^j ≤ bound` 条件的所有解。题目要求输出中不能重复,所以用 map 来去重。剩下的就是 `n^2` 暴力循环枚举所有解。 - - -## 代码 - -```go - -package leetcode - -import "math" - -func powerfulIntegers(x int, y int, bound int) []int { - if x == 1 && y == 1 { - if bound < 2 { - return []int{} - } - return []int{2} - } - if x > y { - x, y = y, x - } - visit, result := make(map[int]bool), make([]int, 0) - for i := 0; ; i++ { - found := false - for j := 0; pow(x, i)+pow(y, j) <= bound; j++ { - v := pow(x, i) + pow(y, j) - if !visit[v] { - found = true - visit[v] = true - result = append(result, v) - } - } - if !found { - break - } - } - return result -} - -func pow(x, i int) int { - return int(math.Pow(float64(x), float64(i))) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0973.K-Closest-Points-to-Origin.md b/website/content/ChapterFour/0973.K-Closest-Points-to-Origin.md deleted file mode 100644 index a0b3a7608..000000000 --- a/website/content/ChapterFour/0973.K-Closest-Points-to-Origin.md +++ /dev/null @@ -1,71 +0,0 @@ -# [973. K Closest Points to Origin](https://leetcode.com/problems/k-closest-points-to-origin/) - -## 题目 - -We have a list of points on the plane. Find the K closest points to the origin (0, 0). - -(Here, the distance between two points on a plane is the Euclidean distance.) - -You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in.) - - -**Example 1**: - -``` - -Input: points = [[1,3],[-2,2]], K = 1 -Output: [[-2,2]] -Explanation: -The distance between (1, 3) and the origin is sqrt(10). -The distance between (-2, 2) and the origin is sqrt(8). -Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin. -We only want the closest K = 1 points from the origin, so the answer is just [[-2,2]]. - -``` - -**Example 2**: - -``` - -Input: points = [[3,3],[5,-1],[-2,4]], K = 2 -Output: [[3,3],[-2,4]] -(The answer [[-2,4],[3,3]] would also be accepted.) - -``` - -**Note**: - -- 1 <= K <= points.length <= 10000 -- -10000 < points[i][0] < 10000 -- -10000 < points[i][1] < 10000 - -## 题目大意 - -找出 K 个距离坐标原点最近的坐标点。 - -## 解题思路 - -这题也是排序题,先将所有点距离坐标原点的距离都算出来,然后从小到大排序。取前 K 个即可。 - -## 代码 - -```go - -package leetcode - -import "sort" - -// KClosest define -func KClosest(points [][]int, K int) [][]int { - sort.Slice(points, func(i, j int) bool { - return points[i][0]*points[i][0]+points[i][1]*points[i][1] < - points[j][0]*points[j][0]+points[j][1]*points[j][1] - }) - ans := make([][]int, K) - for i := 0; i < K; i++ { - ans[i] = points[i] - } - return ans -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0976.Largest-Perimeter-Triangle.md b/website/content/ChapterFour/0976.Largest-Perimeter-Triangle.md deleted file mode 100644 index 52b5b24c4..000000000 --- a/website/content/ChapterFour/0976.Largest-Perimeter-Triangle.md +++ /dev/null @@ -1,78 +0,0 @@ -# [976. Largest Perimeter Triangle](https://leetcode.com/problems/largest-perimeter-triangle/) - -## 题目 - -Given an array A of positive lengths, return the largest perimeter of a triangle with non-zero area, formed from 3 of these lengths. - -If it is impossible to form any triangle of non-zero area, return 0. - - -**Example 1**: - -``` - -Input: [2,1,2] -Output: 5 - -``` - -**Example 2**: - -``` - -Input: [1,2,1] -Output: 0 - -``` - -**Example 3**: - -``` - -Input: [3,2,3,4] -Output: 10 - -``` - -**Example 4**: - -``` - -Input: [3,6,2,3] -Output: 8 - -``` - -**Note**: - -- 3 <= A.length <= 10000 -- 1 <= A[i] <= 10^6 - -## 题目大意 - -找到可以组成三角形三条边的长度,要求输出三条边之和最长的,即三角形周长最长。 - -## 解题思路 - -这道题也是排序题,先讲所有的长度进行排序,从大边开始往前找,找到第一个任意两边之和大于第三边(满足能构成三角形的条件)的下标,然后输出这 3 条边之和即可,如果没有找到输出 0 。 - -## 代码 - -```go - -package leetcode - -func largestPerimeter(A []int) int { - if len(A) < 3 { - return 0 - } - quickSort164(A, 0, len(A)-1) - for i := len(A) - 1; i >= 2; i-- { - if (A[i]+A[i-1] > A[i-2]) && (A[i]+A[i-2] > A[i-1]) && (A[i-2]+A[i-1] > A[i]) { - return A[i] + A[i-1] + A[i-2] - } - } - return 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0977.Squares-of-a-Sorted-Array.md b/website/content/ChapterFour/0977.Squares-of-a-Sorted-Array.md deleted file mode 100644 index 06fbd1a7d..000000000 --- a/website/content/ChapterFour/0977.Squares-of-a-Sorted-Array.md +++ /dev/null @@ -1,86 +0,0 @@ -# [977. Squares of a Sorted Array](https://leetcode.com/problems/squares-of-a-sorted-array/) - -## 题目 - -Given an array of integers A sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order. - - - -**Example 1**: - -``` - -Input: [-4,-1,0,3,10] -Output: [0,1,9,16,100] - -``` - -**Example 2**: - -``` - -Input: [-7,-3,2,3,11] -Output: [4,9,9,49,121] - -``` - -**Note**: - -1. 1 <= A.length <= 10000 -2. -10000 <= A[i] <= 10000 -3. A is sorted in non-decreasing order. - -## 题目大意 - -给一个已经有序的数组,返回的数组也必须是有序的,且数组中的每个元素是由原数组中每个数字的平方得到的。 - -## 解题思路 - -这一题由于原数组是有序的,所以要尽量利用这一特点来减少时间复杂度。 - -最终返回的数组,最后一位,是最大值,这个值应该是由原数组最大值,或者最小值得来的,所以可以从数组的最后一位开始排列最终数组。用 2 个指针分别指向原数组的首尾,分别计算平方值,然后比较两者大小,大的放在最终数组的后面。然后大的一个指针移动。直至两个指针相撞,最终数组就排列完成了。 - - - - - - - - - - - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 -func sortedSquares(A []int) []int { - ans := make([]int, len(A)) - for i, k, j := 0, len(A)-1, len(ans)-1; i <= j; k-- { - if A[i]*A[i] > A[j]*A[j] { - ans[k] = A[i] * A[i] - i++ - } else { - ans[k] = A[j] * A[j] - j-- - } - } - return ans -} - -// 解法二 -func sortedSquares1(A []int) []int { - for i, value := range A { - A[i] = value * value - } - sort.Ints(A) - return A -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0978.Longest-Turbulent-Subarray.md b/website/content/ChapterFour/0978.Longest-Turbulent-Subarray.md deleted file mode 100755 index e4b8bea71..000000000 --- a/website/content/ChapterFour/0978.Longest-Turbulent-Subarray.md +++ /dev/null @@ -1,109 +0,0 @@ -# [978. Longest Turbulent Subarray](https://leetcode.com/problems/longest-turbulent-subarray/) - -## 题目 - -A subarray `A[i], A[i+1], ..., A[j]` of `A` is said to be *turbulent* if and only if: - -- For `i <= k < j`, `A[k] > A[k+1]` when `k` is odd, and `A[k] < A[k+1]` when `k` is even; -- **OR**, for `i <= k < j`, `A[k] > A[k+1]` when `k` is even, and `A[k] < A[k+1]` when `k` is odd. - -That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray. - -Return the **length** of a maximum size turbulent subarray of A. - -**Example 1**: - - Input: [9,4,2,10,7,8,8,1,9] - Output: 5 - Explanation: (A[1] > A[2] < A[3] > A[4] < A[5]) - -**Example 2**: - - Input: [4,8,12,16] - Output: 2 - -**Example 3**: - - Input: [100] - Output: 1 - -**Note**: - -1. `1 <= A.length <= 40000` -2. `0 <= A[i] <= 10^9` - - -## 题目大意 - - -当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: - -若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 k 为偶数时,A[k] < A[k+1]; -或 若 i <= k < j,当 k 为偶数时,A[k] > A[k+1] ,且当 k 为奇数时, A[k] < A[k+1]。 -也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。 - -返回 A 的最大湍流子数组的长度。 - -提示: - -- 1 <= A.length <= 40000 -- 0 <= A[i] <= 10^9 - - - -## 解题思路 - - -- 给出一个数组,要求找出“摆动数组”的最大长度。所谓“摆动数组”的意思是,元素一大一小间隔的。 -- 这一题可以用滑动窗口来解答。用一个变量记住下次出现的元素需要大于还是需要小于前一个元素。也可以用模拟的方法,用两个变量分别记录上升和下降数字的长度。一旦元素相等了,上升和下降数字长度都置为 1,其他时候按照上升和下降的关系增加队列长度即可,最后输出动态维护的最长长度。 - - -## 代码 - -```go - -package leetcode - -// 解法一 模拟法 -func maxTurbulenceSize(A []int) int { - inc, dec := 1, 1 - maxLen := min(1, len(A)) - for i := 1; i < len(A); i++ { - if A[i-1] < A[i] { - inc = dec + 1 - dec = 1 - } else if A[i-1] > A[i] { - dec = inc + 1 - inc = 1 - } else { - inc = 1 - dec = 1 - } - maxLen = max(maxLen, max(inc, dec)) - } - return maxLen -} - -// 解法二 滑动窗口 -func maxTurbulenceSize1(A []int) int { - if len(A) == 1 { - return 1 - } - // flag > 0 代表下一个数要大于前一个数,flag < 0 代表下一个数要小于前一个数 - res, left, right, flag, lastNum := 0, 0, 0, A[1]-A[0], A[0] - for left < len(A) { - if right < len(A)-1 && ((A[right+1] > lastNum && flag > 0) || (A[right+1] < lastNum && flag < 0) || (right == left)) { - right++ - flag = lastNum - A[right] - lastNum = A[right] - } else { - if right != left && flag != 0 { - res = max(res, right-left+1) - } - left++ - } - } - return max(res, 1) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0979.Distribute-Coins-in-Binary-Tree.md b/website/content/ChapterFour/0979.Distribute-Coins-in-Binary-Tree.md deleted file mode 100755 index ac98a4523..000000000 --- a/website/content/ChapterFour/0979.Distribute-Coins-in-Binary-Tree.md +++ /dev/null @@ -1,96 +0,0 @@ -# [979. Distribute Coins in Binary Tree](https://leetcode.com/problems/distribute-coins-in-binary-tree/) - - -## 题目 - -Given the `root` of a binary tree with `N` nodes, each `node` in the tree has `node.val` coins, and there are `N` coins total. - -In one move, we may choose two adjacent nodes and move one coin from one node to another. (The move may be from parent to child, or from child to parent.) - -Return the number of moves required to make every node have exactly one coin. - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2019/01/18/tree1.png) - - Input: [3,0,0] - Output: 2 - Explanation: From the root of the tree, we move one coin to its left child, and one coin to its right child. - -**Example 2**: - -![](https://assets.leetcode.com/uploads/2019/01/18/tree2.png) - - Input: [0,3,0] - Output: 3 - Explanation: From the left child of the root, we move two coins to the root [taking two moves]. Then, we move one coin from the root of the tree to the right child. - -**Example 3**: - -![](https://assets.leetcode.com/uploads/2019/01/18/tree3.png) - - Input: [1,0,2] - Output: 2 - -**Example 4**: - -![](https://assets.leetcode.com/uploads/2019/01/18/tree4.png) - - Input: [1,0,0,null,3] - Output: 4 - -**Note**: - -1. `1<= N <= 100` -2. `0 <= node.val <= N` - -## 题目大意 - -给定一个有 N 个结点的二叉树的根结点 root,树中的每个结点上都对应有 node.val 枚硬币,并且总共有 N 枚硬币。在一次移动中,我们可以选择两个相邻的结点,然后将一枚硬币从其中一个结点移动到另一个结点。(移动可以是从父结点到子结点,或者从子结点移动到父结点。)。返回使每个结点上只有一枚硬币所需的移动次数。 - -提示: - -1. 1<= N <= 100 -2. 0 <= node.val <= N - - -## 解题思路 - -- 给出一棵树,有 N 个节点。有 N 个硬币分散在这 N 个节点中,问经过多少次移动以后,所有节点都有一枚硬币。 -- 这一题乍一看比较难分析,仔细一想,可以用贪心和分治的思想来解决。一个树的最小单元是一个根节点和两个孩子。在这种情况下,3 个节点谁的硬币多就可以分给没有硬币的那个节点,这种移动方法也能保证移动步数最少。不难证明,硬币由相邻的节点移动过来的步数是最少的。那么一棵树从最下一层开始往上推,逐步从下往上把硬币移动上去,直到最后根节点也都拥有硬币。多余 1 枚的节点记为 `n -1`,没有硬币的节点记为 -1 。例如,下图中左下角的 3 个节点,有 4 枚硬币的节点可以送出 3 枚硬币,叶子节点有 0 枚硬币的节点需要接收 1 枚硬币。根节点有 0 枚硬币,左孩子给了 3 枚,右孩子需要 1 枚,自己本身还要留一枚,所以最终还能剩 1 枚。 - -![](https://img.halfrost.com/Leetcode/leetcode_979_1.png) - -- 所以每个节点移动的步数应该是 `left + right + root.Val - 1`。最后递归求解即可。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree root. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func distributeCoins(root *TreeNode) int { - res := 0 - distributeCoinsDFS(root, &res) - return res -} - -func distributeCoinsDFS(root *TreeNode, res *int) int { - if root == nil { - return 0 - } - left, right := distributeCoinsDFS(root.Left, res), distributeCoinsDFS(root.Right, res) - *res += abs(left) + abs(right) - return left + right + root.Val - 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0981.Time-Based-Key-Value-Store.md b/website/content/ChapterFour/0981.Time-Based-Key-Value-Store.md deleted file mode 100755 index a598ed752..000000000 --- a/website/content/ChapterFour/0981.Time-Based-Key-Value-Store.md +++ /dev/null @@ -1,124 +0,0 @@ -# [981. Time Based Key-Value Store](https://leetcode.com/problems/time-based-key-value-store/) - - -## 题目 - -Create a timebased key-value store class `TimeMap`, that supports two operations. - -1. `set(string key, string value, int timestamp)` - -- Stores the `key` and `value`, along with the given `timestamp`. - -2. `get(string key, int timestamp)` - -- Returns a value such that `set(key, value, timestamp_prev)` was called previously, with `timestamp_prev <= timestamp`. -- If there are multiple such values, it returns the one with the largest `timestamp_prev`. -- If there are no values, it returns the empty string (`""`). - -**Example 1**: - - Input: inputs = ["TimeMap","set","get","get","set","get","get"], inputs = [[],["foo","bar",1],["foo",1],["foo",3],["foo","bar2",4],["foo",4],["foo",5]] - Output: [null,null,"bar","bar",null,"bar2","bar2"] - Explanation: - TimeMap kv; - kv.set("foo", "bar", 1); // store the key "foo" and value "bar" along with timestamp = 1 - kv.get("foo", 1); // output "bar" - kv.get("foo", 3); // output "bar" since there is no value corresponding to foo at timestamp 3 and timestamp 2, then the only value is at timestamp 1 ie "bar" - kv.set("foo", "bar2", 4); - kv.get("foo", 4); // output "bar2" - kv.get("foo", 5); //output "bar2" - -**Example 2**: - - Input: inputs = ["TimeMap","set","set","get","get","get","get","get"], inputs = [[],["love","high",10],["love","low",20],["love",5],["love",10],["love",15],["love",20],["love",25]] - Output: [null,null,null,"","high","high","low","low"] - -**Note**: - -1. All key/value strings are lowercase. -2. All key/value strings have length in the range `[1, 100]` -3. The `timestamps` for all `TimeMap.set` operations are strictly increasing. -4. `1 <= timestamp <= 10^7` -5. `TimeMap.set` and `TimeMap.get` functions will be called a total of `120000` times (combined) per test case. - -## 题目大意 - -创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: - -1. set(string key, string value, int timestamp) - -- 存储键 key、值 value,以及给定的时间戳 timestamp。 - -2. get(string key, int timestamp) - -- 返回先前调用 set(key, value, timestamp_prev) 所存储的值,其中 timestamp_prev <= timestamp。 -- 如果有多个这样的值,则返回对应最大的  timestamp_prev 的那个值。 -- 如果没有值,则返回空字符串("")。 - -提示: - -1. 所有的键/值字符串都是小写的。 -2. 所有的键/值字符串长度都在 [1, 100] 范围内。 -3. 所有 TimeMap.set 操作中的时间戳 timestamps 都是严格递增的。 -4. 1 <= timestamp <= 10^7 -5. TimeMap.set 和 TimeMap.get 函数在每个测试用例中将(组合)调用总计 120000 次。 - - -## 解题思路 - -- 要求设计一个基于时间戳的 `kv` 存储。`set()` 操作里面会会包含一个时间戳。get() 操作的时候查找时间戳小于等于 `timestamp` 的 `key` 对应的 `value`,如果有多个解,输出满足条件的最大时间戳对应的 `value` 值。 -- 这一题可以用二分搜索来解答,用 `map` 存储 `kv` 数据,`key` 对应的就是 `key`,`value` 对应一个结构体,里面包含 `value` 和 `timestamp`。执行 `get()` 操作的时候,先取出 `key` 对应的结构体数组,然后在这个数组里面根据 `timestamp` 进行二分搜索。由于题意是要找小于等于 `timestamp` 的最大 `timestamp` ,这会有很多满足条件的解,变换一下,先找 `> timestamp` 的最小解,然后下标减一即是满足题意的最大解。 -- 另外题目中提到“`TimeMap.set` 操作中的 `timestamp` 是严格递增的”。所以在 `map` 中存储 `value` 结构体的时候,不需要排序了,天然有序。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -type data struct { - time int - value string -} - -// TimeMap is a timebased key-value store -// TimeMap define -type TimeMap map[string][]data - -// Constructor981 define -func Constructor981() TimeMap { - return make(map[string][]data, 1024) -} - -// Set define -func (t TimeMap) Set(key string, value string, timestamp int) { - if _, ok := t[key]; !ok { - t[key] = make([]data, 1, 1024) - } - t[key] = append(t[key], data{ - time: timestamp, - value: value, - }) -} - -// Get define -func (t TimeMap) Get(key string, timestamp int) string { - d := t[key] - i := sort.Search(len(d), func(i int) bool { - return timestamp < d[i].time - }) - i-- - return t[key][i].value -} - -/** - * Your TimeMap object will be instantiated and called as such: - * obj := Constructor(); - * obj.Set(key,value,timestamp); - * param_2 := obj.Get(key,timestamp); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0984.String-Without-AAA-or-BBB.md b/website/content/ChapterFour/0984.String-Without-AAA-or-BBB.md deleted file mode 100755 index cccb67b22..000000000 --- a/website/content/ChapterFour/0984.String-Without-AAA-or-BBB.md +++ /dev/null @@ -1,93 +0,0 @@ -# [984. String Without AAA or BBB](https://leetcode.com/problems/string-without-aaa-or-bbb/) - - -## 题目 - -Given two integers `A` and `B`, return **any** string `S` such that: - -- `S` has length `A + B` and contains exactly `A` `'a'` letters, and exactly `B` `'b'`letters; -- The substring `'aaa'` does not occur in `S`; -- The substring `'bbb'` does not occur in `S`. - -**Example 1**: - - Input: A = 1, B = 2 - Output: "abb" - Explanation: "abb", "bab" and "bba" are all correct answers. - -**Example 2**: - - Input: A = 4, B = 1 - Output: "aabaa" - -**Note**: - -1. `0 <= A <= 100` -2. `0 <= B <= 100` -3. It is guaranteed such an `S` exists for the given `A` and `B`. - - -## 题目大意 - -给定两个整数 A 和 B,返回任意字符串 S,要求满足: - -- S 的长度为 A + B,且正好包含 A 个 'a' 字母与 B 个 'b' 字母; -- 子串 'aaa' 没有出现在 S 中; -- 子串 'bbb' 没有出现在 S 中。 - - -提示: - -- 0 <= A <= 100 -- 0 <= B <= 100 -- 对于给定的 A 和 B,保证存在满足要求的 S。 - - -## 解题思路 - - -- 给出 A 和 B 的个数,要求组合出字符串,不能出现 3 个连续的 A 和 3 个连续的 B。这题由于只可能有 4 种情况,暴力枚举就可以了。假设 B 的个数比 A 多(如果 A 多,就交换一下 A 和 B),最终可能的情况只可能是这 4 种情况中的一种: `ba`,`bbabb`,`bbabbabb`,`bbabbabbabbabababa`。 - - -## 代码 - -```go - -package leetcode - -func strWithout3a3b(A int, B int) string { - ans, a, b := "", "a", "b" - if B < A { - A, B = B, A - a, b = b, a - } - Dif := B - A - if A == 1 && B == 1 { // ba - ans = b + a - } else if A == 1 && B < 5 { // bbabb - for i := 0; i < B-2; i++ { - ans = ans + b - } - ans = b + b + a + ans - } else if (B-A)/A >= 1 { //bbabbabb - for i := 0; i < A; i++ { - ans = ans + b + b + a - B = B - 2 - } - for i := 0; i < B; i++ { - ans = ans + b - } - } else { //bbabbabbabbabababa - for i := 0; i < Dif; i++ { - ans = ans + b + b + a - B -= 2 - A-- - } - for i := 0; i < B; i++ { - ans = ans + b + a - } - } - return ans -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0985.Sum-of-Even-Numbers-After-Queries.md b/website/content/ChapterFour/0985.Sum-of-Even-Numbers-After-Queries.md deleted file mode 100644 index 8811079ba..000000000 --- a/website/content/ChapterFour/0985.Sum-of-Even-Numbers-After-Queries.md +++ /dev/null @@ -1,72 +0,0 @@ -# [985. Sum of Even Numbers After Queries](https://leetcode.com/problems/sum-of-even-numbers-after-queries/) - -## 题目 - -We have an array `A` of integers, and an array `queries` of queries. - -For the `i`-th query `val = queries[i][0], index = queries[i][1]`, we add val to `A[index]`. Then, the answer to the `i`-th query is the sum of the even values of `A`. - -*(Here, the given `index = queries[i][1]` is a 0-based index, and each query permanently modifies the array `A`.)* - -Return the answer to all queries. Your `answer` array should have `answer[i]` as the answer to the `i`-th query. - -**Example 1**: - -``` -Input: A = [1,2,3,4], queries = [[1,0],[-3,1],[-4,0],[2,3]] -Output: [8,6,2,4] -Explanation: -At the beginning, the array is [1,2,3,4]. -After adding 1 to A[0], the array is [2,2,3,4], and the sum of even values is 2 + 2 + 4 = 8. -After adding -3 to A[1], the array is [2,-1,3,4], and the sum of even values is 2 + 4 = 6. -After adding -4 to A[0], the array is [-2,-1,3,4], and the sum of even values is -2 + 4 = 2. -After adding 2 to A[3], the array is [-2,-1,3,6], and the sum of even values is -2 + 6 = 4. -``` - -**Note**: - -1. `1 <= A.length <= 10000` -2. `-10000 <= A[i] <= 10000` -3. `1 <= queries.length <= 10000` -4. `-10000 <= queries[i][0] <= 10000` -5. `0 <= queries[i][1] < A.length` - -## 题目大意 - -给出一个整数数组 A 和一个查询数组 queries。 - -对于第 i 次查询,有 val = queries[i][0], index = queries[i][1],我们会把 val 加到 A[index] 上。然后,第 i 次查询的答案是 A 中偶数值的和。(此处给定的 index = queries[i][1] 是从 0 开始的索引,每次查询都会永久修改数组 A。)返回所有查询的答案。你的答案应当以数组 answer 给出,answer[i] 为第 i 次查询的答案。 - - -## 解题思路 - -- 给出一个数组 A 和 query 数组。要求每次 query 操作都改变数组 A 中的元素值,并计算此次操作结束数组 A 中偶数值之和。 -- 简单题,先计算 A 中所有偶数之和。再每次 query 操作的时候,动态维护这个偶数之和即可。 - -## 代码 - -```go - -package leetcode - -func sumEvenAfterQueries(A []int, queries [][]int) []int { - cur, res := 0, []int{} - for _, v := range A { - if v%2 == 0 { - cur += v - } - } - for _, q := range queries { - if A[q[1]]%2 == 0 { - cur -= A[q[1]] - } - A[q[1]] += q[0] - if A[q[1]]%2 == 0 { - cur += A[q[1]] - } - res = append(res, cur) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0986.Interval-List-Intersections.md b/website/content/ChapterFour/0986.Interval-List-Intersections.md deleted file mode 100644 index d1a463415..000000000 --- a/website/content/ChapterFour/0986.Interval-List-Intersections.md +++ /dev/null @@ -1,73 +0,0 @@ -# [986. Interval List Intersections](https://leetcode.com/problems/interval-list-intersections/) - -## 题目 - -Given two lists of closed intervals, each list of intervals is pairwise disjoint and in sorted order. - -Return the intersection of these two interval lists. - -(Formally, a closed interval [a, b] (with a <= b) denotes the set of real numbers x with a <= x <= b. The intersection of two closed intervals is a set of real numbers that is either empty, or can be represented as a closed interval. For example, the intersection of [1, 3] and [2, 4] is [2, 3].) - - - - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2019/01/30/interval1.png) - -``` -Input: A = [[0,2],[5,10],[13,23],[24,25]], B = [[1,5],[8,12],[15,24],[25,26]] -Output: [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]] -Reminder: The inputs and the desired output are lists of Interval objects, and not arrays or lists. -``` - -**Note**: - -- 0 <= A.length < 1000 -- 0 <= B.length < 1000 -- 0 <= A[i].start, A[i].end, B[i].start, B[i].end < 10^9 - -**Note**: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature. - -## 题目大意 - -这道题考察的是滑动窗口的问题。 - -给出 2 个数组 A 和数组 B。要求求出这 2 个数组的交集数组。题意见图。 - -## 解题思路 - -交集的左边界应该为,`start := max(A[i].Start, B[j].Start)`,右边界为,`end := min(A[i].End, B[j].End)`,如果 `start <= end`,那么这个就是一个满足条件的交集,放入最终数组中。如果 `A[i].End <= B[j].End`,代表 B 数组范围比 A 数组大,A 的游标右移。如果 `A[i].End > B[j].End`,代表 A 数组范围比 B 数组大,B 的游标右移。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for an interval. - * type Interval struct { - * Start int - * End int - * } - */ -func intervalIntersection(A []Interval, B []Interval) []Interval { - res := []Interval{} - for i, j := 0, 0; i < len(A) && j < len(B); { - start := max(A[i].Start, B[j].Start) - end := min(A[i].End, B[j].End) - if start <= end { - res = append(res, Interval{Start: start, End: end}) - } - if A[i].End <= B[j].End { - i++ - } else { - j++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0990.Satisfiability-of-Equality-Equations.md b/website/content/ChapterFour/0990.Satisfiability-of-Equality-Equations.md deleted file mode 100755 index 75f33db2c..000000000 --- a/website/content/ChapterFour/0990.Satisfiability-of-Equality-Equations.md +++ /dev/null @@ -1,99 +0,0 @@ -# [990. Satisfiability of Equality Equations](https://leetcode.com/problems/satisfiability-of-equality-equations/) - - -## 题目 - -Given an array equations of strings that represent relationships between variables, each string `equations[i]` has length `4` and takes one of two different forms: `"a==b"` or `"a!=b"`. Here, `a` and `b` are lowercase letters (not necessarily different) that represent one-letter variable names. - -Return `true` if and only if it is possible to assign integers to variable names so as to satisfy all the given equations. - -**Example 1**: - - Input: ["a==b","b!=a"] - Output: false - Explanation: If we assign say, a = 1 and b = 1, then the first equation is satisfied, but not the second. There is no way to assign the variables to satisfy both equations. - -**Example 2**: - - Input: ["b==a","a==b"] - Output: true - Explanation: We could assign a = 1 and b = 1 to satisfy both equations. - -**Example 3**: - - Input: ["a==b","b==c","a==c"] - Output: true - -**Example 4**: - - Input: ["a==b","b!=c","c==a"] - Output: false - -**Example 5**: - - Input: ["c==c","b==d","x!=z"] - Output: true - -**Note**: - -1. `1 <= equations.length <= 500` -2. `equations[i].length == 4` -3. `equations[i][0]` and `equations[i][3]` are lowercase letters -4. `equations[i][1]` is either `'='` or `'!'` -5. `equations[i][2]` is `'='` - - - -## 题目大意 - -给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:"a==b" 或 "a!=b"。在这里,a 和 b 是小写字母(不一定不同),表示单字母变量名。只有当可以将整数分配给变量名,以便满足所有给定的方程时才返回 true,否则返回 false。  - -提示: - -1. 1 <= equations.length <= 500 -2. equations[i].length == 4 -3. equations[i][0] 和 equations[i][3] 是小写字母 -4. equations[i][1] 要么是 '=',要么是 '!' -5. equations[i][2] 是 '=' - - - -## 解题思路 - - -- 给出一个字符串数组,数组里面给出的是一些字母的关系,只有 `'=='` 和 `'! ='` 两种关系。问给出的这些关系中是否存在悖论? -- 这一题是简单的并查集的问题。先将所有 `'=='` 关系的字母 `union()` 起来,然后再一一查看 `'! ='` 关系中是否有 `'=='` 关系的组合,如果有,就返回 `false`,如果遍历完都没有找到,则返回 `true`。 - - -## 代码 - -```go - -package leetcode - -import ( - "github.com/halfrost/LeetCode-Go/template" -) - -func equationsPossible(equations []string) bool { - if len(equations) == 0 { - return false - } - uf := template.UnionFind{} - uf.Init(26) - for _, equ := range equations { - if equ[1] == '=' && equ[2] == '=' { - uf.Union(int(equ[0]-'a'), int(equ[3]-'a')) - } - } - for _, equ := range equations { - if equ[1] == '!' && equ[2] == '=' { - if uf.Find(int(equ[0]-'a')) == uf.Find(int(equ[3]-'a')) { - return false - } - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0992.Subarrays-with-K-Different-Integers.md b/website/content/ChapterFour/0992.Subarrays-with-K-Different-Integers.md deleted file mode 100644 index 33155fa22..000000000 --- a/website/content/ChapterFour/0992.Subarrays-with-K-Different-Integers.md +++ /dev/null @@ -1,113 +0,0 @@ -# [992. Subarrays with K Different Integers](https://leetcode.com/problems/subarrays-with-k-different-integers/) - -## 题目 - -Given an array A of positive integers, call a (contiguous, not necessarily distinct) subarray of A good if the number of different integers in that subarray is exactly K. - -(For example, [1,2,3,1,2] has 3 different integers: 1, 2, and 3.) - -Return the number of good subarrays of A. - - -**Example 1**: - -``` - -Input: A = [1,2,1,2,3], K = 2 -Output: 7 -Explanation: Subarrays formed with exactly 2 different integers: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2]. - -``` - -**Example 2**: - -``` - -Input: A = [1,2,1,3,4], K = 3 -Output: 3 -Explanation: Subarrays formed with exactly 3 different integers: [1,2,1,3], [2,1,3], [1,3,4]. - -``` - -**Note**: - -- 1 <= A.length <= 20000 -- 1 <= A[i] <= A.length -- 1 <= K <= A.length - -## 题目大意 - -这道题考察的是滑动窗口的问题。 - -给出一个数组 和 K,K 代表窗口能能包含的不同数字的个数。K = 2 代表窗口内只能有 2 个不同的数字。求数组中满足条件 K 的窗口个数。 - -## 解题思路 - -如果只是单纯的滑动窗口去做,会错过一些解。比如在例子 1 中,滑动窗口可以得到 [1,2], [1,2,1], [1,2,1,2], [2,1,2], [1,2], [2,3], 会少 [2,1] 这个解,原因是右边窗口滑动到最右边了,左边窗口在缩小的过程中,右边窗口不会再跟着动了。有同学可能会说,每次左边窗口移动的时候,右边窗口都再次从左边窗口的位置开始重新滑动。这样做确实可以,但是这样做完会发现超时。因为中间包含大量的重复计算。 - -这道题就需要第 3 个指针。原有滑动窗口的 2 个指针,右窗口保留这个窗口里面最长的子数组,正好有 K 个元素,左窗口右移的逻辑不变。再多用一个指针用来标识正好有 K - 1 个元素的位置。那么正好有 K 个不同元素的解就等于 ans = atMostK(A, K) - atMostK(A, K - 1)。最多有 K 个元素减去最多有 K - 1 个元素得到的窗口中正好有 K 个元素的解。 - -以例子 1 为例,先求最多有 K 个元素的窗口个数。 - -```c -[1] -[1,2], [2] -[1,2,1], [2,1], [1] -[1,2,1,2], [2,1,2], [1,2], [2] -[2,3], [3] -``` - -每当窗口滑动到把 K 消耗为 0 的时候,res = right - left + 1 。为什么要这么计算,right - left + 1 代表的含义是,终点为 right,至多为 K 个元素的窗口有多少个。[left,right], [left + 1,right], [left + 2,right] …… [right,right]。这样算出来的解是包含这道题最终求得的解的,还多出了一部分解。多出来的部分减掉即可,即减掉最多为 K - 1 个元素的解。 - -最多为 K - 1 个元素的解如下: - -```c -[1] -[2] -[1] -[2] -[3] -``` - -两者相减以后得到的结果就是最终结果: - -```c -[1,2] -[1,2,1], [2,1] -[1,2,1,2], [2,1,2], [1,2] -[2,3] -``` - - - - -## 代码 - -```go - -package leetcode - -func subarraysWithKDistinct(A []int, K int) int { - return subarraysWithKDistinctSlideWindow(A, K) - subarraysWithKDistinctSlideWindow(A, K-1) -} - -func subarraysWithKDistinctSlideWindow(A []int, K int) int { - left, right, counter, res, freq := 0, 0, K, 0, map[int]int{} - for right = 0; right < len(A); right++ { - if freq[A[right]] == 0 { - counter-- - } - freq[A[right]]++ - for counter < 0 { - freq[A[left]]-- - if freq[A[left]] == 0 { - counter++ - } - left++ - } - res += right - left + 1 - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0993.Cousins-in-Binary-Tree.md b/website/content/ChapterFour/0993.Cousins-in-Binary-Tree.md deleted file mode 100755 index 1fd4a366a..000000000 --- a/website/content/ChapterFour/0993.Cousins-in-Binary-Tree.md +++ /dev/null @@ -1,163 +0,0 @@ -# [993. Cousins in Binary Tree](https://leetcode.com/problems/cousins-in-binary-tree/) - -## 题目 - -In a binary tree, the root node is at depth `0`, and children of each depth `k` node are at depth `k+1`. - -Two nodes of a binary tree are *cousins* if they have the same depth, but have **different parents**. - -We are given the `root` of a binary tree with unique values, and the values `x` and `y` of two different nodes in the tree. - -Return `true` if and only if the nodes corresponding to the values `x` and `y` are cousins. - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2019/02/12/q1248-01.png) - - Input: root = [1,2,3,4], x = 4, y = 3 - Output: false - -**Example 2**: - -![](https://assets.leetcode.com/uploads/2019/02/12/q1248-02.png) - - Input: root = [1,2,3,null,4,null,5], x = 5, y = 4 - Output: true - -**Example 3**: - -![](https://assets.leetcode.com/uploads/2019/02/13/q1248-03.png) - - Input: root = [1,2,3,null,4], x = 2, y = 3 - Output: false - -**Note**: - -1. The number of nodes in the tree will be between `2` and `100`. -2. Each node has a unique integer value from `1` to `100`. - - -## 题目大意 - -在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root,以及树中两个不同节点的值 x 和 y。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true。否则,返回 false。 - - - -## 解题思路 - - -- 给出一个二叉树,和 x ,y 两个值,要求判断这两个值是不是兄弟结点。兄弟结点的定义:都位于同一层,并且父结点是同一个结点。 -- 这一题有 3 种解题方法,DFS、BFS、递归。思路都不难。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ - -// 解法一 递归 -func isCousins(root *TreeNode, x int, y int) bool { - if root == nil { - return false - } - levelX, levelY := findLevel(root, x, 1), findLevel(root, y, 1) - if levelX != levelY { - return false - } - return !haveSameParents(root, x, y) -} - -func findLevel(root *TreeNode, x, level int) int { - if root == nil { - return 0 - } - if root.Val != x { - leftLevel, rightLevel := findLevel(root.Left, x, level+1), findLevel(root.Right, x, level+1) - if leftLevel == 0 { - return rightLevel - } - return leftLevel - } - return level -} - -func haveSameParents(root *TreeNode, x, y int) bool { - if root == nil { - return false - } - if (root.Left != nil && root.Right != nil && root.Left.Val == x && root.Right.Val == y) || - (root.Left != nil && root.Right != nil && root.Left.Val == y && root.Right.Val == x) { - return true - } - return haveSameParents(root.Left, x, y) || haveSameParents(root.Right, x, y) -} - -// 解法二 BFS -type mark struct { - prev int - depth int -} - -func isCousinsBFS(root *TreeNode, x int, y int) bool { - if root == nil { - return false - } - queue := []*TreeNode{root} - visited := [101]*mark{} - visited[root.Val] = &mark{prev: -1, depth: 1} - - for len(queue) > 0 { - node := queue[0] - queue = queue[1:] - depth := visited[node.Val].depth - if node.Left != nil { - visited[node.Left.Val] = &mark{prev: node.Val, depth: depth + 1} - queue = append(queue, node.Left) - } - if node.Right != nil { - visited[node.Right.Val] = &mark{prev: node.Val, depth: depth + 1} - queue = append(queue, node.Right) - } - } - if visited[x] == nil || visited[y] == nil { - return false - } - if visited[x].depth == visited[y].depth && visited[x].prev != visited[y].prev { - return true - } - return false -} - -// 解法三 DFS -func isCousinsDFS(root *TreeNode, x int, y int) bool { - var depth1, depth2, parent1, parent2 int - dfsCousins(root, x, 0, -1, &parent1, &depth1) - dfsCousins(root, y, 0, -1, &parent2, &depth2) - return depth1 > 1 && depth1 == depth2 && parent1 != parent2 -} - -func dfsCousins(root *TreeNode, val, depth, last int, parent, res *int) { - if root == nil { - return - } - if root.Val == val { - *res = depth - *parent = last - return - } - depth++ - dfsCousins(root.Left, val, depth, root.Val, parent, res) - dfsCousins(root.Right, val, depth, root.Val, parent, res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0995.Minimum-Number-of-K-Consecutive-Bit-Flips.md b/website/content/ChapterFour/0995.Minimum-Number-of-K-Consecutive-Bit-Flips.md deleted file mode 100755 index 768d37be9..000000000 --- a/website/content/ChapterFour/0995.Minimum-Number-of-K-Consecutive-Bit-Flips.md +++ /dev/null @@ -1,97 +0,0 @@ -# [995. Minimum Number of K Consecutive Bit Flips](https://leetcode.com/problems/minimum-number-of-k-consecutive-bit-flips/) - - -## 题目 - -In an array `A` containing only 0s and 1s, a `K`-bit flip consists of choosing a (contiguous) subarray of length `K` and simultaneously changing every 0 in the subarray to 1, and every 1 in the subarray to 0. - -Return the minimum number of `K`-bit flips required so that there is no 0 in the array. If it is not possible, return `-1`. - -**Example 1**: - - Input: A = [0,1,0], K = 1 - Output: 2 - Explanation: Flip A[0], then flip A[2]. - -**Example 2**: - - Input: A = [1,1,0], K = 2 - Output: -1 - Explanation: No matter how we flip subarrays of size 2, we can't make the array become [1,1,1]. - -**Example 3**: - - Input: A = [0,0,0,1,0,1,1,0], K = 3 - Output: 3 - Explanation: - Flip A[0],A[1],A[2]: A becomes [1,1,1,1,0,1,1,0] - Flip A[4],A[5],A[6]: A becomes [1,1,1,1,1,0,0,0] - Flip A[5],A[6],A[7]: A becomes [1,1,1,1,1,1,1,1] - -**Note**: - -1. `1 <= A.length <= 30000` -2. `1 <= K <= A.length` - - -## 题目大意 - -在仅包含 0 和 1 的数组 A 中,一次 K 位翻转包括选择一个长度为 K 的(连续)子数组,同时将子数组中的每个 0 更改为 1,而每个 1 更改为 0。返回所需的 K 位翻转的次数,以便数组没有值为 0 的元素。如果不可能,返回 -1。 - -提示: - -1. 1 <= A.length <= 30000 -2. 1 <= K <= A.length - - -## 解题思路 - - -- 给出一个数组,数组里面的元素只有 0 和 1。给一个长度为 K 的窗口,在这个窗口内的所有元素都会 0-1 翻转。问最后需要翻转几次,使得整个数组都为 1 。如果不能翻转使得最后数组元素都为 1,则输出 -1。 -- 拿到这一题首先想到的是贪心算法。例如第 765 题,这类题的描述都是这样的:在一个数组中或者环形数组中通过交换位置,或者翻转变换,达到最终结果,要求找到最少步数。贪心能保证是最小步数(证明略)。按照贪心的思想,这一题也这样做,从数组 0 下标开始往后扫,依次翻转每个 K 大小的窗口内元素。 -- 由于窗口大小限制了,所以这题滑动窗口只需要一个边界坐标,用左边界就可以判断了。每一个 `A[i]` 是否需要翻转,是由于 `[ i-k+1,i ]`、`[ i-k+2,i+1 ]`、`[ i-k+3,i+2 ]`……`[ i-1,i+k ]` 这一系列的窗口翻转`累积影响`的。那如何之前这些窗口`累积`到 `A[i]` 上翻转的次数呢?可以动态的维护一个翻转次数,当 `i` 摆脱了上一次翻转窗口 `K` 的时候,翻转次数就 `-1` 。举个例子: - - A = [0 0 0 1 0 1 1 0] K = 3 - - A = [2 0 0 1 0 1 1 0] i = 0 flippedTime = 1 - A = [2 0 0 1 0 1 1 0] i = 1 flippedTime = 1 - A = [2 0 0 1 0 1 1 0] i = 2 flippedTime = 1 - A = [2 0 0 1 0 1 1 0] i = 3 flippedTime = 0 - A = [2 0 0 1 2 1 1 0] i = 4 flippedTime = 1 - A = [2 0 0 1 2 2 1 0] i = 5 flippedTime = 2 - A = [2 0 0 1 2 2 1 0] i = 6 flippedTime = 2 - A = [2 0 0 1 2 2 1 0] i = 7 flippedTime = 1 - - 当判断 `A[i]` 是否需要翻转的时候,只需要留意每个宽度为 `K` 窗口的左边界。会影响到 A[i] 的窗口的左边界分别是 `i-k+1`、`i-k+2`、`i-k+3`、…… `i-1`,只需要分别看这些窗口有没有翻转就行。这里可以用特殊标记来记录这些窗口的左边界是否被翻转了。如果翻转过,则把窗口左边界的那个数字标记为 2 (为什么要标记为 2 呢?其实设置成什么都可以,只要不是 0 和 1 ,和原有的数字区分开就行)。当 `i≥k` 的时候,代表 `i` 已经脱离了 `i-k` 的这个窗口,因为能影响 `A[i]` 的窗口是从 `i-k+1` 开始的,如果 `A[i-k] == 2` 代表 `i-k` 窗口已经翻转过了,现在既然脱离了它的窗口影响,那么就要把累积的 `flippedTime - 1` 。这样就维护了累积 `flippedTime` 和滑动窗口中累积影响的关系。 - -- 接下来还需要处理的是 `flippedTime` 与当前 `A[i]` 是否翻转的问题。如果 `flippedTime` 是偶数次,原来的 0 还是 0,就需要再次翻转,如果 `flippedTime` 是奇数次,原来的 0 变成了 1 就不需要翻转了。总结成一条结论就是 `A[i]` 与 `flippedTime` 同奇偶性的时候就要翻转。当 `i + K` 比 `len(A)` 大的时候,代表剩下的这些元素肯定不能在一个窗口里面翻转,则输出 -1 。 - - -## 代码 - -```go - -package leetcode - -func minKBitFlips(A []int, K int) int { - flippedTime, count := 0, 0 - for i := 0; i < len(A); i++ { - if i >= K && A[i-K] == 2 { - flippedTime-- - } - // 下面这个判断包含了两种情况: - // 如果 flippedTime 是奇数,且 A[i] == 1 就需要翻转 - // 如果 flippedTime 是偶数,且 A[i] == 0 就需要翻转 - if flippedTime%2 == A[i] { - if i+K > len(A) { - return -1 - } - A[i] = 2 - flippedTime++ - count++ - } - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0996.Number-of-Squareful-Arrays.md b/website/content/ChapterFour/0996.Number-of-Squareful-Arrays.md deleted file mode 100755 index 5a420a2c0..000000000 --- a/website/content/ChapterFour/0996.Number-of-Squareful-Arrays.md +++ /dev/null @@ -1,107 +0,0 @@ -# [996. Number of Squareful Arrays](https://leetcode.com/problems/number-of-squareful-arrays/) - - - -## 题目 - -Given an array `A` of non-negative integers, the array is *squareful* if for every pair of adjacent elements, their sum is a perfect square. - -Return the number of permutations of A that are squareful. Two permutations `A1` and `A2` differ if and only if there is some index `i` such that `A1[i] != A2[i]`. - -**Example 1**: - - Input: [1,17,8] - Output: 2 - Explanation: - [1,8,17] and [17,8,1] are the valid permutations. - -**Example 2**: - - Input: [2,2,2] - Output: 1 - -**Note**: - -1. `1 <= A.length <= 12` -2. `0 <= A[i] <= 1e9` - - -## 题目大意 - -给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。 - -返回 A 的正方形排列的数目。两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i] != A2[i]。 - - - -## 解题思路 - - -- 这一题是第 47 题的加强版。第 47 题要求求出一个数组的所有不重复的排列。这一题要求求出一个数组的所有不重复,且相邻两个数字之和都为完全平方数的排列。 -- 思路和第 47 题完全一致,只不过增加判断相邻两个数字之和为完全平方数的判断,注意在 DFS 的过程中,需要剪枝,否则时间复杂度很高,会超时。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - "sort" -) - -func numSquarefulPerms(A []int) int { - if len(A) == 0 { - return 0 - } - used, p, res := make([]bool, len(A)), []int{}, [][]int{} - sort.Ints(A) // 这里是去重的关键逻辑 - generatePermutation996(A, 0, p, &res, &used) - return len(res) -} - -func generatePermutation996(nums []int, index int, p []int, res *[][]int, used *[]bool) { - if index == len(nums) { - checkSquareful := true - for i := 0; i < len(p)-1; i++ { - if !checkSquare(p[i] + p[i+1]) { - checkSquareful = false - break - } - } - if checkSquareful { - temp := make([]int, len(p)) - copy(temp, p) - *res = append(*res, temp) - } - return - } - for i := 0; i < len(nums); i++ { - if !(*used)[i] { - if i > 0 && nums[i] == nums[i-1] && !(*used)[i-1] { // 这里是去重的关键逻辑 - continue - } - if len(p) > 0 && !checkSquare(nums[i]+p[len(p)-1]) { // 关键的剪枝条件 - continue - } - (*used)[i] = true - p = append(p, nums[i]) - generatePermutation996(nums, index+1, p, res, used) - p = p[:len(p)-1] - (*used)[i] = false - } - } - return -} - -func checkSquare(num int) bool { - tmp := math.Sqrt(float64(num)) - if int(tmp)*int(tmp) == num { - return true - } - return false -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/0999.Available-Captures-for-Rook.md b/website/content/ChapterFour/0999.Available-Captures-for-Rook.md deleted file mode 100644 index 47e6d127e..000000000 --- a/website/content/ChapterFour/0999.Available-Captures-for-Rook.md +++ /dev/null @@ -1,99 +0,0 @@ -# [999. Available Captures for Rook](https://leetcode.com/problems/available-captures-for-rook/) - - -## 题目 - -On an 8 x 8 chessboard, there is one white rook. There also may be empty squares, white bishops, and black pawns. These are given as characters 'R', '.', 'B', and 'p' respectively. Uppercase characters represent white pieces, and lowercase characters represent black pieces. - -The rook moves as in the rules of Chess: it chooses one of four cardinal directions (north, east, west, and south), then moves in that direction until it chooses to stop, reaches the edge of the board, or captures an opposite colored pawn by moving to the same square it occupies. Also, rooks cannot move into the same square as other friendly bishops. - -Return the number of pawns the rook can capture in one move. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/02/20/1253_example_1_improved.PNG](https://assets.leetcode.com/uploads/2019/02/20/1253_example_1_improved.PNG) - -``` -Input: [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","R",".",".",".","p"],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]] -Output: 3 -Explanation: -In this example the rook is able to capture all the pawns. -``` - -**Example 2**: - -![https://assets.leetcode.com/uploads/2019/02/19/1253_example_2_improved.PNG](https://assets.leetcode.com/uploads/2019/02/19/1253_example_2_improved.PNG) - -``` -Input: [[".",".",".",".",".",".",".","."],[".","p","p","p","p","p",".","."],[".","p","p","B","p","p",".","."],[".","p","B","R","B","p",".","."],[".","p","p","B","p","p",".","."],[".","p","p","p","p","p",".","."],[".",".",".",".",".",".",".","."],[".",".",".",".",".",".",".","."]] -Output: 0 -Explanation: -Bishops are blocking the rook to capture any pawn. -``` - -**Example 3**: - -![https://assets.leetcode.com/uploads/2019/02/20/1253_example_3_improved.PNG](https://assets.leetcode.com/uploads/2019/02/20/1253_example_3_improved.PNG) - -``` -Input: [[".",".",".",".",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".","p",".",".",".","."],["p","p",".","R",".","p","B","."],[".",".",".",".",".",".",".","."],[".",".",".","B",".",".",".","."],[".",".",".","p",".",".",".","."],[".",".",".",".",".",".",".","."]] -Output: 3 -Explanation: -The rook can capture the pawns at positions b5, d6 and f5. -``` - -**Note**: - -1. `board.length == board[i].length == 8` -2. `board[i][j]` is either `'R'`, `'.'`, `'B'`, or `'p'` -3. There is exactly one cell with `board[i][j] == 'R'` - -## 题目大意 - -在一个 8 x 8 的棋盘上,有一个白色的车(Rook),用字符 'R' 表示。棋盘上还可能存在空方块,白色的象(Bishop)以及黑色的卒(pawn),分别用字符 '.','B' 和 'p' 表示。不难看出,大写字符表示的是白棋,小写字符表示的是黑棋。车按国际象棋中的规则移动。东,西,南,北四个基本方向任选其一,然后一直向选定的方向移动,直到满足下列四个条件之一: - -- 棋手选择主动停下来。 -- 棋子因到达棋盘的边缘而停下。 -- 棋子移动到某一方格来捕获位于该方格上敌方(黑色)的卒,停在该方格内。 -- 车不能进入/越过已经放有其他友方棋子(白色的象)的方格,停在友方棋子前。 - -你现在可以控制车移动一次,请你统计有多少敌方的卒处于你的捕获范围内(即,可以被一步捕获的棋子数)。 - -## 解题思路 - -- 按照国际象棋的规则移动车,要求输出只移动一次,有多少个卒在车的捕获范围之内 -- 简单题,按照国际象棋车的移动规则, 4 个方向分别枚举即可。 - -## 代码 - -```go - -package leetcode - -func numRookCaptures(board [][]byte) int { - num := 0 - for i := 0; i < len(board); i++ { - for j := 0; j < len(board[i]); j++ { - if board[i][j] == 'R' { - num += caputure(board, i-1, j, -1, 0) // Up - num += caputure(board, i+1, j, 1, 0) // Down - num += caputure(board, i, j-1, 0, -1) // Left - num += caputure(board, i, j+1, 0, 1) // Right - } - } - } - return num -} - -func caputure(board [][]byte, x, y int, bx, by int) int { - for x >= 0 && x < len(board) && y >= 0 && y < len(board[x]) && board[x][y] != 'B' { - if board[x][y] == 'p' { - return 1 - } - x += bx - y += by - } - return 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1002.Find-Common-Characters.md b/website/content/ChapterFour/1002.Find-Common-Characters.md deleted file mode 100755 index 9b61e2050..000000000 --- a/website/content/ChapterFour/1002.Find-Common-Characters.md +++ /dev/null @@ -1,74 +0,0 @@ -# [1002. Find Common Characters](https://leetcode.com/problems/find-common-characters/) - - -## 题目 - -Given an array `A` of strings made only from lowercase letters, return a list of all characters that show up in all strings within the list **(including duplicates)**. For example, if a character occurs 3 times in all strings but not 4 times, you need to include that character three times in the final answer. - -You may return the answer in any order. - -**Example 1**: - - Input: ["bella","label","roller"] - Output: ["e","l","l"] - -**Example 2**: - - Input: ["cool","lock","cook"] - Output: ["c","o"] - -**Note**: - -1. `1 <= A.length <= 100` -2. `1 <= A[i].length <= 100` -3. `A[i][j]` is a lowercase letter - -## 题目大意 - -给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。 - - -## 解题思路 - -- 简单题。给出一个字符串数组 A,要求找出这个数组中每个字符串都包含字符,如果字符出现多次,在最终结果中也需要出现多次。这一题可以用 map 来统计每个字符串的频次,但是如果用数组统计会更快。题目中说了只有小写字母,那么用 2 个 26 位长度的数组就可以统计出来了。遍历字符串数组的过程中,不过的缩小每个字符在每个字符串中出现的频次(因为需要找所有字符串公共的字符,公共的频次肯定就是最小的频次),得到了最终公共字符的频次数组以后,按顺序输出就可以了。 - - -## 代码 - -```go - -package leetcode - -import "math" - -func commonChars(A []string) []string { - cnt := [26]int{} - for i := range cnt { - cnt[i] = math.MaxUint16 - } - cntInWord := [26]int{} - for _, word := range A { - for _, char := range []byte(word) { // compiler trick - here we will not allocate new memory - cntInWord[char-'a']++ - } - for i := 0; i < 26; i++ { - // 缩小频次,使得统计的公共频次更加准确 - if cntInWord[i] < cnt[i] { - cnt[i] = cntInWord[i] - } - } - // 重置状态 - for i := range cntInWord { - cntInWord[i] = 0 - } - } - result := make([]string, 0) - for i := 0; i < 26; i++ { - for j := 0; j < cnt[i]; j++ { - result = append(result, string(i+'a')) - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1003.Check-If-Word-Is-Valid-After-Substitutions.md b/website/content/ChapterFour/1003.Check-If-Word-Is-Valid-After-Substitutions.md deleted file mode 100644 index b423f1dc5..000000000 --- a/website/content/ChapterFour/1003.Check-If-Word-Is-Valid-After-Substitutions.md +++ /dev/null @@ -1,107 +0,0 @@ -# [1003. Check If Word Is Valid After Substitutions](https://leetcode.com/problems/check-if-word-is-valid-after-substitutions/) - -## 题目 - -We are given that the string "abc" is valid. - -From any valid string V, we may split V into two pieces X and Y such that X + Y (X concatenated with Y) is equal to V. (X or Y may be empty.) Then, X + "abc" + Y is also valid. - -If for example S = "abc", then examples of valid strings are: "abc", "aabcbc", "abcabc", "abcabcababcc". Examples of invalid strings are: "abccba", "ab", "cababc", "bac". - -Return true if and only if the given string S is valid. - - - -**Example 1**: - -``` - -Input: "aabcbc" -Output: true -Explanation: -We start with the valid string "abc". -Then we can insert another "abc" between "a" and "bc", resulting in "a" + "abc" + "bc" which is "aabcbc". - -``` - -**Example 2**: - -``` - -Input: "abcabcababcc" -Output: true -Explanation: -"abcabcabc" is valid after consecutive insertings of "abc". -Then we can insert "abc" before the last letter, resulting in "abcabcab" + "abc" + "c" which is "abcabcababcc". - -``` - -**Example 3**: - -``` - -Input: "abccba" -Output: false - -``` - -**Example 4**: - -``` - -Input: "cababc" -Output: false - -``` - -**Note**: - -1. 1 <= S.length <= 20000 -2. S[i] is 'a', 'b', or 'c' - -## 题目大意 - -假设 abc 是有效的字符串,对于任何 字符串 V,如果用 abc 把字符串 V 切成 2 半,X 和 Y,组成 X + abc + Y 的字符串,X + abc + Y 的这个字符串依旧是有效的。X 和 Y 可以是空字符串。 - -例如,"abc"( "" + "abc" + ""), "aabcbc"( "a" + "abc" + "bc"), "abcabc"( "" + "abc" + "abc"), "abcabcababcc"( "abc" + "abc" + "ababcc",其中 "ababcc" 也是有效的,"ab" + "abc" + "c") 都是有效的字符串。 - -"abccba"( "" + "abc" + "cba","cba" 不是有效的字符串), "ab"("ab" 也不是有效字符串), "cababc"("c" + "abc" + "bc","c","bc" 都不是有效字符串), "bac" ("bac" 也不是有效字符串)这些都不是有效的字符串。 - -任意给一个字符串 S ,要求判断它是否有效,如果有效则输出 true。 - -## 解题思路 - -这一题可以类似括号匹配问题,因为 "abc" 这样的组合就代表是有效的,类似于括号匹配,遇到 "a" 就入栈,当遇到 "b" 字符的时候判断栈顶是不是 "a",当遇到 "c" 字符的时候需要判断栈顶是不是 "a" 和 "b"。最后如果栈都清空了,就输出 true。 - -## 代码 - -```go - -package leetcode - -func isValid1003(S string) bool { - if len(S) < 3 { - return false - } - stack := []byte{} - for i := 0; i < len(S); i++ { - if S[i] == 'a' { - stack = append(stack, S[i]) - } else if S[i] == 'b' { - if len(stack) > 0 && stack[len(stack)-1] == 'a' { - stack = append(stack, S[i]) - } else { - return false - } - } else { - if len(stack) > 1 && stack[len(stack)-1] == 'b' && stack[len(stack)-2] == 'a' { - stack = stack[:len(stack)-2] - } else { - return false - } - } - } - return len(stack) == 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1004.Max-Consecutive-Ones-III.md b/website/content/ChapterFour/1004.Max-Consecutive-Ones-III.md deleted file mode 100644 index ba6eb873d..000000000 --- a/website/content/ChapterFour/1004.Max-Consecutive-Ones-III.md +++ /dev/null @@ -1,80 +0,0 @@ -# [1004. Max Consecutive Ones III](https://leetcode.com/problems/max-consecutive-ones-iii/) - -## 题目 - -Given an array A of 0s and 1s, we may change up to K values from 0 to 1. - -Return the length of the longest (contiguous) subarray that contains only 1s. - - -**Example 1**: - -``` - -Input: A = [1,1,1,0,0,0,1,1,1,1,0], K = 2 -Output: 6 -Explanation: -[1,1,1,0,0,1,1,1,1,1,1] -Bolded numbers were flipped from 0 to 1. The longest subarray is underlined. - -``` - -**Example 2**: - -``` - -Input: A = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3 -Output: 10 -Explanation: -[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1] -Bolded numbers were flipped from 0 to 1. The longest subarray is underlined. - -``` - - -**Note**: - -- 1 <= A.length <= 20000 -- 0 <= K <= A.length -- A[i] is 0 or 1 - - -## 题目大意 - -这道题考察的是滑动窗口的问题。 - -给出一个数组,数组中元素只包含 0 和 1 。再给一个 K,代表能将 0 变成 1 的次数。要求出经过变换以后,1 连续的最长长度。 - -## 解题思路 - -按照滑动窗口的思路处理即可,不断的更新和维护最大长度。 - - -## 代码 - -```go - -package leetcode - -func longestOnes(A []int, K int) int { - res, left, right := 0, 0, 0 - for left < len(A) { - if right < len(A) && ((A[right] == 0 && K > 0) || A[right] == 1) { - if A[right] == 0 { - K-- - } - right++ - } else { - if K == 0 || (right == len(A) && K > 0) { - res = max(res, right-left) - } - if A[left] == 0 { - K++ - } - left++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1005.Maximize-Sum-Of-Array-After-K-Negations.md b/website/content/ChapterFour/1005.Maximize-Sum-Of-Array-After-K-Negations.md deleted file mode 100644 index 1293b74f0..000000000 --- a/website/content/ChapterFour/1005.Maximize-Sum-Of-Array-After-K-Negations.md +++ /dev/null @@ -1,83 +0,0 @@ -# [1005. Maximize Sum Of Array After K Negations](https://leetcode.com/problems/maximize-sum-of-array-after-k-negations/) - -## 题目 - -Given an array A of integers, we must modify the array in the following way: we choose an i and replace A[i] with -A[i], and we repeat this process K times in total. (We may choose the same index i multiple times.) - -Return the largest possible sum of the array after modifying it in this way. - - -**Example 1**: - -``` - -Input: A = [4,2,3], K = 1 -Output: 5 -Explanation: Choose indices (1,) and A becomes [4,-2,3]. - -``` - -**Example 2**: - -``` - -Input: A = [3,-1,0,2], K = 3 -Output: 6 -Explanation: Choose indices (1, 2, 2) and A becomes [3,1,0,2]. - -``` - -**Example 3**: - -``` - -Input: A = [2,-3,-1,5,-4], K = 2 -Output: 13 -Explanation: Choose indices (1, 4) and A becomes [2,3,-1,5,4]. - -``` - -**Note**: - -- 1 <= A.length <= 10000 -- 1 <= K <= 10000 -- -100 <= A[i] <= 100 - -## 题目大意 - -将数组中的元素变成它的相反数,这种操作执行 K 次之后,求出数组中所有元素的总和最大。 - -## 解题思路 - -这一题可以用最小堆来做,构建最小堆,每次将最小的元素变成它的相反数。然后最小堆调整,再将新的最小元素变成它的相反数。执行 K 次以后求数组中所有的值之和就是最大值。 - -这道题也可以用排序来实现。排序一次,从最小值开始往后扫,依次将最小值变为相反数。这里需要注意一点,负数都改变成正数以后,接着不是再改变这些变成正数的负数,而是接着改变顺序的正数。因为这些正数是比较小的正数。负数越小,变成正数以后值越大。正数越小,变成负数以后对总和影响最小。具体实现见代码。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -func largestSumAfterKNegations(A []int, K int) int { - sort.Ints(A) - minIdx := 0 - for i := 0; i < K; i++ { - A[minIdx] = -A[minIdx] - if A[minIdx+1] < A[minIdx] { - minIdx++ - } - } - sum := 0 - for _, a := range A { - sum += a - } - return sum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1011.Capacity-To-Ship-Packages-Within-D-Days.md b/website/content/ChapterFour/1011.Capacity-To-Ship-Packages-Within-D-Days.md deleted file mode 100755 index 774c53d14..000000000 --- a/website/content/ChapterFour/1011.Capacity-To-Ship-Packages-Within-D-Days.md +++ /dev/null @@ -1,101 +0,0 @@ -# [1011. Capacity To Ship Packages Within D Days](https://leetcode.com/problems/capacity-to-ship-packages-within-d-days/) - - -## 题目 - -A conveyor belt has packages that must be shipped from one port to another within `D` days. - -The `i`-th package on the conveyor belt has a weight of `weights[i]`. Each day, we load the ship with packages on the conveyor belt (in the order given by `weights`). We may not load more weight than the maximum weight capacity of the ship. - -Return the least weight capacity of the ship that will result in all the packages on the conveyor belt being shipped within `D` days. - -**Example 1**: - - Input: weights = [1,2,3,4,5,6,7,8,9,10], D = 5 - Output: 15 - Explanation: - A ship capacity of 15 is the minimum to ship all the packages in 5 days like this: - 1st day: 1, 2, 3, 4, 5 - 2nd day: 6, 7 - 3rd day: 8 - 4th day: 9 - 5th day: 10 - - Note that the cargo must be shipped in the order given, so using a ship of capacity 14 and splitting the packages into parts like (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) is not allowed. - -**Example 2**: - - Input: weights = [3,2,2,4,1,4], D = 3 - Output: 6 - Explanation: - A ship capacity of 6 is the minimum to ship all the packages in 3 days like this: - 1st day: 3, 2 - 2nd day: 2, 4 - 3rd day: 1, 4 - -**Example 3**: - - Input: weights = [1,2,3,1,1], D = 4 - Output: 3 - Explanation: - 1st day: 1 - 2nd day: 2 - 3rd day: 3 - 4th day: 1, 1 - -**Note**: - -1. `1 <= D <= weights.length <= 50000` -2. `1 <= weights[i] <= 500` - - -## 题目大意 - -传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。 - -传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 - -返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。 - -提示: - -- 1 <= D <= weights.length <= 50000 -- 1 <= weights[i] <= 500 - - -## 解题思路 - -- 给出一个数组和天数 D,要求正好在 D 天把数组中的货物都运完。求传输带上能承受的最小货物重量是多少。 -- 这一题和第 410 题完全一样,只不过换了一个题面。代码完全不变。思路解析见第 410 题。 - - -## 代码 - -```go - -package leetcode - -func shipWithinDays(weights []int, D int) int { - maxNum, sum := 0, 0 - for _, num := range weights { - sum += num - if num > maxNum { - maxNum = num - } - } - if D == 1 { - return sum - } - low, high := maxNum, sum - for low < high { - mid := low + (high-low)>>1 - if calSum(mid, D, weights) { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1017.Convert-to-Base--2.md b/website/content/ChapterFour/1017.Convert-to-Base--2.md deleted file mode 100755 index 77eec60f0..000000000 --- a/website/content/ChapterFour/1017.Convert-to-Base--2.md +++ /dev/null @@ -1,75 +0,0 @@ -# [1017. Convert to Base -2](https://leetcode.com/problems/convert-to-base-2/) - - -## 题目 - -Given a number `N`, return a string consisting of `"0"`s and `"1"`s that represents its value in base **`-2`** (negative two). - -The returned string must have no leading zeroes, unless the string is `"0"`. - -**Example 1**: - - Input: 2 - Output: "110" - Explantion: (-2) ^ 2 + (-2) ^ 1 = 2 - -**Example 2**: - - Input: 3 - Output: "111" - Explantion: (-2) ^ 2 + (-2) ^ 1 + (-2) ^ 0 = 3 - -**Example 3**: - - Input: 4 - Output: "100" - Explantion: (-2) ^ 2 = 4 - -**Note**: - -1. `0 <= N <= 10^9` - - -## 题目大意 - -给出数字 N,返回由若干 "0" 和 "1"组成的字符串,该字符串为 N 的负二进制(base -2)表示。除非字符串就是 "0",否则返回的字符串中不能含有前导零。 - -提示: - -- 0 <= N <= 10^9 - - - -## 解题思路 - -- 给出一个十进制的数,要求转换成 -2 进制的数 -- 这一题仿造十进制转二进制的思路,短除法即可。 - - - -## 代码 - -```go - -package leetcode - -import "strconv" - -func baseNeg2(N int) string { - if N == 0 { - return "0" - } - res := "" - for N != 0 { - remainder := N % (-2) - N = N / (-2) - if remainder < 0 { - remainder += 2 - N++ - } - res = strconv.Itoa(remainder) + res - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1019.Next-Greater-Node-In-Linked-List.md b/website/content/ChapterFour/1019.Next-Greater-Node-In-Linked-List.md deleted file mode 100644 index 944ca8e32..000000000 --- a/website/content/ChapterFour/1019.Next-Greater-Node-In-Linked-List.md +++ /dev/null @@ -1,96 +0,0 @@ -# [1019. Next Greater Node In Linked List](https://leetcode.com/problems/next-greater-node-in-linked-list/) - -## 题目 - -We are given a linked list with head as the first node. Let's number the nodes in the list: node\_1, node\_2, node\_3, ... etc. - -Each node may have a next larger value: for node_i, next\_larger(node\_i) is the node\_j.val such that j > i, node\_j.val > node\_i.val, and j is the smallest possible choice. If such a j does not exist, the next larger value is 0. - -Return an array of integers answer, where answer[i] = next\_larger(node\_{i+1}). - -Note that in the example inputs (not outputs) below, arrays such as [2,1,5] represent the serialization of a linked list with a head node value of 2, second node value of 1, and third node value of 5. - - - -**Example 1**: - -``` - -Input: [2,1,5] -Output: [5,5,0] - -``` - -**Example 2**: - -``` - -Input: [2,7,4,3,5] -Output: [7,0,5,5,0] - -``` - -**Example 3**: - -``` - -Input: [1,7,5,1,9,2,5,1] -Output: [7,9,9,9,0,5,0,0] - -``` - -**Note**: - -- 1 <= node.val <= 10^9 for each node in the linked list. -- The given list has length in the range [0, 10000]. - - -## 题目大意 - -给出一个链表,要求找出每个结点后面比该结点值大的第一个结点,如果找不到这个结点,则输出 0 。 - - -## 解题思路 - -这一题和第 739 题、第 496 题、第 503 题类似。也有 2 种解题方法。先把链表中的数字存到数组中,整道题的思路就和第 739 题完全一致了。普通做法就是 2 层循环。优化的做法就是用单调栈,维护一个单调递减的栈即可。 - - - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ -// 解法一 单调栈 -func nextLargerNodes(head *ListNode) []int { - res, indexes, nums := make([]int, 0), make([]int, 0), make([]int, 0) - p := head - for p != nil { - nums = append(nums, p.Val) - p = p.Next - } - for i := 0; i < len(nums); i++ { - res = append(res, 0) - } - for i := 0; i < len(nums); i++ { - num := nums[i] - for len(indexes) > 0 && nums[indexes[len(indexes)-1]] < num { - index := indexes[len(indexes)-1] - res[index] = num - indexes = indexes[:len(indexes)-1] - } - indexes = append(indexes, i) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1020.Number-of-Enclaves.md b/website/content/ChapterFour/1020.Number-of-Enclaves.md deleted file mode 100644 index 34b72b3de..000000000 --- a/website/content/ChapterFour/1020.Number-of-Enclaves.md +++ /dev/null @@ -1,93 +0,0 @@ -# [1020. Number of Enclaves](https://leetcode.com/problems/number-of-enclaves/) - - - -## 题目 - -Given a 2D array `A`, each cell is 0 (representing sea) or 1 (representing land) - -A move consists of walking from one land square 4-directionally to another land square, or off the boundary of the grid. - -Return the number of land squares in the grid for which we **cannot** walk off the boundary of the grid in any number of moves. - -**Example 1**: - -``` -Input: [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]] -Output: 3 -Explanation: -There are three 1s that are enclosed by 0s, and one 1 that isn't enclosed because its on the boundary. -``` - -**Example 2**: - -``` -Input: [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]] -Output: 0 -Explanation: -All 1s are either on the boundary or can reach the boundary. -``` - -**Note**: - -1. `1 <= A.length <= 500` -2. `1 <= A[i].length <= 500` -3. `0 <= A[i][j] <= 1` -4. All rows have the same size. - -## 题目大意 - -给出一个二维数组 A,每个单元格为 0(代表海)或 1(代表陆地)。移动是指在陆地上从一个地方走到另一个地方(朝四个方向之一)或离开网格的边界。返回网格中无法在任意次数的移动中离开网格边界的陆地单元格的数量。 - -提示: - -- 1 <= A.length <= 500 -- 1 <= A[i].length <= 500 -- 0 <= A[i][j] <= 1 -- 所有行的大小都相同 - - -## 解题思路 - -- 给出一个地图,要求输出不和边界连通的 1 的个数。 -- 这一题可以用 DFS 也可以用并查集解答。DFS 的思路是深搜的过程中把和边界连通的点都覆盖成 0,最后遍历一遍地图,输出 1 的个数即可。并查集的思路就比较直接了,把能和边界连通的放在一个集合中,剩下的就是不能和边界连通的都在另外一个集合中,输出这个集合里面元素的个数即可。 -- 这一题和第 200 题,第 1254 题,第 695 题类似。可以放在一起练习。 - -## 代码 - -```go -func numEnclaves(A [][]int) int { - m, n := len(A), len(A[0]) - for i := 0; i < m; i++ { - for j := 0; j < n; j++ { - if i == 0 || i == m-1 || j == 0 || j == n-1 { - if A[i][j] == 1 { - dfsNumEnclaves(A, i, j) - } - } - } - } - count := 0 - for i := 0; i < m; i++ { - for j := 0; j < n; j++ { - if A[i][j] == 1 { - count++ - } - } - } - return count -} - -func dfsNumEnclaves(A [][]int, x, y int) { - if !isInGrid(A, x, y) || A[x][y] == 0 { - return - } - A[x][y] = 0 - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - dfsNumEnclaves(A, nx, ny) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1021.Remove-Outermost-Parentheses.md b/website/content/ChapterFour/1021.Remove-Outermost-Parentheses.md deleted file mode 100644 index d43d1b224..000000000 --- a/website/content/ChapterFour/1021.Remove-Outermost-Parentheses.md +++ /dev/null @@ -1,123 +0,0 @@ -# [1021. Remove Outermost Parentheses](https://leetcode.com/problems/remove-outermost-parentheses/) - -## 题目 - -A valid parentheses string is either empty (""), "(" + A + ")", or A + B, where A and B are valid parentheses strings, and + represents string concatenation. For example, "", "()", "(())()", and "(()(()))" are all valid parentheses strings. - -A valid parentheses string S is primitive if it is nonempty, and there does not exist a way to split it into S = A+B, with A and B nonempty valid parentheses strings. - -Given a valid parentheses string S, consider its primitive decomposition: S = P\_1 + P\_2 + ... + P\_k, where P\_i are primitive valid parentheses strings. - -Return S after removing the outermost parentheses of every primitive string in the primitive decomposition of S. - - -**Example 1**: - -``` - -Input: "(()())(())" -Output: "()()()" -Explanation: -The input string is "(()())(())", with primitive decomposition "(()())" + "(())". -After removing outer parentheses of each part, this is "()()" + "()" = "()()()". - -``` - -**Example 2**: - -``` - -Input: "(()())(())(()(()))" -Output: "()()()()(())" -Explanation: -The input string is "(()())(())(()(()))", with primitive decomposition "(()())" + "(())" + "(()(()))". -After removing outer parentheses of each part, this is "()()" + "()" + "()(())" = "()()()()(())". - -``` - -**Example 3**: - -``` - -Input: "()()" -Output: "" -Explanation: -The input string is "()()", with primitive decomposition "()" + "()". -After removing outer parentheses of each part, this is "" + "" = "". - -``` - -**Note**: - -- S.length <= 10000 -- S[i] is "(" or ")" -- S is a valid parentheses string - - -## 题目大意 - -题目要求去掉最外层的括号。 - -## 解题思路 - -用栈模拟即可。 - - - - - -## 代码 - -```go - -package leetcode - -// 解法一 -func removeOuterParentheses(S string) string { - now, current, ans := 0, "", "" - for _, char := range S { - if string(char) == "(" { - now++ - } else if string(char) == ")" { - now-- - } - current += string(char) - if now == 0 { - ans += current[1 : len(current)-1] - current = "" - } - } - return ans -} - -// 解法二 -func removeOuterParentheses1(S string) string { - stack, res, counter := []byte{}, "", 0 - for i := 0; i < len(S); i++ { - if counter == 0 && len(stack) == 1 && S[i] == ')' { - stack = stack[1:] - continue - } - if len(stack) == 0 && S[i] == '(' { - stack = append(stack, S[i]) - continue - } - if len(stack) > 0 { - switch S[i] { - case '(': - { - counter++ - res += "(" - } - case ')': - { - counter-- - res += ")" - } - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1025.Divisor-Game.md b/website/content/ChapterFour/1025.Divisor-Game.md deleted file mode 100755 index e6a45211d..000000000 --- a/website/content/ChapterFour/1025.Divisor-Game.md +++ /dev/null @@ -1,62 +0,0 @@ -# [1025. Divisor Game](https://leetcode.com/problems/divisor-game/) - - -## 题目 - -Alice and Bob take turns playing a game, with Alice starting first. - -Initially, there is a number `N` on the chalkboard. On each player's turn, that player makes a *move* consisting of: - -- Choosing any `x` with `0 < x < N` and `N % x == 0`. -- Replacing the number `N` on the chalkboard with `N - x`. - -Also, if a player cannot make a move, they lose the game. - -Return `True` if and only if Alice wins the game, assuming both players play optimally. - -**Example 1**: - - Input: 2 - Output: true - Explanation: Alice chooses 1, and Bob has no more moves. - -**Example 2**: - - Input: 3 - Output: false - Explanation: Alice chooses 1, Bob chooses 1, and Alice has no more moves. - -**Note**: - -1. `1 <= N <= 1000` - - -## 题目大意 - - -爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作: - -- 选出任一 x,满足 0 < x < N 且 N % x == 0 。 -- 用 N - x 替换黑板上的数字 N 。 - -如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。 - - -## 解题思路 - - -- 两人相互玩一个游戏,游戏初始有一个数 N,开始游戏的时候,任一方选择一个数 x,满足 `0 < x < N` 并且 `N % x == 0` 的条件,然后 `N-x` 为下一轮开始的数。此轮结束,该另外一个人继续选择数字,两人相互轮流选择。直到某一方再也没法选择数字的时候,输掉游戏。问如果你先手开始游戏,给出 N 的时候,能否直到这局你是否会必胜或者必输? -- 这一题当 `N = 1` 的时候,那一轮的人必输。因为没法找到一个数字能满足 `0 < x < N` 并且 `N % x == 0` 的条件了。必胜策略就是把对方逼至 `N = 1` 的情况。题目中假设了对手也是一个很有头脑的人。初始如果 `N 为偶数`,我就选择 x = 1,对手拿到的数字就是奇数。只要最终能让对手拿到奇数,他就会输。初始如果 `N 为奇数`,N = 1 的时候直接输了,N 为其他奇数的时候,我们也只能选择一个奇数 x,(因为 `N % x == 0` ,N 为奇数,x 一定不会是偶数,因为偶数就能被 2 整除了),对手由于是一个很有头脑的人,当我们选完 N - x 是偶数的时候,他就选择 1,那么轮到我们拿到的数字又是奇数。对手只要一直保证我们拿到奇数,最终肯定会逼着我们拿到 1,最终他就会获得胜利。所以经过分析可得,初始数字如果是偶数,有必胜策略,如果初始数字是奇数,有必输的策略。 - - -## 代码 - -```go - -package leetcode - -func divisorGame(N int) bool { - return N%2 == 0 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1026.Maximum-Difference-Between-Node-and-Ancestor.md b/website/content/ChapterFour/1026.Maximum-Difference-Between-Node-and-Ancestor.md deleted file mode 100644 index b2c946172..000000000 --- a/website/content/ChapterFour/1026.Maximum-Difference-Between-Node-and-Ancestor.md +++ /dev/null @@ -1,74 +0,0 @@ -# [1026. Maximum Difference Between Node and Ancestor](https://leetcode.com/problems/maximum-difference-between-node-and-ancestor/) - - - -## 题目 - -Given the `root` of a binary tree, find the maximum value `V` for which there exists **different** nodes `A` and `B` where `V = |A.val - B.val|` and `A` is an ancestor of `B`. - -(A node A is an ancestor of B if either: any child of A is equal to B, or any child of A is an ancestor of B.) - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/09/09/2whqcep.jpg](https://assets.leetcode.com/uploads/2019/09/09/2whqcep.jpg) - -``` -Input: [8,3,10,1,6,null,14,null,null,4,7,13] -Output: 7 -Explanation: -We have various ancestor-node differences, some of which are given below : -|8 - 3| = 5 -|3 - 7| = 4 -|8 - 1| = 7 -|10 - 13| = 3 -Among all possible differences, the maximum value of 7 is obtained by |8 - 1| = 7. -``` - -**Note**: - -1. The number of nodes in the tree is between `2` and `5000`. -2. Each node will have value between `0` and `100000`. - -## 题目大意 - -给定二叉树的根节点 root,找出存在于不同节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先) - -提示: - -- 树中的节点数在 2 到 5000 之间。 -- 每个节点的值介于 0 到 100000 之间。 - - - -## 解题思路 - -- 给出一颗树,要求找出祖先和孩子的最大差值。 -- DPS 深搜即可。每个节点和其所有孩子的`最大值`来自于 3 个值,节点本身,递归遍历左子树的最大值,递归遍历右子树的最大值;每个节点和其所有孩子的`最小值`来自于 3 个值,节点本身,递归遍历左子树的最小值,递归遍历右子树的最小值。依次求出自身节点和其所有孩子节点的最大差值,深搜的过程中动态维护最大差值即可。 - -## 代码 - -```go -func maxAncestorDiff(root *TreeNode) int { - res := 0 - dfsAncestorDiff(root, &res) - return res -} - -func dfsAncestorDiff(root *TreeNode, res *int) (int, int) { - if root == nil { - return -1, -1 - } - leftMax, leftMin := dfsAncestorDiff(root.Left, res) - if leftMax == -1 && leftMin == -1 { - leftMax = root.Val - leftMin = root.Val - } - rightMax, rightMin := dfsAncestorDiff(root.Right, res) - if rightMax == -1 && rightMin == -1 { - rightMax = root.Val - rightMin = root.Val - } - *res = max(*res, max(abs(root.Val-min(leftMin, rightMin)), abs(root.Val-max(leftMax, rightMax)))) - return max(leftMax, max(rightMax, root.Val)), min(leftMin, min(rightMin, root.Val)) -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1028.Recover-a-Tree-From-Preorder-Traversal.md b/website/content/ChapterFour/1028.Recover-a-Tree-From-Preorder-Traversal.md deleted file mode 100755 index f9c25238e..000000000 --- a/website/content/ChapterFour/1028.Recover-a-Tree-From-Preorder-Traversal.md +++ /dev/null @@ -1,135 +0,0 @@ -# [1028. Recover a Tree From Preorder Traversal](https://leetcode.com/problems/recover-a-tree-from-preorder-traversal/) - - -## 题目 - -We run a preorder depth first search on the `root` of a binary tree. - -At each node in this traversal, we output `D` dashes (where `D` is the *depth* of this node), then we output the value of this node. *(If the depth of a node is `D`, the depth of its immediate child is `D+1`. The depth of the root node is `0`.)* - -If a node has only one child, that child is guaranteed to be the left child. - -Given the output `S` of this traversal, recover the tree and return its `root`. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/04/08/recover-a-tree-from-preorder-traversal.png](https://assets.leetcode.com/uploads/2019/04/08/recover-a-tree-from-preorder-traversal.png) - - Input: "1-2--3--4-5--6--7" - Output: [1,2,5,3,4,6,7] - -**Example 2**: - -![https://assets.leetcode.com/uploads/2019/04/11/screen-shot-2019-04-10-at-114101-pm.png](https://assets.leetcode.com/uploads/2019/04/11/screen-shot-2019-04-10-at-114101-pm.png) - - Input: "1-2--3---4-5--6---7" - Output: [1,2,5,3,null,6,null,4,null,7] - -**Example 3**: - -![https://assets.leetcode.com/uploads/2019/04/11/screen-shot-2019-04-10-at-114955-pm.png](https://assets.leetcode.com/uploads/2019/04/11/screen-shot-2019-04-10-at-114955-pm.png) - - Input: "1-401--349---90--88" - Output: [1,401,null,349,88,90] - -**Note**: - -- The number of nodes in the original tree is between `1` and `1000`. -- Each node will have a value between `1` and `10^9`. - -## 题目大意 - -我们从二叉树的根节点 root 开始进行深度优先搜索。 - -在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。如果节点只有一个子节点,那么保证该子节点为左子节点。给出遍历输出 S,还原树并返回其根节点 root。 - - -提示: - -- 原始树中的节点数介于 1 和 1000 之间。 -- 每个节点的值介于 1 和 10 ^ 9 之间。 - - -## 解题思路 - -- 给出一个字符串,字符串是一个树的先根遍历的结果,其中破折号的个数代表层数。请根据这个字符串生成对应的树。 -- 这一题解题思路比较明确,用 DFS 就可以解题。边深搜字符串,边根据破折号的个数判断当前节点是否属于本层。如果不属于本层,回溯到之前的根节点,添加叶子节点以后再继续深搜。需要注意的是每次深搜时,扫描字符串的 index 需要一直保留,回溯也需要用到这个 index。 - - -## 代码 - -```go - -package leetcode - -import ( - "strconv" -) - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func recoverFromPreorder(S string) *TreeNode { - if len(S) == 0 { - return &TreeNode{} - } - root, index, level := &TreeNode{}, 0, 0 - cur := root - dfsBuildPreorderTree(S, &index, &level, cur) - return root.Right -} - -func dfsBuildPreorderTree(S string, index, level *int, cur *TreeNode) (newIndex *int) { - if *index == len(S) { - return index - } - if *index == 0 && *level == 0 { - i := 0 - for i = *index; i < len(S); i++ { - if !isDigital(S[i]) { - break - } - } - num, _ := strconv.Atoi(S[*index:i]) - tmp := &TreeNode{Val: num, Left: nil, Right: nil} - cur.Right = tmp - nLevel := *level + 1 - index = dfsBuildPreorderTree(S, &i, &nLevel, tmp) - index = dfsBuildPreorderTree(S, index, &nLevel, tmp) - } - i := 0 - for i = *index; i < len(S); i++ { - if isDigital(S[i]) { - break - } - } - if *level == i-*index { - j := 0 - for j = i; j < len(S); j++ { - if !isDigital(S[j]) { - break - } - } - num, _ := strconv.Atoi(S[i:j]) - tmp := &TreeNode{Val: num, Left: nil, Right: nil} - if cur.Left == nil { - cur.Left = tmp - nLevel := *level + 1 - index = dfsBuildPreorderTree(S, &j, &nLevel, tmp) - index = dfsBuildPreorderTree(S, index, level, cur) - } else if cur.Right == nil { - cur.Right = tmp - nLevel := *level + 1 - index = dfsBuildPreorderTree(S, &j, &nLevel, tmp) - index = dfsBuildPreorderTree(S, index, level, cur) - } - } - return index -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1030.Matrix-Cells-in-Distance-Order.md b/website/content/ChapterFour/1030.Matrix-Cells-in-Distance-Order.md deleted file mode 100755 index ba60ec4dc..000000000 --- a/website/content/ChapterFour/1030.Matrix-Cells-in-Distance-Order.md +++ /dev/null @@ -1,84 +0,0 @@ -# [1030. Matrix Cells in Distance Order](https://leetcode.com/problems/matrix-cells-in-distance-order/) - - -## 题目 - -We are given a matrix with `R` rows and `C` columns has cells with integer coordinates `(r, c)`, where `0 <= r < R` and `0 <= c < C`. - -Additionally, we are given a cell in that matrix with coordinates `(r0, c0)`. - -Return the coordinates of all cells in the matrix, sorted by their distance from `(r0, c0)` from smallest distance to largest distance. Here, the distance between two cells `(r1, c1)` and `(r2, c2)` is the Manhattan distance, `|r1 - r2| + |c1 - c2|`. (You may return the answer in any order that satisfies this condition.) - -**Example 1**: - - Input: R = 1, C = 2, r0 = 0, c0 = 0 - Output: [[0,0],[0,1]] - Explanation: The distances from (r0, c0) to other cells are: [0,1] - -**Example 2**: - - Input: R = 2, C = 2, r0 = 0, c0 = 1 - Output: [[0,1],[0,0],[1,1],[1,0]] - Explanation: The distances from (r0, c0) to other cells are: [0,1,1,2] - The answer [[0,1],[1,1],[0,0],[1,0]] would also be accepted as correct. - -**Example 3**: - - Input: R = 2, C = 3, r0 = 1, c0 = 2 - Output: [[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]] - Explanation: The distances from (r0, c0) to other cells are: [0,1,1,2,2,3] - There are other answers that would also be accepted as correct, such as [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]. - -**Note**: - -1. `1 <= R <= 100` -2. `1 <= C <= 100` -3. `0 <= r0 < R` -4. `0 <= c0 < C` - - - -## 题目大意 - - -给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。 - -返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。) - - -## 解题思路 - - -- 按照题意计算矩阵内给定点到其他每个点的距离即可 - - - -## 代码 - -```go - -package leetcode - -func allCellsDistOrder(R int, C int, r0 int, c0 int) [][]int { - longRow, longCol, result := max(abs(r0-0), abs(R-r0)), max(abs(c0-0), abs(C-c0)), make([][]int, 0) - maxDistance := longRow + longCol - bucket := make([][][]int, maxDistance+1) - for i := 0; i <= maxDistance; i++ { - bucket[i] = make([][]int, 0) - } - for r := 0; r < R; r++ { - for c := 0; c < C; c++ { - distance := abs(r-r0) + abs(c-c0) - tmp := []int{r, c} - bucket[distance] = append(bucket[distance], tmp) - } - } - for i := 0; i <= maxDistance; i++ { - for _, buk := range bucket[i] { - result = append(result, buk) - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1037.Valid-Boomerang.md b/website/content/ChapterFour/1037.Valid-Boomerang.md deleted file mode 100644 index 89a4000db..000000000 --- a/website/content/ChapterFour/1037.Valid-Boomerang.md +++ /dev/null @@ -1,49 +0,0 @@ -# [1037. Valid Boomerang](https://leetcode.com/problems/valid-boomerang/) - - -## 题目 - -A *boomerang* is a set of 3 points that are all distinct and **not** in a straight line. - -Given a list of three points in the plane, return whether these points are a boomerang. - -**Example 1**: - -``` -Input: [[1,1],[2,3],[3,2]] -Output: true -``` - -**Example 2**: - -``` -Input: [[1,1],[2,2],[3,3]] -Output: false -``` - -**Note**: - -1. `points.length == 3` -2. `points[i].length == 2` -3. `0 <= points[i][j] <= 100` - -## 题目大意 - -回旋镖定义为一组三个点,这些点各不相同且不在一条直线上。给出平面上三个点组成的列表,判断这些点是否可以构成回旋镖。 - -## 解题思路 - -- 判断给出的 3 组点能否满足回旋镖。 -- 简单题。判断 3 个点组成的 2 条直线的斜率是否相等。由于斜率的计算是除法,还可能遇到分母为 0 的情况,那么可以转换成乘法,交叉相乘再判断是否相等,就可以省去判断分母为 0 的情况了,代码也简洁成一行了。 - -## 代码 - -```go - -package leetcode - -func isBoomerang(points [][]int) bool { - return (points[0][0]-points[1][0])*(points[0][1]-points[2][1]) != (points[0][0]-points[2][0])*(points[0][1]-points[1][1]) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1040.Moving-Stones-Until-Consecutive-II.md b/website/content/ChapterFour/1040.Moving-Stones-Until-Consecutive-II.md deleted file mode 100755 index 9c41121ef..000000000 --- a/website/content/ChapterFour/1040.Moving-Stones-Until-Consecutive-II.md +++ /dev/null @@ -1,121 +0,0 @@ -# [1040. Moving Stones Until Consecutive II](https://leetcode.com/problems/moving-stones-until-consecutive-ii/) - - -## 题目 - -On an **infinite** number line, the position of the i-th stone is given by `stones[i]`. Call a stone an *endpoint stone* if it has the smallest or largest position. - -Each turn, you pick up an endpoint stone and move it to an unoccupied position so that it is no longer an endpoint stone. - -In particular, if the stones are at say, `stones = [1,2,5]`, you **cannot** move the endpoint stone at position 5, since moving it to any position (such as 0, or 3) will still keep that stone as an endpoint stone. - -The game ends when you cannot make any more moves, ie. the stones are in consecutive positions. - -When the game ends, what is the minimum and maximum number of moves that you could have made? Return the answer as an length 2 array: `answer = [minimum_moves, maximum_moves]` - -**Example 1**: - - Input: [7,4,9] - Output: [1,2] - Explanation: - We can move 4 -> 8 for one move to finish the game. - Or, we can move 9 -> 5, 4 -> 6 for two moves to finish the game. - -**Example 2**: - - Input: [6,5,4,3,10] - Output: [2,3] - We can move 3 -> 8 then 10 -> 7 to finish the game. - Or, we can move 3 -> 7, 4 -> 8, 5 -> 9 to finish the game. - Notice we cannot move 10 -> 2 to finish the game, because that would be an illegal move. - -**Example 3**: - - Input: [100,101,104,102,103] - Output: [0,0] - -**Note**: - -1. `3 <= stones.length <= 10^4` -2. `1 <= stones[i] <= 10^9` -3. `stones[i]` have distinct values. - - -## 题目大意 - -在一个长度无限的数轴上,第 i 颗石子的位置为 stones[i]。如果一颗石子的位置最小/最大,那么该石子被称作端点石子。每个回合,你可以将一颗端点石子拿起并移动到一个未占用的位置,使得该石子不再是一颗端点石子。值得注意的是,如果石子像 stones = [1,2,5] 这样,你将无法移动位于位置 5 的端点石子,因为无论将它移动到任何位置(例如 0 或 3),该石子都仍然会是端点石子。当你无法进行任何移动时,即,这些石子的位置连续时,游戏结束。 - -要使游戏结束,你可以执行的最小和最大移动次数分别是多少? 以长度为 2 的数组形式返回答案:answer = [minimum\_moves, maximum\_moves] 。 - -提示: - -1. 3 <= stones.length <= 10^4 -2. 1 <= stones[i] <= 10^9 -3. stones[i] 的值各不相同。 - - -## 解题思路 - - -- 给出一个数组,数组里面代表的是石头的坐标。要求移动石头,最终使得这些石头的坐标是一个连续的自然数列。但是规定,当一个石头是端点的时候,是不能移动的,例如 [1,2,5],5 是端点,不能把 5 移到 3 或者 0 的位置,因为移动之后,这个石头仍然是端点。最终输出将所有石头排成连续的自然数列所需的最小步数和最大步数。 -- 这道题的关键就是如何保证端点石头不能再次移动到端点的限制。例如,[5,6,8,9,20],20 是端点,但是 20 就可以移动到 7 的位置,最终形成 [5,6,7,8,9] 的连续序列。但是 [5,6,7,8,20],这种情况 20 就不能移动到 9 了,只能让 8 移动到 9,20 再移动到 8 的位置,最终还是形成了 [5,6,7,8,9],但是步数需要 2 步。经过上述分析,可以得到,端点石头只能往中间空挡的位置移动,如果中间没有空挡,那么需要借助一个石头先制造一个空挡,然后端点石头再插入到中间,这样最少是需要 2 步。 -- 再来考虑极值的情况。先看最大步数,最大步数肯定慢慢移动,一次移动一格,并且移动的格数最多。这里有两个极端情况,把数组里面的数全部都移动到最左端点,把数组里面的数全部都移动到最右端点。每次只移动一格。例如,全部都移到最右端点: - - [3,4,5,6,10] // 初始状态,连续的情况 - [4,5,6,7,10] // 第一步,把 3 挪到右边第一个可以插入的位置,即 7 - [5,6,7,8,10] // 第二步,把 4 挪到右边第一个可以插入的位置,即 8 - [6,7,8,9,10] // 第三步,把 5 挪到右边第一个可以插入的位置,即 9 - - - [1,3,5,7,10] // 初始状态,不连续的情况 - [3,4,5,7,10] // 第一步,把 1 挪到右边第一个可以插入的位置,即 4 - [4,5,6,7,10] // 第二步,把 3 挪到右边第一个可以插入的位置,即 6 - [5,6,7,8,10] // 第三步,把 4 挪到右边第一个可以插入的位置,即 8 - [6,7,8,9,10] // 第四步,把 5 挪到右边第一个可以插入的位置,即 9 - - 挪动的过程类似翻滚,最左边的石头挪到右边第一个可以放下的地方。然后不断的往右翻滚。把数组中的数全部都移动到最左边也同理。对比这两种情况的最大值,即是移动的最大步数。 - -- 再看最小步数。这里就涉及到了滑动窗口了。由于最终是要形成连续的自然数列,所以滑动窗口的大小已经固定成 n 了,从数组的 0 下标可以往右滑动窗口,这个窗口中能包含的数字越多,代表窗口外的数字越少,那么把这些数字放进窗口内的步数也最小。于是可以求得最小步数。这里有一个比较坑的地方就是题目中的那个`“端点不能移动以后还是端点”`的限制。针对这种情况,需要额外的判断。如果当前窗口内有 n-1 个元素了,即只有一个端点在窗口外,并且窗口右边界的值减去左边界的值也等于 n-1,代表这个窗口内已经都是连续数字了。这种情况端点想融合到这个连续数列中,最少需要 2 步(上文已经分析过了)。 -- 注意一些边界情况。如果窗口从左往右滑动,窗口右边界滑到最右边了,但是窗口右边界的数字减去左边界的数字还是小于窗口大小 n,代表已经滑到头了,可以直接 break 出去。为什么滑到头了呢?由于数组经过从小到大排序以后,数字越往右边越大,当前数字是小值,已经满足了 `stones[right]-stones[left] < n`,左边界继续往右移动只会使得 `stones[left]` 更大,就更加小于 n 了。而我们需要寻找的是 `stones[right]-stones[left] >= n` 的边界点,肯定再也找不到了。 - - -## 代码 - -```go - -package leetcode - -import ( - "math" - "sort" -) - -func numMovesStonesII(stones []int) []int { - if len(stones) == 0 { - return []int{0, 0} - } - sort.Ints(stones) - n := len(stones) - maxStep, minStep, left, right := max(stones[n-1]-stones[1]-n+2, stones[n-2]-stones[0]-n+2), math.MaxInt64, 0, 0 - for left < n { - if right+1 < n && stones[right]-stones[left] < n { - right++ - } else { - if stones[right]-stones[left] >= n { - right-- - } - if right-left+1 == n-1 && stones[right]-stones[left]+1 == n-1 { - minStep = min(minStep, 2) - } else { - minStep = min(minStep, n-(right-left+1)) - } - if right == n-1 && stones[right]-stones[left] < n { - break - } - left++ - } - } - return []int{minStep, maxStep} -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1047.Remove-All-Adjacent-Duplicates-In-String.md b/website/content/ChapterFour/1047.Remove-All-Adjacent-Duplicates-In-String.md deleted file mode 100644 index 1166355f8..000000000 --- a/website/content/ChapterFour/1047.Remove-All-Adjacent-Duplicates-In-String.md +++ /dev/null @@ -1,57 +0,0 @@ -# [1047. Remove All Adjacent Duplicates In String](https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string/) - -## 题目 - -Given a string S of lowercase letters, a duplicate removal consists of choosing two adjacent and equal letters, and removing them. - -We repeatedly make duplicate removals on S until we no longer can. - -Return the final string after all such duplicate removals have been made. It is guaranteed the answer is unique. - - - -**Example 1**: - -``` - -Input: "abbaca" -Output: "ca" -Explanation: -For example, in "abbaca" we could remove "bb" since the letters are adjacent and equal, and this is the only possible move. The result of this move is that the string is "aaca", of which only "aa" is possible, so the final string is "ca". - -``` - -**Note**: - -1. 1 <= S.length <= 20000 -2. S consists only of English lowercase letters. - - -## 题目大意 - -给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 - - -## 解题思路 - -用栈模拟,类似“对对碰”,一旦新来的字符和栈顶的字符一样的话,就弹出栈顶字符,直至扫完整个字符串。栈中剩下的字符串就是最终要输出的结果。 - -## 代码 - -```go - -package leetcode - -func removeDuplicates1047(S string) string { - stack := []rune{} - for _, s := range S { - if len(stack) == 0 || len(stack) > 0 && stack[len(stack)-1] != s { - stack = append(stack, s) - } else { - stack = stack[:len(stack)-1] - } - } - return string(stack) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1049.Last-Stone-Weight-II.md b/website/content/ChapterFour/1049.Last-Stone-Weight-II.md deleted file mode 100755 index 4159bb504..000000000 --- a/website/content/ChapterFour/1049.Last-Stone-Weight-II.md +++ /dev/null @@ -1,79 +0,0 @@ -# [1049. Last Stone Weight II](https://leetcode.com/problems/last-stone-weight-ii/) - -## 题目 - -We have a collection of rocks, each rock has a positive integer weight. - -Each turn, we choose **any two rocks** and smash them together. Suppose the stones have weights `x` and `y` with `x <= y`. The result of this smash is: - -- If `x == y`, both stones are totally destroyed; -- If `x != y`, the stone of weight `x` is totally destroyed, and the stone of weight `y`has new weight `y-x`. - -At the end, there is at most 1 stone left. Return the **smallest possible** weight of this stone (the weight is 0 if there are no stones left.) - -**Example 1**: - - Input: [2,7,4,1,8,1] - Output: 1 - Explanation: - We can combine 2 and 4 to get 2 so the array converts to [2,7,1,8,1] then, - we can combine 7 and 8 to get 1 so the array converts to [2,1,1,1] then, - we can combine 2 and 1 to get 1 so the array converts to [1,1,1] then, - we can combine 1 and 1 to get 0 so the array converts to [1] then that's the optimal value. - -**Note**: - -1. `1 <= stones.length <= 30` -2. `1 <= stones[i] <= 100` - - - -## 题目大意 - -有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下: - -如果 x == y,那么两块石头都会被完全粉碎; -如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。 -最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。 - -提示: - -1. 1 <= stones.length <= 30 -2. 1 <= stones[i] <= 1000 - - -## 解题思路 - - -- 给出一个数组,数组里面的元素代表的是石头的重量。现在要求两个石头对碰,如果重量相同,两个石头都消失,如果一个重一个轻,剩下的石头是两者的差值。问经过这样的多次碰撞以后,能剩下的石头的重量最轻是多少? -- 由于两两石头要发生碰撞,所以可以将整个数组可以分为两部分,如果这两部分的石头重量总和相差不大,那么经过若干次碰撞以后,剩下的石头重量一定是最小的。现在就需要找到这样两堆总重量差不多的两堆石头。这个问题就可以转化为 01 背包问题。从数组中找到 `sum/2` 重量的石头集合,如果一半能尽量达到 `sum/2`,那么另外一半和 `sum/2` 的差是最小的,最好的情况就是两堆石头的重量都是 `sum/2`,那么两两石头对碰以后最后都能消失。01 背包的经典模板可以参考第 416 题。 - - -## 代码 - -```go - -package leetcode - -func lastStoneWeightII(stones []int) int { - sum := 0 - for _, v := range stones { - sum += v - } - n, C, dp := len(stones), sum/2, make([]int, sum/2+1) - for i := 0; i <= C; i++ { - if stones[0] <= i { - dp[i] = stones[0] - } else { - dp[i] = 0 - } - } - for i := 1; i < n; i++ { - for j := C; j >= stones[i]; j-- { - dp[j] = max(dp[j], dp[j-stones[i]]+stones[i]) - } - } - return sum - 2*dp[C] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1051.Height-Checker.md b/website/content/ChapterFour/1051.Height-Checker.md deleted file mode 100644 index 10653f21f..000000000 --- a/website/content/ChapterFour/1051.Height-Checker.md +++ /dev/null @@ -1,72 +0,0 @@ -# [1051. Height Checker](https://leetcode.com/problems/height-checker/) - - -## 题目 - -Students are asked to stand in non-decreasing order of heights for an annual photo. - -Return the minimum number of students that must move in order for all students to be standing in non-decreasing order of height. - -Notice that when a group of students is selected they can reorder in any possible way between themselves and the non selected students remain on their seats. - -**Example 1**: - -``` -Input: heights = [1,1,4,2,1,3] -Output: 3 -Explanation: -Current array : [1,1,4,2,1,3] -Target array : [1,1,1,2,3,4] -On index 2 (0-based) we have 4 vs 1 so we have to move this student. -On index 4 (0-based) we have 1 vs 3 so we have to move this student. -On index 5 (0-based) we have 3 vs 4 so we have to move this student. -``` - -**Example 2**: - -``` -Input: heights = [5,1,2,3,4] -Output: 5 -``` - -**Example 3**: - -``` -Input: heights = [1,2,3,4,5] -Output: 0 -``` - -**Constraints**: - -- `1 <= heights.length <= 100` -- `1 <= heights[i] <= 100` - -## 题目大意 - -学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。 - - -## 解题思路 - -- 给定一个高度数组,要求输出把这个数组按照非递减高度排列所需移动的最少次数。 -- 简单题,最少次数意味着每次移动,一步到位,一步就移动到它所在的最终位置。那么用一个辅助排好序的数组,一一比对计数即可。 - -## 代码 - -```go - -package leetcode - -func heightChecker(heights []int) int { - result, checker := 0, []int{} - checker = append(checker, heights...) - sort.Ints(checker) - for i := 0; i < len(heights); i++ { - if heights[i] != checker[i] { - result++ - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1052.Grumpy-Bookstore-Owner.md b/website/content/ChapterFour/1052.Grumpy-Bookstore-Owner.md deleted file mode 100755 index b63f9479f..000000000 --- a/website/content/ChapterFour/1052.Grumpy-Bookstore-Owner.md +++ /dev/null @@ -1,106 +0,0 @@ -# [1052. Grumpy Bookstore Owner](https://leetcode.com/problems/grumpy-bookstore-owner/) - - -## 题目 - -Today, the bookstore owner has a store open for `customers.length`minutes. Every minute, some number of customers (`customers[i]`) enter the store, and all those customers leave after the end of that minute. - -On some minutes, the bookstore owner is grumpy. If the bookstore owner is grumpy on the i-th minute, `grumpy[i] = 1`, otherwise `grumpy[i] = 0`. When the bookstore owner is grumpy, the customers of that minute are not satisfied, otherwise they are satisfied. - -The bookstore owner knows a secret technique to keep themselves not grumpy for `X` minutes straight, but can only use it once. - -Return the maximum number of customers that can be satisfied throughout the day. - -**Example 1**: - - Input: customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3 - Output: 16 - Explanation: The bookstore owner keeps themselves not grumpy for the last 3 minutes. - The maximum number of customers that can be satisfied = 1 + 1 + 1 + 1 + 7 + 5 = 16. - -**Note**: - -- `1 <= X <= customers.length == grumpy.length <= 20000` -- `0 <= customers[i] <= 1000` -- `0 <= grumpy[i] <= 1` - - -## 题目大意 - -今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。请你返回这一天营业下来,最多有多少客户能够感到满意的数量。 - -提示: - -1. 1 <= X <= customers.length == grumpy.length <= 20000 -2. 0 <= customers[i] <= 1000 -3. 0 <= grumpy[i] <= 1 - - - -## 解题思路 - - -- 给出一个顾客入店时间表和书店老板发脾气的时间表。两个数组的时间是一一对应的,即相同下标对应的相同的时间。书店老板可以控制自己在 X 分钟内不发火,但是只能控制一次。问有多少顾客能在书店老板不发火的时候在书店里看书。抽象一下,给出一个价值数组和一个装着 0 和 1 的数组,当价值数组的下标对应另外一个数组相同下标的值是 0 的时候,那么这个价值可以累加,当对应是 1 的时候,就不能加上这个价值。现在可以让装着 0 和 1 的数组中连续 X 个数都变成 0,问最终价值最大是多少? -- 这道题是典型的滑动窗口的题目。最暴力的解法是滑动窗口右边界,当与左边界的距离等于 X 的时候,计算此刻对应的数组的总价值。当整个宽度为 X 的窗口滑过整个数组以后,输出维护的最大值即可。这个方法耗时比较长。因为每次计算数组总价值的时候都要遍历整个数组。这里是可以优化的地方。 -- 每次计算数组总价值的时候,其实目的是为了找到宽度为 X 的窗口对应里面为 1 的数累加和最大,因为如果把这个窗口里面的 1 都变成 0 以后,那么对最终价值的影响也最大。所以用一个变量 `customer0` 专门记录脾气数组中为 0 的对应的价值,累加起来。因为不管怎么改变,为 0 的永远为 0,唯一变化的是 1 变成 0 。用 `customer1` 专门记录脾气数组中为 1 的对应的价值。在窗口滑动过程中找到 `customer1` 的最大值。最终要求的最大值就是 `customer0 + maxCustomer1`。 - - -## 代码 - -```go - -package leetcode - -// 解法一 滑动窗口优化版 -func maxSatisfied(customers []int, grumpy []int, X int) int { - customer0, customer1, maxCustomer1, left, right := 0, 0, 0, 0, 0 - for ; right < len(customers); right++ { - if grumpy[right] == 0 { - customer0 += customers[right] - } else { - customer1 += customers[right] - for right-left+1 > X { - if grumpy[left] == 1 { - customer1 -= customers[left] - } - left++ - } - if customer1 > maxCustomer1 { - maxCustomer1 = customer1 - } - } - } - return maxCustomer1 + customer0 -} - -// 解法二 滑动窗口暴力版 -func maxSatisfied1(customers []int, grumpy []int, X int) int { - left, right, res := 0, -1, 0 - for left < len(customers) { - if right+1 < len(customers) && right-left < X-1 { - right++ - } else { - if right-left+1 == X { - res = max(res, sumSatisfied(customers, grumpy, left, right)) - } - left++ - } - } - return res -} - -func sumSatisfied(customers []int, grumpy []int, start, end int) int { - sum := 0 - for i := 0; i < len(customers); i++ { - if i < start || i > end { - if grumpy[i] == 0 { - sum += customers[i] - } - } else { - sum += customers[i] - } - } - return sum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1054.Distant-Barcodes.md b/website/content/ChapterFour/1054.Distant-Barcodes.md deleted file mode 100755 index 522c4e835..000000000 --- a/website/content/ChapterFour/1054.Distant-Barcodes.md +++ /dev/null @@ -1,92 +0,0 @@ -# [1054. Distant Barcodes](https://leetcode.com/problems/distant-barcodes/) - - -## 题目 - -In a warehouse, there is a row of barcodes, where the `i`-th barcode is `barcodes[i]`. - -Rearrange the barcodes so that no two adjacent barcodes are equal. You may return any answer, and it is guaranteed an answer exists. - -**Example 1**: - - Input: [1,1,1,2,2,2] - Output: [2,1,2,1,2,1] - -**Example 2**: - - Input: [1,1,1,1,2,2,3,3] - Output: [1,3,1,3,2,1,2,1] - -**Note**: - -1. `1 <= barcodes.length <= 10000` -2. `1 <= barcodes[i] <= 10000` - - -## 题目大意 - -在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 - - - -## 解题思路 - - -- 这一题和第 767 题原理是完全一样的。第 767 题是 Google 的面试题。 -- 解题思路比较简单,先按照每个数字的频次从高到低进行排序,注意会有频次相同的数字。排序以后,分别从第 0 号位和中间的位置开始往后取数,取完以后即为最终解。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -func rearrangeBarcodes(barcodes []int) []int { - bfs := barcodesFrequencySort(barcodes) - if len(bfs) == 0 { - return []int{} - } - res := []int{} - j := (len(bfs)-1)/2 + 1 - for i := 0; i <= (len(bfs)-1)/2; i++ { - res = append(res, bfs[i]) - if j < len(bfs) { - res = append(res, bfs[j]) - } - j++ - } - return res -} - -func barcodesFrequencySort(s []int) []int { - if len(s) == 0 { - return []int{} - } - sMap := map[int]int{} // 统计每个数字出现的频次 - cMap := map[int][]int{} // 按照频次作为 key 排序 - for _, b := range s { - sMap[b]++ - } - for key, value := range sMap { - cMap[value] = append(cMap[value], key) - } - var keys []int - for k := range cMap { - keys = append(keys, k) - } - sort.Sort(sort.Reverse(sort.IntSlice(keys))) - res := make([]int, 0) - for _, k := range keys { - for i := 0; i < len(cMap[k]); i++ { - for j := 0; j < k; j++ { - res = append(res, cMap[k][i]) - } - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1073.Adding-Two-Negabinary-Numbers.md b/website/content/ChapterFour/1073.Adding-Two-Negabinary-Numbers.md deleted file mode 100755 index b8380b335..000000000 --- a/website/content/ChapterFour/1073.Adding-Two-Negabinary-Numbers.md +++ /dev/null @@ -1,146 +0,0 @@ -# [1073. Adding Two Negabinary Numbers](https://leetcode.com/problems/adding-two-negabinary-numbers/) - - -## 题目 - -Given two numbers `arr1` and `arr2` in base **-2**, return the result of adding them together. - -Each number is given in *array format*: as an array of 0s and 1s, from most significant bit to least significant bit. For example, `arr = [1,1,0,1]`represents the number `(-2)^3 + (-2)^2 + (-2)^0 = -3`. A number `arr` in *array format* is also guaranteed to have no leading zeros: either `arr == [0]` or `arr[0] == 1`. - -Return the result of adding `arr1` and `arr2` in the same format: as an array of 0s and 1s with no leading zeros. - -**Example 1**: - - Input: arr1 = [1,1,1,1,1], arr2 = [1,0,1] - Output: [1,0,0,0,0] - Explanation: arr1 represents 11, arr2 represents 5, the output represents 16. - -**Note**: - -1. `1 <= arr1.length <= 1000` -2. `1 <= arr2.length <= 1000` -3. `arr1` and `arr2` have no leading zeros -4. `arr1[i]` is `0` or `1` -5. `arr2[i]` is `0` or `1` - - -## 题目大意 - -给出基数为 -2 的两个数 arr1 和 arr2,返回两数相加的结果。数字以 数组形式 给出:数组由若干 0 和 1 组成,按最高有效位到最低有效位的顺序排列。例如,arr = [1,1,0,1] 表示数字 (-2)^3 + (-2)^2 + (-2)^0 = -3。数组形式 的数字也同样不含前导零:以 arr 为例,这意味着要么 arr == [0],要么 arr[0] == 1。 - -返回相同表示形式的 arr1 和 arr2 相加的结果。两数的表示形式为:不含前导零、由若干 0 和 1 组成的数组。 - -提示: - -- 1 <= arr1.length <= 1000 -- 1 <= arr2.length <= 1000 -- arr1 和 arr2 都不含前导零 -- arr1[i] 为 0 或 1 -- arr2[i] 为 0 或 1 - - - -## 解题思路 - -- 给出两个 -2 进制的数,要求计算出这两个数的和,最终表示形式还是 -2 进制。 -- 这一题最先想到的思路是先把两个 -2 进制的数转成 10 进制以后做加法,然后把结果表示成 -2 进制。这个思路可行,但是在提交以后会发现数据溢出 int64 了。在第 257 / 267 组测试数据会出现 WA。测试数据见 test 文件。另外换成 big.Add 也不是很方便。所以考虑换一个思路。 -- 这道题实际上就是求两个 -2 进制数的加法,为什么还要先转到 10 进制再换回 -2 进制呢?为何不直接进行 -2 进制的加法。所以开始尝试直接进行加法运算。加法是从低位到高位依次累加,遇到进位要从低往高位进位。所以从两个数组的末尾往前扫,模拟低位相加的过程。关键的是进位问题。进位分 3 种情况,依次来讨论: - -1. 进位到高位 k ,高位 k 上的两个数数字分别是 0 和 0 。这种情况最终 k 位为 1 。 -```c - 证明:由于进位是由 k - 1 位进过来的,所以 k - 1 位是 2 个 1 。现在 k 位是 2 个 0, - 所以加起来的和是 2 * (-2)^(k - 1)。 - 当 k 为奇数的时候,2 * (-2)^(k - 1) = (-1)^(k - 1)* 2 * 2^(k - 1) = 2^k - 当 k 为偶数的时候,2 * (-2)^(k - 1) = (-1)^(k - 1)* 2 * 2^(k - 1) = -2^k - 综合起来就是 (-2)^k,所以最终 k 位上有一个 1 -``` -2. 进位到高位 k ,高位 k 上的两个数数字分别是 0 和 1 。这种情况最终 k 位为 0 。 -```c - 证明:由于进位是由 k - 1 位进过来的,所以 k - 1 位是 2 个 1。现在 k 位是 1 个 0 和 1 个 1, - 所以加起来的和是 (-2)^k + 2 * (-2)^(k - 1)。 - 当 k 为奇数的时候,(-2)^k + 2 * (-2)^(k - 1) = -2^k + 2^k = 0 - 当 k 为偶数的时候,(-2)^k + 2 * (-2)^(k - 1) = 2^k - 2^k = 0 - 综合起来就是 0,所以最终 k 位上有一个 0 -``` -3. 进位到高位 k ,高位 k 上的两个数数字分别是 1 和 1 。这种情况最终 k 位为 1 。 -```c - 证明:由于进位是由 k - 1 位进过来的,所以 k - 1 位是 2 个 1 。现在 k 位是 2 个 1, - 所以加起来的和是 2 * (-2)^k + 2 * (-2)^(k - 1)。 - 当 k 为奇数的时候,2 * (-2)^k + 2 * (-2)^(k - 1) = -2^(k + 1) + 2^k = 2^k*(1 - 2) = -2^k - 当 k 为偶数的时候,2 * (-2)^k + 2 * (-2)^(k - 1) = 2^(k + 1) - 2^k = 2^k*(2 - 1) = 2^k - 综合起来就是 (-2)^k,所以最终 k 位上有一个 1 -``` - -- 所以综上所属,-2 进制的进位和 2 进制的进位原理是完全一致的,只不过 -2 进制的进位是 -1,而 2 进制的进位是 1 。由于进位可能在 -2 进制上出现前导 0 ,所以最终结果需要再去除前导 0 。 - - - -## 代码 - -```go - -package leetcode - -// 解法一 模拟进位 -func addNegabinary(arr1 []int, arr2 []int) []int { - carry, ans := 0, []int{} - for i, j := len(arr1)-1, len(arr2)-1; i >= 0 || j >= 0 || carry != 0; { - if i >= 0 { - carry += arr1[i] - i-- - } - if j >= 0 { - carry += arr2[j] - j-- - } - ans = append([]int{carry & 1}, ans...) - carry = -(carry >> 1) - } - for idx, num := range ans { // 去掉前导 0 - if num != 0 { - return ans[idx:] - } - } - return []int{0} -} - -// 解法二 标准的模拟,但是这个方法不能 AC,因为测试数据超过了 64 位,普通数据类型无法存储 -func addNegabinary1(arr1 []int, arr2 []int) []int { - return intToNegabinary(negabinaryToInt(arr1) + negabinaryToInt(arr2)) -} - -func negabinaryToInt(arr []int) int { - if len(arr) == 0 { - return 0 - } - res := 0 - for i := 0; i < len(arr)-1; i++ { - if res == 0 { - res += (-2) * arr[i] - } else { - res = res * (-2) - res += (-2) * arr[i] - } - } - return res + 1*arr[len(arr)-1] -} - -func intToNegabinary(num int) []int { - if num == 0 { - return []int{0} - } - res := []int{} - - for num != 0 { - remainder := num % (-2) - num = num / (-2) - if remainder < 0 { - remainder += 2 - num++ - } - res = append([]int{remainder}, res...) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1074.Number-of-Submatrices-That-Sum-to-Target.md b/website/content/ChapterFour/1074.Number-of-Submatrices-That-Sum-to-Target.md deleted file mode 100755 index a9a66a85e..000000000 --- a/website/content/ChapterFour/1074.Number-of-Submatrices-That-Sum-to-Target.md +++ /dev/null @@ -1,143 +0,0 @@ -# [1074. Number of Submatrices That Sum to Target](https://leetcode.com/problems/number-of-submatrices-that-sum-to-target/) - - -## 题目 - -Given a `matrix`, and a `target`, return the number of non-empty submatrices that sum to target. - -A submatrix `x1, y1, x2, y2` is the set of all cells `matrix[y]` with `x1 <= x <= x2` and `y1 <= y <= y2`. - -Two submatrices `(x1, y1, x2, y2)` and `(x1', y1', x2', y2')` are different if they have some coordinate that is different: for example, if `x1 != x1'`. - -**Example 1**: - - Input: matrix = [[0,1,0],[1,1,1],[0,1,0]], target = 0 - Output: 4 - Explanation: The four 1x1 submatrices that only contain 0. - -**Example 2**: - - Input: matrix = [[1,-1],[-1,1]], target = 0 - Output: 5 - Explanation: The two 1x2 submatrices, plus the two 2x1 submatrices, plus the 2x2 submatrix. - -**Note**: - -1. `1 <= matrix.length <= 300` -2. `1 <= matrix[0].length <= 300` -3. `-1000 <= matrix[i] <= 1000` -4. `-10^8 <= target <= 10^8` - - -## 题目大意 - -给出矩阵 matrix 和目标值 target,返回元素总和等于目标值的非空子矩阵的数量。 - -子矩阵 x1, y1, x2, y2 是满足 x1 <= x <= x2 且 y1 <= y <= y2 的所有单元 matrix[x][y] 的集合。 - -如果 (x1, y1, x2, y2) 和 (x1', y1', x2', y2') 两个子矩阵中部分坐标不同(如:x1 != x1'),那么这两个子矩阵也不同。 - - -提示: - -1. 1 <= matrix.length <= 300 -2. 1 <= matrix[0].length <= 300 -3. -1000 <= matrix[i] <= 1000 -4. -10^8 <= target <= 10^8 - - - - -## 解题思路 - -- 给出一个矩阵,要求在这个矩阵中找出子矩阵的和等于 target 的矩阵个数。 -- 这一题读完题感觉是滑动窗口的二维版本。如果把它拍扁,在一维数组中,求连续的子数组和为 target,这样就很好做。如果这题不降维,纯暴力解是 O(n^6)。如何优化降低时间复杂度呢? -- 联想到第 1 题 Two Sum 问题,可以把 2 个数求和的问题优化到 O(n)。这里也用类似的思想,用一个 map 来保存行方向上曾经出现过的累加和,相减就可以得到本行的和。这里可能读者会有疑惑,为什么不能每一行都单独保存呢?为什么一定要用累加和相减的方式来获取每一行的和呢?因为这一题要求子矩阵所有解,如果只单独保存每一行的和,只能求得小的子矩阵,子矩阵和子矩阵组成的大矩阵的情况会漏掉(当然再循环一遍,把子矩阵累加起来也可以,但是这样就多了一层循环了),例如子矩阵是 1*4 的,但是 2 个这样的子矩阵摞在一起形成 2 * 4 也能满足条件,如果不用累加和的办法,只单独存每一行的和,最终还要有组合的步骤。经过这样的优化,可以从 O(n^6) 优化到 O(n^4),能 AC 这道题,但是时间复杂度太高了。如何优化? -- 首先,子矩阵需要上下左右 4 个边界,4 个变量控制循环就需要 O(n^4),行和列的区间累加还需要 O(n^2)。行和列的区间累加可以通过 preSum 来解决。例如 `sum[i,j] = sum[j] - sum[i - 1]`,其中 sum[k] 中存的是从 0 到 K 的累加和: ![](https://img.halfrost.com/Leetcode/leetcode_1074.gif) - - 那么一个区间内的累加和可以由这个区间的右边界减去区间左边界左边的那个累加和得到(由于是闭区间,所需要取左边界左边的和)。经过这样的处理,列方向的维度就被我们拍扁了。 - -- 再来看看行方向的和,现在每一列的和都可以通过区间相减的方法得到。那么这道题就变成了第 1 题 Two Sum 的问题了。Two Sum 问题只需要 O(n) 的时间复杂度求解,这一题由于是二维的,所以两个列的边界还需要循环,所以最终优化下来的时间复杂度是 O(n^3)。计算 presum 可以直接用原数组,所以空间复杂度只有一个 O(n) 的字典。 -- 类似思路的题目有第 560 题,第 304 题。 - - -## 代码 - -```go - -package leetcode - -func numSubmatrixSumTarget(matrix [][]int, target int) int { - m, n, res := len(matrix), len(matrix[0]), 0 - for row := range matrix { - for col := 1; col < len(matrix[row]); col++ { - matrix[row][col] += matrix[row][col-1] - } - } - for i := 0; i < n; i++ { - for j := i; j < n; j++ { - counterMap, sum := make(map[int]int, m), 0 - counterMap[0] = 1 // 题目保证一定有解,所以这里初始化是 1 - for row := 0; row < m; row++ { - if i > 0 { - sum += matrix[row][j] - matrix[row][i-1] - } else { - sum += matrix[row][j] - } - res += counterMap[sum-target] - counterMap[sum]++ - } - } - } - return res -} - -// 暴力解法 O(n^4) -func numSubmatrixSumTarget1(matrix [][]int, target int) int { - m, n, res, sum := len(matrix), len(matrix[0]), 0, 0 - for i := 0; i < n; i++ { - for j := i; j < n; j++ { - counterMap := map[int]int{} - counterMap[0] = 1 // 题目保证一定有解,所以这里初始化是 1 - sum = 0 - for row := 0; row < m; row++ { - for k := i; k <= j; k++ { - sum += matrix[row][k] - } - res += counterMap[sum-target] - counterMap[sum]++ - } - } - } - return res -} - -// 暴力解法超时! O(n^6) -func numSubmatrixSumTarget2(matrix [][]int, target int) int { - res := 0 - for startx := 0; startx < len(matrix); startx++ { - for starty := 0; starty < len(matrix[startx]); starty++ { - for endx := startx; endx < len(matrix); endx++ { - for endy := starty; endy < len(matrix[startx]); endy++ { - if sumSubmatrix(matrix, startx, starty, endx, endy) == target { - //fmt.Printf("startx = %v, starty = %v, endx = %v, endy = %v\n", startx, starty, endx, endy) - res++ - } - } - } - } - } - return res -} - -func sumSubmatrix(matrix [][]int, startx, starty, endx, endy int) int { - sum := 0 - for i := startx; i <= endx; i++ { - for j := starty; j <= endy; j++ { - sum += matrix[i][j] - } - } - return sum -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1078.Occurrences-After-Bigram.md b/website/content/ChapterFour/1078.Occurrences-After-Bigram.md deleted file mode 100755 index 6d1806e02..000000000 --- a/website/content/ChapterFour/1078.Occurrences-After-Bigram.md +++ /dev/null @@ -1,64 +0,0 @@ -# [1078. Occurrences After Bigram](https://leetcode.com/problems/occurrences-after-bigram/) - - -## 题目 - -Given words `first` and `second`, consider occurrences in some `text` of the form "`first second third`", where `second` comes immediately after `first`, and `third`comes immediately after `second`. - -For each such occurrence, add "`third`" to the answer, and return the answer. - -**Example 1**: - - Input: text = "alice is a good girl she is a good student", first = "a", second = "good" - Output: ["girl","student"] - -**Example 2**: - - Input: text = "we will we will rock you", first = "we", second = "will" - Output: ["we","rock"] - -**Note**: - -1. `1 <= text.length <= 1000` -2. `text` consists of space separated words, where each word consists of lowercase English letters. -3. `1 <= first.length, second.length <= 10` -4. `first` and `second` consist of lowercase English letters. - - -## 题目大意 - - -给出第一个词 first 和第二个词 second,考虑在某些文本 text 中可能以 "first second third" 形式出现的情况,其中 second 紧随 first 出现,third 紧随 second 出现。对于每种这样的情况,将第三个词 "third" 添加到答案中,并返回答案。 - - - - -## 解题思路 - - -- 简单题。给出一个 text,要求找出紧接在 first 和 second 后面的那个字符串,有多个就输出多个。解法很简单,先分解出 words 每个字符串,然后依次遍历进行字符串匹配。匹配到 first 和 second 以后,输出之后的那个字符串。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func findOcurrences(text string, first string, second string) []string { - var res []string - words := strings.Split(text, " ") - if len(words) < 3 { - return []string{} - } - for i := 2; i < len(words); i++ { - if words[i-2] == first && words[i-1] == second { - res = append(res, words[i]) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1089.Duplicate-Zeros.md b/website/content/ChapterFour/1089.Duplicate-Zeros.md deleted file mode 100644 index 3c8224749..000000000 --- a/website/content/ChapterFour/1089.Duplicate-Zeros.md +++ /dev/null @@ -1,58 +0,0 @@ -# [1089. Duplicate Zeros](https://leetcode.com/problems/duplicate-zeros/) - - -## 题目 - -Given a fixed length array `arr` of integers, duplicate each occurrence of zero, shifting the remaining elements to the right. - -Note that elements beyond the length of the original array are not written. - -Do the above modifications to the input array **in place**, do not return anything from your function. - -**Example 1**: - -``` -Input: [1,0,2,3,0,4,5,0] -Output: null -Explanation: After calling your function, the input array is modified to: [1,0,0,2,3,0,0,4] -``` - -**Example 2**: - -``` -Input: [1,2,3] -Output: null -Explanation: After calling your function, the input array is modified to: [1,2,3] -``` - -**Note**: - -1. `1 <= arr.length <= 10000` -2. `0 <= arr[i] <= 9` - -## 题目大意 - -给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。 - - -## 解题思路 - -- 给一个固定长度的数组,把数组元素为 0 的元素都往后复制一遍,后面的元素往后移,超出数组长度的部分删除。 -- 简单题,按照题意,用 append 和 slice 操作即可。 - -## 代码 - -```go - -package leetcode - -func duplicateZeros(arr []int) { - for i := 0; i < len(arr); i++ { - if arr[i] == 0 && i+1 < len(arr) { - arr = append(arr[:i+1], arr[i:len(arr)-1]...) - i++ - } - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1093.Statistics-from-a-Large-Sample.md b/website/content/ChapterFour/1093.Statistics-from-a-Large-Sample.md deleted file mode 100755 index 7ebf2a326..000000000 --- a/website/content/ChapterFour/1093.Statistics-from-a-Large-Sample.md +++ /dev/null @@ -1,95 +0,0 @@ -# [1093. Statistics from a Large Sample](https://leetcode.com/problems/statistics-from-a-large-sample/) - - -## 题目 - -We sampled integers between `0` and `255`, and stored the results in an array `count`: `count[k]` is the number of integers we sampled equal to `k`. - -Return the minimum, maximum, mean, median, and mode of the sample respectively, as an array of **floating point numbers**. The mode is guaranteed to be unique. - -*(Recall that the median of a sample is:* - -- *The middle element, if the elements of the sample were sorted and the number of elements is odd;* -- *The average of the middle two elements, if the elements of the sample were sorted and the number of elements is even.)* - -**Example 1**: - - Input: count = [0,1,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - Output: [1.00000,3.00000,2.37500,2.50000,3.00000] - -**Example 2**: - - Input: count = [0,4,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] - Output: [1.00000,4.00000,2.18182,2.00000,1.00000] - -**Constraints:** - -1. `count.length == 256` -2. `1 <= sum(count) <= 10^9` -3. The mode of the sample that count represents is unique. -4. Answers within `10^-5` of the true value will be accepted as correct. - - -## 题目大意 - -我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 的采样个数。 - -我们以 浮点数 数组的形式,分别返回样本的最小值、最大值、平均值、中位数和众数。其中,众数是保证唯一的。我们先来回顾一下中位数的知识: - -- 如果样本中的元素有序,并且元素数量为奇数时,中位数为最中间的那个元素; -- 如果样本中的元素有序,并且元素数量为偶数时,中位数为中间的两个元素的平均值。 - - - -## 解题思路 - - -- 这个问题的关键需要理解题目的意思,什么是采样?`count[k]` 就是整数 `k` 的采样个数。 -- 题目要求返回样本的最小值、最大值、平均值、中位数和众数。最大值和最小值就很好处理,只需要遍历 count 判断最小的非 0 的 index 就是最小值,最大的非 0 的 index 就是最大值。平均值也非常好处理,对于所有非 0 的 count,我们通过累加 count[k] * index 得到所有数的和,然后除上所有非 0 的 count 的和。![](https://latex.codecogs.com/svg.latex?\sum_{n=0}^{256}count[n](while\%20\%20count[n]!=0)) - -- 众数也非常容易,只需统计 count 值最大时的 index 即可。 -- 中位数的处理相对麻烦一些,因为需要分非 0 的 count 之和是奇数还是偶数两种情况。先假设非 0 的 count 和为 cnt,那么如果 cnt 是奇数的话,只需要找到 cnt/2 的位置即可,通过不断累加 count 的值,直到累加和超过 ≥ cnt/2。如果 cnt 是偶数的话,需要找到 cnt/2 + 1 和 cnt/2 的位置,找法和奇数情况相同,不过需要找两次(可以放到一个循环中做两次判断)。 - -## 代码 - -```go - -package leetcode - -func sampleStats(count []int) []float64 { - res := make([]float64, 5) - res[0] = 255 - sum := 0 - for _, val := range count { - sum += val - } - left, right := sum/2, sum/2 - if (sum % 2) == 0 { - right++ - } - pre, mode := 0, 0 - for i, val := range count { - if val > 0 { - if i < int(res[0]) { - res[0] = float64(i) - } - res[1] = float64(i) - } - res[2] += float64(i*val) / float64(sum) - if pre < left && pre+val >= left { - res[3] += float64(i) / 2.0 - } - if pre < right && pre+val >= right { - res[3] += float64(i) / 2.0 - } - pre += val - - if val > mode { - mode = val - res[4] = float64(i) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1105.Filling-Bookcase-Shelves.md b/website/content/ChapterFour/1105.Filling-Bookcase-Shelves.md deleted file mode 100755 index 5c248f89c..000000000 --- a/website/content/ChapterFour/1105.Filling-Bookcase-Shelves.md +++ /dev/null @@ -1,68 +0,0 @@ -# [1105. Filling Bookcase Shelves](https://leetcode.com/problems/filling-bookcase-shelves/) - - -## 题目 - -We have a sequence of `books`: the `i`-th book has thickness `books[i][0]`and height `books[i][1]`. - -We want to place these books **in order** onto bookcase shelves that have total width `shelf_width`. - -We choose some of the books to place on this shelf (such that the sum of their thickness is `<= shelf_width`), then build another level of shelf of the bookcase so that the total height of the bookcase has increased by the maximum height of the books we just put down. We repeat this process until there are no more books to place. - -Note again that at each step of the above process, the order of the books we place is the same order as the given sequence of books. For example, if we have an ordered list of 5 books, we might place the first and second book onto the first shelf, the third book on the second shelf, and the fourth and fifth book on the last shelf. - -Return the minimum possible height that the total bookshelf can be after placing shelves in this manner. - -**Example 1**: - -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/06/28/shelves.png) - - Input: books = [[1,1],[2,3],[2,3],[1,1],[1,1],[1,1],[1,2]], shelf_width = 4 - Output: 6 - Explanation: - The sum of the heights of the 3 shelves are 1 + 3 + 2 = 6. - Notice that book number 2 does not have to be on the first shelf. - -**Constraints:** - -- `1 <= books.length <= 1000` -- `1 <= books[i][0] <= shelf_width <= 1000` -- `1 <= books[i][1] <= 1000` - -## 题目大意 - -附近的家居城促销,你买回了一直心仪的可调节书架,打算把自己的书都整理到新的书架上。你把要摆放的书 books 都整理好,叠成一摞:从上往下,第 i 本书的厚度为 books[i][0],高度为 books[i][1]。按顺序将这些书摆放到总宽度为 shelf\_width 的书架上。 - -先选几本书放在书架上(它们的厚度之和小于等于书架的宽度 shelf_width),然后再建一层书架。重复这个过程,直到把所有的书都放在书架上。 - -需要注意的是,在上述过程的每个步骤中,摆放书的顺序与你整理好的顺序相同。 例如,如果这里有 5 本书,那么可能的一种摆放情况是:第一和第二本书放在第一层书架上,第三本书放在第二层书架上,第四和第五本书放在最后一层书架上。每一层所摆放的书的最大高度就是这一层书架的层高,书架整体的高度为各层高之和。以这种方式布置书架,返回书架整体可能的最小高度。 - - - -## 解题思路 - -- 给出一个数组,数组里面每个元素代表的是一个本书的宽度和高度。要求按照书籍的顺序,把书摆到宽度为 `shelf_width` 的书架上。问最终放下所有书籍以后,书架的最小高度。 -- 这一题的解题思路是动态规划。`dp[i]` 代表放置前 `i` 本书所需要的书架最小高度。初始值 dp[0] = 0,其他为最大值 1000*1000。遍历每一本书,把当前这本书作为书架最后一层的最后一本书,将这本书之前的书向后调整,看看是否可以减少之前的书架高度。状态转移方程为 `dp[i] = min(dp[i] , dp[j - 1] + h)`,其中 `j` 表示最后一层所能容下书籍的索引,`h` 表示最后一层最大高度。`j` 调整完一遍以后就能找出书架最小高度值了。时间复杂度 O(n^2)。 - -## 代码 - -```go - -package leetcode - -func minHeightShelves(books [][]int, shelfWidth int) int { - dp := make([]int, len(books)+1) - dp[0] = 0 - for i := 1; i <= len(books); i++ { - width, height := books[i-1][0], books[i-1][1] - dp[i] = dp[i-1] + height - for j := i - 1; j > 0 && width+books[j-1][0] <= shelfWidth; j-- { - height = max(height, books[j-1][1]) - width += books[j-1][0] - dp[i] = min(dp[i], dp[j-1]+height) - } - } - return dp[len(books)] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1108.Defanging-an-IP-Address.md b/website/content/ChapterFour/1108.Defanging-an-IP-Address.md deleted file mode 100755 index 0eb4a7f90..000000000 --- a/website/content/ChapterFour/1108.Defanging-an-IP-Address.md +++ /dev/null @@ -1,54 +0,0 @@ -# [1108. Defanging an IP Address](https://leetcode.com/problems/defanging-an-ip-address/) - - -## 题目 - -Given a valid (IPv4) IP `address`, return a defanged version of that IP address. - -A *defanged IP address* replaces every period `"."` with `"[.]"`. - -**Example 1**: - - Input: address = "1.1.1.1" - Output: "1[.]1[.]1[.]1" - -**Example 2**: - - Input: address = "255.100.50.0" - Output: "255[.]100[.]50[.]0" - -**Constraints:** - -- The given `address` is a valid IPv4 address. - -## 题目大意 - - -给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."。 - - -提示: - -- 给出的 address 是一个有效的 IPv4 地址 - - - -## 解题思路 - -- 给出一个 IP 地址,要求把点替换成 `[.]`。 -- 简单题,按照题意替换即可。 - - -## 代码 - -```go - -package leetcode - -import "strings" - -func defangIPaddr(address string) string { - return strings.Replace(address, ".", "[.]", -1) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1110.Delete-Nodes-And-Return-Forest.md b/website/content/ChapterFour/1110.Delete-Nodes-And-Return-Forest.md deleted file mode 100644 index 9d3c214c6..000000000 --- a/website/content/ChapterFour/1110.Delete-Nodes-And-Return-Forest.md +++ /dev/null @@ -1,82 +0,0 @@ -# [1110. Delete Nodes And Return Forest](https://leetcode.com/problems/delete-nodes-and-return-forest/) - - -## 题目 - -Given the `root` of a binary tree, each node in the tree has a distinct value. - -After deleting all nodes with a value in `to_delete`, we are left with a forest (a disjoint union of trees). - -Return the roots of the trees in the remaining forest. You may return the result in any order. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/07/01/screen-shot-2019-07-01-at-53836-pm.png](https://assets.leetcode.com/uploads/2019/07/01/screen-shot-2019-07-01-at-53836-pm.png) - -``` -Input: root = [1,2,3,4,5,6,7], to_delete = [3,5] -Output: [[1,2,null,4],[6],[7]] -``` - -**Constraints**: - -- The number of nodes in the given tree is at most `1000`. -- Each node has a distinct value between `1` and `1000`. -- `to_delete.length <= 1000` -- `to_delete` contains distinct values between `1` and `1000`. - - -## 题目大意 - -给出二叉树的根节点 root,树上每个节点都有一个不同的值。如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。返回森林中的每棵树。你可以按任意顺序组织答案。 - - -提示: - -- 树中的节点数最大为 1000。 -- 每个节点都有一个介于 1 到 1000 之间的值,且各不相同。 -- to_delete.length <= 1000 -- to_delete 包含一些从 1 到 1000、各不相同的值。 - - - -## 解题思路 - -- 给出一棵树,再给出一个数组,要求删除数组中相同元素值的节点。输出最终删除以后的森林。 -- 简单题。边遍历树,边删除数组中的元素。这里可以先把数组里面的元素放入 map 中,加速查找。遇到相同的元素就删除节点。这里需要特殊判断的是当前删除的节点是否是根节点,如果是根节点需要根据条件置空它的左节点或者右节点。 - -## 代码 - -```go -func delNodes(root *TreeNode, toDelete []int) []*TreeNode { - if root == nil { - return nil - } - res, deleteMap := []*TreeNode{}, map[int]bool{} - for _, v := range toDelete { - deleteMap[v] = true - } - dfsDelNodes(root, deleteMap, true, &res) - return res -} - -func dfsDelNodes(root *TreeNode, toDel map[int]bool, isRoot bool, res *[]*TreeNode) bool { - if root == nil { - return false - } - if isRoot && !toDel[root.Val] { - *res = append(*res, root) - } - isRoot = false - if toDel[root.Val] { - isRoot = true - } - if dfsDelNodes(root.Left, toDel, isRoot, res) { - root.Left = nil - } - if dfsDelNodes(root.Right, toDel, isRoot, res) { - root.Right = nil - } - return isRoot -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1111.Maximum-Nesting-Depth-of-Two-Valid-Parentheses-Strings.md b/website/content/ChapterFour/1111.Maximum-Nesting-Depth-of-Two-Valid-Parentheses-Strings.md deleted file mode 100755 index 8f4d8f59d..000000000 --- a/website/content/ChapterFour/1111.Maximum-Nesting-Depth-of-Two-Valid-Parentheses-Strings.md +++ /dev/null @@ -1,132 +0,0 @@ -# [1111. Maximum Nesting Depth of Two Valid Parentheses Strings](https://leetcode.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/) - - -## 题目 - -A string is a *valid parentheses string* (denoted VPS) if and only if it consists of `"("` and `")"` characters only, and: - -- It is the empty string, or -- It can be written as `AB` (`A` concatenated with `B`), where `A` and `B` are VPS's, or -- It can be written as `(A)`, where `A` is a VPS. - -We can similarly define the *nesting depth* `depth(S)` of any VPS `S` as follows: - -- `depth("") = 0` -- `depth(A + B) = max(depth(A), depth(B))`, where `A` and `B` are VPS's -- `depth("(" + A + ")") = 1 + depth(A)`, where `A` is a VPS. - -For example, `""`, `"()()"`, and `"()(()())"` are VPS's (with nesting depths 0, 1, and 2), and `")("` and `"(()"` are not VPS's. - -Given a VPS seq, split it into two disjoint subsequences `A` and `B`, such that `A` and `B` are VPS's (and `A.length + B.length = seq.length`). - -Now choose **any** such `A` and `B` such that `max(depth(A), depth(B))` is the minimum possible value. - -Return an `answer` array (of length `seq.length`) that encodes such a choice of `A` and `B`: `answer[i] = 0` if `seq[i]` is part of `A`, else `answer[i] = 1`. Note that even though multiple answers may exist, you may return any of them. - -**Example 1**: - - Input: seq = "(()())" - Output: [0,1,1,1,1,0] - -**Example 2**: - - Input: seq = "()(())()" - Output: [0,0,0,1,1,0,1,1] - -**Constraints:** - -- `1 <= seq.size <= 10000` - - -## 题目大意 - - -有效括号字符串 仅由 "(" 和 ")" 构成,并符合下述几个条件之一: - -- 空字符串 -- 连接,可以记作 AB(A 与 B 连接),其中 A 和 B 都是有效括号字符串 -- 嵌套,可以记作 (A),其中 A 是有效括号字符串 - -类似地,我们可以定义任意有效括号字符串 s 的 嵌套深度 depth(S): - -- s 为空时,depth("") = 0 -- s 为 A 与 B 连接时,depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是有效括号字符串 -- s 为嵌套情况,depth("(" + A + ")") = 1 + depth(A),其中 A 是有效括号字符串 - - -例如:"","()()",和 "()(()())" 都是有效括号字符串,嵌套深度分别为 0,1,2,而 ")(" 和 "(()" 都不是有效括号字符串。 - -  - -给你一个有效括号字符串 seq,将其分成两个不相交的子序列 A 和 B,且 A 和 B 满足有效括号字符串的定义(注意:A.length + B.length = seq.length)。 - -现在,你需要从中选出 任意 一组有效括号字符串 A 和 B,使 max(depth(A), depth(B)) 的可能取值最小。 - -返回长度为 seq.length 答案数组 answer ,选择 A 还是 B 的编码规则是:如果 seq[i] 是 A 的一部分,那么 answer[i] = 0。否则,answer[i] = 1。即便有多个满足要求的答案存在,你也只需返回 一个。 - - - -## 解题思路 - -- 给出一个括号字符串。选出 A 部分和 B 部分,使得 `max(depth(A), depth(B))` 值最小。在最终的数组中输出 0 和 1,0 标识是 A 部分,1 标识是 B 部分。 -- 这一题想要 `max(depth(A), depth(B))` 值最小,可以使用贪心思想。如果 A 部分和 B 部分都尽快括号匹配,不深层次嵌套,那么总的层次就会变小。只要让嵌套的括号中属于 A 的和属于 B 的间隔排列即可。例如:“`(((())))`”,上面的字符串的嵌套深度是 4,按照上述的贪心思想,则标记为 0101 1010。 -- 这一题也可以用二分的思想来解答。把深度平分给 A 部分和 B 部分。 - - 第一次遍历,先计算最大深度 - - 第二次遍历,把深度小于等于最大深度一半的括号标记为 0(给 A 部分),否则标记为 1(给 B 部分) - - -## 代码 - -```go - -package leetcode - -// 解法一 二分思想 -func maxDepthAfterSplit(seq string) []int { - stack, maxDepth, res := 0, 0, []int{} - for _, v := range seq { - if v == '(' { - stack++ - maxDepth = max(stack, maxDepth) - } else { - stack-- - } - } - stack = 0 - for i := 0; i < len(seq); i++ { - if seq[i] == '(' { - stack++ - if stack <= maxDepth/2 { - res = append(res, 0) - } else { - res = append(res, 1) - } - } else { - if stack <= maxDepth/2 { - res = append(res, 0) - } else { - res = append(res, 1) - } - stack-- - } - } - return res -} - -// 解法二 模拟 -func maxDepthAfterSplit1(seq string) []int { - stack, top, res := make([]int, len(seq)), -1, make([]int, len(seq)) - for i, r := range seq { - if r == ')' { - res[i] = res[stack[top]] - top-- - continue - } - top++ - stack[top] = i - res[i] = top % 2 - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1122.Relative-Sort-Array.md b/website/content/ChapterFour/1122.Relative-Sort-Array.md deleted file mode 100755 index 7a536881f..000000000 --- a/website/content/ChapterFour/1122.Relative-Sort-Array.md +++ /dev/null @@ -1,101 +0,0 @@ -# [1122. Relative Sort Array](https://leetcode.com/problems/relative-sort-array/) - - -## 题目 - -Given two arrays `arr1` and `arr2`, the elements of `arr2` are distinct, and all elements in `arr2` are also in `arr1`. - -Sort the elements of `arr1` such that the relative ordering of items in `arr1` are the same as in `arr2`. Elements that don't appear in `arr2` should be placed at the end of `arr1` in **ascending** order. - -**Example 1**: - - Input: arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] - Output: [2,2,2,1,4,3,3,9,6,7,19] - -**Constraints:** - -- `arr1.length, arr2.length <= 1000` -- `0 <= arr1[i], arr2[i] <= 1000` -- Each `arr2[i]` is distinct. -- Each `arr2[i]` is in `arr1`. - - -## 题目大意 - - -给你两个数组,arr1 和 arr2, - -- arr2 中的元素各不相同 -- arr2 中的每个元素都出现在 arr1 中 - -对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。 - -提示: - -- arr1.length, arr2.length <= 1000 -- 0 <= arr1[i], arr2[i] <= 1000 -- arr2 中的元素 arr2[i] 各不相同 -- arr2 中的每个元素 arr2[i] 都出现在 arr1 中 - - - -## 解题思路 - -- 给出 2 个数组 A 和 B,A 中包含 B 中的所有元素。要求 A 按照 B 的元素顺序排序,B 中没有的元素再接着排在后面,从小到大排序。 -- 这一题有多种解法。一种暴力的解法就是依照题意,先把 A 中的元素都统计频次放在 map 中,然后 按照 B 的顺序输出,接着再把剩下的元素排序接在后面。还有一种桶排序的思想,由于题目限定了 A 的大小是 1000,这个数量级很小,所以可以用 1001 个桶装所有的数,把数都放在桶里,这样默认就已经排好序了。接下来的做法和前面暴力解法差不多,按照频次输出。B 中以外的元素就按照桶的顺序依次输出即可。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -// 解法一 桶排序,时间复杂度 O(n^2) -func relativeSortArray(A, B []int) []int { - count := [1001]int{} - for _, a := range A { - count[a]++ - } - res := make([]int, 0, len(A)) - for _, b := range B { - for count[b] > 0 { - res = append(res, b) - count[b]-- - } - } - for i := 0; i < 1001; i++ { - for count[i] > 0 { - res = append(res, i) - count[i]-- - } - } - return res -} - -// 解法二 模拟,时间复杂度 O(n^2) -func relativeSortArray1(arr1 []int, arr2 []int) []int { - leftover, m, res := []int{}, make(map[int]int), []int{} - for _, v := range arr1 { - m[v]++ - } - for _, s := range arr2 { - count := m[s] - for i := 0; i < count; i++ { - res = append(res, s) - } - m[s] = 0 - } - for v, count := range m { - for i := 0; i < count; i++ { - leftover = append(leftover, v) - } - } - sort.Ints(leftover) - res = append(res, leftover...) - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1123.Lowest-Common-Ancestor-of-Deepest-Leaves.md b/website/content/ChapterFour/1123.Lowest-Common-Ancestor-of-Deepest-Leaves.md deleted file mode 100755 index f2838c9d5..000000000 --- a/website/content/ChapterFour/1123.Lowest-Common-Ancestor-of-Deepest-Leaves.md +++ /dev/null @@ -1,101 +0,0 @@ -# [1123. Lowest Common Ancestor of Deepest Leaves](https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/) - - -## 题目 - -Given a rooted binary tree, return the lowest common ancestor of its deepest leaves. - -Recall that: - -- The node of a binary tree is a *leaf* if and only if it has no children -- The *depth* of the root of the tree is 0, and if the depth of a node is `d`, the depth of each of its children is `d+1`. -- The *lowest common ancestor* of a set `S` of nodes is the node `A` with the largest depth such that every node in S is in the subtree with root `A`. - -**Example 1**: - - Input: root = [1,2,3] - Output: [1,2,3] - Explanation: - The deepest leaves are the nodes with values 2 and 3. - The lowest common ancestor of these leaves is the node with value 1. - The answer returned is a TreeNode object (not an array) with serialization "[1,2,3]". - -**Example 2**: - - Input: root = [1,2,3,4] - Output: [4] - -**Example 3**: - - Input: root = [1,2,3,4,5] - Output: [2,4,5] - -**Constraints:** - -- The given tree will have between 1 and 1000 nodes. -- Each node of the tree will have a distinct value between 1 and 1000. - - -## 题目大意 - - -给你一个有根节点的二叉树,找到它最深的叶节点的最近公共祖先。 - -回想一下: - -- 叶节点 是二叉树中没有子节点的节点 -- 树的根节点的 深度 为 0,如果某一节点的深度为 d,那它的子节点的深度就是 d+1 -- 如果我们假定 A 是一组节点 S 的 最近公共祖先,S 中的每个节点都在以 A 为根节点的子树中,且 A 的深度达到此条件下可能的最大值。 -  - -提示: - -- 给你的树中将有 1 到 1000 个节点。 -- 树中每个节点的值都在 1 到 1000 之间。 - - -## 解题思路 - - -- 给出一颗树,找出最深的叶子节点的最近公共祖先 LCA。 -- 这一题思路比较直接。先遍历找到最深的叶子节点,如果左右子树的最深的叶子节点深度相同,那么当前节点就是它们的最近公共祖先。如果左右子树的最深的深度不等,那么需要继续递归往下找符合题意的 LCA。如果最深的叶子节点没有兄弟,那么公共父节点就是叶子本身,否则返回它的 LCA。 -- 有几个特殊的测试用例,见测试文件。特殊的点就是最深的叶子节点没有兄弟节点的情况。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for a binary tree node. - * type TreeNode struct { - * Val int - * Left *TreeNode - * Right *TreeNode - * } - */ -func lcaDeepestLeaves(root *TreeNode) *TreeNode { - if root == nil { - return nil - } - lca, maxLevel := &TreeNode{}, 0 - lcaDeepestLeavesDFS(&lca, &maxLevel, 0, root) - return lca -} - -func lcaDeepestLeavesDFS(lca **TreeNode, maxLevel *int, depth int, root *TreeNode) int { - *maxLevel = max(*maxLevel, depth) - if root == nil { - return depth - } - depthLeft := lcaDeepestLeavesDFS(lca, maxLevel, depth+1, root.Left) - depthRight := lcaDeepestLeavesDFS(lca, maxLevel, depth+1, root.Right) - if depthLeft == *maxLevel && depthRight == *maxLevel { - *lca = root - } - return max(depthLeft, depthRight) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1128.Number-of-Equivalent-Domino-Pairs.md b/website/content/ChapterFour/1128.Number-of-Equivalent-Domino-Pairs.md deleted file mode 100755 index cc946659c..000000000 --- a/website/content/ChapterFour/1128.Number-of-Equivalent-Domino-Pairs.md +++ /dev/null @@ -1,68 +0,0 @@ -# [1128. Number of Equivalent Domino Pairs](https://leetcode.com/problems/number-of-equivalent-domino-pairs/) - - -## 题目 - -Given a list of `dominoes`, `dominoes[i] = [a, b]` is *equivalent* to `dominoes[j] = [c, d]` if and only if either (`a==c` and `b==d`), or (`a==d` and `b==c`) - that is, one domino can be rotated to be equal to another domino. - -Return the number of pairs `(i, j)` for which `0 <= i < j < dominoes.length`, and `dominoes[i]` is equivalent to `dominoes[j]`. - -**Example 1**: - - Input: dominoes = [[1,2],[2,1],[3,4],[5,6]] - Output: 1 - -**Constraints:** - -- `1 <= dominoes.length <= 40000` -- `1 <= dominoes[i][j] <= 9` - - -## 题目大意 - -给你一个由一些多米诺骨牌组成的列表 dominoes。如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 a==d 且 b==c。 - -在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。 - -提示: - -- 1 <= dominoes.length <= 40000 -- 1 <= dominoes[i][j] <= 9 - - - -## 解题思路 - -- 给出一组多米诺骨牌,求出这组牌中相同牌的个数。牌相同的定义是:牌的 2 个数字相同(正序或者逆序相同都算相同) -- 简单题。由于牌是 2 个数,所以将牌的 2 个数 hash 成一个 2 位数,比较大小即可,正序和逆序都 hash 成 2 位数,然后在桶中比较是否已经存在,如果不存在,跳过,如果存在,计数。 - - -## 代码 - -```go - -package leetcode - -func numEquivDominoPairs(dominoes [][]int) int { - if dominoes == nil || len(dominoes) == 0 { - return 0 - } - result, buckets := 0, [100]int{} - for _, dominoe := range dominoes { - key, rotatedKey := dominoe[0]*10+dominoe[1], dominoe[1]*10+dominoe[0] - if dominoe[0] != dominoe[1] { - if buckets[rotatedKey] > 0 { - result += buckets[rotatedKey] - } - } - if buckets[key] > 0 { - result += buckets[key] - buckets[key]++ - } else { - buckets[key]++ - } - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1137.N-th-Tribonacci-Number.md b/website/content/ChapterFour/1137.N-th-Tribonacci-Number.md deleted file mode 100755 index f897528da..000000000 --- a/website/content/ChapterFour/1137.N-th-Tribonacci-Number.md +++ /dev/null @@ -1,71 +0,0 @@ -# [1137. N-th Tribonacci Number](https://leetcode.com/problems/n-th-tribonacci-number/) - - -## 题目 - -The Tribonacci sequence Tn is defined as follows: - -T0 = 0, T1 = 1, T2 = 1, and Tn+3 = Tn + Tn+1 + Tn+2 for n >= 0. - -Given `n`, return the value of Tn. - -**Example 1**: - - Input: n = 4 - Output: 4 - Explanation: - T_3 = 0 + 1 + 1 = 2 - T_4 = 1 + 1 + 2 = 4 - -**Example 2**: - - Input: n = 25 - Output: 1389537 - -**Constraints:** - -- `0 <= n <= 37` -- The answer is guaranteed to fit within a 32-bit integer, ie. `answer <= 2^31 - 1`. - - -## 题目大意 - - -泰波那契序列 Tn 定义如下:  - -T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 - -给你整数 n,请返回第 n 个泰波那契数 Tn 的值。 - -提示: - -- 0 <= n <= 37 -- 答案保证是一个 32 位整数,即 answer <= 2^31 - 1。 - - - -## 解题思路 - -- 求泰波那契数列中的第 n 个数。 -- 简单题,按照题意定义计算即可。 - - -## 代码 - -```go - -package leetcode - -func tribonacci(n int) int { - if n < 2 { - return n - } - trib, prev, prev2 := 1, 1, 0 - for n > 2 { - trib, prev, prev2 = trib+prev+prev2, trib, prev - n-- - } - return trib -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1145.Binary-Tree-Coloring-Game.md b/website/content/ChapterFour/1145.Binary-Tree-Coloring-Game.md deleted file mode 100644 index 02fbc6824..000000000 --- a/website/content/ChapterFour/1145.Binary-Tree-Coloring-Game.md +++ /dev/null @@ -1,82 +0,0 @@ -# [1145. Binary Tree Coloring Game](https://leetcode.com/problems/binary-tree-coloring-game/) - - - -## 题目 - -Two players play a turn based game on a binary tree. We are given the `root` of this binary tree, and the number of nodes `n` in the tree. `n` is odd, and each node has a distinct value from `1` to `n`. - -Initially, the first player names a value `x` with `1 <= x <= n`, and the second player names a value `y` with `1 <= y <= n` and `y != x`. The first player colors the node with value `x` red, and the second player colors the node with value `y` blue. - -Then, the players take turns starting with the first player. In each turn, that player chooses a node of their color (red if player 1, blue if player 2) and colors an **uncolored** neighbor of the chosen node (either the left child, right child, or parent of the chosen node.) - -If (and only if) a player cannot choose such a node in this way, they must pass their turn. If both players pass their turn, the game ends, and the winner is the player that colored more nodes. - -You are the second player. If it is possible to choose such a `y` to ensure you win the game, return `true`. If it is not possible, return `false`. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/08/01/1480-binary-tree-coloring-game.png](https://assets.leetcode.com/uploads/2019/08/01/1480-binary-tree-coloring-game.png) - -``` -Input: root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3 -Output: true -Explanation: The second player can choose the node with value 2. -``` - -**Constraints**: - -- `root` is the root of a binary tree with `n` nodes and distinct node values from `1` to `n`. -- `n` is odd. -- `1 <= x <= n <= 100` - -## 题目大意 - -有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。游戏从「一号」玩家开始(「一号」玩家为红色,「二号」玩家为蓝色),最开始时, - -- 「一号」玩家从 [1, n] 中取一个值 x(1 <= x <= n); -- 「二号」玩家也从 [1, n] 中取一个值 y(1 <= y <= n)且 y != x。 -- 「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。 - -之后两位玩家轮流进行操作,每一回合,玩家选择一个他之前涂好颜色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色。如果当前玩家无法找到这样的节点来染色时,他的回合就会被跳过。若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true;若无法获胜,就请返回 false。 - - -提示: - -- 二叉树的根节点为 root,树上由 n 个节点,节点上的值从 1 到 n 各不相同。 -- n 为奇数。 -- 1 <= x <= n <= 100 - -## 解题思路 - -- 2 个人参加二叉树着色游戏。二叉树节点数为奇数。1 号玩家和 2 号玩家分别在二叉树上选项一个点着色。每一回合,玩家选择一个他之前涂好颜色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色。当有人不能选点着色的时候,他的那个回合会被跳过。双方都没法继续着色的时候游戏结束。着色多的人获胜。问二号玩家是否存在必胜策略? - -![](https://img.halfrost.com/Leetcode/leetcode_1145.png) - -- 如图所示,当一号玩家选择了一个红色的结点,可能会将二叉树切割为 3 个部分(连通分量),如果选择的是根结点,则可能是 2 个部分或 1 个部分,如果选择叶结点,则是 1 个部分。不过无论哪种情况都无关紧要,我们都可以当成 3 个部分来对待,例如一号玩家选择了一个叶结点,我们也可以把叶结点的左右两个空指针看成大小为 0 的两个部分。 -- 那么二号玩家怎样选择蓝色结点才是最优呢?答案是:选择离红色结点最近,且所属连通分量规模最大的那个点。也就是示例图中的 1 号结点。如果我们选择了 1 号结点为蓝色结点,那么可以染成红色的点就只剩下 6 号点和 7 号点了,而蓝色可以把根结点和其左子树全部占据。 -- 如何确定蓝色是否有必胜策略,就可以转换为,被红色点切割的三个连通分量中,是否存在一个连通分量,大小大于所有结点数目的一半。统计三个连通分量大小的过程,可以用深度优先搜索(DFS)来实现。当遍历到某一结点,其结点值等于选定的红色结点时,我们统计这个结点的左子树 `red_left` 和右子树 `red_right` 的大小,那么我们就已经找到两个连通分量的大小了,最后一个父结点连通分量的大小,可以用结点总数减去这两个连通分量大小,再减去红色所占结点,即 `parent = n - red_left - red_right - 1`。 - -## 代码 - -```go - -func btreeGameWinningMove(root *TreeNode, n int, x int) bool { - var left, right int - dfsBtreeGameWinningMove(root, &left, &right, x) - up := n - left - right - 1 - n /= 2 - return left > n || right > n || up > n -} - -func dfsBtreeGameWinningMove(node *TreeNode, left, right *int, x int) int { - if node == nil { - return 0 - } - l, r := dfsBtreeGameWinningMove(node.Left, left, right, x), dfsBtreeGameWinningMove(node.Right, left, right, x) - if node.Val == x { - *left, *right = l, r - } - return l + r + 1 -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1154.Day-of-the-Year.md b/website/content/ChapterFour/1154.Day-of-the-Year.md deleted file mode 100755 index 6b1bc846b..000000000 --- a/website/content/ChapterFour/1154.Day-of-the-Year.md +++ /dev/null @@ -1,81 +0,0 @@ -# [1154. Day of the Year](https://leetcode.com/problems/day-of-the-year/) - - -## 题目 - -Given a string `date` representing a [Gregorian calendar](https://en.wikipedia.org/wiki/Gregorian_calendar) date formatted as `YYYY-MM-DD`, return the day number of the year. - -**Example 1**: - - Input: date = "2019-01-09" - Output: 9 - Explanation: Given date is the 9th day of the year in 2019. - -**Example 2**: - - Input: date = "2019-02-10" - Output: 41 - -**Example 3**: - - Input: date = "2003-03-01" - Output: 60 - -**Example 4**: - - Input: date = "2004-03-01" - Output: 61 - -**Constraints:** - -- `date.length == 10` -- `date[4] == date[7] == '-'`, and all other `date[i]`'s are digits -- `date` represents a calendar date between Jan 1st, 1900 and Dec 31, 2019. - -## 题目大意 - - -实现一个 MajorityChecker 的类,它应该具有下述几个 API: - -- MajorityChecker(int[] arr) 会用给定的数组 arr 来构造一个 MajorityChecker 的实例。 -- int query(int left, int right, int threshold) 有这么几个参数: - - 0 <= left <= right < arr.length 表示数组 arr 的子数组的长度。 - - 2 * threshold > right - left + 1,也就是说阈值 threshold 始终比子序列长度的一半还要大。 - -每次查询 query(...) 会返回在 arr[left], arr[left+1], ..., arr[right] 中至少出现阈值次数 threshold 的元素,如果不存在这样的元素,就返回 -1。 - -提示: - -- 1 <= arr.length <= 20000 -- 1 <= arr[i] <= 20000 -- 对于每次查询,0 <= left <= right < len(arr) -- 对于每次查询,2 * threshold > right - left + 1 -- 查询次数最多为 10000 - - - - - -## 解题思路 - -- 给出一个时间字符串,求出这一天是这一年当中的第几天。 -- 简单题。依照题意处理即可。 - - -## 代码 - -```go - -package leetcode - -import "time" - -func dayOfYear(date string) int { - first := date[:4] + "-01-01" - firstDay, _ := time.Parse("2006-01-02", first) - dateDay, _ := time.Parse("2006-01-02", date) - duration := dateDay.Sub(firstDay) - return int(duration.Hours())/24 + 1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1157.Online-Majority-Element-In-Subarray.md b/website/content/ChapterFour/1157.Online-Majority-Element-In-Subarray.md deleted file mode 100755 index ac7d539b9..000000000 --- a/website/content/ChapterFour/1157.Online-Majority-Element-In-Subarray.md +++ /dev/null @@ -1,196 +0,0 @@ -# [1157. Online Majority Element In Subarray](https://leetcode.com/problems/online-majority-element-in-subarray/) - - -## 题目 - -Implementing the class `MajorityChecker`, which has the following API: - -- `MajorityChecker(int[] arr)` constructs an instance of MajorityChecker with the given array `arr`; -- `int query(int left, int right, int threshold)` has arguments such that: - - `0 <= left <= right < arr.length` representing a subarray of `arr`; - - `2 * threshold > right - left + 1`, ie. the threshold is always a strict majority of the length of the subarray - -Each `query(...)` returns the element in `arr[left], arr[left+1], ..., arr[right]` that occurs at least `threshold` times, or `-1` if no such element exists. - -**Example**: - - MajorityChecker majorityChecker = new MajorityChecker([1,1,2,2,1,1]); - majorityChecker.query(0,5,4); // returns 1 - majorityChecker.query(0,3,3); // returns -1 - majorityChecker.query(2,3,2); // returns 2 - -**Constraints:** - -- `1 <= arr.length <= 20000` -- `1 <= arr[i] <= 20000` -- For each query, `0 <= left <= right < len(arr)` -- For each query, `2 * threshold > right - left + 1` -- The number of queries is at most `10000` - - -## 题目大意 - -实现一个 MajorityChecker 的类,它应该具有下述几个 API: - -- MajorityChecker(int[] arr) 会用给定的数组 arr 来构造一个 MajorityChecker 的实例。 -- int query(int left, int right, int threshold) 有这么几个参数: -- 0 <= left <= right < arr.length 表示数组 arr 的子数组的长度。 -- 2 * threshold > right - left + 1,也就是说阈值 threshold 始终比子序列长度的一半还要大。 - -每次查询 query(...) 会返回在 arr[left], arr[left+1], ..., arr[right] 中至少出现阈值次数 threshold 的元素,如果不存在这样的元素,就返回 -1。 - -提示: - -- 1 <= arr.length <= 20000 -- 1 <= arr[i] <= 20000 -- 对于每次查询,0 <= left <= right < len(arr) -- 对于每次查询,2 * threshold > right - left + 1 -- 查询次数最多为 10000 - - - - -## 解题思路 - - -- 设计一个数据结构,能在任意的一个区间内,查找是否存在众数,众数的定义是:该数字出现的次数大于区间的一半。如果存在众数,一定唯一。如果在给定的区间内找不到众数,则输出 -1 。 -- 这一题有一个很显眼的“暗示”,`2 * threshold > right - left + 1`,这个条件就是摩尔投票算法的前提条件。摩尔投票的思想可以见第 169 题。这一题又要在区间内查询,所以选用线段树这个数据结构来实现。经过分析,可以确定此题的解题思路,摩尔投票 + 线段树。 -- 摩尔投票的思想是用两个变量,candidate 和 count,用来记录待被投票投出去的元素,和候选人累积没被投出去的轮数。如果候选人累积没有被投出去的轮数越多,那么最终成为众数的可能越大。从左往右扫描整个数组,先去第一个元素为 candidate,如果遇到相同的元素就累加轮数,如果遇到不同的元素,就把 candidate 和不同的元素一起投出去。当轮数变成 0 了,再选下一个元素作为 candidate。从左扫到右,就能找到众数了。那怎么和线段树结合起来呢? -- 线段树是把一个大的区间拆分成很多个小区间,那么考虑这样一个问题。每个小区间内使用摩尔投票,最终把所有小区间合并起来再用一次摩尔投票,得到的结果和对整个区间使用一次摩尔投票的结果是一样的么?答案是一样的。可以这样想,众数总会在一个区间内被选出来,那么其他区间的摩尔投票都是起“中和”作用的,即两两元素一起出局。这个问题想通以后,说明摩尔投票具有可加的性质。既然满足可加,就可以和线段树结合,因为线段树每个线段就是加起来,最终合并成大区间的。 -- 举个例子,arr = [1,1,2,2,1,1],先构造线段树,如下左图。 - - ![](https://img.halfrost.com/Leetcode/leetcode_1157_0.png) - - 现在每个线段树的节点不是只存一个 int 数字了,而是存 candidate 和 count。每个节点的 candidate 和 count 分别代表的是该区间内摩尔投票的结果。初始化的时候,先把每个叶子都填满,candidate 是自己,count = 1 。即右图绿色节点。然后在 pushUp 的时候,进行摩尔投票: - - mc.merge = func(i, j segmentItem) segmentItem { - if i.candidate == j.candidate { - return segmentItem{candidate: i.candidate, count: i.count + j.count} - } - if i.count > j.count { - return segmentItem{candidate: i.candidate, count: i.count - j.count} - } - return segmentItem{candidate: j.candidate, count: j.count - i.count} - } - - 直到根节点的 candidate 和 count 都填满。**注意,这里的 count 并不是元素出现的总次数,而是摩尔投票中坚持没有被投出去的轮数**。当线段树构建完成以后,就可以开始查询任意区间内的众数了,candidate 即为众数。接下来还要确定众数是否满足 `threshold` 的条件。 - -- 用一个字典记录每个元素在数组中出现位置的下标,例如上述这个例子,用 map 记录下标:count = map[1:[0 1 4 5] 2:[2 3]]。由于下标在记录过程中是递增的,所以满足二分查找的条件。利用这个字典就可以查出在任意区间内,指定元素出现的次数。例如这里要查找 1 在 [0,5] 区间内出现的个数,那么利用 2 次二分查找,分别找到 `lowerBound` 和 `upperBound`,在 [lowerBound,upperBound) 区间内,都是元素 1 ,那么区间长度即是该元素重复出现的次数,和 `threshold` 比较,如果 ≥ `threshold` 说明找到了答案,否则没有找到就输出 -1 。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" -) - -type segmentItem struct { - candidate int - count int -} - -// MajorityChecker define -type MajorityChecker struct { - segmentTree []segmentItem - data []int - merge func(i, j segmentItem) segmentItem - count map[int][]int -} - -// Constructor1157 define -func Constructor1157(arr []int) MajorityChecker { - data, tree, mc, count := make([]int, len(arr)), make([]segmentItem, 4*len(arr)), MajorityChecker{}, make(map[int][]int) - // 这个 merge 函数就是摩尔投票算法 - mc.merge = func(i, j segmentItem) segmentItem { - if i.candidate == j.candidate { - return segmentItem{candidate: i.candidate, count: i.count + j.count} - } - if i.count > j.count { - return segmentItem{candidate: i.candidate, count: i.count - j.count} - } - return segmentItem{candidate: j.candidate, count: j.count - i.count} - } - for i := 0; i < len(arr); i++ { - data[i] = arr[i] - } - for i := 0; i < len(arr); i++ { - if _, ok := count[arr[i]]; !ok { - count[arr[i]] = []int{} - } - count[arr[i]] = append(count[arr[i]], i) - } - mc.data, mc.segmentTree, mc.count = data, tree, count - if len(arr) > 0 { - mc.buildSegmentTree(0, 0, len(arr)-1) - } - return mc -} - -func (mc *MajorityChecker) buildSegmentTree(treeIndex, left, right int) { - if left == right { - mc.segmentTree[treeIndex] = segmentItem{candidate: mc.data[left], count: 1} - return - } - leftTreeIndex, rightTreeIndex := mc.leftChild(treeIndex), mc.rightChild(treeIndex) - midTreeIndex := left + (right-left)>>1 - mc.buildSegmentTree(leftTreeIndex, left, midTreeIndex) - mc.buildSegmentTree(rightTreeIndex, midTreeIndex+1, right) - mc.segmentTree[treeIndex] = mc.merge(mc.segmentTree[leftTreeIndex], mc.segmentTree[rightTreeIndex]) -} - -func (mc *MajorityChecker) leftChild(index int) int { - return 2*index + 1 -} - -func (mc *MajorityChecker) rightChild(index int) int { - return 2*index + 2 -} - -// Query define -func (mc *MajorityChecker) query(left, right int) segmentItem { - if len(mc.data) > 0 { - return mc.queryInTree(0, 0, len(mc.data)-1, left, right) - } - return segmentItem{candidate: -1, count: -1} -} - -func (mc *MajorityChecker) queryInTree(treeIndex, left, right, queryLeft, queryRight int) segmentItem { - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, mc.leftChild(treeIndex), mc.rightChild(treeIndex) - if queryLeft <= left && queryRight >= right { // segment completely inside range - return mc.segmentTree[treeIndex] - } - if queryLeft > midTreeIndex { - return mc.queryInTree(rightTreeIndex, midTreeIndex+1, right, queryLeft, queryRight) - } else if queryRight <= midTreeIndex { - return mc.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, queryRight) - } - // merge query results - return mc.merge(mc.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, midTreeIndex), - mc.queryInTree(rightTreeIndex, midTreeIndex+1, right, midTreeIndex+1, queryRight)) -} - -// Query define -func (mc *MajorityChecker) Query(left int, right int, threshold int) int { - res := mc.query(left, right) - if _, ok := mc.count[res.candidate]; !ok { - return -1 - } - start := sort.Search(len(mc.count[res.candidate]), func(i int) bool { return left <= mc.count[res.candidate][i] }) - end := sort.Search(len(mc.count[res.candidate]), func(i int) bool { return right < mc.count[res.candidate][i] }) - 1 - if (end - start + 1) >= threshold { - return res.candidate - } - return -1 -} - -/** - * Your MajorityChecker object will be instantiated and called as such: - * obj := Constructor(arr); - * param_1 := obj.Query(left,right,threshold); - */ - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1160.Find-Words-That-Can-Be-Formed-by-Characters.md b/website/content/ChapterFour/1160.Find-Words-That-Can-Be-Formed-by-Characters.md deleted file mode 100755 index 5a73172da..000000000 --- a/website/content/ChapterFour/1160.Find-Words-That-Can-Be-Formed-by-Characters.md +++ /dev/null @@ -1,81 +0,0 @@ -# [1160. Find Words That Can Be Formed by Characters](https://leetcode.com/problems/find-words-that-can-be-formed-by-characters/) - - -## 题目 - -You are given an array of strings `words` and a string `chars`. - -A string is *good* if it can be formed by characters from `chars` (each character can only be used once). - -Return the sum of lengths of all good strings in `words`. - -**Example 1**: - - Input: words = ["cat","bt","hat","tree"], chars = "atach" - Output: 6 - Explanation: - The strings that can be formed are "cat" and "hat" so the answer is 3 + 3 = 6. - -**Example 2**: - - Input: words = ["hello","world","leetcode"], chars = "welldonehoneyr" - Output: 10 - Explanation: - The strings that can be formed are "hello" and "world" so the answer is 5 + 5 = 10. - -**Note**: - -1. `1 <= words.length <= 1000` -2. `1 <= words[i].length, chars.length <= 100` -3. All strings contain lowercase English letters only. - - -## 题目大意 - - -给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和。 - -提示: - -1. 1 <= words.length <= 1000 -2. 1 <= words[i].length, chars.length <= 100 -3. 所有字符串中都仅包含小写英文字母 - - - -## 解题思路 - -- 给出一个字符串数组 `words` 和一个字符串 `chars`,要求输出 `chars` 中能构成 `words` 字符串的字符数总数。 -- 简单题。先分别统计 `words` 和 `chars` 里面字符的频次。然后针对 `words` 中每个 `word` 判断能够能由 `chars` 构成,如果能构成,最终结果加上这个 `word` 的长度。 - - -## 代码 - -```go - -package leetcode - -func countCharacters(words []string, chars string) int { - count, res := make([]int, 26), 0 - for i := 0; i < len(chars); i++ { - count[chars[i]-'a']++ - } - for _, w := range words { - if canBeFormed(w, count) { - res += len(w) - } - } - return res -} -func canBeFormed(w string, c []int) bool { - count := make([]int, 26) - for i := 0; i < len(w); i++ { - count[w[i]-'a']++ - if count[w[i]-'a'] > c[w[i]-'a'] { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1170.Compare-Strings-by-Frequency-of-the-Smallest-Character.md b/website/content/ChapterFour/1170.Compare-Strings-by-Frequency-of-the-Smallest-Character.md deleted file mode 100755 index be6dfc0d6..000000000 --- a/website/content/ChapterFour/1170.Compare-Strings-by-Frequency-of-the-Smallest-Character.md +++ /dev/null @@ -1,86 +0,0 @@ -# [1170. Compare Strings by Frequency of the Smallest Character](https://leetcode.com/problems/compare-strings-by-frequency-of-the-smallest-character/) - -## 题目 - -Let's define a function `f(s)` over a non-empty string `s`, which calculates the frequency of the smallest character in `s`. For example, if `s = "dcce"` then `f(s) = 2` because the smallest character is `"c"` and its frequency is 2. - -Now, given string arrays `queries` and `words`, return an integer array `answer`, where each `answer[i]` is the number of words such that `f(queries[i])` < `f(W)`, where `W` is a word in `words`. - -**Example 1**: - - Input: queries = ["cbd"], words = ["zaaaz"] - Output: [1] - Explanation: On the first query we have f("cbd") = 1, f("zaaaz") = 3 so f("cbd") < f("zaaaz"). - -**Example 2**: - - Input: queries = ["bbb","cc"], words = ["a","aa","aaa","aaaa"] - Output: [1,2] - Explanation: On the first query only f("bbb") < f("aaaa"). On the second query both f("aaa") and f("aaaa") are both > f("cc"). - -**Constraints:** - -- `1 <= queries.length <= 2000` -- `1 <= words.length <= 2000` -- `1 <= queries[i].length, words[i].length <= 10` -- `queries[i][j]`, `words[i][j]` are English lowercase letters. - - -## 题目大意 - - -我们来定义一个函数 f(s),其中传入参数 s 是一个非空字符串;该函数的功能是统计 s  中(按字典序比较)最小字母的出现频次。 - -例如,若 s = "dcce",那么 f(s) = 2,因为最小的字母是 "c",它出现了 2 次。 - -现在,给你两个字符串数组待查表 queries 和词汇表 words,请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是满足 f(queries[i]) < f(W) 的词的数目,W 是词汇表 words 中的词。 - -提示: - -- 1 <= queries.length <= 2000 -- 1 <= words.length <= 2000 -- 1 <= queries[i].length, words[i].length <= 10 -- queries[i][j], words[i][j] 都是小写英文字母 - - - - -## 解题思路 - -- 给出 2 个数组,`queries` 和 `words`,针对每一个 `queries[i]` 统计在 `words[j]` 中满足 `f(queries[i]) < f(words[j])` 条件的 `words[j]` 的个数。`f(string)` 的定义是 `string` 中字典序最小的字母的频次。 -- 先依照题意,构造出 `f()` 函数,算出每个 `words[j]` 的 `f()` 值,然后排序。再依次计算 `queries[i]` 的 `f()` 值。针对每个 `f()` 值,在 `words[j]` 的 `f()` 值中二分搜索,查找比它大的值的下标 `k`,`n-k` 即是比 `queries[i]` 的 `f()` 值大的元素个数。依次输出到结果数组中即可。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -func numSmallerByFrequency(queries []string, words []string) []int { - ws, res := make([]int, len(words)), make([]int, len(queries)) - for i, w := range words { - ws[i] = countFunc(w) - } - sort.Ints(ws) - for i, q := range queries { - fq := countFunc(q) - res[i] = len(words) - sort.Search(len(words), func(i int) bool { return fq < ws[i] }) - } - return res -} - -func countFunc(s string) int { - count, i := [26]int{}, 0 - for _, b := range s { - count[b-'a']++ - } - for count[i] == 0 { - i++ - } - return count[i] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1171.Remove-Zero-Sum-Consecutive-Nodes-from-Linked-List.md b/website/content/ChapterFour/1171.Remove-Zero-Sum-Consecutive-Nodes-from-Linked-List.md deleted file mode 100755 index b71ad63b7..000000000 --- a/website/content/ChapterFour/1171.Remove-Zero-Sum-Consecutive-Nodes-from-Linked-List.md +++ /dev/null @@ -1,140 +0,0 @@ -# [1171. Remove Zero Sum Consecutive Nodes from Linked List](https://leetcode.com/problems/remove-zero-sum-consecutive-nodes-from-linked-list/) - - -## 题目 - -Given the `head` of a linked list, we repeatedly delete consecutive sequences of nodes that sum to `0` until there are no such sequences. - -After doing so, return the head of the final linked list. You may return any such answer. - -(Note that in the examples below, all sequences are serializations of `ListNode` objects.) - -**Example 1**: - - Input: head = [1,2,-3,3,1] - Output: [3,1] - **Note**: The answer [1,2,1] would also be accepted. - -**Example 2**: - - Input: head = [1,2,3,-3,4] - Output: [1,2,4] - -**Example 3**: - - Input: head = [1,2,3,-3,-2] - Output: [1] - -**Constraints:** - -- The given linked list will contain between `1` and `1000` nodes. -- Each node in the linked list has `-1000 <= node.val <= 1000`. - - -## 题目大意 - - -给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。删除完毕后,请你返回最终结果链表的头节点。你可以返回任何满足题目要求的答案。 - -(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。) - -提示: - -- 给你的链表中可能有 1 到 1000 个节点。 -- 对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000. - - - -## 解题思路 - -- 给出一个链表,要求把链表中和为 0 的结点都移除。 -- 由于链表的特性,不能随机访问。所以从链表的头开始往后扫,把累加和存到字典中。当再次出现相同的累加和的时候,代表这中间的一段和是 0,于是要删除这一段。删除这一段的过程中,也要删除这一段在字典中存过的累加和。有一个特殊情况需要处理,即整个链表的总和是 0,那么最终结果是空链表。针对这个特殊情况,字典中先预存入 0 值。 - - -## 代码 - -```go - -package leetcode - -/** - * Definition for singly-linked list. - * type ListNode struct { - * Val int - * Next *ListNode - * } - */ - -// 解法一 -func removeZeroSumSublists(head *ListNode) *ListNode { - // 计算累加和,和作为 key 存在 map 中,value 存那个节点的指针。如果字典中出现了重复的和,代表出现了和为 0 的段。 - sum, sumMap, cur := 0, make(map[int]*ListNode), head - // 字典中增加 0 这个特殊值,是为了防止最终链表全部消除完 - sumMap[0] = nil - for cur != nil { - sum = sum + cur.Val - if ptr, ok := sumMap[sum]; ok { - // 在字典中找到了重复的和,代表 [ptr, tmp] 中间的是和为 0 的段,要删除的就是这一段。 - // 同时删除 map 中中间这一段的和 - if ptr != nil { - iter := ptr.Next - tmpSum := sum + iter.Val - for tmpSum != sum { - // 删除中间为 0 的那一段,tmpSum 不断的累加删除 map 中的和 - delete(sumMap, tmpSum) - iter = iter.Next - tmpSum = tmpSum + iter.Val - } - ptr.Next = cur.Next - } else { - head = cur.Next - sumMap = make(map[int]*ListNode) - sumMap[0] = nil - } - } else { - sumMap[sum] = cur - } - cur = cur.Next - } - return head -} - -// 解法二 暴力解法 -func removeZeroSumSublists1(head *ListNode) *ListNode { - if head == nil { - return nil - } - h, prefixSumMap, sum, counter, lastNode := head, map[int]int{}, 0, 0, &ListNode{Val: 1010} - for h != nil { - for h != nil { - sum += h.Val - counter++ - if v, ok := prefixSumMap[sum]; ok { - lastNode, counter = h, v - break - } - if sum == 0 { - head = h.Next - break - } - prefixSumMap[sum] = counter - h = h.Next - } - if lastNode.Val != 1010 { - h = head - for counter > 1 { - counter-- - h = h.Next - } - h.Next = lastNode.Next - } - if h == nil { - break - } else { - h, prefixSumMap, sum, counter, lastNode = head, map[int]int{}, 0, 0, &ListNode{Val: 1010} - } - } - return head -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1175.Prime-Arrangements.md b/website/content/ChapterFour/1175.Prime-Arrangements.md deleted file mode 100755 index e5550e67a..000000000 --- a/website/content/ChapterFour/1175.Prime-Arrangements.md +++ /dev/null @@ -1,65 +0,0 @@ -# [1175. Prime Arrangements](https://leetcode.com/problems/prime-arrangements/) - - -## 题目 - -Return the number of permutations of 1 to `n` so that prime numbers are at prime indices (1-indexed.) - -*(Recall that an integer is prime if and only if it is greater than 1, and cannot be written as a product of two positive integers both smaller than it.)* - -Since the answer may be large, return the answer **modulo `10^9 + 7`**. - -**Example 1**: - - Input: n = 5 - Output: 12 - Explanation: For example [1,2,5,4,3] is a valid permutation, but [5,2,3,4,1] is not because the prime number 5 is at index 1. - -**Example 2**: - - Input: n = 100 - Output: 682289015 - -**Constraints:** - -- `1 <= n <= 100` - - -## 题目大意 - - -请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。 - -提示: - -- 1 <= n <= 100 - -## 解题思路 - -- 给出一个数 n,要求在 1-n 这 n 个数中,素数在素数索引下标位置上的全排列个数。 -- 由于这一题的 `n` 小于 100,所以可以用打表法。先把小于 100 个素数都打表打出来。然后对小于 n 的素数进行全排列,即 n!,然后再对剩下来的非素数进行全排列,即 (n-c)!。两个的乘积即为最终答案。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -var primes = []int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97} - -func numPrimeArrangements(n int) int { - primeCount := sort.Search(25, func(i int) bool { return primes[i] > n }) - return factorial(primeCount) * factorial(n-primeCount) % 1000000007 -} - -func factorial(n int) int { - if n == 1 || n == 0 { - return 1 - } - return n * factorial(n-1) % 1000000007 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1184.Distance-Between-Bus-Stops.md b/website/content/ChapterFour/1184.Distance-Between-Bus-Stops.md deleted file mode 100755 index 4f5f6c64a..000000000 --- a/website/content/ChapterFour/1184.Distance-Between-Bus-Stops.md +++ /dev/null @@ -1,82 +0,0 @@ -# [1184. Distance Between Bus Stops](https://leetcode.com/problems/distance-between-bus-stops/) - -## 题目 - -A bus has `n` stops numbered from `0` to `n - 1` that form a circle. We know the distance between all pairs of neighboring stops where `distance[i]` is the distance between the stops number `i` and `(i + 1) % n`. - -The bus goes along both directions i.e. clockwise and counterclockwise. - -Return the shortest distance between the given `start` and `destination` stops. - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2019/09/03/untitled-diagram-1.jpg) - - Input: distance = [1,2,3,4], start = 0, destination = 1 - Output: 1 - Explanation: Distance between 0 and 1 is 1 or 9, minimum is 1. - -**Example 2**: - -![](https://assets.leetcode.com/uploads/2019/09/03/untitled-diagram-1-1.jpg) - - Input: distance = [1,2,3,4], start = 0, destination = 2 - Output: 3 - Explanation: Distance between 0 and 2 is 3 or 7, minimum is 3. - -**Example 3**: - -![](https://assets.leetcode.com/uploads/2019/09/03/untitled-diagram-1-2.jpg) - - Input: distance = [1,2,3,4], start = 0, destination = 3 - Output: 4 - Explanation: Distance between 0 and 3 is 6 or 4, minimum is 4. - -**Constraints:** - -- `1 <= n <= 10^4` -- `distance.length == n` -- `0 <= start, destination < n` -- `0 <= distance[i] <= 10^4` - - -## 题目大意 - -环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之间的距离。环线上的公交车都可以按顺时针和逆时针的方向行驶。返回乘客从出发点 start 到目的地 destination 之间的最短距离。 - -提示: - -- 1 <= n <= 10^4 -- distance.length == n -- 0 <= start, destination < n -- 0 <= distance[i] <= 10^4 - - -## 解题思路 - - -- 给出一个数组,代表的是公交车站每站直接的距离。距离是按照数组下标的顺序给出的,公交车可以按照顺时针行驶,也可以按照逆时针行驶。问行驶的最短距离是多少。 -- 按照题意,分别算出顺时针和逆时针的行驶距离,比较两者距离,取出小值就是结果。 - - -## 代码 - -```go - -package leetcode - -func distanceBetweenBusStops(distance []int, start int, destination int) int { - clockwiseDis, counterclockwiseDis, n := 0, 0, len(distance) - for i := start; i != destination; i = (i + 1) % n { - clockwiseDis += distance[i] - } - for i := destination; i != start; i = (i + 1) % n { - counterclockwiseDis += distance[i] - } - if clockwiseDis < counterclockwiseDis { - return clockwiseDis - } - return counterclockwiseDis -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1185.Day-of-the-Week.md b/website/content/ChapterFour/1185.Day-of-the-Week.md deleted file mode 100755 index 0eef0bcf8..000000000 --- a/website/content/ChapterFour/1185.Day-of-the-Week.md +++ /dev/null @@ -1,61 +0,0 @@ -# [1185. Day of the Week](https://leetcode.com/problems/day-of-the-week/) - - -## 题目 - -Given a date, return the corresponding day of the week for that date. - -The input is given as three integers representing the `day`, `month` and `year` respectively. - -Return the answer as one of the following values `{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}`. - -**Example 1**: - - Input: day = 31, month = 8, year = 2019 - Output: "Saturday" - -**Example 2**: - - Input: day = 18, month = 7, year = 1999 - Output: "Sunday" - -**Example 3**: - - Input: day = 15, month = 8, year = 1993 - Output: "Sunday" - -**Constraints:** - -- The given dates are valid dates between the years `1971` and `2100`. - - -## 题目大意 - -给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。输入为三个整数:day、month 和 year,分别表示日、月、年。 - -您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。 - -提示: - -- 给出的日期一定是在 1971 到 2100 年之间的有效日期。 - -## 解题思路 - - -- 给出一个日期,要求算出这一天是星期几。 -- 简单题,按照常识计算即可。 - - -## 代码 - -```go - -package leetcode - -import "time" - -func dayOfTheWeek(day int, month int, year int) string { - return time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.Local).Weekday().String() -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1189.Maximum-Number-of-Balloons.md b/website/content/ChapterFour/1189.Maximum-Number-of-Balloons.md deleted file mode 100755 index 9fdae8753..000000000 --- a/website/content/ChapterFour/1189.Maximum-Number-of-Balloons.md +++ /dev/null @@ -1,70 +0,0 @@ -# [1189. Maximum Number of Balloons](https://leetcode.com/problems/maximum-number-of-balloons/) - - -## 题目 - -Given a string `text`, you want to use the characters of `text` to form as many instances of the word **"balloon"** as possible. - -You can use each character in `text` **at most once**. Return the maximum number of instances that can be formed. - -**Example 1**: - -![](https://assets.leetcode.com/uploads/2019/09/05/1536_ex1_upd.JPG) - - Input: text = "nlaebolko" - Output: 1 - -**Example 2**: - -![](https://assets.leetcode.com/uploads/2019/09/05/1536_ex2_upd.JPG) - - Input: text = "loonbalxballpoon" - Output: 2 - -**Example 3**: - - Input: text = "leetcode" - Output: 0 - -**Constraints:** - -- `1 <= text.length <= 10^4` -- `text` consists of lower case English letters only. - - -## 题目大意 - -给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。 - -提示: - -- 1 <= text.length <= 10^4 -- text 全部由小写英文字母组成 - -## 解题思路 - - -- 给出一个字符串,问这个字符串里面的数组能组成多少个 **balloon** 这个单词。 -- 简单题,先统计 26 个字母每个字母的频次,然后取出 balloon 这 5 个字母出现频次最小的值就是结果。 - - -## 代码 - -```go - -package leetcode - -func maxNumberOfBalloons(text string) int { - fre := make([]int, 26) - for _, t := range text { - fre[t-'a']++ - } - // 字符 b 的频次是数组下标 1 对应的元素值 - // 字符 a 的频次是数组下标 0 对应的元素值 - // 字符 l 的频次是数组下标 11 对应的元素值,这里有 2 个 l,所以元素值需要除以 2 - // 字符 o 的频次是数组下标 14 对应的元素值,这里有 2 个 o,所以元素值需要除以 2 - // 字符 n 的频次是数组下标 13 对应的元素值 - return min(fre[1], min(fre[0], min(fre[11]/2, min(fre[14]/2, fre[13])))) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1200.Minimum-Absolute-Difference.md b/website/content/ChapterFour/1200.Minimum-Absolute-Difference.md deleted file mode 100755 index c52b77995..000000000 --- a/website/content/ChapterFour/1200.Minimum-Absolute-Difference.md +++ /dev/null @@ -1,77 +0,0 @@ -# [1200. Minimum Absolute Difference](https://leetcode.com/problems/minimum-absolute-difference/) - - -## 题目 - -Given an array of **distinct** integers `arr`, find all pairs of elements with the minimum absolute difference of any two elements. - -Return a list of pairs in ascending order(with respect to pairs), each pair `[a, b]` follows - -- `a, b` are from `arr` -- `a < b` -- `b - a` equals to the minimum absolute difference of any two elements in `arr` - -**Example 1**: - - Input: arr = [4,2,1,3] - Output: [[1,2],[2,3],[3,4]] - Explanation: The minimum absolute difference is 1. List all pairs with difference equal to 1 in ascending order. - -**Example 2**: - - Input: arr = [1,3,6,10,15] - Output: [[1,3]] - -**Example 3**: - - Input: arr = [3,8,-10,23,19,-4,-14,27] - Output: [[-14,-10],[19,23],[23,27]] - -**Constraints:** - -- `2 <= arr.length <= 10^5` -- `-10^6 <= arr[i] <= 10^6` - - -## 题目大意 - -给出一个数组,要求找出所有满足条件的数值对 [a,b]:`a>1 - if calNthCount(mid, int64(a), int64(b), int64(c)) < int64(n) { - low = mid + 1 - } else { - high = mid - } - } - return int(low) -} - -func calNthCount(num, a, b, c int64) int64 { - ab, bc, ac := a*b/gcd(a, b), b*c/gcd(b, c), a*c/gcd(a, c) - abc := a * bc / gcd(a, bc) - return num/a + num/b + num/c - num/ab - num/bc - num/ac + num/abc -} - -func gcd(a, b int64) int64 { - for b != 0 { - a, b = b, a%b - } - return a -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1202.Smallest-String-With-Swaps.md b/website/content/ChapterFour/1202.Smallest-String-With-Swaps.md deleted file mode 100755 index 18527ba9d..000000000 --- a/website/content/ChapterFour/1202.Smallest-String-With-Swaps.md +++ /dev/null @@ -1,102 +0,0 @@ -# [1202. Smallest String With Swaps](https://leetcode.com/problems/smallest-string-with-swaps/) - - -## 题目 - -You are given a string `s`, and an array of pairs of indices in the string `pairs` where `pairs[i] = [a, b]` indicates 2 indices(0-indexed) of the string. - -You can swap the characters at any pair of indices in the given `pairs` **any number of times**. - -Return the lexicographically smallest string that `s` can be changed to after using the swaps. - -**Example 1**: - - Input: s = "dcab", pairs = [[0,3],[1,2]] - Output: "bacd" - Explaination: - Swap s[0] and s[3], s = "bcad" - Swap s[1] and s[2], s = "bacd" - -**Example 2**: - - Input: s = "dcab", pairs = [[0,3],[1,2],[0,2]] - Output: "abcd" - Explaination: - Swap s[0] and s[3], s = "bcad" - Swap s[0] and s[2], s = "acbd" - Swap s[1] and s[2], s = "abcd" - -**Example 3**: - - Input: s = "cba", pairs = [[0,1],[1,2]] - Output: "abc" - Explaination: - Swap s[0] and s[1], s = "bca" - Swap s[1] and s[2], s = "bac" - Swap s[0] and s[1], s = "abc" - -**Constraints:** - -- `1 <= s.length <= 10^5` -- `0 <= pairs.length <= 10^5` -- `0 <= pairs[i][0], pairs[i][1] < s.length` -- `s` only contains lower case English letters. - - -## 题目大意 - -给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。你可以 任意多次交换 在 pairs 中任意一对索引处的字符。返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。 - -提示: - -- 1 <= s.length <= 10^5 -- 0 <= pairs.length <= 10^5 -- 0 <= pairs[i][0], pairs[i][1] < s.length -- s 中只含有小写英文字母 - - - -## 解题思路 - - -- 给出一个字符串和一个字符串里可交换的下标。要求交换以后字典序最小的字符串。 -- 这一题可以用并查集来解题,先把可交换下标都 `Union()` 起来,每个集合内,按照字典序从小到大排列。最后扫描原有字符串,从左到右依次找到各自对应的集合里面最小的字符进行替换,每次替换完以后,删除集合中该字符(防止下次重复替换)。最终得到的字符就是最小字典序的字符。 - - -## 代码 - -```go - -package leetcode - -import ( - "sort" - - "github.com/halfrost/LeetCode-Go/template" -) - -func smallestStringWithSwaps(s string, pairs [][]int) string { - uf, res, sMap := template.UnionFind{}, []byte(s), map[int][]byte{} - uf.Init(len(s)) - for _, pair := range pairs { - uf.Union(pair[0], pair[1]) - } - for i := 0; i < len(s); i++ { - r := uf.Find(i) - sMap[r] = append(sMap[r], s[i]) - } - for _, v := range sMap { - sort.Slice(v, func(i, j int) bool { - return v[i] < v[j] - }) - } - for i := 0; i < len(s); i++ { - r := uf.Find(i) - bytes := sMap[r] - res[i] = bytes[0] - sMap[r] = bytes[1:len(bytes)] - } - return string(res) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1207.Unique-Number-of-Occurrences.md b/website/content/ChapterFour/1207.Unique-Number-of-Occurrences.md deleted file mode 100755 index 43e3c6f83..000000000 --- a/website/content/ChapterFour/1207.Unique-Number-of-Occurrences.md +++ /dev/null @@ -1,68 +0,0 @@ -# [1207. Unique Number of Occurrences](https://leetcode.com/problems/unique-number-of-occurrences/) - - -## 题目 - -Given an array of integers `arr`, write a function that returns `true` if and only if the number of occurrences of each value in the array is unique. - -**Example 1**: - - Input: arr = [1,2,2,1,1,3] - Output: true - Explanation: The value 1 has 3 occurrences, 2 has 2 and 3 has 1. No two values have the same number of occurrences. - -**Example 2**: - - Input: arr = [1,2] - Output: false - -**Example 3**: - - Input: arr = [-3,0,1,-3,1,1,1,-3,10,0] - Output: true - -**Constraints:** - -- `1 <= arr.length <= 1000` -- `-1000 <= arr[i] <= 1000` - - - -## 题目大意 - -给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 - -提示: - -- 1 <= arr.length <= 1000 -- -1000 <= arr[i] <= 1000 - -## 解题思路 - - -- 给出一个数组,先统计每个数字出现的频次,判断在这个数组中是否存在相同的频次。 -- 简单题,先统计数组中每个数字的频次,然后用一个 map 判断频次是否重复。 - - -## 代码 - -```go - -package leetcode - -func uniqueOccurrences(arr []int) bool { - freq, m := map[int]int{}, map[int]bool{} - for _, v := range arr { - freq[v]++ - } - for _, v := range freq { - if _, ok := m[v]; !ok { - m[v] = true - } else { - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1208.Get-Equal-Substrings-Within-Budget.md b/website/content/ChapterFour/1208.Get-Equal-Substrings-Within-Budget.md deleted file mode 100755 index 5d0474f57..000000000 --- a/website/content/ChapterFour/1208.Get-Equal-Substrings-Within-Budget.md +++ /dev/null @@ -1,77 +0,0 @@ -# [1208. Get Equal Substrings Within Budget](https://leetcode.com/problems/get-equal-substrings-within-budget/) - - -## 题目 - -You are given two strings `s` and `t` of the same length. You want to change `s` to `t`. Changing the `i`-th character of `s` to `i`-th character of `t` costs `|s[i] - t[i]|` that is, the absolute difference between the ASCII values of the characters. - -You are also given an integer `maxCost`. - -Return the maximum length of a substring of `s` that can be changed to be the same as the corresponding substring of `t`with a cost less than or equal to `maxCost`. - -If there is no substring from `s` that can be changed to its corresponding substring from `t`, return `0`. - -**Example 1**: - - Input: s = "abcd", t = "bcdf", maxCost = 3 - Output: 3 - Explanation: "abc" of s can change to "bcd". That costs 3, so the maximum length is 3. - -**Example 2**: - - Input: s = "abcd", t = "cdef", maxCost = 3 - Output: 1 - Explanation: Each character in s costs 2 to change to charactor in t, so the maximum length is 1. - -**Example 3**: - - Input: s = "abcd", t = "acde", maxCost = 0 - Output: 1 - Explanation: You can't make any change, so the maximum length is 1. - -**Constraints:** - -- `1 <= s.length, t.length <= 10^5` -- `0 <= maxCost <= 10^6` -- `s` and `t` only contain lower case English letters. - -## 题目大意 - -给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。 - -用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。 - -提示: - -- 1 <= s.length, t.length <= 10^5 -- 0 <= maxCost <= 10^6 -- s 和 t 都只含小写英文字母。 - -## 解题思路 - -- 给出 2 个字符串 `s` 和 `t` 和一个“预算”,要求把“预算”尽可能的花完,`s` 中最多连续有几个字母能变成 `t` 中的字母。“预算”的定义是:|s[i] - t[i]| 。 -- 这一题是滑动窗口的题目,滑动窗口右边界每移动一格,就减少一定的预算,直到预算不能减少,再移动滑动窗口的左边界,这个时候注意要把预算还原回去。当整个窗口把字符 `s` 或 `t` 都滑动完了的时候,取出滑动过程中窗口的最大值即为结果。 - - -## 代码 - -```go - -package leetcode - -func equalSubstring(s string, t string, maxCost int) int { - left, right, res := 0, -1, 0 - for left < len(s) { - if right+1 < len(s) && maxCost-abs(int(s[right+1]-'a')-int(t[right+1]-'a')) >= 0 { - right++ - maxCost -= abs(int(s[right]-'a') - int(t[right]-'a')) - } else { - res = max(res, right-left+1) - maxCost += abs(int(s[left]-'a') - int(t[left]-'a')) - left++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1217.Play-with-Chips.md b/website/content/ChapterFour/1217.Play-with-Chips.md deleted file mode 100755 index 29eec710c..000000000 --- a/website/content/ChapterFour/1217.Play-with-Chips.md +++ /dev/null @@ -1,76 +0,0 @@ -# [1217. Play with Chips](https://leetcode.com/problems/play-with-chips/) - - -## 题目 - -There are some chips, and the i-th chip is at position `chips[i]`. - -You can perform any of the two following types of moves **any number of times** (possibly zero) **on any chip**: - -- Move the `i`-th chip by 2 units to the left or to the right with a cost of **0**. -- Move the `i`-th chip by 1 unit to the left or to the right with a cost of **1**. - -There can be two or more chips at the same position initially. - -Return the minimum cost needed to move all the chips to the same position (any position). - -**Example 1**: - - Input: chips = [1,2,3] - Output: 1 - Explanation: Second chip will be moved to positon 3 with cost 1. First chip will be moved to position 3 with cost 0. Total cost is 1. - -**Example 2**: - - Input: chips = [2,2,2,3,3] - Output: 2 - Explanation: Both fourth and fifth chip will be moved to position two with cost 1. Total minimum cost will be 2. - -**Constraints:** - -- `1 <= chips.length <= 100` -- `1 <= chips[i] <= 10^9` - - -## 题目大意 - - -数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以): - -- 将第 i 个筹码向左或者右移动 2 个单位,代价为 0。 -- 将第 i 个筹码向左或者右移动 1 个单位,代价为 1。 - -最开始的时候,同一位置上也可能放着两个或者更多的筹码。返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。 - - -提示: - -- 1 <= chips.length <= 100 -- 1 <= chips[i] <= 10^9 - - -## 解题思路 - -- 给出一个数组,数组的下标代表的是数轴上的坐标点,数组的元素代表的是砝码大小。砝码移动规则,左右移动 2 格,没有代价,左右移动 1 个,代价是 1 。问最终把砝码都移动到一个格子上,最小代价是多少。 -- 先解读砝码移动规则:偶数位置的到偶数位置的没有代价,奇数到奇数位置的没有代价。利用这个规则,我们可以把所有的砝码**无代价**的摞在一个奇数的位置上和一个偶数的位置上。这样我们只用关心这两个位置了。并且这两个位置可以连续在一起。最后一步即将相邻的这两摞砝码合并到一起。由于左右移动一个代价是 1,所以最小代价的操作是移动最少砝码的那一边。奇数位置上砝码少就移动奇数位置上的,偶数位置上砝码少就移动偶数位置上的。所以这道题解法变的异常简单,遍历一次数组,找到其中有多少个奇数和偶数位置的砝码,取其中比较少的,就是最终答案。 - - -## 代码 - -```go - -package leetcode - -func minCostToMoveChips(chips []int) int { - odd, even := 0, 0 - for _, c := range chips { - if c%2 == 0 { - even++ - } else { - odd++ - } - } - return min(odd, even) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1221.Split-a-String-in-Balanced-Strings.md b/website/content/ChapterFour/1221.Split-a-String-in-Balanced-Strings.md deleted file mode 100755 index 5a50681b3..000000000 --- a/website/content/ChapterFour/1221.Split-a-String-in-Balanced-Strings.md +++ /dev/null @@ -1,73 +0,0 @@ -# [1221. Split a String in Balanced Strings](https://leetcode.com/problems/split-a-string-in-balanced-strings/) - - -## 题目 - -Balanced strings are those who have equal quantity of 'L' and 'R' characters. - -Given a balanced string `s` split it in the maximum amount of balanced strings. - -Return the maximum amount of splitted balanced strings. - -**Example 1**: - - Input: s = "RLRRLLRLRL" - Output: 4 - Explanation: s can be split into "RL", "RRLL", "RL", "RL", each substring contains same number of 'L' and 'R'. - -**Example 2**: - - Input: s = "RLLLLRRRLR" - Output: 3 - Explanation: s can be split into "RL", "LLLRRR", "LR", each substring contains same number of 'L' and 'R'. - -**Example 3**: - - Input: s = "LLLLRRRR" - Output: 1 - Explanation: s can be split into "LLLLRRRR". - -**Constraints:** - -- `1 <= s.length <= 1000` -- `s[i] = 'L' or 'R'` - -## 题目大意 - - -在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的。给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。返回可以通过分割得到的平衡字符串的最大数量。 - -提示: - -- 1 <= s.length <= 1000 -- s[i] = 'L' 或 'R' - - -## 解题思路 - -- 给出一个字符串,要求把这个字符串切成一些子串,这些子串中 R 和 L 的字符数是相等的。问能切成多少个满足条件的子串。 -- 这道题是简单题,按照题意模拟即可。从左往右扫,遇到 `R` 就加一,遇到 `L` 就减一,当计数是 `0` 的时候就是平衡的时候,就切割。 - - -## 代码 - -```go - -package leetcode - -func balancedStringSplit(s string) int { - count, res := 0, 0 - for _, r := range s { - if r == 'R' { - count++ - } else { - count-- - } - if count == 0 { - res++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1232.Check-If-It-Is-a-Straight-Line.md b/website/content/ChapterFour/1232.Check-If-It-Is-a-Straight-Line.md deleted file mode 100755 index a6bdd744c..000000000 --- a/website/content/ChapterFour/1232.Check-If-It-Is-a-Straight-Line.md +++ /dev/null @@ -1,71 +0,0 @@ -# [1232. Check If It Is a Straight Line](https://leetcode.com/problems/check-if-it-is-a-straight-line/) - - -## 题目 - -You are given an array `coordinates`, `coordinates[i] = [x, y]`, where `[x, y]` represents the coordinate of a point. Check if these points make a straight line in the XY plane. - -**Example 1**: - -![](https://img.halfrost.com/Leetcode/leetcode_1232_1.png) - - Input: coordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]] - Output: true - -**Example 2**: - - -![](https://img.halfrost.com/Leetcode/leetcode_1232_2.png) - - Input: coordinates = [[1,1],[2,2],[3,4],[4,5],[5,6],[7,7]] - Output: false - -**Constraints:** - -- `2 <= coordinates.length <= 1000` -- `coordinates[i].length == 2` -- `-10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4` -- `coordinates` contains no duplicate point. - -## 题目大意 - - -在一个 XY 坐标系中有一些点,我们用数组 coordinates 来分别记录它们的坐标,其中 coordinates[i] = [x, y] 表示横坐标为 x、纵坐标为 y 的点。 - -请你来判断,这些点是否在该坐标系中属于同一条直线上,是则返回 true,否则请返回 false。 - -提示: - -- 2 <= coordinates.length <= 1000 -- coordinates[i].length == 2 -- -10^4 <= coordinates[i][0], coordinates[i][1] <= 10^4 -- coordinates 中不含重复的点 - - - -## 解题思路 - -- 给出一组坐标点,要求判断这些点是否在同一直线上。 -- 按照几何原理,依次计算这些点的斜率是否相等即可。斜率需要做除法,这里采用一个技巧是换成乘法。例如 `a/b = c/d` 换成乘法是 `a*d = c*d` 。 - - -## 代码 - -```go - -package leetcode - -func checkStraightLine(coordinates [][]int) bool { - dx0 := coordinates[1][0] - coordinates[0][0] - dy0 := coordinates[1][1] - coordinates[0][1] - for i := 1; i < len(coordinates)-1; i++ { - dx := coordinates[i+1][0] - coordinates[i][0] - dy := coordinates[i+1][1] - coordinates[i][1] - if dy*dx0 != dy0*dx { // check cross product - return false - } - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1234.Replace-the-Substring-for-Balanced-String.md b/website/content/ChapterFour/1234.Replace-the-Substring-for-Balanced-String.md deleted file mode 100755 index f5584b74f..000000000 --- a/website/content/ChapterFour/1234.Replace-the-Substring-for-Balanced-String.md +++ /dev/null @@ -1,93 +0,0 @@ -# [1234. Replace the Substring for Balanced String](https://leetcode.com/problems/replace-the-substring-for-balanced-string/) - - -## 题目 - -You are given a string containing only 4 kinds of characters `'Q',` `'W', 'E'` and `'R'`. - -A string is said to be **balanced** **if each of its characters appears `n/4` times where `n` is the length of the string. - -Return the minimum length of the substring that can be replaced with **any** other string of the same length to make the original string `s` **balanced**. - -Return 0 if the string is already **balanced**. - -**Example 1**: - - Input: s = "QWER" - Output: 0 - Explanation: s is already balanced. - -**Example 2**: - - Input: s = "QQWE" - Output: 1 - Explanation: We need to replace a 'Q' to 'R', so that "RQWE" (or "QRWE") is balanced. - -**Example 3**: - - Input: s = "QQQW" - Output: 2 - Explanation: We can replace the first "QQ" to "ER". - -**Example 4**: - - Input: s = "QQQQ" - Output: 3 - Explanation: We can replace the last 3 'Q' to make s = "QWER". - -**Constraints:** - -- `1 <= s.length <= 10^5` -- `s.length` is a multiple of `4` -- `s` contains only `'Q'`, `'W'`, `'E'` and `'R'`. - -## 题目大意 - - -有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串。假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」。你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。请返回待替换子串的最小可能长度。如果原字符串自身就是一个平衡字符串,则返回 0。 - -提示: - -- 1 <= s.length <= 10^5 -- s.length 是 4 的倍数 -- s 中只含有 'Q', 'W', 'E', 'R' 四种字符 - - - -## 解题思路 - -- 给出一个字符串,要求输出把这个字符串变成“平衡字符串”的最小替换字符串的长度(替换只能替换一串,不能单个字母替换)。“平衡字符串”的定义是:字符串中,`‘Q’`,`‘W’`,`‘E’`,`‘R’`,出现的次数当且仅当只有 `len(s)/4` 次。 -- 这一题是滑动窗口的题目。先统计 4 个字母的频次并计算出 `k = len(s)/4` 。滑动窗口向右滑动一次,对应右窗口的那个字母频次减 1,直到滑到所有字母的频次都 `≤ k` 的地方停止。此时,窗口外的字母的频次都 `≤ k` 了。这是只要变换窗口内字符串即可。但是这个窗口内还可能包含本来频次就小于 `k` 的字母,如果能把它们剔除掉,窗口可以进一步的减少。所以继续移动左边界,试探移动完左边界以后,是否所有字母频次都 `≤ k`。在所有窗口移动过程中取出最小值,即为最终答案。 -- 举个例子:`"WQWRQQQW"`。`w` 有 3 个,`Q` 有 4 个,`R` 有 1 个,`E` 有 0 个。最后平衡状态是每个字母 2 个,那么我们需要拿出 1 个 `W` 和 2 个 `Q` 替换掉。即要找到一个最短的字符串包含 1 个 `W` 和 2 个 `Q`。滑动窗口正好可以解决这个问题。向右滑到 `"WQWRQ"` 停止,这时窗口外的所有字母频次都 `≤ k` 了。这个窗口包含了多余的 1 个 `W`,和 1 个 `R`。`W` 可以踢除掉,那么要替换的字符串是 `"QWRQ"`。`R` 不能踢除了(因为要找包含 1 个 `W` 和 2 个 `Q` 的字符串) 。窗口不断的滑动,直到结束。这个例子中最小的字符串其实位于末尾,`"QQW"`。 - - -## 代码 - -```go - -package leetcode - -func balancedString(s string) int { - count, k := make([]int, 128), len(s)/4 - for _, v := range s { - count[int(v)]++ - } - left, right, res := 0, -1, len(s) - for left < len(s) { - if count['Q'] > k || count['W'] > k || count['E'] > k || count['R'] > k { - if right+1 < len(s) { - right++ - count[s[right]]-- - } else { - break - } - } else { - res = min(res, right-left+1) - count[s[left]]++ - left++ - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1235.Maximum-Profit-in-Job-Scheduling.md b/website/content/ChapterFour/1235.Maximum-Profit-in-Job-Scheduling.md deleted file mode 100755 index 915b54335..000000000 --- a/website/content/ChapterFour/1235.Maximum-Profit-in-Job-Scheduling.md +++ /dev/null @@ -1,118 +0,0 @@ -# [1235. Maximum Profit in Job Scheduling](https://leetcode.com/problems/maximum-profit-in-job-scheduling/) - - -## 题目 - -We have `n` jobs, where every job is scheduled to be done from `startTime[i]` to `endTime[i]`, obtaining a profit of `profit[i]`. - -You're given the `startTime` , `endTime` and `profit` arrays, you need to output the maximum profit you can take such that there are no 2 jobs in the subset with overlapping time range. - -If you choose a job that ends at time `X` you will be able to start another job that starts at time `X`. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/10/10/sample1_1584.png](https://assets.leetcode.com/uploads/2019/10/10/sample1_1584.png) - - Input: startTime = [1,2,3,3], endTime = [3,4,5,6], profit = [50,10,40,70] - Output: 120 - Explanation: The subset chosen is the first and fourth job. - Time range [1-3]+[3-6] , we get profit of 120 = 50 + 70. - -**Example 2**: - -![https://assets.leetcode.com/uploads/2019/10/10/sample22_1584.png](https://assets.leetcode.com/uploads/2019/10/10/sample22_1584.png) - - Input: startTime = [1,2,3,4,6], endTime = [3,5,10,6,9], profit = [20,20,100,70,60] - Output: 150 - Explanation: The subset chosen is the first, fourth and fifth job. - Profit obtained 150 = 20 + 70 + 60. - -**Example 3**: - -![https://assets.leetcode.com/uploads/2019/10/10/sample3_1584.png](https://assets.leetcode.com/uploads/2019/10/10/sample3_1584.png) - - Input: startTime = [1,1,1], endTime = [2,3,4], profit = [5,6,4] - Output: 6 - -**Constraints:** - -- `1 <= startTime.length == endTime.length == profit.length <= 5 * 10^4` -- `1 <= startTime[i] < endTime[i] <= 10^9` -- `1 <= profit[i] <= 10^4` - -## 题目大意 - - -你打算利用空闲时间来做兼职工作赚些零花钱。这里有 n 份兼职工作,每份工作预计从 startTime[i] 开始到 endTime[i] 结束,报酬为 profit[i]。给你一份兼职工作表,包含开始时间 startTime,结束时间 endTime 和预计报酬 profit 三个数组,请你计算并返回可以获得的最大报酬。注意,时间上出现重叠的 2 份工作不能同时进行。如果你选择的工作在时间 X 结束,那么你可以立刻进行在时间 X 开始的下一份工作。 - - -提示: - -- 1 <= startTime.length == endTime.length == profit.length <= 5 * 10^4 -- 1 <= startTime[i] < endTime[i] <= 10^9 -- 1 <= profit[i] <= 10^4 - - - -## 解题思路 - -- 给出一组任务,任务有开始时间,结束时间,和任务收益。一个任务开始还没有结束,中间就不能再安排其他任务。问如何安排任务,能使得最后收益最大? -- 一般任务的题目,区间的题目,都会考虑是否能排序。这一题可以先按照任务的结束时间从小到大排序,如果结束时间相同,则按照收益从小到大排序。`dp[i]` 代表前 `i` 份工作能获得的最大收益。初始值,`dp[0] = job[1].profit` 。对于任意一个任务 `i` ,看能否找到满足 `jobs[j].enTime <= jobs[j].startTime && j < i` 条件的 `j`,即查找 `upper_bound` 。由于 `jobs` 被我们排序了,所以这里可以使用二分搜索来查找。如果能找到满足条件的任务 j,那么状态转移方程是:`dp[i] = max(dp[i-1], jobs[i].profit)`。如果能找到满足条件的任务 j,那么状态转移方程是:`dp[i] = max(dp[i-1], dp[low]+jobs[i].profit)`。最终求得的解在 `dp[len(startTime)-1]` 中。 - - -## 代码 - -```go - -package leetcode - -import "sort" - -type job struct { - startTime int - endTime int - profit int -} - -func jobScheduling(startTime []int, endTime []int, profit []int) int { - jobs, dp := []job{}, make([]int, len(startTime)) - for i := 0; i < len(startTime); i++ { - jobs = append(jobs, job{startTime: startTime[i], endTime: endTime[i], profit: profit[i]}) - } - sort.Sort(sortJobs(jobs)) - dp[0] = jobs[0].profit - for i := 1; i < len(jobs); i++ { - low, high := 0, i-1 - for low < high { - mid := low + (high-low)>>1 - if jobs[mid+1].endTime <= jobs[i].startTime { - low = mid + 1 - } else { - high = mid - } - } - if jobs[low].endTime <= jobs[i].startTime { - dp[i] = max(dp[i-1], dp[low]+jobs[i].profit) - } else { - dp[i] = max(dp[i-1], jobs[i].profit) - } - } - return dp[len(startTime)-1] -} - -type sortJobs []job - -func (s sortJobs) Len() int { - return len(s) -} -func (s sortJobs) Less(i, j int) bool { - if s[i].endTime == s[j].endTime { - return s[i].profit < s[j].profit - } - return s[i].endTime < s[j].endTime -} -func (s sortJobs) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1252.Cells-with-Odd-Values-in-a-Matrix.md b/website/content/ChapterFour/1252.Cells-with-Odd-Values-in-a-Matrix.md deleted file mode 100755 index 14db287ae..000000000 --- a/website/content/ChapterFour/1252.Cells-with-Odd-Values-in-a-Matrix.md +++ /dev/null @@ -1,103 +0,0 @@ -# [1252. Cells with Odd Values in a Matrix](https://leetcode.com/problems/cells-with-odd-values-in-a-matrix/) - - -## 题目 - -Given `n` and `m` which are the dimensions of a matrix initialized by zeros and given an array `indices` where `indices[i] = [ri, ci]`. For each pair of `[ri, ci]` you have to increment all cells in row `ri` and column `ci` by 1. - -Return *the number of cells with odd values* in the matrix after applying the increment to all `indices`. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/10/30/e1.png](https://assets.leetcode.com/uploads/2019/10/30/e1.png) - - Input: n = 2, m = 3, indices = [[0,1],[1,1]] - Output: 6 - Explanation: Initial matrix = [[0,0,0],[0,0,0]]. - After applying first increment it becomes [[1,2,1],[0,1,0]]. - The final matrix will be [[1,3,1],[1,3,1]] which contains 6 odd numbers. - -**Example 2**: - -![https://assets.leetcode.com/uploads/2019/10/30/e2.png](https://assets.leetcode.com/uploads/2019/10/30/e2.png) - - Input: n = 2, m = 2, indices = [[1,1],[0,0]] - Output: 0 - Explanation: Final matrix = [[2,2],[2,2]]. There is no odd number in the final matrix. - -**Constraints:** - -- `1 <= n <= 50` -- `1 <= m <= 50` -- `1 <= indices.length <= 100` -- `0 <= indices[i][0] < n` -- `0 <= indices[i][1] < m` - -## 题目大意 - - -给你一个 n 行 m 列的矩阵,最开始的时候,每个单元格中的值都是 0。另有一个索引数组 indices,indices[i] = [ri, ci] 中的 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。你需要将每对 [ri, ci] 指定的行和列上的所有单元格的值加 1。请你在执行完所有 indices 指定的增量操作后,返回矩阵中 「奇数值单元格」 的数目。 - -提示: - -- 1 <= n <= 50 -- 1 <= m <= 50 -- 1 <= indices.length <= 100 -- 0 <= indices[i][0] < n -- 0 <= indices[i][1] < m - - -## 解题思路 - -- 给出一个 n * m 的矩阵,和一个数组,数组里面包含一些行列坐标,并在指定坐标上 + 1,问最后 n * m 的矩阵中奇数的总数。 -- 暴力方法按照题意模拟即可。 - - -## 代码 - -```go - -package leetcode - -// 解法一 暴力法 -func oddCells(n int, m int, indices [][]int) int { - matrix, res := make([][]int, n), 0 - for i := range matrix { - matrix[i] = make([]int, m) - } - for _, indice := range indices { - for i := 0; i < m; i++ { - matrix[indice[0]][i]++ - } - for j := 0; j < n; j++ { - matrix[j][indice[1]]++ - } - } - for _, m := range matrix { - for _, v := range m { - if v&1 == 1 { - res++ - } - } - } - return res -} - -// 解法二 暴力法 -func oddCells1(n int, m int, indices [][]int) int { - rows, cols, count := make([]int, n), make([]int, m), 0 - for _, pair := range indices { - rows[pair[0]]++ - cols[pair[1]]++ - } - for i := 0; i < n; i++ { - for j := 0; j < m; j++ { - if (rows[i]+cols[j])%2 == 1 { - count++ - } - } - } - return count -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1254.Number-of-Closed-Islands.md b/website/content/ChapterFour/1254.Number-of-Closed-Islands.md deleted file mode 100755 index 3ff8da1a2..000000000 --- a/website/content/ChapterFour/1254.Number-of-Closed-Islands.md +++ /dev/null @@ -1,110 +0,0 @@ -# [1254. Number of Closed Islands](https://leetcode.com/problems/number-of-closed-islands/) - - -## 题目 - -Given a 2D `grid` consists of `0s` (land) and `1s` (water). An *island* is a maximal 4-directionally connected group of `0s` and a *closed island* is an island **totally** (all left, top, right, bottom) surrounded by `1s.` - -Return the number of *closed islands*. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/10/31/sample_3_1610.png](https://assets.leetcode.com/uploads/2019/10/31/sample_3_1610.png) - - Input: grid = [[1,1,1,1,1,1,1,0],[1,0,0,0,0,1,1,0],[1,0,1,0,1,1,1,0],[1,0,0,0,0,1,0,1],[1,1,1,1,1,1,1,0]] - Output: 2 - Explanation: - Islands in gray are closed because they are completely surrounded by water (group of 1s). - -**Example 2**: - -![https://assets.leetcode.com/uploads/2019/10/31/sample_4_1610.png](https://assets.leetcode.com/uploads/2019/10/31/sample_4_1610.png) - - Input: grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]] - Output: 1 - -**Example 3**: - - Input: grid = [[1,1,1,1,1,1,1], - [1,0,0,0,0,0,1], - [1,0,1,1,1,0,1], - [1,0,1,0,1,0,1], - [1,0,1,1,1,0,1], - [1,0,0,0,0,0,1], - [1,1,1,1,1,1,1]] - Output: 2 - -**Constraints**: - -- `1 <= grid.length, grid[0].length <= 100` -- `0 <= grid[i][j] <=1` - -## 题目大意 - -有一个二维矩阵 grid ,每个位置要么是陆地(记号为 0 )要么是水域(记号为 1 )。我们从一块陆地出发,每次可以往上下左右 4 个方向相邻区域走,能走到的所有陆地区域,我们将其称为一座「岛屿」。如果一座岛屿 完全 由水域包围,即陆地边缘上下左右所有相邻区域都是水域,那么我们将其称为 「封闭岛屿」。请返回封闭岛屿的数目。 - -提示: - -- 1 <= grid.length, grid[0].length <= 100 -- 0 <= grid[i][j] <=1 - - -## 解题思路 - -- 给出一个地图,1 代表海水,0 代表陆地。要求找出四周都是海水的陆地的总个数。 -- 这一题和第 200 题解题思路完全一致。只不过这一题要求必须四周都是海水,第 200 题的陆地可以是靠着地图边缘的。在此题中,靠着地图边缘的陆地不能最终计数到结果中。 - -## 代码 - -```go - -package leetcode - -func closedIsland(grid [][]int) int { - m := len(grid) - if m == 0 { - return 0 - } - n := len(grid[0]) - if n == 0 { - return 0 - } - res, visited := 0, make([][]bool, m) - for i := 0; i < m; i++ { - visited[i] = make([]bool, n) - } - for i := 0; i < m; i++ { - for j := 0; j < n; j++ { - isEdge := false - if grid[i][j] == 0 && !visited[i][j] { - checkIslands(grid, &visited, i, j, &isEdge) - if !isEdge { - res++ - } - - } - } - } - return res -} - -func checkIslands(grid [][]int, visited *[][]bool, x, y int, isEdge *bool) { - if (x == 0 || x == len(grid)-1 || y == 0 || y == len(grid[0])-1) && grid[x][y] == 0 { - *isEdge = true - } - (*visited)[x][y] = true - for i := 0; i < 4; i++ { - nx := x + dir[i][0] - ny := y + dir[i][1] - if isIntInBoard(grid, nx, ny) && !(*visited)[nx][ny] && grid[nx][ny] == 0 { - checkIslands(grid, visited, nx, ny, isEdge) - } - } - *isEdge = *isEdge || false -} - -func isIntInBoard(board [][]int, x, y int) bool { - return x >= 0 && x < len(board) && y >= 0 && y < len(board[0]) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1260.Shift-2D-Grid.md b/website/content/ChapterFour/1260.Shift-2D-Grid.md deleted file mode 100644 index a63d3e771..000000000 --- a/website/content/ChapterFour/1260.Shift-2D-Grid.md +++ /dev/null @@ -1,90 +0,0 @@ -# [1260. Shift 2D Grid](https://leetcode.com/problems/shift-2d-grid/) - - -## 题目 - -Given a 2D `grid` of size `m x n` and an integer `k`. You need to shift the `grid` `k` times. - -In one shift operation: - -- Element at `grid[i][j]` moves to `grid[i][j + 1]`. -- Element at `grid[i][n - 1]` moves to `grid[i + 1][0]`. -- Element at `grid[m - 1][n - 1]` moves to `grid[0][0]`. - -Return the *2D grid* after applying shift operation `k` times. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/11/05/e1.png](https://assets.leetcode.com/uploads/2019/11/05/e1.png) - -``` -Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 -Output: [[9,1,2],[3,4,5],[6,7,8]] -``` - -**Example 2**: - -![https://assets.leetcode.com/uploads/2019/11/05/e2.png](https://assets.leetcode.com/uploads/2019/11/05/e2.png) - -``` -Input: grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 -Output: [[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]] -``` - -**Example 3**: - -``` -Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 -Output: [[1,2,3],[4,5,6],[7,8,9]] -``` - -**Constraints**: - -- `m == grid.length` -- `n == grid[i].length` -- `1 <= m <= 50` -- `1 <= n <= 50` -- `-1000 <= grid[i][j] <= 1000` -- `0 <= k <= 100` - -## 题目大意 - -给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。每次「迁移」操作将会引发下述活动: - -- 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。 -- 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。 -- 位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。 - -请你返回 k 次迁移操作后最终得到的 二维网格。 - - -## 解题思路 - -- 给一个矩阵和一个移动步数 k,要求把矩阵每个元素往后移动 k 步,最后的元素移动头部,循环移动,最后输出移动结束的矩阵。 -- 简单题,按照题意循环移动即可,注意判断边界情况。 - -## 代码 - -```go - -package leetcode - -func shiftGrid(grid [][]int, k int) [][]int { - x, y := len(grid[0]), len(grid) - newGrid := make([][]int, y) - for i := 0; i < y; i++ { - newGrid[i] = make([]int, x) - } - for i := 0; i < y; i++ { - for j := 0; j < x; j++ { - ny := (k / x) + i - if (j + (k % x)) >= x { - ny++ - } - newGrid[ny%y][(j+(k%x))%x] = grid[i][j] - } - } - return newGrid -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1266.Minimum-Time-Visiting-All-Points.md b/website/content/ChapterFour/1266.Minimum-Time-Visiting-All-Points.md deleted file mode 100755 index 5fe48f070..000000000 --- a/website/content/ChapterFour/1266.Minimum-Time-Visiting-All-Points.md +++ /dev/null @@ -1,75 +0,0 @@ -# [1266. Minimum Time Visiting All Points](https://leetcode.com/problems/minimum-time-visiting-all-points/) - - -## 题目 - -On a plane there are `n` points with integer coordinates `points[i] = [xi, yi]`. Your task is to find the minimum time in seconds to visit all points. - -You can move according to the next rules: - -- In one second always you can either move vertically, horizontally by one unit or diagonally (it means to move one unit vertically and one unit horizontally in one second). -- You have to visit the points in the same order as they appear in the array. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/11/14/1626_example_1.PNG](https://assets.leetcode.com/uploads/2019/11/14/1626_example_1.PNG) - - Input: points = [[1,1],[3,4],[-1,0]] - Output: 7 - Explanation: One optimal path is [1,1] -> [2,2] -> [3,3] -> [3,4] -> [2,3] -> [1,2] -> [0,1] -> [-1,0] - Time from [1,1] to [3,4] = 3 seconds - Time from [3,4] to [-1,0] = 4 seconds - Total time = 7 seconds - -**Example 2**: - - Input: points = [[3,2],[-2,2]] - Output: 5 - -**Constraints:** - -- `points.length == n` -- `1 <= n <= 100` -- `points[i].length == 2` -- `-1000 <= points[i][0], points[i][1] <= 1000` - -## 题目大意 - - -平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi]。请你计算访问所有这些点需要的最小时间(以秒为单位)。你可以按照下面的规则在平面上移动: - -- 每一秒沿水平或者竖直方向移动一个单位长度,或者跨过对角线(可以看作在一秒内向水平和竖直方向各移动一个单位长度)。 -- 必须按照数组中出现的顺序来访问这些点。 - -提示: - -- points.length == n -- 1 <= n <= 100 -- points[i].length == 2 -- -1000 <= points[i][0], points[i][1] <= 1000 - - - - - -## 解题思路 - -- 在直角坐标系上给出一个数组,数组里面的点是飞机飞行经过的点。飞机飞行只能沿着水平方向、垂直方向、45°方向飞行。问飞机经过所有点的最短时间。 -- 简单的数学问题。依次遍历数组,分别计算 x 轴和 y 轴上的差值,取最大值即是这两点之间飞行的最短时间。最后累加每次计算的最大值就是最短时间。 - - -## 代码 - -```go - -package leetcode - -func minTimeToVisitAllPoints(points [][]int) int { - res := 0 - for i := 1; i < len(points); i++ { - res += max(abs(points[i][0]-points[i-1][0]), abs(points[i][1]-points[i-1][1])) - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1275.Find-Winner-on-a-Tic-Tac-Toe-Game.md b/website/content/ChapterFour/1275.Find-Winner-on-a-Tic-Tac-Toe-Game.md deleted file mode 100644 index d019be1cb..000000000 --- a/website/content/ChapterFour/1275.Find-Winner-on-a-Tic-Tac-Toe-Game.md +++ /dev/null @@ -1,154 +0,0 @@ -# [1275. Find Winner on a Tic Tac Toe Game](https://leetcode.com/problems/find-winner-on-a-tic-tac-toe-game/) - - -## 题目 - -Tic-tac-toe is played by two players *A* and *B* on a 3 x 3 grid. - -Here are the rules of Tic-Tac-Toe: - -- Players take turns placing characters into empty squares (" "). -- The first player *A* always places "X" characters, while the second player *B* always places "O" characters. -- "X" and "O" characters are always placed into empty squares, never on filled ones. -- The game ends when there are 3 of the same (non-empty) character filling any row, column, or diagonal. -- The game also ends if all squares are non-empty. -- No more moves can be played if the game is over. - -Given an array `moves` where each element is another array of size 2 corresponding to the row and column of the grid where they mark their respective character in the order in which *A* and *B* play. - -Return the winner of the game if it exists (*A* or *B*), in case the game ends in a draw return "Draw", if there are still movements to play return "Pending". - -You can assume that `moves` is **valid** (It follows the rules of Tic-Tac-Toe), the grid is initially empty and *A* will play **first**. - -**Example 1**: - -``` -Input: moves = [[0,0],[2,0],[1,1],[2,1],[2,2]] -Output: "A" -Explanation: "A" wins, he always plays first. -"X " "X " "X " "X " "X " -" " -> " " -> " X " -> " X " -> " X " -" " "O " "O " "OO " "OOX" - -``` - -**Example 2**: - -``` -Input: moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]] -Output: "B" -Explanation: "B" wins. -"X " "X " "XX " "XXO" "XXO" "XXO" -" " -> " O " -> " O " -> " O " -> "XO " -> "XO " -" " " " " " " " " " "O " - -``` - -**Example 3**: - -``` -Input: moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]] -Output: "Draw" -Explanation: The game ends in a draw since there are no moves to make. -"XXO" -"OOX" -"XOX" - -``` - -**Example 4**: - -``` -Input: moves = [[0,0],[1,1]] -Output: "Pending" -Explanation: The game has not finished yet. -"X " -" O " -" " - -``` - -**Constraints:** - -- `1 <= moves.length <= 9` -- `moves[i].length == 2` -- `0 <= moves[i][j] <= 2` -- There are no repeated elements on `moves`. -- `moves` follow the rules of tic tac toe. - - -## 题目大意 - -A 和 B 在一个 3 x 3 的网格上玩井字棋。井字棋游戏的规则如下: - -- 玩家轮流将棋子放在空方格 (" ") 上。 -- 第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子。 -- "X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上。 -- 只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。 -- 如果所有方块都放满棋子(不为空),游戏也会结束。 -- 游戏结束后,棋子无法再进行任何移动。 - -给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各自的棋子位置。如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 "Draw";如果仍会有行动(游戏未结束),则返回 "Pending"。你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。 - -提示: - -- 1 <= moves.length <= 9 -- moves[i].length == 2 -- 0 <= moves[i][j] <= 2 -- moves 里没有重复的元素。 -- moves 遵循井字棋的规则。 - - -## 解题思路 - -- 两人玩 3*3 井字棋,A 先走,B 再走。谁能获胜就输出谁,如果平局输出 “Draw”,如果游戏还未结束,输出 “Pending”。游戏规则:谁能先占满行、列或者对角线任意一条线,谁就赢。 -- 简单题。题目给定 move 数组最多 3 步,而要赢得比赛,必须走满 3 步,所以可以先模拟,按照给的步数数组把 A 和 B 的步数都放在棋盘上。然后依次判断行、列,对角线的三种情况。如果都判完了,剩下的情况就是平局和死局的情况。 - -## 代码 - -```go - -package leetcode - -func tictactoe(moves [][]int) string { - board := [3][3]byte{} - for i := 0; i < len(moves); i++ { - if i%2 == 0 { - board[moves[i][0]][moves[i][1]] = 'X' - } else { - board[moves[i][0]][moves[i][1]] = 'O' - } - } - for i := 0; i < 3; i++ { - if board[i][0] == 'X' && board[i][1] == 'X' && board[i][2] == 'X' { - return "A" - } - if board[i][0] == 'O' && board[i][1] == 'O' && board[i][2] == 'O' { - return "B" - } - if board[0][i] == 'X' && board[1][i] == 'X' && board[2][i] == 'X' { - return "A" - } - if board[0][i] == 'O' && board[1][i] == 'O' && board[2][i] == 'O' { - return "B" - } - } - if board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X' { - return "A" - } - if board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O' { - return "B" - } - if board[0][2] == 'X' && board[1][1] == 'X' && board[2][0] == 'X' { - return "A" - } - if board[0][2] == 'O' && board[1][1] == 'O' && board[2][0] == 'O' { - return "B" - } - if len(moves) < 9 { - return "Pending" - } - return "Draw" -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1281.Subtract-the-Product-and-Sum-of-Digits-of-an-Integer.md b/website/content/ChapterFour/1281.Subtract-the-Product-and-Sum-of-Digits-of-an-Integer.md deleted file mode 100644 index 96cc347d9..000000000 --- a/website/content/ChapterFour/1281.Subtract-the-Product-and-Sum-of-Digits-of-an-Integer.md +++ /dev/null @@ -1,59 +0,0 @@ -# [1281. Subtract the Product and Sum of Digits of an Integer](https://leetcode.com/problems/subtract-the-product-and-sum-of-digits-of-an-integer/) - - - -## 题目 - -Given an integer number `n`, return the difference between the product of its digits and the sum of its digits. - -**Example 1**: - -``` -Input: n = 234 -Output: 15 -Explanation: -Product of digits = 2 * 3 * 4 = 24 -Sum of digits = 2 + 3 + 4 = 9 -Result = 24 - 9 = 15 -``` - -**Example 2**: - -``` -Input: n = 4421 -Output: 21 -Explanation: -Product of digits = 4 * 4 * 2 * 1 = 32 -Sum of digits = 4 + 4 + 2 + 1 = 11 -Result = 32 - 11 = 21 -``` - -**Constraints**: - -- `1 <= n <= 10^5` - -## 题目大意 - -给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 - -提示: - -- 1 <= n <= 10^5 - -## 解题思路 - -- 给出一个数,计算这个数每位数字乘积减去每位数字累加的差值。 -- 简单题,按照题意输入输出即可。 - -## 代码 - -```go -func subtractProductAndSum(n int) int { - sum, product := 0, 1 - for ; n > 0; n /= 10 { - sum += n % 10 - product *= n % 10 - } - return product - sum -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1283.Find-the-Smallest-Divisor-Given-a-Threshold.md b/website/content/ChapterFour/1283.Find-the-Smallest-Divisor-Given-a-Threshold.md deleted file mode 100644 index f0359723b..000000000 --- a/website/content/ChapterFour/1283.Find-the-Smallest-Divisor-Given-a-Threshold.md +++ /dev/null @@ -1,87 +0,0 @@ -# [1283. Find the Smallest Divisor Given a Threshold](https://leetcode.com/problems/find-the-smallest-divisor-given-a-threshold/) - - - -## 题目 - -Given an array of integers `nums` and an integer `threshold`, we will choose a positive integer divisor and divide all the array by it and sum the result of the division. Find the **smallest** divisor such that the result mentioned above is less than or equal to `threshold`. - -Each result of division is rounded to the nearest integer greater than or equal to that element. (For example: 7/3 = 3 and 10/2 = 5). - -It is guaranteed that there will be an answer. - -**Example 1**: - -``` -Input: nums = [1,2,5,9], threshold = 6 -Output: 5 -Explanation: We can get a sum to 17 (1+2+5+9) if the divisor is 1. -If the divisor is 4 we can get a sum to 7 (1+1+2+3) and if the divisor is 5 the sum will be 5 (1+1+1+2). -``` - -**Example 2**: - -``` -Input: nums = [2,3,5,7,11], threshold = 11 -Output: 3 -``` - -**Example 3**: - -``` -Input: nums = [19], threshold = 5 -Output: 4 -``` - -**Constraints**: - -- `1 <= nums.length <= 5 * 10^4` -- `1 <= nums[i] <= 10^6` -- `nums.length <= threshold <= 10^6` - -## 题目大意 - -给你一个整数数组 nums 和一个正整数 threshold  ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。请你找出能够使上述结果小于等于阈值 threshold 的除数中 最小 的那个。每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。题目保证一定有解。 - -提示: - -- 1 <= nums.length <= 5 * 10^4 -- 1 <= nums[i] <= 10^6 -- nums.length <= threshold <= 10^6 - -## 解题思路 - -- 给出一个数组和一个阈值,要求找到一个除数,使得数组里面每个数和这个除数的商之和不超过这个阈值。求除数的最小值。 -- 这一题是典型的二分搜索的题目。根据题意,在 [1, 1000000] 区间内搜索除数,针对每次 `mid`,计算一次商的累加和。如果和比 `threshold` 小,说明除数太大,所以缩小右区间;如果和比 `threshold` 大,说明除数太小,所以缩小左区间。最终找到的 `low` 值就是最求的最小除数。 - -## 代码 - -```go -func smallestDivisor(nums []int, threshold int) int { - low, high := 1, 1000000 - for low < high { - mid := low + (high-low)>>1 - if calDivisor(nums, mid, threshold) { - high = mid - } else { - low = mid + 1 - } - } - return low -} - -func calDivisor(nums []int, mid, threshold int) bool { - sum := 0 - for i := range nums { - if nums[i]%mid != 0 { - sum += nums[i]/mid + 1 - } else { - sum += nums[i] / mid - } - } - if sum <= threshold { - return true - } - return false -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1287.Element-Appearing-More-Than-25-In-Sorted-Array.md b/website/content/ChapterFour/1287.Element-Appearing-More-Than-25-In-Sorted-Array.md deleted file mode 100644 index f9714a4dd..000000000 --- a/website/content/ChapterFour/1287.Element-Appearing-More-Than-25-In-Sorted-Array.md +++ /dev/null @@ -1,49 +0,0 @@ -# [1287. Element Appearing More Than 25% In Sorted Array](https://leetcode.com/problems/element-appearing-more-than-25-in-sorted-array/) - - - -## 题目 - -Given an integer array **sorted** in non-decreasing order, there is exactly one integer in the array that occurs more than 25% of the time. - -Return that integer. - -**Example 1**: - -``` -Input: arr = [1,2,2,6,6,6,6,7,10] -Output: 6 -``` - -**Constraints**: - -- `1 <= arr.length <= 10^4` -- `0 <= arr[i] <= 10^5` - -## 题目大意 - -给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。请你找到并返回这个整数。 - -提示: - -- 1 <= arr.length <= 10^4 -- 0 <= arr[i] <= 10^5 - -## 解题思路 - -- 给出一个非递减的有序数组,要求输出出现次数超过数组元素总数 25% 的元素。 -- 简单题,由于已经非递减有序了,所以只需要判断 `arr[i] == arr[i+n/4]` 是否相等即可。 - -## 代码 - -```go -func findSpecialInteger(arr []int) int { - n := len(arr) - for i := 0; i < n-n/4; i++ { - if arr[i] == arr[i+n/4] { - return arr[i] - } - } - return -1 -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer.md b/website/content/ChapterFour/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer.md deleted file mode 100644 index 1c0f9be17..000000000 --- a/website/content/ChapterFour/1290.Convert-Binary-Number-in-a-Linked-List-to-Integer.md +++ /dev/null @@ -1,81 +0,0 @@ -# [1290. Convert Binary Number in a Linked List to Integer](https://leetcode.com/problems/convert-binary-number-in-a-linked-list-to-integer/) - - - -## 题目 - -Given `head` which is a reference node to a singly-linked list. The value of each node in the linked list is either 0 or 1. The linked list holds the binary representation of a number. - -Return the *decimal value* of the number in the linked list. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/12/05/graph-1.png](https://assets.leetcode.com/uploads/2019/12/05/graph-1.png) - -``` -Input: head = [1,0,1] -Output: 5 -Explanation: (101) in base 2 = (5) in base 10 -``` - -**Example 2**: - -``` -Input: head = [0] -Output: 0 -``` - -**Example 3**: - -``` -Input: head = [1] -Output: 1 -``` - -**Example 4**: - -``` -Input: head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0] -Output: 18880 -``` - -**Example 5**: - -``` -Input: head = [0,0] -Output: 0 -``` - -**Constraints**: - -- The Linked List is not empty. -- Number of nodes will not exceed `30`. -- Each node's value is either `0` or `1`. - -## 题目大意 - -给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。 - -提示: - -- 链表不为空。 -- 链表的结点总数不超过 30。 -- 每个结点的值不是 0 就是 1。 - -## 解题思路 - -- 给出一个链表,链表从头到尾表示的数是一个整数的二进制形式,要求输出这个整数的十进制。 -- 简单题,从头到尾遍历一次链表,边遍历边累加二进制位。 - -## 代码 - -```go -func getDecimalValue(head *ListNode) int { - sum := 0 - for head != nil { - sum = sum*2 + head.Val - head = head.Next - } - return sum -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1295.Find-Numbers-with-Even-Number-of-Digits.md b/website/content/ChapterFour/1295.Find-Numbers-with-Even-Number-of-Digits.md deleted file mode 100644 index ccaa6c492..000000000 --- a/website/content/ChapterFour/1295.Find-Numbers-with-Even-Number-of-Digits.md +++ /dev/null @@ -1,63 +0,0 @@ -# [1295. Find Numbers with Even Number of Digits](https://leetcode.com/problems/find-numbers-with-even-number-of-digits/) - - - -## 题目 - -Given an array `nums` of integers, return how many of them contain an **even number** of digits. - -**Example 1**: - -``` -Input: nums = [12,345,2,6,7896] -Output: 2 -Explanation: -12 contains 2 digits (even number of digits). -345 contains 3 digits (odd number of digits). -2 contains 1 digit (odd number of digits). -6 contains 1 digit (odd number of digits). -7896 contains 4 digits (even number of digits). -Therefore only 12 and 7896 contain an even number of digits. -``` - -**Example 2**: - -``` -Input: nums = [555,901,482,1771] -Output: 1 -Explanation: -Only 1771 contains an even number of digits. -``` - -**Constraints**: - -- `1 <= nums.length <= 500` -- `1 <= nums[i] <= 10^5` - -## 题目大意 - -给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。 - -提示: - -- 1 <= nums.length <= 500 -- 1 <= nums[i] <= 10^5 - - - -## 解题思路 - -- 给你一个整数数组,要求输出位数为偶数的数字的个数。 -- 简单题,把每个数字转换为字符串判断长度是否是偶数即可。 - -## 代码 - -```go -func findNumbers(nums []int) int { - res := 0 - for _, n := range nums { - res += 1 - len(strconv.Itoa(n))%2 - } - return res -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1299.Replace-Elements-with-Greatest-Element-on-Right-Side.md b/website/content/ChapterFour/1299.Replace-Elements-with-Greatest-Element-on-Right-Side.md deleted file mode 100644 index 633c65761..000000000 --- a/website/content/ChapterFour/1299.Replace-Elements-with-Greatest-Element-on-Right-Side.md +++ /dev/null @@ -1,51 +0,0 @@ -# [1299. Replace Elements with Greatest Element on Right Side](https://leetcode.com/problems/replace-elements-with-greatest-element-on-right-side/) - - - -## 题目 - -Given an array `arr`, replace every element in that array with the greatest element among the elements to its right, and replace the last element with `-1`. - -After doing so, return the array. - -**Example 1**: - -``` -Input: arr = [17,18,5,4,6,1] -Output: [18,6,6,6,1,-1] -``` - -**Constraints**: - -- `1 <= arr.length <= 10^4` -- `1 <= arr[i] <= 10^5` - - -## 题目大意 - -给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。完成所有替换操作后,请你返回这个数组。 - -提示: - -- 1 <= arr.length <= 10^4 -- 1 <= arr[i] <= 10^5 - - -## 解题思路 - -- 给出一个数组,要求把所有元素都替换成自己右边最大的元素,最后一位补上 -1 。最后输出变化以后的数组。 -- 简单题,按照题意操作即可。 - -## 代码 - -```go -func replaceElements(arr []int) []int { - j, temp := -1, 0 - for i := len(arr) - 1; i >= 0; i-- { - temp = arr[i] - arr[i] = j - j = max(j, temp) - } - return arr -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1302.Deepest-Leaves-Sum.md b/website/content/ChapterFour/1302.Deepest-Leaves-Sum.md deleted file mode 100644 index 70482634f..000000000 --- a/website/content/ChapterFour/1302.Deepest-Leaves-Sum.md +++ /dev/null @@ -1,58 +0,0 @@ -# [1302. Deepest Leaves Sum](https://leetcode.com/problems/deepest-leaves-sum/) - - - -## 题目 - -Given a binary tree, return the sum of values of its deepest leaves. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/07/31/1483_ex1.png](https://assets.leetcode.com/uploads/2019/07/31/1483_ex1.png) - -``` -Input: root = [1,2,3,4,5,null,6,7,null,null,null,null,8] -Output: 15 -``` - -**Constraints**: - -- The number of nodes in the tree is between `1` and `10^4`. -- The value of nodes is between `1` and `100`. - -## 题目大意 - -给你一棵二叉树,请你返回层数最深的叶子节点的和。 - -提示: - -- 树中节点数目在 1 到 10^4 之间。 -- 每个节点的值在 1 到 100 之间。 - -## 解题思路 - -- 给你一棵二叉树,请你返回层数最深的叶子节点的和。 -- 这一题不难,DFS 遍历把最底层的叶子节点和都加起来即可。 - -## 代码 - -```go -func deepestLeavesSum(root *TreeNode) int { - maxLevel, sum := 0, 0 - dfsDeepestLeavesSum(root, 0, &maxLevel, &sum) - return sum -} - -func dfsDeepestLeavesSum(root *TreeNode, level int, maxLevel, sum *int) { - if root == nil { - return - } - if level > *maxLevel { - *maxLevel, *sum = level, root.Val - } else if level == *maxLevel { - *sum += root.Val - } - dfsDeepestLeavesSum(root.Left, level+1, maxLevel, sum) - dfsDeepestLeavesSum(root.Right, level+1, maxLevel, sum) -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1304.Find-N-Unique-Integers-Sum-up-to-Zero.md b/website/content/ChapterFour/1304.Find-N-Unique-Integers-Sum-up-to-Zero.md deleted file mode 100644 index 1e15836e3..000000000 --- a/website/content/ChapterFour/1304.Find-N-Unique-Integers-Sum-up-to-Zero.md +++ /dev/null @@ -1,62 +0,0 @@ -# [1304. Find N Unique Integers Sum up to Zero](https://leetcode.com/problems/find-n-unique-integers-sum-up-to-zero/) - - - -## 题目 - -Given an integer `n`, return **any** array containing `n` **unique** integers such that they add up to 0. - -**Example 1**: - -``` -Input: n = 5 -Output: [-7,-1,1,3,4] -Explanation: These arrays also are accepted [-5,-1,1,2,3] , [-3,-1,2,-2,4]. -``` - -**Example 2**: - -``` -Input: n = 3 -Output: [-1,0,1] -``` - -**Example 3**: - -``` -Input: n = 1 -Output: [0] -``` - -**Constraints**: - -- `1 <= n <= 1000` - -## 题目大意 - -给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。 - -提示: - -- 1 <= n <= 1000 - -## 解题思路 - -- 给出一个数 n,输出一个有 n 个数的数组,里面元素之和为 0 。 -- 简单题,简单循环即可。 - -## 代码 - -```go -func sumZero(n int) []int { - res, left, right, start := make([]int, n), 0, n-1, 1 - for left < right { - res[left] = start - res[right] = -start - start++ - left = left + 1 - right = right - 1 - } - return res -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1305.All-Elements-in-Two-Binary-Search-Trees.md b/website/content/ChapterFour/1305.All-Elements-in-Two-Binary-Search-Trees.md deleted file mode 100644 index 247bbfbbe..000000000 --- a/website/content/ChapterFour/1305.All-Elements-in-Two-Binary-Search-Trees.md +++ /dev/null @@ -1,90 +0,0 @@ -# [1305. All Elements in Two Binary Search Trees](https://leetcode.com/problems/all-elements-in-two-binary-search-trees/) - - - -## 题目 - -Given two binary search trees `root1` and `root2`. - -Return a list containing *all the integers* from *both trees* sorted in **ascending** order. - -**Example 1**: - -![https://assets.leetcode.com/uploads/2019/12/18/q2-e1.png](https://assets.leetcode.com/uploads/2019/12/18/q2-e1.png) - -``` -Input: root1 = [2,1,4], root2 = [1,0,3] -Output: [0,1,1,2,3,4] -``` - -**Example 2**: - -``` -Input: root1 = [0,-10,10], root2 = [5,1,7,0,2] -Output: [-10,0,0,1,2,5,7,10] -``` - -**Example 3**: - -``` -Input: root1 = [], root2 = [5,1,7,0,2] -Output: [0,1,2,5,7] -``` - -**Example 4**: - -``` -Input: root1 = [0,-10,10], root2 = [] -Output: [-10,0,10] -``` - -**Example 5**: - -![https://assets.leetcode.com/uploads/2019/12/18/q2-e5-.png](https://assets.leetcode.com/uploads/2019/12/18/q2-e5-.png) - -``` -Input: root1 = [1,null,8], root2 = [8,1] -Output: [1,1,8,8] -``` - -**Constraints**: - -- Each tree has at most `5000` nodes. -- Each node's value is between `[-10^5, 10^5]`. - -## 题目大意 - -给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。. - -提示: - -- 每棵树最多有 5000 个节点。 -- 每个节点的值在 [-10^5, 10^5] 之间。 - - -## 解题思路 - -- 给出 2 棵二叉排序树,要求将 2 棵树所有节点的值按照升序排序。 -- 这一题最暴力简单的方法就是把 2 棵树的节点都遍历出来,然后放在一个数组里面从小到大排序即可。这样做虽然能 AC,但是时间复杂度高。因为题目中给的二叉排序树这一条件没有用上。由于树中节点本来已经有序了,所以题目实质想要我们合并 2 个有序数组。利用中根遍历,把 2 个二叉排序树的所有节点值都遍历出来,遍历出来以后就是有序的。接下来再合并这两个有序数组即可。合并 2 个有序数组是第 88 题。 - -## 代码 - -```go -// 解法一 合并排序 -func getAllElements(root1 *TreeNode, root2 *TreeNode) []int { - arr1 := inorderTraversal(root1) - arr2 := inorderTraversal(root2) - arr1 = append(arr1, make([]int, len(arr2))...) - merge(arr1, len(arr1)-len(arr2), arr2, len(arr2)) - return arr1 -} - -// 解法二 暴力遍历排序,时间复杂度高 -func getAllElements1(root1 *TreeNode, root2 *TreeNode) []int { - arr := []int{} - arr = append(arr, preorderTraversal(root1)...) - arr = append(arr, preorderTraversal(root2)...) - sort.Ints(arr) - return arr -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1306.Jump-Game-III.md b/website/content/ChapterFour/1306.Jump-Game-III.md deleted file mode 100644 index 63f26345a..000000000 --- a/website/content/ChapterFour/1306.Jump-Game-III.md +++ /dev/null @@ -1,80 +0,0 @@ -# [1306. Jump Game III](https://leetcode.com/problems/jump-game-iii/) - - -## 题目 - -Given an array of non-negative integers `arr`, you are initially positioned at `start` index of the array. When you are at index `i`, you can jump to `i + arr[i]` or `i - arr[i]`, check if you can reach to **any** index with value 0. - -Notice that you can not jump outside of the array at any time. - -**Example 1**: - -``` -Input: arr = [4,2,3,0,3,1,2], start = 5 -Output: true -Explanation: -All possible ways to reach at index 3 with value 0 are: -index 5 -> index 4 -> index 1 -> index 3 -index 5 -> index 6 -> index 4 -> index 1 -> index 3 -``` - -**Example 2**: - -``` -Input: arr = [4,2,3,0,3,1,2], start = 0 -Output: true -Explanation: -One possible way to reach at index 3 with value 0 is: -index 0 -> index 4 -> index 1 -> index 3 -``` - -**Example 3**: - -``` -Input: arr = [3,0,2,1,2], start = 2 -Output: false -Explanation: There is no way to reach at index 1 with value 0. -``` - -**Constraints**: - -- `1 <= arr.length <= 5 * 10^4` -- `0 <= arr[i] < arr.length` -- `0 <= start < arr.length` - - -## 题目大意 - -这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。注意,不管是什么情况下,你都无法跳到数组之外。 - -提示: - -- 1 <= arr.length <= 5 * 10^4 -- 0 <= arr[i] < arr.length -- 0 <= start < arr.length - - -## 解题思路 - -- 给出一个非负数组和一个起始下标 `start`。站在 `start`,每次可以跳到 `i + arr[i]` 或者 `i - arr[i]` 。要求判断能否跳到元素值为 0 的下标处。 -- 这一题考察的是递归。每一步都需要判断 3 种可能: - 1. 当前是否站在元素值为 0 的目标点上。 - 2. 往前跳 arr[start],是否能站在元素值为 0 的目标点上。 - 3. 往后跳 arr[start],是否能站在元素值为 0 的目标点上。 - - 第 2 种可能和第 3 种可能递归即可,每一步都判断这 3 种可能是否有一种能跳到元素值为 0 的下标处。 - -- `arr[start] += len(arr)` 这一步仅仅只是为了标记此下标已经用过了,下次判断的时候该下标会被 `if` 条件筛选掉。 - -## 代码 - -```go -func canReach(arr []int, start int) bool { - if start >= 0 && start < len(arr) && arr[start] < len(arr) { - jump := arr[start] - arr[start] += len(arr) - return jump == 0 || canReach(arr, start+jump) || canReach(arr, start-jump) - } - return false -} -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1313.Decompress-Run-Length-Encoded-List.md b/website/content/ChapterFour/1313.Decompress-Run-Length-Encoded-List.md deleted file mode 100644 index 645d90578..000000000 --- a/website/content/ChapterFour/1313.Decompress-Run-Length-Encoded-List.md +++ /dev/null @@ -1,60 +0,0 @@ -# [1313. Decompress Run-Length Encoded List](https://leetcode.com/problems/decompress-run-length-encoded-list/) - - -## 题目 - -We are given a list `nums` of integers representing a list compressed with run-length encoding. - -Consider each adjacent pair of elements `[freq, val] = [nums[2*i], nums[2*i+1]]` (with `i >= 0`). For each such pair, there are `freq` elements with value `val` concatenated in a sublist. Concatenate all the sublists from left to right to generate the decompressed list. - -Return the decompressed list. - -**Example 1**: - -``` -Input: nums = [1,2,3,4] -Output: [2,4,4,4] -Explanation: The first pair [1,2] means we have freq = 1 and val = 2 so we generate the array [2]. -The second pair [3,4] means we have freq = 3 and val = 4 so we generate [4,4,4]. -At the end the concatenation [2] + [4,4,4] is [2,4,4,4]. -``` - -**Example 2**: - -``` -Input: nums = [1,1,2,3] -Output: [1,3,3] -``` - -**Constraints**: - -- `2 <= nums.length <= 100` -- `nums.length % 2 == 0` -- `1 <= nums[i] <= 100` - -## 题目大意 - -给你一个以行程长度编码压缩的整数列表 nums 。考虑每对相邻的两个元素 [freq, val] = [nums[2*i], nums[2*i+1]] (其中 i >= 0 ),每一对都表示解压后子列表中有 freq 个值为 val 的元素,你需要从左到右连接所有子列表以生成解压后的列表。请你返回解压后的列表。 - -## 解题思路 - -- 给定一个带编码长度的数组,要求解压这个数组。 -- 简单题。按照题目要求,下标从 0 开始,奇数位下标为前一个下标对应元素重复次数,那么就把这个元素 append 几次。最终输出解压后的数组即可。 - -## 代码 - -```go - -package leetcode - -func decompressRLElist(nums []int) []int { - res := []int{} - for i := 0; i < len(nums); i += 2 { - for j := 0; j < nums[i]; j++ { - res = append(res, nums[i+1]) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1317.Convert-Integer-to-the-Sum-of-Two-No-Zero-Integers.md b/website/content/ChapterFour/1317.Convert-Integer-to-the-Sum-of-Two-No-Zero-Integers.md deleted file mode 100644 index b7871908f..000000000 --- a/website/content/ChapterFour/1317.Convert-Integer-to-the-Sum-of-Two-No-Zero-Integers.md +++ /dev/null @@ -1,96 +0,0 @@ -# [1317. Convert Integer to the Sum of Two No-Zero Integers](https://leetcode.com/problems/convert-integer-to-the-sum-of-two-no-zero-integers/) - - -## 题目 - -Given an integer `n`. No-Zero integer is a positive integer which **doesn't contain any 0** in its decimal representation. - -Return *a list of two integers* `[A, B]` where: - -- `A` and `B` are No-Zero integers. -- `A + B = n` - -It's guarateed that there is at least one valid solution. If there are many valid solutions you can return any of them. - -**Example 1**: - -``` -Input: n = 2 -Output: [1,1] -Explanation: A = 1, B = 1. A + B = n and both A and B don't contain any 0 in their decimal representation. -``` - -**Example 2**: - -``` -Input: n = 11 -Output: [2,9] -``` - -**Example 3**: - -``` -Input: n = 10000 -Output: [1,9999] -``` - -**Example 4**: - -``` -Input: n = 69 -Output: [1,68] -``` - -**Example 5**: - -``` -Input: n = 1010 -Output: [11,999] -``` - -**Constraints**: - -- `2 <= n <= 10^4` - -## 题目大意 - -「无零整数」是十进制表示中 不含任何 0 的正整数。给你一个整数 n,请你返回一个 由两个整数组成的列表 [A, B],满足: - -- A 和 B 都是无零整数 -- A + B = n - -题目数据保证至少有一个有效的解决方案。如果存在多个有效解决方案,你可以返回其中任意一个。 - -## 解题思路 - -- 给定一个整数 n,要求把它分解为 2 个十进制位中不含 0 的正整数且这两个正整数之和为 n。 -- 简单题。在 [1, n/2] 区间内搜索,只要有一组满足条件的解就 break。题目保证了至少有一组解,并且多组解返回任意一组即可。 - -## 代码 - -```go - -package leetcode - -func getNoZeroIntegers(n int) []int { - noZeroPair := []int{} - for i := 1; i <= n/2; i++ { - if isNoZero(i) && isNoZero(n-i) { - noZeroPair = append(noZeroPair, []int{i, n - i}...) - break - } - } - return noZeroPair -} - -func isNoZero(n int) bool { - for n != 0 { - if n%10 == 0 { - return false - } - n /= 10 - } - return true -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1380.Lucky-Numbers-in-a-Matrix.md b/website/content/ChapterFour/1380.Lucky-Numbers-in-a-Matrix.md deleted file mode 100644 index 01d97eb82..000000000 --- a/website/content/ChapterFour/1380.Lucky-Numbers-in-a-Matrix.md +++ /dev/null @@ -1,87 +0,0 @@ -# [1380. Lucky Numbers in a Matrix](https://leetcode.com/problems/lucky-numbers-in-a-matrix/) - - -## 题目 - -Given a `m * n` matrix of **distinct** numbers, return all lucky numbers in the matrix in **any** order. - -A lucky number is an element of the matrix such that it is the minimum element in its row and maximum in its column. - -**Example 1**: - -``` -Input: matrix = [[3,7,8],[9,11,13],[15,16,17]] -Output: [15] -Explanation: 15 is the only lucky number since it is the minimum in its row and the maximum in its column -``` - -**Example 2**: - -``` -Input: matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]] -Output: [12] -Explanation: 12 is the only lucky number since it is the minimum in its row and the maximum in its column. -``` - -**Example 3**: - -``` -Input: matrix = [[7,8],[1,2]] -Output: [7] -``` - -**Constraints**: - -- `m == mat.length` -- `n == mat[i].length` -- `1 <= n, m <= 50` -- `1 <= matrix[i][j] <= 10^5`. -- All elements in the matrix are distinct. - -## 题目大意 - -给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。幸运数是指矩阵中满足同时下列两个条件的元素: - -- 在同一行的所有元素中最小 -- 在同一列的所有元素中最大 - - - -## 解题思路 - -- 找出矩阵中的幸运数。幸运数的定义:同时满足 2 个条件,在同一行的所有元素中最小并且在同一列的所有元素中最大。 -- 简单题。按照题意遍历矩阵,找到同时满足 2 个条件的数输出即可。 - -## 代码 - -```go - -package leetcode - -func luckyNumbers(matrix [][]int) []int { - t, r, res := make([]int, len(matrix[0])), make([]int, len(matrix[0])), []int{} - for _, val := range matrix { - m, k := val[0], 0 - for j := 0; j < len(matrix[0]); j++ { - if val[j] < m { - m = val[j] - k = j - } - if t[j] < val[j] { - t[j] = val[j] - } - } - - if t[k] == m { - r[k] = m - } - } - for k, v := range r { - if v > 0 && v == t[k] { - res = append(res, v) - } - } - return res -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1385.Find-the-Distance-Value-Between-Two-Arrays.md b/website/content/ChapterFour/1385.Find-the-Distance-Value-Between-Two-Arrays.md deleted file mode 100644 index 9d6042469..000000000 --- a/website/content/ChapterFour/1385.Find-the-Distance-Value-Between-Two-Arrays.md +++ /dev/null @@ -1,98 +0,0 @@ -# [1385. Find the Distance Value Between Two Arrays](https://leetcode.com/problems/find-the-distance-value-between-two-arrays/) - - -## 题目 - -Given two integer arrays `arr1` and `arr2`, and the integer `d`, *return the distance value between the two arrays*. - -The distance value is defined as the number of elements `arr1[i]` such that there is not any element `arr2[j]` where `|arr1[i]-arr2[j]| <= d`. - -**Example 1**: - -``` -Input: arr1 = [4,5,8], arr2 = [10,9,1,8], d = 2 -Output: 2 -Explanation: -For arr1[0]=4 we have: -|4-10|=6 > d=2 -|4-9|=5 > d=2 -|4-1|=3 > d=2 -|4-8|=4 > d=2 -For arr1[1]=5 we have: -|5-10|=5 > d=2 -|5-9|=4 > d=2 -|5-1|=4 > d=2 -|5-8|=3 > d=2 -For arr1[2]=8 we have: -|8-10|=2 <= d=2 -|8-9|=1 <= d=2 -|8-1|=7 > d=2 -|8-8|=0 <= d=2 -``` - -**Example 2**: - -``` -Input: arr1 = [1,4,2,3], arr2 = [-4,-3,6,10,20,30], d = 3 -Output: 2 -``` - -**Example 3**: - -``` -Input: arr1 = [2,1,100,3], arr2 = [-5,-2,10,-3,7], d = 6 -Output: 1 -``` - -**Constraints**: - -- `1 <= arr1.length, arr2.length <= 500` -- `-10^3 <= arr1[i], arr2[j] <= 10^3` -- `0 <= d <= 100` - - -## 题目大意 - -给你两个整数数组 arr1 , arr2 和一个整数 d ,请你返回两个数组之间的 距离值 。「距离值」 定义为符合此距离要求的元素数目:对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d 。 - -提示: - -- 1 <= arr1.length, arr2.length <= 500 -- -10^3 <= arr1[i], arr2[j] <= 10^3 -- 0 <= d <= 100 - - -## 解题思路 - -- 计算两个数组之间的距离,距离值的定义:满足对于元素 arr1[i] ,不存在任何元素 arr2[j] 满足 |arr1[i]-arr2[j]| <= d 这一条件的元素数目。 -- 简单题,按照距离值的定义,双层循环计数即可。 - -## 代码 - -```go - -package leetcode - -func findTheDistanceValue(arr1 []int, arr2 []int, d int) int { - res := 0 - for i := range arr1 { - for j := range arr2 { - if abs(arr1[i]-arr2[j]) <= d { - break - } - if j == len(arr2)-1 { - res++ - } - } - } - return res -} - -func abs(a int) int { - if a < 0 { - return -1 * a - } - return a -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1389.Create-Target-Array-in-the-Given-Order.md b/website/content/ChapterFour/1389.Create-Target-Array-in-the-Given-Order.md deleted file mode 100644 index 45f4acf6a..000000000 --- a/website/content/ChapterFour/1389.Create-Target-Array-in-the-Given-Order.md +++ /dev/null @@ -1,90 +0,0 @@ -# [1389. Create Target Array in the Given Order](https://leetcode.com/problems/create-target-array-in-the-given-order/) - -## 题目 - -Given two arrays of integers `nums` and `index`. Your task is to create *target* array under the following rules: - -- Initially *target* array is empty. -- From left to right read nums[i] and index[i], insert at index `index[i]` the value `nums[i]` in *target* array. -- Repeat the previous step until there are no elements to read in `nums` and `index.` - -Return the *target* array. - -It is guaranteed that the insertion operations will be valid. - -**Example 1**: - -``` -Input: nums = [0,1,2,3,4], index = [0,1,2,2,1] -Output: [0,4,1,3,2] -Explanation: -nums index target -0 0 [0] -1 1 [0,1] -2 2 [0,1,2] -3 2 [0,1,3,2] -4 1 [0,4,1,3,2] -``` - -**Example 2**: - -``` -Input: nums = [1,2,3,4,0], index = [0,1,2,3,0] -Output: [0,1,2,3,4] -Explanation: -nums index target -1 0 [1] -2 1 [1,2] -3 2 [1,2,3] -4 3 [1,2,3,4] -0 0 [0,1,2,3,4] -``` - -**Example 3**: - -``` -Input: nums = [1], index = [0] -Output: [1] -``` - -**Constraints**: - -- `1 <= nums.length, index.length <= 100` -- `nums.length == index.length` -- `0 <= nums[i] <= 100` -- `0 <= index[i] <= i` - -## 题目大意 - -给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组: - -- 目标数组 target 最初为空。 -- 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。 -- 重复上一步,直到在 nums 和 index 中都没有要读取的元素。 - -请你返回目标数组。题目保证数字插入位置总是存在。 - - - - -## 解题思路 - -- 给定 2 个数组,分别装的是待插入的元素和待插入的位置。最后输出操作完成的数组。 -- 简单题,按照题意插入元素即可。 - -## 代码 - -```go - -package leetcode - -func createTargetArray(nums []int, index []int) []int { - result := make([]int, len(nums)) - for i, pos := range index { - copy(result[pos+1:i+1], result[pos:i]) - result[pos] = nums[i] - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1455.Check-If-a-Word-Occurs-As-a-Prefix-of-Any-Word-in-a-Sentence.md b/website/content/ChapterFour/1455.Check-If-a-Word-Occurs-As-a-Prefix-of-Any-Word-in-a-Sentence.md deleted file mode 100644 index c8081e82b..000000000 --- a/website/content/ChapterFour/1455.Check-If-a-Word-Occurs-As-a-Prefix-of-Any-Word-in-a-Sentence.md +++ /dev/null @@ -1,98 +0,0 @@ -# [1455. Check If a Word Occurs As a Prefix of Any Word in a Sentence](https://leetcode.com/problems/check-if-a-word-occurs-as-a-prefix-of-any-word-in-a-sentence/) - - -## 题目 - -Given a `sentence` that consists of some words separated by a **single space**, and a `searchWord`. - -You have to check if `searchWord` is a prefix of any word in `sentence`. - -Return *the index of the word* in `sentence` where `searchWord` is a prefix of this word (**1-indexed**). - -If `searchWord` is a prefix of more than one word, return the index of the first word **(minimum index)**. If there is no such word return **-1**. - -A **prefix** of a string `S` is any leading contiguous substring of `S`. - -**Example 1**: - -``` -Input: sentence = "i love eating burger", searchWord = "burg" -Output: 4 -Explanation: "burg" is prefix of "burger" which is the 4th word in the sentence. - -``` - -**Example 2**: - -``` -Input: sentence = "this problem is an easy problem", searchWord = "pro" -Output: 2 -Explanation: "pro" is prefix of "problem" which is the 2nd and the 6th word in the sentence, but we return 2 as it's the minimal index. - -``` - -**Example 3**: - -``` -Input: sentence = "i am tired", searchWord = "you" -Output: -1 -Explanation: "you" is not a prefix of any word in the sentence. - -``` - -**Example 4**: - -``` -Input: sentence = "i use triple pillow", searchWord = "pill" -Output: 4 - -``` - -**Example 5**: - -``` -Input: sentence = "hello from the other side", searchWord = "they" -Output: -1 - -``` - -**Constraints**: - -- `1 <= sentence.length <= 100` -- `1 <= searchWord.length <= 10` -- `sentence` consists of lowercase English letters and spaces. -- `searchWord` consists of lowercase English letters. - -## 题目大意 - -给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成。请你检查检索词 searchWord 是否为句子 sentence 中任意单词的前缀。 - -- 如果 searchWord 是某一个单词的前缀,则返回句子 sentence 中该单词所对应的下标(下标从 1 开始)。 -- 如果 searchWord 是多个单词的前缀,则返回匹配的第一个单词的下标(最小下标)。 -- 如果 searchWord 不是任何单词的前缀,则返回 -1 。 - -字符串 S 的 「前缀」是 S 的任何前导连续子字符串。 - -## 解题思路 - -- 给出 2 个字符串,一个是匹配串,另外一个是句子。在句子里面查找带匹配串前缀的单词,并返回第一个匹配单词的下标。 -- 简单题。按照题意,扫描一遍句子,一次匹配即可。 - -## 代码 - -```go - -package leetcode - -import "strings" - -func isPrefixOfWord(sentence string, searchWord string) int { - for i, v := range strings.Split(sentence, " ") { - if strings.HasPrefix(v, searchWord) { - return i + 1 - } - } - return -1 -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1464.Maximum-Product-of-Two-Elements-in-an-Array.md b/website/content/ChapterFour/1464.Maximum-Product-of-Two-Elements-in-an-Array.md deleted file mode 100644 index 04dbf134b..000000000 --- a/website/content/ChapterFour/1464.Maximum-Product-of-Two-Elements-in-an-Array.md +++ /dev/null @@ -1,66 +0,0 @@ -# [1464. Maximum Product of Two Elements in an Array](https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/) - - -## 题目 - -Given the array of integers `nums`, you will choose two different indices `i` and `j` of that array. Return the maximum value of `(nums[i]-1)*(nums[j]-1)`. - -**Example 1**: - -``` -Input: nums = [3,4,5,2] -Output: 12 -Explanation: If you choose the indices i=1 and j=2 (indexed from 0), you will get the maximum value, that is, (nums[1]-1)*(nums[2]-1) = (4-1)*(5-1) = 3*4 = 12. - -``` - -**Example 2**: - -``` -Input: nums = [1,5,4,5] -Output: 16 -Explanation: Choosing the indices i=1 and j=3 (indexed from 0), you will get the maximum value of (5-1)*(5-1) = 16. - -``` - -**Example 3**: - -``` -Input: nums = [3,7] -Output: 12 - -``` - -**Constraints**: - -- `2 <= nums.length <= 500` -- `1 <= nums[i] <= 10^3` - -## 题目大意 - -给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值。请你计算并返回该式的最大值。 - -## 解题思路 - -- 简单题。循环一次,按照题意动态维护 2 个最大值,从而也使得 `(nums[i]-1)*(nums[j]-1)` 能取到最大值。 - -## 代码 - -```go - -package leetcode - -func maxProduct(nums []int) int { - max1, max2 := 0, 0 - for _, num := range nums { - if num >= max1 { - max2 = max1 - max1 = num - } else if num <= max1 && num >= max2 { - max2 = num - } - } - return (max1 - 1) * (max2 - 1) -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/1470.Shuffle-the-Array.md b/website/content/ChapterFour/1470.Shuffle-the-Array.md deleted file mode 100644 index 961d200c4..000000000 --- a/website/content/ChapterFour/1470.Shuffle-the-Array.md +++ /dev/null @@ -1,64 +0,0 @@ -# [1470. Shuffle the Array](https://leetcode.com/problems/shuffle-the-array/) - -## 题目 - -Given the array `nums` consisting of `2n` elements in the form `[x1,x2,...,xn,y1,y2,...,yn]`. - -*Return the array in the form* `[x1,y1,x2,y2,...,xn,yn]`. - -**Example 1**: - -``` -Input: nums = [2,5,1,3,4,7], n = 3 -Output: [2,3,5,4,1,7] -Explanation: Since x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 then the answer is [2,3,5,4,1,7]. - -``` - -**Example 2**: - -``` -Input: nums = [1,2,3,4,4,3,2,1], n = 4 -Output: [1,4,2,3,3,2,4,1] - -``` - -**Example 3**: - -``` -Input: nums = [1,1,2,2], n = 2 -Output: [1,2,1,2] - -``` - -**Constraints**: - -- `1 <= n <= 500` -- `nums.length == 2n` -- `1 <= nums[i] <= 10^3` - -## 题目大意 - -给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。 - -## 解题思路 - -- 给定一个 2n 的数组,把后 n 个元素插空放到前 n 个元素里面。输出最终完成的数组。 -- 简单题,按照题意插空即可。 - -## 代码 - -```go - -package leetcode - -func shuffle(nums []int, n int) []int { - result := make([]int, 0) - for i := 0; i < n; i++ { - result = append(result, nums[i]) - result = append(result, nums[n+i]) - } - return result -} - -``` \ No newline at end of file diff --git a/website/content/ChapterFour/_index.md b/website/content/ChapterFour/_index.md deleted file mode 100644 index 3daf13a7b..000000000 --- a/website/content/ChapterFour/_index.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: 第四章 -type: docs ---- - -# 第四章 Leetcode 题解 - -

- -

- - -这一章就是 LeetCode 的题解了。笔者目前只刷到 608 题,题解这里有 520 题,都已经 runtime beats 100% 了。相差的 88 题是还没有 beats 100% 的,笔者还需要继续优化~ - -题解慢慢更新中,欢迎大家提出更好的解法。点击页面下方的 edit,会跳转到 github 对应的页面 markdown 中,可以提交你的最优解 PR。 - -让我们在题解的太空遨游吧~ \ No newline at end of file diff --git a/website/content/ChapterFour/pytool/AddTOC.py b/website/content/ChapterFour/pytool/AddTOC.py deleted file mode 100644 index 356882662..000000000 --- a/website/content/ChapterFour/pytool/AddTOC.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -from os.path import join -from shutil import move - -toc_string = """\n - ---- -bookToc: false ---- - -\n""" - -current_working_dir = os.getcwd() -# print(f"current_working_dir: {current_working_dir}") - -dir_names = os.listdir(current_working_dir) -# print(dir_names) -print(len(dir_names)) -for file_name in dir_names: - if(file_name.endswith('.md')): - with open(file_name, "r") as myfile: - codeContent = toc_string + myfile.read() - with open(file_name, "w") as myfile: - myfile.write(codeContent) -print("Finished") \ No newline at end of file diff --git a/website/content/ChapterFour/pytool/GenerateIndex.py b/website/content/ChapterFour/pytool/GenerateIndex.py deleted file mode 100644 index e4dd33f70..000000000 --- a/website/content/ChapterFour/pytool/GenerateIndex.py +++ /dev/null @@ -1,21 +0,0 @@ -import os -import glob - -content = [] -indexFile = 'index.txt' -current_working_dir = os.getcwd() -# print(f"current_working_dir: {current_working_dir}") - -dir_names = glob.glob("*.md") -dir_names.sort() -# print(dir_names) -print(len(dir_names)) -for file_name in dir_names: - # - [0001. Two Sum]({{< relref "/ChapterFour/withouttoc/0001. Two Sum.md" >}}) - # content = '- [' + file_name[:-3] + ']' + '({{< relref "/ChapterFour/withouttoc/' + file_name + '" >}})' - content.append('- [{}]({{{{< relref "/ChapterFour/{}" >}}}})'.format(file_name[:-3],file_name)) - -with open(indexFile, "w") as myfile: - myfile.write('\n'.join(content)) - -print("Finished") \ No newline at end of file diff --git a/website/content/ChapterFour/pytool/GenerateOne.py b/website/content/ChapterFour/pytool/GenerateOne.py deleted file mode 100644 index 233171b52..000000000 --- a/website/content/ChapterFour/pytool/GenerateOne.py +++ /dev/null @@ -1,24 +0,0 @@ -import os -from os.path import join -from shutil import move -import glob - -content = [] -oneFile = 'ChapterTwo_OnePDF.md' -current_working_dir = os.getcwd() -# print(f"current_working_dir: {current_working_dir}") - -dir_names = glob.glob("*.md") -dir_names.sort() -# print(dir_names) -print(len(dir_names)) -for file_name in dir_names: - # print(file_name) - with open(file_name, "r") as myfile: - content = myfile.read() - with open(oneFile, "a") as myfile: - myfile.write("\n") - myfile.write(content) - myfile.write("\n") - -print("Finished") \ No newline at end of file diff --git a/website/content/ChapterFour/pytool/GetFile.py b/website/content/ChapterFour/pytool/GetFile.py deleted file mode 100644 index 154f4397f..000000000 --- a/website/content/ChapterFour/pytool/GetFile.py +++ /dev/null @@ -1,56 +0,0 @@ -import os -from os.path import join -from shutil import move - -toc_string = """\n - ---- -bookToc: false ---- - -\n""" - -pre_string = """ - -## 代码 - -```go - -""" -end_string = "\n```" -codeContent = "" -current_working_dir = os.getcwd() -# print(f"current_working_dir: {current_working_dir}") - -# dir_names = os.listdir(current_working_dir) - -# 重命名目录。 os.rename(dir_name, new_dir_name) - -# 遍历目录 -# dir_path是当前遍历到的目录。dir_names是dir_path下的文件夹列表。file_names是是dir_path下的文件列表 -# 如果想实现目录白名单,将白名单目录从dir_names中去除即可 -for (dir_path, dir_names, file_names) in os.walk(current_working_dir): - # print(f"当前遍历到的目录: {dir_path}") - os.chdir(dir_path) - files = dir_path.split("/") - new_file_name = files[len(files) - 1] + '.md' - - print(f"当前所在的文件夹: {os.getcwd()}") - for file_name in file_names: - if(file_name.endswith('.go') and not file_name.endswith('_test.go')): - print(f"当前所在文件: {file_name}") - with open(file_name, "r") as myfile: - codeContent = myfile.read() - break - # print(codeContent) - for file_name in file_names: - if(file_name.endswith('.md')): - print(f"当前所在文件: {file_name}") - with open(file_name, "a") as myfile: - myfile.write(pre_string) - myfile.write(codeContent) - myfile.write(end_string) - os.rename(file_name, new_file_name) - move(join(dir_path, new_file_name), current_working_dir) - break - \ No newline at end of file diff --git a/website/content/ChapterOne/_index.md b/website/content/ChapterOne/_index.md deleted file mode 100644 index 1016b57c0..000000000 --- a/website/content/ChapterOne/_index.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: 第一章 -type: docs ---- - -# 第一章 序章 - -{{< columns >}} -## 关于 LeetCode - -说到 LeetCode,作为一个程序员来说,应该不陌生,近几年参加面试都会提到它。国内外的程序员用它刷题主要是为了面试。据历史记载,这个网站 2011 年就成立了,马上就要到自己 10 周年的生日了。每周举行周赛,双周赛,月赛,在有限时间内编码,确实非常能考验人的算法能力。一些大公司赞助冠名的比赛获得前几名除了有奖品,还能直接拿到内推的机会。 - -<---> - -## 什么是 Cookbook - -直译的话就是烹饪书,教你做各种食谱美食的书。经常看 O'Reilly 技术书的同学对这个名词会很熟悉。一般动手操作,实践类的书都会有这个名字。 - -{{< /columns >}} - -logo - -## 为什么会写这个开源书 - -笔者刷题刷了一年了,想和大家分享分享一些做题心得,解题方法。想和有相同爱好的人交个朋友,一起交流学习。对于自己来说,写题解也是一种提高。把一道深奥的题目讲给一点都没有头绪的人,并能让他完全听懂,很能锻炼人的表达能力。在讲解中很可能还会遇到听者的一些提问,这些问题可能是自己的知识漏洞,强迫自己去弥补。笔者在公司做过相关的分享,感受很深,双方受益都还不错。 - -> 另外,在大学期间,笔者做题的时候最讨厌写题解,感觉是浪费时间,用更多的时间去做更多的题。现在不知道算不算是“出来混的,总是要还的”。 - - -## 关于书的封面 - -常看 O'Reilly 动物书的同学一看这个封面就知道是向他们致敬。确实是这个目的。O'Reilly 的封面动物都是稀缺动物,并且画风都是黑白素描风。这些动物都有版权了,所以只能在网上找没有版权的黑白素描风的图片。常见的能找到 40 张这种风格的图片。不过用的人太多了,笔者费劲的找了其他几张这种图片,这张孔雀开屏是其中一张。孔雀开屏的意义是希望大家刷完 LeetCode 以后,提高了自身的算法能力,在人生的舞台上开出自己的“屏”。全书配色也都是绿色,因为这是 AC 的颜色。 - - -## 关于作者 - -笔者是一个刚刚入行一年半的 gopher 新人,还请各位大佬多多指点小弟我。大学参加了 3 年 ACM-ICPC,但是由于资质不高,没有拿到一块金牌。所以在算法方面,我对自己的评价算是新手吧。参加 ACM-ICPC 最大的收获是训练了思维能力,这种能力也会运用到生活中。其次是认识了很多国内很聪明的选手,看到了自己和他们的差距。最后,就是那 200 多页,有些自己都没有完全理解的,打印的密密麻麻的[算法模板](https://github.com/halfrost/LeetCode-Go/releases/tag/Special)。知识学会了,终身都是自己的,没有学会,那些知识都是身外之物。 - -笔者从 2019 年 3 月 25 号开始刷题,到 2020 年 3 月 25 号,整整一年的时间。原计划是每天一题。实际上每天有时候不止一题,最终完成了 600+: - -![](https://img.halfrost.com/Blog/ArticleImage/2019_leetcode.png) - -> 一个温馨提示:笔者本以为每天做一题,会让这个 submissions 图全绿,但是我发现我错了。如果你也想坚持,让这个图全绿,一定要注意以下的问题:LeetCode 服务器是在 +0 时区的,这个图也是按照这个时区计算的。也就是说,中国每天早上 8 点之前,是算前一天的!也是因为时区的问题,导致我空白了这 22 个格子。比如有一道 Hard 题很难,当天工作也很多,晚上下班回家想出来了就到第二天凌晨了。于是再做一题当做第二天的量。结果会发现这 2 题都算前一天的。有时候笔者早上 6 点起床刷题,提交以后也都是前一天的。 -> -> (当然这些都是过去了,不重要了,全当是奋斗路上的一些小插曲) - -2020 年笔者肯定还会继续刷题,因为还没有达到自己的一些目标。可能会朝着 1000 题奋进,也有可能刷到 800 题的时候回头开始二刷,三刷。(不达目的不罢休吧~) - -## 关于书中的代码 - -代码都放在 [github repo](https://github.com/halfrost/LeetCode-Go/tree/master/leetcode) 中,按题号可以搜索到题目。 -本书题目的代码都已经 beats 100% 了。没有 beats 100% 题解就没有放到本书中了。那些题目笔者会继续优化到 100% 再放进来。 - -有可能读者会问,为何要追求 beats 100%。笔者认为优化到 beats 100% 才算是把这题做出感觉了。有好几道 Hard 题,笔者都用暴力解法 AC 了,然后只 beats 了 5%。这题就如同没做一样。而且面试中如果给了这样的答案,面试官也不会满意,“还有没有更优解?”。如果通过自己的思考能给出更优解,面试官会更满意一些。 - -LeetCode 统计代码运行时长会有波动的,相同的代码提交 10 次可能就会 beats 100% 了。笔者开始没有发现这个问题,很多题用正确的代码连续交了很多次,一年提交 3400+ 次,导致我的正确率也变的奇高。😢 - -当然,如果还有其他更优美的解法,也能 beats 100% 的,欢迎提交 PR,笔者和大家一起学习。 - -## 目标读者 - -想通过 LeetCode 提高算法能力的编程爱好者。 - - -## 编程语言 - -本书的算法全部用 Go 语言实现。 - - -## 使用说明 - -- 本电子书的左上角有搜索栏,可以迅速帮你找到你想看的章节和题号。 -- 本电子书每页都接入了 Gitalk,每一页的最下方都有评论框可以评论,如果没有显示出来,请检查自己的网络。 -- 关于题解,笔者建议这样使用:先自己读题,思考如何解题。如果 15 分钟还没有思路,那么先看笔者的解题思路,但是不要看代码。有思路以后自己用代码实现一遍。如果完全不会写,那就看笔者提供的代码,找出自己到底哪里不会写,找出问题记下来,这就是自己要弥补的知识漏洞。如果自己实现出来了,提交以后有错误,自己先 debug。AC 以后没有到 100% 也先自己思考如何优化。如果每道题自己都能优化到 100% 了,那么一段时间以后进步会很大。所以总的来说,实在没思路,看解题思路;实在优化不到 100%,看看代码。 - -## 互动与勘误 - -如果书中文章有所遗漏,欢迎点击所在页面下边的 edit 按钮进行评论和互动,感谢您的支持与帮助。 - -## 最后 - -一起开始刷题吧~ - -![](https://img.halfrost.com/Blog/ArticleImage/hello_leetcode.png) - -本作品采用 [知识署名-非商业性使用-禁止演绎 (BY-NC-ND) 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode.zh-Hans) 进行许可。 - - -题解里面的所有题目版权均归 [LeetCode](https://leetcode.com/) 和 [力扣中国](https://leetcode-cn.com/) 所有 \ No newline at end of file diff --git a/website/content/ChapterThree/Segment_Tree.md b/website/content/ChapterThree/Segment_Tree.md deleted file mode 100644 index 96160509e..000000000 --- a/website/content/ChapterThree/Segment_Tree.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -title: 线段树 -type: docs ---- - -# 线段树 Segment Tree - -```go -package template - -// SegmentTree define -type SegmentTree struct { - data, tree, lazy []int - left, right int - merge func(i, j int) int -} - -// Init define -func (st *SegmentTree) Init(nums []int, oper func(i, j int) int) { - st.merge = oper - data, tree, lazy := make([]int, len(nums)), make([]int, 4*len(nums)), make([]int, 4*len(nums)) - for i := 0; i < len(nums); i++ { - data[i] = nums[i] - } - st.data, st.tree, st.lazy = data, tree, lazy - if len(nums) > 0 { - st.buildSegmentTree(0, 0, len(nums)-1) - } -} - -// 在 treeIndex 的位置创建 [left....right] 区间的线段树 -func (st *SegmentTree) buildSegmentTree(treeIndex, left, right int) { - if left == right { - st.tree[treeIndex] = st.data[left] - return - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - st.buildSegmentTree(leftTreeIndex, left, midTreeIndex) - st.buildSegmentTree(rightTreeIndex, midTreeIndex+1, right) - st.tree[treeIndex] = st.merge(st.tree[leftTreeIndex], st.tree[rightTreeIndex]) -} - -func (st *SegmentTree) leftChild(index int) int { - return 2*index + 1 -} - -func (st *SegmentTree) rightChild(index int) int { - return 2*index + 2 -} - -// 查询 [left....right] 区间内的值 - -// Query define -func (st *SegmentTree) Query(left, right int) int { - if len(st.data) > 0 { - return st.queryInTree(0, 0, len(st.data)-1, left, right) - } - return 0 -} - -// 在以 treeIndex 为根的线段树中 [left...right] 的范围里,搜索区间 [queryLeft...queryRight] 的值 -func (st *SegmentTree) queryInTree(treeIndex, left, right, queryLeft, queryRight int) int { - if left == queryLeft && right == queryRight { - return st.tree[treeIndex] - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - if queryLeft > midTreeIndex { - return st.queryInTree(rightTreeIndex, midTreeIndex+1, right, queryLeft, queryRight) - } else if queryRight <= midTreeIndex { - return st.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, queryRight) - } - return st.merge(st.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, midTreeIndex), - st.queryInTree(rightTreeIndex, midTreeIndex+1, right, midTreeIndex+1, queryRight)) -} - -// 查询 [left....right] 区间内的值 - -// QueryLazy define -func (st *SegmentTree) QueryLazy(left, right int) int { - if len(st.data) > 0 { - return st.queryLazyInTree(0, 0, len(st.data)-1, left, right) - } - return 0 -} - -func (st *SegmentTree) queryLazyInTree(treeIndex, left, right, queryLeft, queryRight int) int { - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - if left > queryRight || right < queryLeft { // segment completely outside range - return 0 // represents a null node - } - if st.lazy[treeIndex] != 0 { // this node is lazy - for i := 0; i < right-left+1; i++ { - st.tree[treeIndex] = st.merge(st.tree[treeIndex], st.lazy[treeIndex]) - // st.tree[treeIndex] += (right - left + 1) * st.lazy[treeIndex] // normalize current node by removing lazinesss - } - if left != right { // update lazy[] for children nodes - st.lazy[leftTreeIndex] = st.merge(st.lazy[leftTreeIndex], st.lazy[treeIndex]) - st.lazy[rightTreeIndex] = st.merge(st.lazy[rightTreeIndex], st.lazy[treeIndex]) - // st.lazy[leftTreeIndex] += st.lazy[treeIndex] - // st.lazy[rightTreeIndex] += st.lazy[treeIndex] - } - st.lazy[treeIndex] = 0 // current node processed. No longer lazy - } - if queryLeft <= left && queryRight >= right { // segment completely inside range - return st.tree[treeIndex] - } - if queryLeft > midTreeIndex { - return st.queryLazyInTree(rightTreeIndex, midTreeIndex+1, right, queryLeft, queryRight) - } else if queryRight <= midTreeIndex { - return st.queryLazyInTree(leftTreeIndex, left, midTreeIndex, queryLeft, queryRight) - } - // merge query results - return st.merge(st.queryLazyInTree(leftTreeIndex, left, midTreeIndex, queryLeft, midTreeIndex), - st.queryLazyInTree(rightTreeIndex, midTreeIndex+1, right, midTreeIndex+1, queryRight)) -} - -// 更新 index 位置的值 - -// Update define -func (st *SegmentTree) Update(index, val int) { - if len(st.data) > 0 { - st.updateInTree(0, 0, len(st.data)-1, index, val) - } -} - -// 以 treeIndex 为根,更新 index 位置上的值为 val -func (st *SegmentTree) updateInTree(treeIndex, left, right, index, val int) { - if left == right { - st.tree[treeIndex] = val - return - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - if index > midTreeIndex { - st.updateInTree(rightTreeIndex, midTreeIndex+1, right, index, val) - } else { - st.updateInTree(leftTreeIndex, left, midTreeIndex, index, val) - } - st.tree[treeIndex] = st.merge(st.tree[leftTreeIndex], st.tree[rightTreeIndex]) -} - -// 更新 [updateLeft....updateRight] 位置的值 -// 注意这里的更新值是在原来值的基础上增加或者减少,而不是把这个区间内的值都赋值为 x,区间更新和单点更新不同 -// 这里的区间更新关注的是变化,单点更新关注的是定值 -// 当然区间更新也可以都更新成定值,如果只区间更新成定值,那么 lazy 更新策略需要变化,merge 策略也需要变化,这里暂不详细讨论 - -// UpdateLazy define -func (st *SegmentTree) UpdateLazy(updateLeft, updateRight, val int) { - if len(st.data) > 0 { - st.updateLazyInTree(0, 0, len(st.data)-1, updateLeft, updateRight, val) - } -} - -func (st *SegmentTree) updateLazyInTree(treeIndex, left, right, updateLeft, updateRight, val int) { - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - if st.lazy[treeIndex] != 0 { // this node is lazy - for i := 0; i < right-left+1; i++ { - st.tree[treeIndex] = st.merge(st.tree[treeIndex], st.lazy[treeIndex]) - //st.tree[treeIndex] += (right - left + 1) * st.lazy[treeIndex] // normalize current node by removing laziness - } - if left != right { // update lazy[] for children nodes - st.lazy[leftTreeIndex] = st.merge(st.lazy[leftTreeIndex], st.lazy[treeIndex]) - st.lazy[rightTreeIndex] = st.merge(st.lazy[rightTreeIndex], st.lazy[treeIndex]) - // st.lazy[leftTreeIndex] += st.lazy[treeIndex] - // st.lazy[rightTreeIndex] += st.lazy[treeIndex] - } - st.lazy[treeIndex] = 0 // current node processed. No longer lazy - } - - if left > right || left > updateRight || right < updateLeft { - return // out of range. escape. - } - - if updateLeft <= left && right <= updateRight { // segment is fully within update range - for i := 0; i < right-left+1; i++ { - st.tree[treeIndex] = st.merge(st.tree[treeIndex], val) - //st.tree[treeIndex] += (right - left + 1) * val // update segment - } - if left != right { // update lazy[] for children - st.lazy[leftTreeIndex] = st.merge(st.lazy[leftTreeIndex], val) - st.lazy[rightTreeIndex] = st.merge(st.lazy[rightTreeIndex], val) - // st.lazy[leftTreeIndex] += val - // st.lazy[rightTreeIndex] += val - } - return - } - st.updateLazyInTree(leftTreeIndex, left, midTreeIndex, updateLeft, updateRight, val) - st.updateLazyInTree(rightTreeIndex, midTreeIndex+1, right, updateLeft, updateRight, val) - // merge updates - st.tree[treeIndex] = st.merge(st.tree[leftTreeIndex], st.tree[rightTreeIndex]) -} - -// SegmentCountTree define -type SegmentCountTree struct { - data, tree []int - left, right int - merge func(i, j int) int -} - -// Init define -func (st *SegmentCountTree) Init(nums []int, oper func(i, j int) int) { - st.merge = oper - - data, tree := make([]int, len(nums)), make([]int, 4*len(nums)) - for i := 0; i < len(nums); i++ { - data[i] = nums[i] - } - st.data, st.tree = data, tree -} - -// 在 treeIndex 的位置创建 [left....right] 区间的线段树 -func (st *SegmentCountTree) buildSegmentTree(treeIndex, left, right int) { - if left == right { - st.tree[treeIndex] = st.data[left] - return - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - st.buildSegmentTree(leftTreeIndex, left, midTreeIndex) - st.buildSegmentTree(rightTreeIndex, midTreeIndex+1, right) - st.tree[treeIndex] = st.merge(st.tree[leftTreeIndex], st.tree[rightTreeIndex]) -} - -func (st *SegmentCountTree) leftChild(index int) int { - return 2*index + 1 -} - -func (st *SegmentCountTree) rightChild(index int) int { - return 2*index + 2 -} - -// 查询 [left....right] 区间内的值 - -// Query define -func (st *SegmentCountTree) Query(left, right int) int { - if len(st.data) > 0 { - return st.queryInTree(0, 0, len(st.data)-1, left, right) - } - return 0 -} - -// 在以 treeIndex 为根的线段树中 [left...right] 的范围里,搜索区间 [queryLeft...queryRight] 的值,值是计数值 -func (st *SegmentCountTree) queryInTree(treeIndex, left, right, queryLeft, queryRight int) int { - if queryRight < st.data[left] || queryLeft > st.data[right] { - return 0 - } - if queryLeft <= st.data[left] && queryRight >= st.data[right] || left == right { - return st.tree[treeIndex] - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - return st.queryInTree(rightTreeIndex, midTreeIndex+1, right, queryLeft, queryRight) + - st.queryInTree(leftTreeIndex, left, midTreeIndex, queryLeft, queryRight) -} - -// 更新计数 - -// UpdateCount define -func (st *SegmentCountTree) UpdateCount(val int) { - if len(st.data) > 0 { - st.updateCountInTree(0, 0, len(st.data)-1, val) - } -} - -// 以 treeIndex 为根,更新 [left...right] 区间内的计数 -func (st *SegmentCountTree) updateCountInTree(treeIndex, left, right, val int) { - if val >= st.data[left] && val <= st.data[right] { - st.tree[treeIndex]++ - if left == right { - return - } - midTreeIndex, leftTreeIndex, rightTreeIndex := left+(right-left)>>1, st.leftChild(treeIndex), st.rightChild(treeIndex) - st.updateCountInTree(rightTreeIndex, midTreeIndex+1, right, val) - st.updateCountInTree(leftTreeIndex, left, midTreeIndex, val) - } -} - -``` \ No newline at end of file diff --git a/website/content/ChapterThree/UnionFind.md b/website/content/ChapterThree/UnionFind.md deleted file mode 100644 index e49101319..000000000 --- a/website/content/ChapterThree/UnionFind.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: 并查集 -type: docs ---- - -# 并查集 UnionFind - -```go -package template - -// UnionFind defind -// 路径压缩 + 秩优化 -type UnionFind struct { - parent, rank []int - count int -} - -// Init define -func (uf *UnionFind) Init(n int) { - uf.count = n - uf.parent = make([]int, n) - uf.rank = make([]int, n) - for i := range uf.parent { - uf.parent[i] = i - } -} - -// Find define -func (uf *UnionFind) Find(p int) int { - root := p - for root != uf.parent[root] { - root = uf.parent[root] - } - // compress path - for p != uf.parent[p] { - tmp := uf.parent[p] - uf.parent[p] = root - p = tmp - } - return root -} - -// Union define -func (uf *UnionFind) Union(p, q int) { - proot := uf.Find(p) - qroot := uf.Find(q) - if proot == qroot { - return - } - if uf.rank[qroot] > uf.rank[proot] { - uf.parent[proot] = qroot - } else { - uf.parent[qroot] = proot - if uf.rank[proot] == uf.rank[qroot] { - uf.rank[proot]++ - } - } - uf.count-- -} - -// TotalCount define -func (uf *UnionFind) TotalCount() int { - return uf.count -} - -// UnionFindCount define -// 计算每个集合中元素的个数 + 最大集合元素个数 -type UnionFindCount struct { - parent, count []int - maxUnionCount int -} - -// Init define -func (uf *UnionFindCount) Init(n int) { - uf.parent = make([]int, n) - uf.count = make([]int, n) - for i := range uf.parent { - uf.parent[i] = i - uf.count[i] = 1 - } -} - -// Find define -func (uf *UnionFindCount) Find(p int) int { - root := p - for root != uf.parent[root] { - root = uf.parent[root] - } - return root -} - -// 不进行秩压缩,时间复杂度爆炸,太高了 -// func (uf *UnionFindCount) union(p, q int) { -// proot := uf.find(p) -// qroot := uf.find(q) -// if proot == qroot { -// return -// } -// if proot != qroot { -// uf.parent[proot] = qroot -// uf.count[qroot] += uf.count[proot] -// } -// } - -// Union define -func (uf *UnionFindCount) Union(p, q int) { - proot := uf.Find(p) - qroot := uf.Find(q) - if proot == qroot { - return - } - if proot == len(uf.parent)-1 { - //proot is root - } else if qroot == len(uf.parent)-1 { - // qroot is root, always attach to root - proot, qroot = qroot, proot - } else if uf.count[qroot] > uf.count[proot] { - proot, qroot = qroot, proot - } - - //set relation[0] as parent - uf.maxUnionCount = max(uf.maxUnionCount, (uf.count[proot] + uf.count[qroot])) - uf.parent[qroot] = proot - uf.count[proot] += uf.count[qroot] -} - -// Count define -func (uf *UnionFindCount) Count() []int { - return uf.count -} - -// MaxUnionCount define -func (uf *UnionFindCount) MaxUnionCount() int { - return uf.maxUnionCount -} - -func max(a int, b int) int { - if a > b { - return a - } - return b -} - -``` \ No newline at end of file diff --git a/website/content/ChapterThree/_index.md b/website/content/ChapterThree/_index.md deleted file mode 100644 index 30eec94af..000000000 --- a/website/content/ChapterThree/_index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: 第三章 -type: docs ---- - -# 第三章 一些模板 - -

- -

- - -这一章会罗列一些整理好的模板。一起来看看吧。 \ No newline at end of file diff --git a/website/content/ChapterTwo/Array.md b/website/content/ChapterTwo/Array.md deleted file mode 100644 index 59dfa8f18..000000000 --- a/website/content/ChapterTwo/Array.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Array -type: docs ---- - -# Array - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|1. Two Sum| [Go]({{< relref "/ChapterFour/0001.Two-Sum.md" >}})| Easy | O(n)| O(n)|| -|11. Container With Most Water| [Go]({{< relref "/ChapterFour/0011.Container-With-Most-Water.md" >}})| Medium | O(n)| O(1)|| -|15. 3Sum | [Go]({{< relref "/ChapterFour/0015.3Sum.md" >}})| Medium | O(n^2)| O(n)|❤️| -|16. 3Sum Closest | [Go]({{< relref "/ChapterFour/0016.3Sum-Closest.md" >}})| Medium | O(n^2)| O(1)|❤️| -|18. 4Sum | [Go]({{< relref "/ChapterFour/0018.4Sum.md" >}})| Medium | O(n^3)| O(n^2)|❤️| -|26. Remove Duplicates from Sorted Array | [Go]({{< relref "/ChapterFour/0026.Remove-Duplicates-from-Sorted-Array.md" >}})| Easy | O(n)| O(1)|| -|27. Remove Element | [Go]({{< relref "/ChapterFour/0027.Remove-Element.md" >}})| Easy | O(n)| O(1)|| -|39. Combination Sum | [Go]({{< relref "/ChapterFour/0039.Combination-Sum.md" >}})| Medium | O(n log n)| O(n)|| -|40. Combination Sum II | [Go]({{< relref "/ChapterFour/0040.Combination-Sum-II.md" >}})| Medium | O(n log n)| O(n)|| -|41. First Missing Positive | [Go]({{< relref "/ChapterFour/0041.First-Missing-Positive.md" >}})| Hard | O(n)| O(n)|| -|42. Trapping Rain Water | [Go]({{< relref "/ChapterFour/0042.Trapping-Rain-Water.md" >}})| Hard | O(n)| O(1)|❤️| -|48. Rotate Image | [Go]({{< relref "/ChapterFour/0048.Rotate-Image.md" >}})| Medium | O(n)| O(1)|| -|53. Maximum Subarray| [Go]({{< relref "/ChapterFour/0053.Maximum-Subarray.md" >}})| Easy | O(n)| O(n)|| -|54. Spiral Matrix| [Go]({{< relref "/ChapterFour/0054.Spiral-Matrix.md" >}})| Medium | O(n)| O(n^2)|| -|56. Merge Intervals | [Go]({{< relref "/ChapterFour/0056.Merge-Intervals.md" >}})| Medium | O(n log n)| O(1)|| -|57. Insert Interval | [Go]({{< relref "/ChapterFour/0057.Insert-Interval.md" >}})| Hard | O(n)| O(1)|| -|59. Spiral Matrix II | [Go]({{< relref "/ChapterFour/0059.Spiral-Matrix-II.md" >}})| Medium | O(n)| O(n^2)|| -|62. Unique Paths | [Go]({{< relref "/ChapterFour/0062.Unique-Paths.md" >}})| Medium | O(n^2)| O(n^2)|| -|63. Unique Paths II | [Go]({{< relref "/ChapterFour/0063.Unique-Paths-II.md" >}})| Medium | O(n^2)| O(n^2)|| -|64. Minimum Path Sum | [Go]({{< relref "/ChapterFour/0064.Minimum-Path-Sum.md" >}})| Medium | O(n^2)| O(n^2)|| -|75. Sort Colors | [Go]({{< relref "/ChapterFour/0075.Sort-Colors.md" >}})| Medium| O(n)| O(1)|❤️| -|78. Subsets| [Go]({{< relref "/ChapterFour/0078.Subsets.md" >}})| Medium | O(n^2)| O(n)|❤️| -|79. Word Search | [Go]({{< relref "/ChapterFour/0079.Word-Search.md" >}})| Medium | O(n^2)| O(n^2)|❤️| -|80. Remove Duplicates from Sorted Array II| [Go]({{< relref "/ChapterFour/0080.Remove-Duplicates-from-Sorted-Array-II.md" >}})| Medium | O(n)| O(1|| -|84. Largest Rectangle in Histogram | [Go]({{< relref "/ChapterFour/0084.Largest-Rectangle-in-Histogram.md" >}})| Medium | O(n)| O(n)|❤️| -|88. Merge Sorted Array | [Go]({{< relref "/ChapterFour/0088.Merge-Sorted-Array.md" >}})| Easy | O(n)| O(1)|❤️| -|90. Subsets II | [Go]({{< relref "/ChapterFour/0090.Subsets-II.md" >}})| Medium | O(n^2)| O(n)|❤️| -|120. Triangle | [Go]({{< relref "/ChapterFour/0120.Triangle.md" >}})| Medium | O(n^2)| O(n)|| -|121. Best Time to Buy and Sell Stock | [Go]({{< relref "/ChapterFour/0121.Best-Time-to-Buy-and-Sell-Stock.md" >}})| Easy | O(n)| O(1)|| -|122. Best Time to Buy and Sell Stock II | [Go]({{< relref "/ChapterFour/0122.Best-Time-to-Buy-and-Sell-Stock-II.md" >}})| Easy | O(n)| O(1)|| -|126. Word Ladder II | [Go]({{< relref "/ChapterFour/0126.Word-Ladder-II.md" >}})| Hard | O(n)| O(n^2)|❤️| -|152. Maximum Product Subarray | [Go]({{< relref "/ChapterFour/0152.Maximum-Product-Subarray.md" >}})| Medium | O(n)| O(1)|| -|167. Two Sum II - Input array is sorted | [Go]({{< relref "/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md" >}})| Easy | O(n)| O(1)|| -|209. Minimum Size Subarray Sum | [Go]({{< relref "/ChapterFour/0209.Minimum-Size-Subarray-Sum.md" >}})| Medium | O(n)| O(1)|| -|216. Combination Sum III | [Go]({{< relref "/ChapterFour/0216.Combination-Sum-III.md" >}})| Medium | O(n)| O(1)|❤️| -|217. Contains Duplicate | [Go]({{< relref "/ChapterFour/0217.Contains-Duplicate.md" >}})| Easy | O(n)| O(n)|| -|219. Contains Duplicate II | [Go]({{< relref "/ChapterFour/0219.Contains-Duplicate-II.md" >}})| Easy | O(n)| O(n)|| -|283. Move Zeroes | [Go]({{< relref "/ChapterFour/0283.Move-Zeroes.md" >}})| Easy | O(n)| O(1)|| -|287. Find the Duplicate Number | [Go]({{< relref "/ChapterFour/0287.Find-the-Duplicate-Number.md" >}})| Easy | O(n)| O(1)|❤️| -|532. K-diff Pairs in an Array | [Go]({{< relref "/ChapterFour/0532.K-diff-Pairs-in-an-Array.md" >}})| Easy | O(n)| O(n)|| -|566. Reshape the Matrix | [Go]({{< relref "/ChapterFour/0566.Reshape-the-Matrix.md" >}})| Easy | O(n^2)| O(n^2)|| -|628. Maximum Product of Three Numbers | [Go]({{< relref "/ChapterFour/0628.Maximum-Product-of-Three-Numbers.md" >}})| Easy | O(n)| O(1)|| -|713. Subarray Product Less Than K | [Go]({{< relref "/ChapterFour/0713.Subarray-Product-Less-Than-K.md" >}})| Medium | O(n)| O(1)|| -|714. Best Time to Buy and Sell Stock with Transaction Fee| [Go]({{< relref "/ChapterFour/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md" >}})| Medium | O(n)| O(1)|| -|746. Min Cost Climbing Stairs | [Go]({{< relref "/ChapterFour/0746.Min-Cost-Climbing-Stairs.md" >}})| Easy | O(n)| O(1)|| -|766. Toeplitz Matrix | [Go]({{< relref "/ChapterFour/0766.Toeplitz-Matrix.md" >}})| Easy | O(n)| O(1)|| -|867. Transpose Matrix | [Go]({{< relref "/ChapterFour/0867.Transpose-Matrix.md" >}})| Easy | O(n)| O(1)|| -|891. Sum of Subsequence Widths | [Go]({{< relref "/ChapterFour/0891.Sum-of-Subsequence-Widths.md" >}})| Hard | O(n log n)| O(1)|| -|907. Sum of Subarray Minimums | [Go]({{< relref "/ChapterFour/0907.Sum-of-Subarray-Minimums.md" >}})| Medium | O(n)| O(n)|❤️| -|922. Sort Array By Parity II | [Go]({{< relref "/ChapterFour/0922.Sort-Array-By-Parity-II.md" >}})| Medium | O(n)| O(1)|| -|969. Pancake Sorting | [Go]({{< relref "/ChapterFour/0969.Pancake-Sorting.md" >}})| Medium | O(n)| O(1)|❤️| -|977. Squares of a Sorted Array | [Go]({{< relref "/ChapterFour/0977.Squares-of-a-Sorted-Array.md" >}})| Easy | O(n)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Backtracking.md b/website/content/ChapterTwo/Backtracking.md deleted file mode 100644 index 74f112a07..000000000 --- a/website/content/ChapterTwo/Backtracking.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Backtracking -type: docs ---- - -# Backtracking - -![](https://img.halfrost.com/Leetcode/Backtracking.png) - -- 排列问题 Permutations。第 46 题,第 47 题。第 60 题,第 526 题,第 996 题。 -- 组合问题 Combination。第 39 题,第 40 题,第 77 题,第 216 题。 -- 排列和组合杂交问题。第 1079 题。 -- N 皇后终极解法(二进制解法)。第 51 题,第 52 题。 -- 数独问题。第 37 题。 -- 四个方向搜索。第 79 题,第 212 题,第 980 题。 -- 子集合问题。第 78 题,第 90 题。 -- Trie。第 208 题,第 211 题。 -- BFS 优化。第 126 题,第 127 题。 -- DFS 模板。(只是一个例子,不对应任何题) - -```go -func combinationSum2(candidates []int, target int) [][]int { - if len(candidates) == 0 { - return [][]int{} - } - c, res := []int{}, [][]int{} - sort.Ints(candidates) - findcombinationSum2(candidates, target, 0, c, &res) - return res -} - -func findcombinationSum2(nums []int, target, index int, c []int, res *[][]int) { - if target == 0 { - b := make([]int, len(c)) - copy(b, c) - *res = append(*res, b) - return - } - for i := index; i < len(nums); i++ { - if i > index && nums[i] == nums[i-1] { // 这里是去重的关键逻辑 - continue - } - if target >= nums[i] { - c = append(c, nums[i]) - findcombinationSum2(nums, target-nums[i], i+1, c, res) - c = c[:len(c)-1] - } - } -} -``` -- BFS 模板。(只是一个例子,不对应任何题) - -```go -func updateMatrix_BFS(matrix [][]int) [][]int { - res := make([][]int, len(matrix)) - if len(matrix) == 0 || len(matrix[0]) == 0 { - return res - } - queue := make([][]int, 0) - for i, _ := range matrix { - res[i] = make([]int, len(matrix[0])) - for j, _ := range res[i] { - if matrix[i][j] == 0 { - res[i][j] = -1 - queue = append(queue, []int{i, j}) - } - } - } - level := 1 - for len(queue) > 0 { - size := len(queue) - for size > 0 { - size -= 1 - node := queue[0] - queue = queue[1:] - i, j := node[0], node[1] - for _, direction := range [][]int{{-1, 0}, {1, 0}, {0, 1}, {0, -1}} { - x := i + direction[0] - y := j + direction[1] - if x < 0 || x >= len(matrix) || y < 0 || y >= len(matrix[0]) || res[x][y] < 0 || res[x][y] > 0 { - continue - } - res[x][y] = level - queue = append(queue, []int{x, y}) - } - } - level++ - } - for i, row := range res { - for j, cell := range row { - if cell == -1 { - res[i][j] = 0 - } - } - } - return res -} -``` - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|17. Letter Combinations of a Phone Number | [Go]({{< relref "/ChapterFour/0017.Letter-Combinations-of-a-Phone-Number.md" >}})| Medium | O(log n)| O(1)|| -|22. Generate Parentheses| [Go]({{< relref "/ChapterFour/0022.Generate-Parentheses.md" >}})| Medium | O(log n)| O(1)|| -|37. Sudoku Solver | [Go]({{< relref "/ChapterFour/0037.Sudoku-Solver.md" >}})| Hard | O(n^2)| O(n^2)|❤️| -|39. Combination Sum | [Go]({{< relref "/ChapterFour/0039.Combination-Sum.md" >}})| Medium | O(n log n)| O(n)|| -|40. Combination Sum II | [Go]({{< relref "/ChapterFour/0040.Combination-Sum-II.md" >}})| Medium | O(n log n)| O(n)|| -|46. Permutations | [Go]({{< relref "/ChapterFour/0046.Permutations.md" >}})| Medium | O(n)| O(n)|❤️| -|47. Permutations II | [Go]({{< relref "/ChapterFour/0047.Permutations-II.md" >}})| Medium | O(n^2)| O(n)|❤️| -|51. N-Queens | [Go]({{< relref "/ChapterFour/0051.N-Queens.md" >}})| Hard | O(n^2)| O(n)|❤️| -|52. N-Queens II | [Go]({{< relref "/ChapterFour/0052.N-Queens-II.md" >}})| Hard | O(n^2)| O(n)|❤️| -|60. Permutation Sequence | [Go]({{< relref "/ChapterFour/0060.Permutation-Sequence.md" >}})| Medium | O(n log n)| O(1)|| -|77. Combinations | [Go]({{< relref "/ChapterFour/0077.Combinations.md" >}})| Medium | O(n)| O(n)|❤️| -|78. Subsets | [Go]({{< relref "/ChapterFour/0078.Subsets.md" >}})| Medium | O(n^2)| O(n)|❤️| -|79. Word Search | [Go]({{< relref "/ChapterFour/0079.Word-Search.md" >}})| Medium | O(n^2)| O(n^2)|❤️| -|89. Gray Codes | [Go]({{< relref "/ChapterFour/0089.Gray-Code.md" >}})| Medium | O(n)| O(1)|| -|90. Subsets II | [Go]({{< relref "/ChapterFour/0090.Subsets-II.md" >}})| Medium | O(n^2)| O(n)|❤️| -|93. Restore IP Addresses | [Go]({{< relref "/ChapterFour/0093.Restore-IP-Addresses.md" >}})| Medium | O(n)| O(n)|❤️| -|126. Word Ladder II | [Go]({{< relref "/ChapterFour/0126.Word-Ladder-II.md" >}})| Hard | O(n)| O(n^2)|❤️| -|131. Palindrome Partitioning | [Go]({{< relref "/ChapterFour/0131.Palindrome-Partitioning.md" >}})| Medium | O(n)| O(n^2)|❤️| -|211. Add and Search Word - Data structure design | [Go]({{< relref "/ChapterFour/0211.Add-and-Search-Word---Data-structure-design.md" >}})| Medium | O(n)| O(n)|❤️| -|212. Word Search II | [Go]({{< relref "/ChapterFour/0212.Word-Search-II.md" >}})| Hard | O(n^2)| O(n^2)|❤️| -|216. Combination Sum III | [Go]({{< relref "/ChapterFour/0216.Combination-Sum-III.md" >}})| Medium | O(n)| O(1)|❤️| -|306. Additive Number | [Go]({{< relref "/ChapterFour/0306.Additive-Number.md" >}})| Medium | O(n^2)| O(1)|❤️| -|357. Count Numbers with Unique Digits | [Go]({{< relref "/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md" >}})| Medium | O(1)| O(1)|| -|401. Binary Watch | [Go]({{< relref "/ChapterFour/0401.Binary-Watch.md" >}})| Easy | O(1)| O(1)|| -|526. Beautiful Arrangement | [Go]({{< relref "/ChapterFour/0526.Beautiful-Arrangement.md" >}})| Medium | O(n^2)| O(1)|❤️| -|784. Letter Case Permutation | [Go]({{< relref "/ChapterFour/0784.Letter-Case-Permutation.md" >}})| Easy | O(n)| O(n)|| -|842. Split Array into Fibonacci Sequence | [Go]({{< relref "/ChapterFour/0842.Split-Array-into-Fibonacci-Sequence.md" >}})| Medium | O(n^2)| O(1)|❤️| -|980. Unique Paths III | [Go]({{< relref "/ChapterFour/0980.Unique-Paths-III.md" >}})| Hard | O(n log n)| O(n)|| -|996. Number of Squareful Arrays | [Go]({{< relref "/ChapterFour/0996.Number-of-Squareful-Arrays.md" >}})| Hard | O(n log n)| O(n) || -|1079. Letter Tile Possibilities | [Go]({{< relref "/ChapterFour/1079.Letter-Tile-Possibilities.md" >}})| Medium | O(n^2)| O(1)|❤️| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Binary_Indexed_Tree.md b/website/content/ChapterTwo/Binary_Indexed_Tree.md deleted file mode 100644 index 7fbc2dfca..000000000 --- a/website/content/ChapterTwo/Binary_Indexed_Tree.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Binary Indexed Tree -type: docs ---- - -# Binary Indexed Tree - -![](https://img.halfrost.com/Leetcode/Binary_Indexed_Tree.png) diff --git a/website/content/ChapterTwo/Binary_Search.md b/website/content/ChapterTwo/Binary_Search.md deleted file mode 100644 index 2c71c30df..000000000 --- a/website/content/ChapterTwo/Binary_Search.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Binary Search -type: docs ---- - -# Binary Search - -- 二分搜索的经典写法。需要注意的三点: - 1. 循环退出条件,注意是 low <= high,而不是 low < high。 - 2. mid 的取值,mid := low + (high-low)>>1 - 3. low 和 high 的更新。low = mid + 1,high = mid - 1。 - -```go -func binarySearchMatrix(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + (high-low)>>1 - if nums[mid] == target { - return mid - } else if nums[mid] > target { - high = mid - 1 - } else { - low = mid + 1 - } - } - return -1 -} -``` - -- 二分搜索的变种写法。有 4 个基本变种: - 1. 查找第一个与 target 相等的元素,时间复杂度 O(logn) - 2. 查找最后一个与 target 相等的元素,时间复杂度 O(logn) - 3. 查找第一个大于等于 target 的元素,时间复杂度 O(logn) - 4. 查找最后一个小于等于 target 的元素,时间复杂度 O(logn) - -```go -// 二分查找第一个与 target 相等的元素,时间复杂度 O(logn) -func searchFirstEqualElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] > target { - high = mid - 1 - } else if nums[mid] < target { - low = mid + 1 - } else { - if (mid == 0) || (nums[mid-1] != target) { // 找到第一个与 target 相等的元素 - return mid - } - high = mid - 1 - } - } - return -1 -} - -// 二分查找最后一个与 target 相等的元素,时间复杂度 O(logn) -func searchLastEqualElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] > target { - high = mid - 1 - } else if nums[mid] < target { - low = mid + 1 - } else { - if (mid == len(nums)-1) || (nums[mid+1] != target) { // 找到最后一个与 target 相等的元素 - return mid - } - low = mid + 1 - } - } - return -1 -} - -// 二分查找第一个大于等于 target 的元素,时间复杂度 O(logn) -func searchFirstGreaterElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] >= target { - if (mid == 0) || (nums[mid-1] < target) { // 找到第一个大于等于 target 的元素 - return mid - } - high = mid - 1 - } else { - low = mid + 1 - } - } - return -1 -} - -// 二分查找最后一个小于等于 target 的元素,时间复杂度 O(logn) -func searchLastLessElement(nums []int, target int) int { - low, high := 0, len(nums)-1 - for low <= high { - mid := low + ((high - low) >> 1) - if nums[mid] <= target { - if (mid == len(nums)-1) || (nums[mid+1] > target) { // 找到最后一个小于等于 target 的元素 - return mid - } - low = mid + 1 - } else { - high = mid - 1 - } - } - return -1 -} -``` - -- 在基本有序的数组中用二分搜索。经典解法可以解,变种写法也可以写,常见的题型,在山峰数组中找山峰,在旋转有序数组中找分界点。第 33 题,第 81 题,第 153 题,第 154 题,第 162 题,第 852 题 - -```go -func peakIndexInMountainArray(A []int) int { - low, high := 0, len(A)-1 - for low < high { - mid := low + (high-low)>>1 - // 如果 mid 较大,则左侧存在峰值,high = m,如果 mid + 1 较大,则右侧存在峰值,low = mid + 1 - if A[mid] > A[mid+1] { - high = mid - } else { - low = mid + 1 - } - } - return low -} -``` - -- max-min 最大值最小化问题。求在最小满足条件的情况下的最大值。第 410 题,第 875 题,第 1011 题,第 1283 题。 - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|50. Pow(x, n) | [Go]({{< relref "/ChapterFour/0050.Powx-n.md" >}})| Medium | O(log n)| O(1)|| -|69. Sqrt(x) | [Go]({{< relref "/ChapterFour/0069.Sqrtx.md" >}})| Easy | O(log n)| O(1)|| -|167. Two Sum II - Input array is sorted | [Go]({{< relref "/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md" >}})| Easy | O(n)| O(1)|| -|209. Minimum Size Subarray Sum | [Go]({{< relref "/ChapterFour/0209.Minimum-Size-Subarray-Sum.md" >}})| Medium | O(n)| O(1)|| -|222. Count Complete Tree Nodes | [Go]({{< relref "/ChapterFour/0222.Count-Complete-Tree-Nodes.md" >}})| Medium | O(n)| O(1)|| -|230. Kth Smallest Element in a BST | [Go]({{< relref "/ChapterFour/0230.Kth-Smallest-Element-in-a-BST.md" >}})| Medium | O(n)| O(1)|| -|287. Find the Duplicate Number | [Go]({{< relref "/ChapterFour/0287.Find-the-Duplicate-Number.md" >}})| Easy | O(n)| O(1)|❤️| -|300. Longest Increasing Subsequence | [Go]({{< relref "/ChapterFour/0300.Longest-Increasing-Subsequence.md" >}})| Medium | O(n log n)| O(n)|| -|349. Intersection of Two Arrays | [Go]({{< relref "/ChapterFour/0349.Intersection-of-Two-Arrays.md" >}})| Easy | O(n)| O(n) || -|350. Intersection of Two Arrays II | [Go]({{< relref "/ChapterFour/0350.Intersection-of-Two-Arrays-II.md" >}})| Easy | O(n)| O(n) || -|392. Is Subsequence | [Go]({{< relref "/ChapterFour/0392.Is-Subsequence.md" >}})| Medium | O(n)| O(1)|| -|454. 4Sum II | [Go]({{< relref "/ChapterFour/0454.4Sum-II.md" >}})| Medium | O(n^2)| O(n) || -|710. Random Pick with Blacklist | [Go]({{< relref "/ChapterFour/0710.Random-Pick-with-Blacklist.md" >}})| Hard | O(n)| O(n) || -|-----------------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Bit_Manipulation.md b/website/content/ChapterTwo/Bit_Manipulation.md deleted file mode 100644 index 4dbc87050..000000000 --- a/website/content/ChapterTwo/Bit_Manipulation.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Bit Manipulation -type: docs ---- - -# Bit Manipulation - -![](https://img.halfrost.com/Leetcode/Bit_Manipulation.png) - -- 异或的特性。第 136 题,第 268 题,第 389 题,第 421 题, - -```go -x ^ 0 = x -x ^ 11111……1111 = ~x -x ^ (~x) = 11111……1111 -x ^ x = 0 -a ^ b = c => a ^ c = b => b ^ c = a (交换律) -a ^ b ^ c = a ^ (b ^ c) = (a ^ b)^ c (结合律) -``` - -- 构造特殊 Mask,将特殊位置放 0 或 1。 - -```go -将 x 最右边的 n 位清零, x & ( ~0 << n ) -获取 x 的第 n 位值(0 或者 1),(x >> n) & 1 -获取 x 的第 n 位的幂值,x & (1 << (n - 1)) -仅将第 n 位置为 1,x | (1 << n) -仅将第 n 位置为 0,x & (~(1 << n)) -将 x 最高位至第 n 位(含)清零,x & ((1 << n) - 1) -将第 n 位至第 0 位(含)清零,x & (~((1 << (n + 1)) - 1)) -``` - -- 有特殊意义的 & 位操作运算。第 260 题,第 201 题,第 318 题,第 371 题,第 397 题,第 461 题,第 693 题, - -```go -X & 1 == 1 判断是否是奇数(偶数) -X & = (X - 1) 将最低位(LSB)的 1 清零 -X & -X 得到最低位(LSB)的 1 -X & ~X = 0 -``` - - -| Title | Solution | Difficulty | Time | Space | 收藏 | -| ----- | :--------: | :----------: | :----: | :-----: |:-----: | -|78. Subsets | [Go]({{< relref "/ChapterFour/0078.Subsets.md" >}})| Medium | O(n^2)| O(n)|❤️| -|136. Single Number | [Go]({{< relref "/ChapterFour/0136.Single-Number.md" >}})| Easy | O(n)| O(1)|| -|137. Single Number II | [Go]({{< relref "/ChapterFour/0137.Single-Number-II.md" >}})| Medium | O(n)| O(1)|❤️| -|169. Majority Element | [Go]({{< relref "/ChapterFour/0169.Majority-Element.md" >}})| Easy | O(n)| O(1)|❤️| -|187. Repeated DNA Sequences | [Go]({{< relref "/ChapterFour/0187.Repeated-DNA-Sequences.md" >}})| Medium | O(n)| O(1)|| -|190. Reverse Bits | [Go]({{< relref "/ChapterFour/0190.Reverse-Bits.md" >}})| Easy | O(n)| O(1)|❤️| -|191. Number of 1 Bits | [Go]({{< relref "/ChapterFour/0191.Number-of-1-Bits.md" >}})| Easy | O(n)| O(1)|| -|201. Bitwise AND of Numbers Range | [Go]({{< relref "/ChapterFour/0201.Bitwise-AND-of-Numbers-Range.md" >}})| Medium | O(n)| O(1)|❤️| -|231. Power of Two | [Go]({{< relref "/ChapterFour/0231.Power-of-Two.md" >}})| Easy | O(1)| O(1)|| -|260. Single Number III | [Go]({{< relref "/ChapterFour/0260.Single-Number-III.md" >}})| Medium | O(n)| O(1)|❤️| -|268. Missing Number | [Go]({{< relref "/ChapterFour/0268.Missing-Number.md" >}})| Easy | O(n)| O(1)|| -|318. Maximum Product of Word Lengths | [Go]({{< relref "/ChapterFour/0318.Maximum-Product-of-Word-Lengths.md" >}})| Medium | O(n)| O(1)|| -|338. Counting Bits | [Go]({{< relref "/ChapterFour/0338.Counting-Bits.md" >}})| Medium | O(n)| O(n)|| -|342. Power of Four | [Go]({{< relref "/ChapterFour/0342.Power-of-Four.md" >}})| Easy | O(n)| O(1)|| -|371. Sum of Two Integers | [Go]({{< relref "/ChapterFour/0371.Sum-of-Two-Integers.md" >}})| Easy | O(n)| O(1)|| -|389. Find the Difference | [Go]({{< relref "/ChapterFour/0389.Find-the-Difference.md" >}})| Easy | O(n)| O(1)|| -|393. UTF-8 Validation | [Go]({{< relref "/ChapterFour/0393.UTF-8-Validation.md" >}})| Medium | O(n)| O(1)|| -|397. Integer Replacement | [Go]({{< relref "/ChapterFour/0397.Integer-Replacement.md" >}})| Medium | O(n)| O(1)|| -|401. Binary Watch | [Go]({{< relref "/ChapterFour/0401.Binary-Watch.md" >}})| Easy | O(1)| O(1)|| -|405. Convert a Number to Hexadecimal | [Go]({{< relref "/ChapterFour/0405.Convert-a-Number-to-Hexadecimal.md" >}})| Easy | O(n)| O(1)|| -|421. Maximum XOR of Two Numbers in an Array | [Go]({{< relref "/ChapterFour/0421.Maximum-XOR-of-Two-Numbers-in-an-Array.md" >}})| Medium | O(n)| O(1)|❤️| -|461. Hamming Distance | [Go]({{< relref "/ChapterFour/0461.Hamming-Distance.md" >}})| Easy | O(n)| O(1)|| -|476. Number Complement | [Go]({{< relref "/ChapterFour/0476.Number-Complement.md" >}})| Easy | O(n)| O(1)|| -|477. Total Hamming Distance | [Go]({{< relref "/ChapterFour/0477.Total-Hamming-Distance.md" >}})| Medium | O(n)| O(1)|| -|693. Binary Number with Alternating Bits | [Go]({{< relref "/ChapterFour/0693.Binary-Number-with-Alternating-Bits.md" >}})| Easy | O(n)| O(1)|❤️| -|756. Pyramid Transition Matrix | [Go]({{< relref "/ChapterFour/0756.Pyramid-Transition-Matrix.md" >}})| Medium | O(n log n)| O(n)|| -|762. Prime Number of Set Bits in Binary Representation | [Go]({{< relref "/ChapterFour/0762.Prime-Number-of-Set-Bits-in-Binary-Representation.md" >}})| Easy | O(n)| O(1)|| -|784. Letter Case Permutation | [Go]({{< relref "/ChapterFour/0784.Letter-Case-Permutation.md" >}})| Easy | O(n)| O(1)|| -|898. Bitwise ORs of Subarrays | [Go]({{< relref "/ChapterFour/0898.Bitwise-ORs-of-Subarrays.md" >}})| Medium | O(n)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Breadth_First_Search.md b/website/content/ChapterTwo/Breadth_First_Search.md deleted file mode 100644 index f5ff7c731..000000000 --- a/website/content/ChapterTwo/Breadth_First_Search.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Breadth First Search -type: docs ---- - -# Breadth First Search - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|101. Symmetric Tree | [Go]({{< relref "/ChapterFour/0101.Symmetric-Tree.md" >}})| Easy | O(n)| O(1)|| -|102. Binary Tree Level Order Traversal | [Go]({{< relref "/ChapterFour/0102.Binary-Tree-Level-Order-Traversal.md" >}})| Medium | O(n)| O(1)|| -|103. Binary Tree Zigzag Level Order Traversal | [Go]({{< relref "/ChapterFour/0103.Binary-Tree-Zigzag-Level-Order-Traversal.md" >}})| Medium | O(n)| O(n)|| -|107. Binary Tree Level Order Traversal II | [Go]({{< relref "/ChapterFour/0107.Binary-Tree-Level-Order-Traversal-II.md" >}})| Easy | O(n)| O(1)|| -|111. Minimum Depth of Binary Tree | [Go]({{< relref "/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|126. Word Ladder II | [Go]({{< relref "/ChapterFour/0126.Word-Ladder-II.md" >}})| Hard | O(n)| O(n^2)|❤️| -|127. Word Ladder | [Go]({{< relref "/ChapterFour/0127.Word-Ladder.md" >}})| Medium | O(n)| O(n)|| -|199. Binary Tree Right Side View | [Go]({{< relref "/ChapterFour/0199.Binary-Tree-Right-Side-View.md" >}})| Medium | O(n)| O(1)|| -|200. Number of Islands | [Go]({{< relref "/ChapterFour/0200.Number-of-Islands.md" >}})| Medium | O(n^2)| O(n^2)|| -|207. Course Schedule | [Go]({{< relref "/ChapterFour/0207.Course-Schedule.md" >}})| Medium | O(n^2)| O(n^2)|| -|210. Course Schedule II | [Go]({{< relref "/ChapterFour/0210.Course-Schedule-II.md" >}})| Medium | O(n^2)| O(n^2)|| -|515. Find Largest Value in Each Tree Row | [Go]({{< relref "/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md" >}})| Medium | O(n)| O(n)|| -|542. 01 Matrix | [Go]({{< relref "/ChapterFour/0542.01-Matrix.md" >}})| Medium | O(n)| O(1)|| -|993. Cousins in Binary Tree | [Go]({{< relref "/ChapterFour/0993.Cousins-in-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Depth_First_Search.md b/website/content/ChapterTwo/Depth_First_Search.md deleted file mode 100644 index 41d8ac37e..000000000 --- a/website/content/ChapterTwo/Depth_First_Search.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Depth First Search -type: docs ---- - -# Depth First Search - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|98. Validate Binary Search Tree | [Go]({{< relref "/ChapterFour/0098.Validate-Binary-Search-Tree.md" >}})| Medium | O(n)| O(1)|| -|99. Recover Binary Search Tree | [Go]({{< relref "/ChapterFour/0099.Recover-Binary-Search-Tree.md" >}})| Hard | O(n)| O(1)|| -|100. Same Tree | [Go]({{< relref "/ChapterFour/0100.Same-Tree.md" >}})| Easy | O(n)| O(1)|| -|101. Symmetric Tree | [Go]({{< relref "/ChapterFour/0101.Symmetric-Tree.md" >}})| Easy | O(n)| O(1)|| -|104. Maximum Depth of Binary Tree | [Go]({{< relref "/ChapterFour/0104.Maximum-Depth-of-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|108. Convert Sorted Array to Binary Search Tree | [Go]({{< relref "/ChapterFour/0108.Convert-Sorted-Array-to-Binary-Search-Tree.md" >}})| Easy | O(n)| O(1)|| -|109. Convert Sorted List to Binary Search Tree | [Go]({{< relref "/ChapterFour/0109.Convert-Sorted-List-to-Binary-Search-Tree.md" >}})| Medium | O(log n)| O(n)|| -|110. Balanced Binary Tree | [Go]({{< relref "/ChapterFour/0110.Balanced-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|111. Minimum Depth of Binary Tree | [Go]({{< relref "/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|112. Path Sum | [Go]({{< relref "/ChapterFour/0112.Path-Sum.md" >}})| Easy | O(n)| O(1)|| -|113. Path Sum II | [Go]({{< relref "/ChapterFour/0113.Path-Sum-II.md" >}})| Medium | O(n)| O(1)|| -|114. Flatten Binary Tree to Linked List | [Go]({{< relref "/ChapterFour/0114.Flatten-Binary-Tree-to-Linked-List.md" >}})| Medium | O(n)| O(1)|| -|124. Binary Tree Maximum Path Sum | [Go]({{< relref "/ChapterFour/0124.Binary-Tree-Maximum-Path-Sum.md" >}})| Hard | O(n)| O(1)|| -|129. Sum Root to Leaf Numbers | [Go]({{< relref "/ChapterFour/0129.Sum-Root-to-Leaf-Numbers.md" >}})| Medium | O(n)| O(1)|| -|199. Binary Tree Right Side View | [Go]({{< relref "/ChapterFour/0199.Binary-Tree-Right-Side-View.md" >}})| Medium | O(n)| O(1)|| -|200. Number of Islands | [Go]({{< relref "/ChapterFour/0200.Number-of-Islands.md" >}})| Medium | O(n^2)| O(n^2)|| -|207. Course Schedule | [Go]({{< relref "/ChapterFour/0207.Course-Schedule.md" >}})| Medium | O(n^2)| O(n^2)|| -|210. Course Schedule II | [Go]({{< relref "/ChapterFour/0210.Course-Schedule-II.md" >}})| Medium | O(n^2)| O(n^2)|| -|257. Binary Tree Paths | [Go]({{< relref "/ChapterFour/0257.Binary-Tree-Paths.md" >}})| Easy | O(n)| O(1)|| -|394. Decode String | [Go]({{< relref "/ChapterFour/0394.Decode-String.md" >}})| Medium | O(n)| O(n)|| -|515. Find Largest Value in Each Tree Row | [Go]({{< relref "/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md" >}})| Medium | O(n)| O(n)|| -|542. 01 Matrix | [Go]({{< relref "/ChapterFour/0542.01-Matrix.md" >}})| Medium | O(n)| O(1)|| -|980. Unique Paths III | [Go]({{< relref "/ChapterFour/0980.Unique-Paths-III.md" >}})| Hard | O(n log n)| O(n)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Dynamic_Programming.md b/website/content/ChapterTwo/Dynamic_Programming.md deleted file mode 100644 index 2baddaa93..000000000 --- a/website/content/ChapterTwo/Dynamic_Programming.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Dynamic Programming -type: docs ---- - -# Dynamic Programming - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|53. Maximum Subarray| [Go]({{< relref "/ChapterFour/0053.Maximum-Subarray.md" >}})| Easy | O(n)| O(n)|| -|62. Unique Paths | [Go]({{< relref "/ChapterFour/0062.Unique-Paths.md" >}})| Medium | O(n^2)| O(n^2)|| -|63. Unique Paths II | [Go]({{< relref "/ChapterFour/0063.Unique-Paths-II.md" >}})| Medium | O(n^2)| O(n^2)|| -|64. Minimum Path Sum | [Go]({{< relref "/ChapterFour/0064.Minimum-Path-Sum.md" >}})| Medium | O(n^2)| O(n^2)|| -|70. Climbing Stairs | [Go]({{< relref "/ChapterFour/0070.Climbing-Stairs.md" >}})| Easy | O(n)| O(n)|| -|91. Decode Ways | [Go]({{< relref "/ChapterFour/0091.Decode-Ways.md" >}})| Medium | O(n)| O(n)|| -|96. Unique Binary Search Trees | [Go]({{< relref "/ChapterFour/0096.Unique-Binary-Search-Trees.md" >}})| Medium | O(n)| O(n)|| -|120. Triangle | [Go]({{< relref "/ChapterFour/0120.Triangle.md" >}})| Medium | O(n^2)| O(n)|| -|121. Best Time to Buy and Sell Stock | [Go]({{< relref "/ChapterFour/0121.Best-Time-to-Buy-and-Sell-Stock.md" >}})| Easy | O(n)| O(1)|| -|152. Maximum Product Subarray | [Go]({{< relref "/ChapterFour/0152.Maximum-Product-Subarray.md" >}})| Medium | O(n)| O(1)|| -|198. House Robber | [Go]({{< relref "/ChapterFour/0198.House-Robber.md" >}})| Easy | O(n)| O(n)|| -|213. House Robber II | [Go]({{< relref "/ChapterFour/0213.House-Robber-II.md" >}})| Medium | O(n)| O(n)|| -|300. Longest Increasing Subsequence | [Go]({{< relref "/ChapterFour/0300.Longest-Increasing-Subsequence.md" >}})| Medium | O(n log n)| O(n)|| -|309. Best Time to Buy and Sell Stock with Cooldown | [Go]({{< relref "/ChapterFour/0309.Best-Time-to-Buy-and-Sell-Stock-with-Cooldown.md" >}})| Medium | O(n)| O(n)|| -|322. Coin Change | [Go]({{< relref "/ChapterFour/0322.Coin-Change.md" >}})| Medium | O(n)| O(n)|| -|338. Counting Bits | [Go]({{< relref "/ChapterFour/0338.Counting-Bits.md" >}})| Medium | O(n)| O(n)|| -|343. Integer Break | [Go]({{< relref "/ChapterFour/0343.Integer-Break.md" >}})| Medium | O(n^2)| O(n)|| -|357. Count Numbers with Unique Digits | [Go]({{< relref "/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md" >}})| Medium | O(1)| O(1)|| -|392. Is Subsequence | [Go]({{< relref "/ChapterFour/0392.Is-Subsequence.md" >}})| Medium | O(n)| O(1)|| -|416. Partition Equal Subset Sum | [Go]({{< relref "/ChapterFour/0416.Partition-Equal-Subset-Sum.md" >}})| Medium | O(n^2)| O(n)|| -|714. Best Time to Buy and Sell Stock with Transaction Fee | [Go]({{< relref "/ChapterFour/0714.Best-Time-to-Buy-and-Sell-Stock-with-Transaction-Fee.md" >}})| Medium | O(n)| O(1)|| -|746. Min Cost Climbing Stairs | [Go]({{< relref "/ChapterFour/0746.Min-Cost-Climbing-Stairs.md" >}})| Easy | O(n)| O(1)|| -|838. Push Dominoes | [Go]({{< relref "/ChapterFour/0838.Push-Dominoes.md" >}})| Medium | O(n)| O(n)|| -|1025. Divisor Game | [Go]({{< relref "/ChapterFour/1025.Divisor-Game.md" >}})| Easy | O(1)| O(1)|| -|891. Sum of Subsequence Widths | [Go]({{< relref "/ChapterFour/0891.Sum-of-Subsequence-Widths.md" >}})| Hard | O(n log n)| O(1)|| -|942. DI String Match | [Go]({{< relref "/ChapterFour/0942.DI-String-Match.md" >}})| Easy | O(n)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Hash_Table.md b/website/content/ChapterTwo/Hash_Table.md deleted file mode 100644 index ae4d23865..000000000 --- a/website/content/ChapterTwo/Hash_Table.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Hash Table -type: docs ---- - -# Hash Table - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|1. Two Sum | [Go]({{< relref "/ChapterFour/0001.Two-Sum.md" >}})| Easy | O(n)| O(n)|| -|3. Longest Substring Without Repeating Characters | [Go]({{< relref "/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md" >}})| Medium | O(n)| O(1)|❤️| -|18. 4Sum | [Go]({{< relref "/ChapterFour/0018.4Sum.md" >}})| Medium | O(n^3)| O(n^2)|❤️| -|30. Substring with Concatenation of All Words | [Go]({{< relref "/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md" >}})| Hard | O(n)| O(n)|❤️| -|36. Valid Sudoku | [Go]({{< relref "/ChapterFour/0036.Valid-Sudoku.md" >}})| Medium | O(n^2)| O(n^2)|| -|37. Sudoku Solver | [Go]({{< relref "/ChapterFour/0037.Sudoku-Solver.md" >}})| Hard | O(n^2)| O(n^2)|❤️| -|49. Group Anagrams | [Go]({{< relref "/ChapterFour/0049.Group-Anagrams.md" >}})| Medium | O(n log n)| O(n)|| -|76. Minimum Window Substring | [Go]({{< relref "/ChapterFour/0076.Minimum-Window-Substring.md" >}})| Hard | O(n)| O(n)|❤️| -|94. Binary Tree Inorder Traversal | [Go]({{< relref "/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md" >}})| Medium | O(n)| O(1)|| -|138. Copy List with Random Pointer | [Go]()| Medium | O(n)| O(1)|| -|202. Happy Number | [Go]({{< relref "/ChapterFour/0202.Happy-Number.md" >}})| Easy | O(log n)| O(1)|| -|205. Isomorphic Strings | [Go]({{< relref "/ChapterFour/0205.Isomorphic-Strings.md" >}})| Easy | O(log n)| O(n)|| -|217. Contains Duplicate | [Go]({{< relref "/ChapterFour/0217.Contains-Duplicate.md" >}})| Easy | O(n)| O(n)|| -|219. Contains Duplicate II | [Go]({{< relref "/ChapterFour/0219.Contains-Duplicate-II.md" >}})| Easy | O(n)| O(n)|| -|242. Valid Anagram | [Go]({{< relref "/ChapterFour/0242.Valid-Anagram.md" >}})| Easy | O(n)| O(n) || -|274. H-Index | [Go]({{< relref "/ChapterFour/0274.H-Index.md" >}})| Medium | O(n)| O(n) || -|290. Word Pattern | [Go]({{< relref "/ChapterFour/0290.Word-Pattern.md" >}})| Easy | O(n)| O(n) || -|347. Top K Frequent Elements | [Go]({{< relref "/ChapterFour/0347.Top-K-Frequent-Elements.md" >}})| Medium | O(n)| O(n) || -|349. Intersection of Two Arrays | [Go]({{< relref "/ChapterFour/0349.Intersection-of-Two-Arrays.md" >}})| Easy | O(n)| O(n) || -|350. Intersection of Two Arrays II | [Go]({{< relref "/ChapterFour/0350.Intersection-of-Two-Arrays-II.md" >}})| Easy | O(n)| O(n) || -|438. Find All Anagrams in a String | [Go]({{< relref "/ChapterFour/0438.Find-All-Anagrams-in-a-String.md" >}})| Easy | O(n)| O(1) || -|447. Number of Boomerangs | [Go]({{< relref "/ChapterFour/0447.Number-of-Boomerangs.md" >}})| Easy | O(n)| O(1) || -|451. Sort Characters By Frequency | [Go]({{< relref "/ChapterFour/0451.Sort-Characters-By-Frequency.md" >}})| Medium | O(n log n)| O(1) || -|454. 4Sum II | [Go]({{< relref "/ChapterFour/0454.4Sum-II.md" >}})| Medium | O(n^2)| O(n) || -|648. Replace Words | [Go]({{< relref "/ChapterFour/0648.Replace-Words.md" >}})| Medium | O(n)| O(n) || -|676. Implement Magic Dictionary | [Go]({{< relref "/ChapterFour/0676.Implement-Magic-Dictionary.md" >}})| Medium | O(n)| O(n) || -|720. Longest Word in Dictionary | [Go]({{< relref "/ChapterFour/0720.Longest-Word-in-Dictionary.md" >}})| Easy | O(n)| O(n) || -|726. Number of Atoms | [Go]({{< relref "/ChapterFour/0726.Number-of-Atoms.md" >}})| Hard | O(n)| O(n) |❤️| -|739. Daily Temperatures | [Go]({{< relref "/ChapterFour/0739.Daily-Temperatures.md" >}})| Medium | O(n)| O(n) || -|710. Random Pick with Blacklist | [Go]({{< relref "/ChapterFour/0710.Random-Pick-with-Blacklist.md" >}})| Hard | O(n)| O(n) || -|895. Maximum Frequency Stack | [Go]({{< relref "/ChapterFour/0895.Maximum-Frequency-Stack.md" >}})| Hard | O(n)| O(n) || -|930. Binary Subarrays With Sum | [Go]({{< relref "/ChapterFour/0930.Binary-Subarrays-With-Sum.md" >}})| Medium | O(n)| O(n) |❤️| -|992. Subarrays with K Different Integers | [Go]({{< relref "/ChapterFour/0992.Subarrays-with-K-Different-Integers.md" >}})| Hard | O(n)| O(n) |❤️| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Linked_List.md b/website/content/ChapterTwo/Linked_List.md deleted file mode 100644 index d786f4665..000000000 --- a/website/content/ChapterTwo/Linked_List.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -title: Linked List -type: docs ---- - -# Linked List - -![](https://img.halfrost.com/Leetcode/Linked_List.png) - - -- 巧妙的构造虚拟头结点。可以使遍历处理逻辑更加统一。 -- 灵活使用递归。构造递归条件,使用递归可以巧妙的解题。不过需要注意有些题目不能使用递归,因为递归深度太深会导致超时和栈溢出。 -- 链表区间逆序。第 92 题。 -- 链表寻找中间节点。第 876 题。链表寻找倒数第 n 个节点。第 19 题。只需要一次遍历就可以得到答案。 -- 合并 K 个有序链表。第 21 题,第 23 题。 -- 链表归类。第 86 题,第 328 题。 -- 链表排序,时间复杂度要求 O(n * log n),空间复杂度 O(1)。只有一种做法,归并排序,至顶向下归并。第 148 题。 -- 判断链表是否存在环,如果有环,输出环的交叉点的下标;判断 2 个链表是否有交叉点,如果有交叉点,输出交叉点。第 141 题,第 142 题,第 160 题。 - - - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|2. Add Two Numbers | [Go]({{< relref "/ChapterFour/0002.Add-Two-Numbers.md" >}})| Medium | O(n)| O(1)|| -|19. Remove Nth Node From End of List | [Go]({{< relref "/ChapterFour/0019.Remove-Nth-Node-From-End-of-List.md" >}})| Medium | O(n)| O(1)|| -|21. Merge Two Sorted Lists | [Go]({{< relref "/ChapterFour/0021.Merge-Two-Sorted-Lists.md" >}})| Easy | O(log n)| O(1)|| -|23. Merge k Sorted Lists| [Go]({{< relref "/ChapterFour/0023.Merge-k-Sorted-Lists.md" >}})| Hard | O(log n)| O(1)|❤️| -|24. Swap Nodes in Pairs | [Go]({{< relref "/ChapterFour/0024.Swap-Nodes-in-Pairs.md" >}})| Medium | O(n)| O(1)|| -|25. Reverse Nodes in k-Group | [Go]({{< relref "/ChapterFour/0025.Reverse-Nodes-in-k-Group.md" >}})| Hard | O(log n)| O(1)|❤️| -|61. Rotate List | [Go]({{< relref "/ChapterFour/0061.Rotate-List.md" >}})| Medium | O(n)| O(1)|| -|82. Remove Duplicates from Sorted List II | [Go]({{< relref "/ChapterFour/0082.Remove-Duplicates-from-Sorted-List-II.md" >}})| Medium | O(n)| O(1)|| -|83. Remove Duplicates from Sorted List | [Go]({{< relref "/ChapterFour/0083.Remove-Duplicates-from-Sorted-List.md" >}})| Easy | O(n)| O(1)|| -|86. Partition List | [Go]({{< relref "/ChapterFour/0086.Partition-List.md" >}})| Medium | O(n)| O(1)|❤️| -|92. Reverse Linked List II | [Go]({{< relref "/ChapterFour/0092.Reverse-Linked-List-II.md" >}})| Medium | O(n)| O(1)|❤️| -|109. Convert Sorted List to Binary Search Tree | [Go]({{< relref "/ChapterFour/0109.Convert-Sorted-List-to-Binary-Search-Tree.md" >}})| Medium | O(log n)| O(n)|| -|141. Linked List Cycle | [Go]({{< relref "/ChapterFour/0141.Linked-List-Cycle.md" >}})| Easy | O(n)| O(1)|❤️| -|142. Linked List Cycle II | [Go]({{< relref "/ChapterFour/0142.Linked-List-Cycle-II.md" >}})| Medium | O(n)| O(1)|❤️| -|143. Reorder List | [Go]({{< relref "/ChapterFour/0143.Reorder-List.md" >}})| Medium | O(n)| O(1)|❤️| -|147. Insertion Sort List | [Go]({{< relref "/ChapterFour/0147.Insertion-Sort-List.md" >}})| Medium | O(n)| O(1)|❤️| -|148. Sort List | [Go]({{< relref "/ChapterFour/0148.Sort-List.md" >}})| Medium | O(n log n)| O(n)|❤️| -|160. Intersection of Two Linked Lists | [Go]({{< relref "/ChapterFour/0160.Intersection-of-Two-Linked-Lists.md" >}})| Easy | O(n)| O(1)|❤️| -|203. Remove Linked List Elements | [Go]({{< relref "/ChapterFour/0203.Remove-Linked-List-Elements.md" >}})| Easy | O(n)| O(1)|| -|206. Reverse Linked List | [Go]({{< relref "/ChapterFour/0206.Reverse-Linked-List.md" >}})| Easy | O(n)| O(1)|| -|234. Palindrome Linked List | [Go]({{< relref "/ChapterFour/0234.Palindrome-Linked-List.md" >}})| Easy | O(n)| O(1)|| -|237. Delete Node in a Linked List | [Go]({{< relref "/ChapterFour/0237.Delete-Node-in-a-Linked-List.md" >}})| Easy | O(n)| O(1)|| -|328. Odd Even Linked List | [Go]({{< relref "/ChapterFour/0328.Odd-Even-Linked-List.md" >}})| Medium | O(n)| O(1)|| -|445. Add Two Numbers II | [Go]({{< relref "/ChapterFour/0445.Add-Two-Numbers-II.md" >}})| Medium | O(n)| O(n)|| -|725. Split Linked List in Parts | [Go]({{< relref "/ChapterFour/0725.Split-Linked-List-in-Parts.md" >}})| Medium | O(n)| O(1)|| -|817. Linked List Components | [Go]({{< relref "/ChapterFour/0817.Linked-List-Components.md" >}})| Medium | O(n)| O(1)|| -|707. Design Linked List | [Go]({{< relref "/ChapterFour/0707.Design-Linked-List.md" >}})| Easy | O(n)| O(1)|| -|876. Middle of the Linked List | [Go]({{< relref "/ChapterFour/0876.Middle-of-the-Linked-List.md" >}})| Easy | O(n)| O(1)|❤️| -|1019. Next Greater Node In Linked List | [Go]({{< relref "/ChapterFour/1019.Next-Greater-Node-In-Linked-List.md" >}})| Medium | O(n)| O(1)|| -|---------------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Math.md b/website/content/ChapterTwo/Math.md deleted file mode 100644 index b20da7a36..000000000 --- a/website/content/ChapterTwo/Math.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Math -type: docs ---- - -# Math - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|2. Add Two Numbers | [Go]({{< relref "/ChapterFour/0002.Add-Two-Numbers.md" >}})| Medium | O(n)| O(1)|| -|50. Pow(x, n) | [Go]({{< relref "/ChapterFour/0050.Powx-n.md" >}})| Medium | O(log n)| O(1)|| -|60. Permutation Sequence | [Go]({{< relref "/ChapterFour/0060.Permutation-Sequence.md" >}})| Medium | O(n log n)| O(1)|| -|69. Sqrt(x) | [Go]({{< relref "/ChapterFour/0069.Sqrtx.md" >}})| Easy | O(log n)| O(1)|| -|202. Happy Number | [Go]({{< relref "/ChapterFour/0202.Happy-Number.md" >}})| Easy | O(log n)| O(1)|| -|224. Basic Calculator | [Go]({{< relref "/ChapterFour/0224.Basic-Calculator.md" >}})| Hard | O(n)| O(n)|| -|231. Power of Two | [Go]({{< relref "/ChapterFour/0231.Power-of-Two.md" >}})| Easy | O(1)| O(1)|| -|263. Ugly Number | [Go]({{< relref "/ChapterFour/0263.Ugly-Number.md" >}})| Easy | O(log n)| O(1)|| -|326. Power of Three | [Go]({{< relref "/ChapterFour/0326.Power-of-Three.md" >}})| Easy | O(1)| O(1)|| -|343. Integer Break | [Go]({{< relref "/ChapterFour/0343.Integer-Break.md" >}})| Medium | O(n^2)| O(n)|| -|357. Count Numbers with Unique Digits | [Go]({{< relref "/ChapterFour/0357.Count-Numbers-with-Unique-Digits.md" >}})| Medium | O(1)| O(1)|| -|628. Maximum Product of Three Numbers | [Go]({{< relref "/ChapterFour/0628.Maximum-Product-of-Three-Numbers.md" >}})| Easy | O(n)| O(1)|| -|885. Spiral Matrix III | [Go]({{< relref "/ChapterFour/0885.Spiral-Matrix-III.md" >}})| Medium | O(n^2)| O(1)|| -|891. Sum of Subsequence Widths | [Go]({{< relref "/ChapterFour/0891.Sum-of-Subsequence-Widths.md" >}})| Hard | O(n log n)| O(1)|| -|942. DI String Match | [Go]({{< relref "/ChapterFour/0942.DI-String-Match.md" >}})| Easy | O(n)| O(1)|| -|976. Largest Perimeter Triangle | [Go]({{< relref "/ChapterFour/0976.Largest-Perimeter-Triangle.md" >}})| Easy | O(n log n)| O(log n) || -|996. Number of Squareful Arrays | [Go]({{< relref "/ChapterFour/0996.Number-of-Squareful-Arrays.md" >}})| Hard | O(n log n)| O(n) || -|1025. Divisor Game | [Go]({{< relref "/ChapterFour/1025.Divisor-Game.md" >}})| Easy | O(1)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Sliding_Window.md b/website/content/ChapterTwo/Sliding_Window.md deleted file mode 100644 index 2ffd90d7e..000000000 --- a/website/content/ChapterTwo/Sliding_Window.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Sliding Window -type: docs ---- - -# Sliding Window - -![](https://img.halfrost.com/Leetcode/Sliding_Window.png) - -- 双指针滑动窗口的经典写法。右指针不断往右移,移动到不能往右移动为止(具体条件根据题目而定)。当右指针到最右边以后,开始挪动左指针,释放窗口左边界。第 3 题,第 76 题,第 209 题,第 424 题,第 438 题,第 567 题,第 713 题,第 763 题,第 845 题,第 881 题,第 904 题,第 978 题,第 992 题,第 1004 题,第 1040 题,第 1052 题。 - -```c - left, right := 0, -1 - - for left < len(s) { - if right+1 < len(s) && freq[s[right+1]-'a'] == 0 { - freq[s[right+1]-'a']++ - right++ - } else { - freq[s[left]-'a']-- - left++ - } - result = max(result, right-left+1) - } -``` -- 滑动窗口经典题。第 239 题,第 480 题。 - -| Title | Solution | Difficulty | Time | Space | 收藏 | -| ----- | :--------: | :----------: | :----: | :-----: |:-----: | -|3. Longest Substring Without Repeating Characters | [Go]({{< relref "/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md" >}})| Medium | O(n)| O(1)|❤️| -|76. Minimum Window Substring | [Go]({{< relref "/ChapterFour/0076.Minimum-Window-Substring.md" >}})| Hard | O(n)| O(n)|❤️| -|239. Sliding Window Maximum | [Go]({{< relref "/ChapterFour/0239.Sliding-Window-Maximum.md" >}})| Hard | O(n * k)| O(n)|❤️| -|424. Longest Repeating Character Replacement | [Go]({{< relref "/ChapterFour/0424.Longest-Repeating-Character-Replacement.md" >}})| Medium | O(n)| O(1) || -|480. Sliding Window Median | [Go]({{< relref "/ChapterFour/0480.Sliding-Window-Median.md" >}})| Hard | O(n * log k)| O(k)|❤️| -|567. Permutation in String | [Go]({{< relref "/ChapterFour/0567.Permutation-in-String.md" >}})| Medium | O(n)| O(1)|❤️| -|978. Longest Turbulent Subarray | [Go]({{< relref "/ChapterFour/0978.Longest-Turbulent-Subarray.md" >}})| Medium | O(n)| O(1)|❤️| -|992. Subarrays with K Different Integers | [Go]({{< relref "/ChapterFour/0992.Subarrays-with-K-Different-Integers.md" >}})| Hard | O(n)| O(n)|❤️| -|995. Minimum Number of K Consecutive Bit Flips | [Go]({{< relref "/ChapterFour/0995.Minimum-Number-of-K-Consecutive-Bit-Flips.md" >}})| Hard | O(n)| O(1)|❤️| -|1004. Max Consecutive Ones III | [Go]({{< relref "/ChapterFour/1004.Max-Consecutive-Ones-III.md" >}})| Medium | O(n)| O(1) || -|1040. Moving Stones Until Consecutive II | [Go]({{< relref "/ChapterFour/1040.Moving-Stones-Until-Consecutive-II.md" >}})| Medium | O(n log n)| O(1) |❤️| -|1052. Grumpy Bookstore Owner | [Go]({{< relref "/ChapterFour/1052.Grumpy-Bookstore-Owner.md" >}})| Medium | O(n log n)| O(1) || -|1074. Number of Submatrices That Sum to Target | [Go]({{< relref "/ChapterFour/1074.Number-of-Submatrices-That-Sum-to-Target.md" >}})| Hard | O(n^3)| O(n) |❤️| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Sort.md b/website/content/ChapterTwo/Sort.md deleted file mode 100644 index f759edf86..000000000 --- a/website/content/ChapterTwo/Sort.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Sort -type: docs ---- - -# Sort - -![](https://img.halfrost.com/Leetcode/Sort.png) - -- 深刻的理解多路快排。第 75 题。 -- 链表的排序,插入排序(第 147 题)和归并排序(第 148 题) -- 桶排序和基数排序。第 164 题。 -- "摆动排序"。第 324 题。 -- 两两不相邻的排序。第 767 题,第 1054 题。 -- "饼子排序"。第 969 题。 - -| Title | Solution | Difficulty | Time | Space | 收藏 | -| ----- | :--------: | :----------: | :----: | :-----: |:-----: | -|56. Merge Intervals | [Go]({{< relref "/ChapterFour/0056.Merge-Intervals.md" >}})| Medium | O(n log n)| O(log n)|| -|57. Insert Interval | [Go]({{< relref "/ChapterFour/0057.Insert-Interval.md" >}})| Hard | O(n)| O(1)|| -|75. Sort Colors | [Go]({{< relref "/ChapterFour/0075.Sort-Colors.md" >}})| Medium| O(n)| O(1)|❤️| -|147. Insertion Sort List | [Go]({{< relref "/ChapterFour/0147.Insertion-Sort-List.md" >}})| Medium | O(n)| O(1) |❤️| -|148. Sort List | [Go]({{< relref "/ChapterFour/0148.Sort-List.md" >}})| Medium |O(n log n)| O(log n)|❤️| -|164. Maximum Gap | [Go]({{< relref "/ChapterFour/0164.Maximum-Gap.md" >}})| Hard | O(n log n)| O(log n) |❤️| -|179. Largest Number | [Go]({{< relref "/ChapterFour/0179.Largest-Number.md" >}})| Medium | O(n log n)| O(log n) |❤️| -|220. Contains Duplicate III | [Go]({{< relref "/ChapterFour/0220.Contains-Duplicate-III.md" >}})| Medium | O(n log n)| O(1) |❤️| -|242. Valid Anagram | [Go]({{< relref "/ChapterFour/0242.Valid-Anagram.md" >}})| Easy | O(n)| O(n) || -|274. H-Index | [Go]({{< relref "/ChapterFour/0274.H-Index.md" >}})| Medium | O(n)| O(n) || -|324. Wiggle Sort II | [Go]({{< relref "/ChapterFour/0324.Wiggle-Sort-II.md" >}})| Medium| O(n)| O(n)|❤️| -|349. Intersection of Two Arrays | [Go]({{< relref "/ChapterFour/0349.Intersection-of-Two-Arrays.md" >}})| Easy | O(n)| O(n) || -|350. Intersection of Two Arrays II | [Go]({{< relref "/ChapterFour/0350.Intersection-of-Two-Arrays-II.md" >}})| Easy | O(n)| O(n) || -|524. Longest Word in Dictionary through Deleting | [Go]({{< relref "/ChapterFour/0524.Longest-Word-in-Dictionary-through-Deleting.md" >}})| Medium | O(n)| O(1) || -|767. Reorganize String | [Go]({{< relref "/ChapterFour/0767.Reorganize-String.md" >}})| Medium | O(n log n)| O(log n) |❤️| -|853. Car Fleet | [Go]({{< relref "/ChapterFour/0853.Car-Fleet.md" >}})| Medium | O(n log n)| O(log n) || -|710. Random Pick with Blacklist | [Go]({{< relref "/ChapterFour/0710.Random-Pick-with-Blacklist.md" >}})| Hard | O(n)| O(n) || -|922. Sort Array By Parity II | [Go]({{< relref "/ChapterFour/0922.Sort-Array-By-Parity-II.md" >}})| Easy | O(n)| O(1) || -|969. Pancake Sorting | [Go]({{< relref "/ChapterFour/0969.Pancake-Sorting.md" >}})| Medium | O(n log n)| O(log n) |❤️| -|973. K Closest Points to Origin | [Go]({{< relref "/ChapterFour/0973.K-Closest-Points-to-Origin.md" >}})| Medium | O(n log n)| O(log n) || -|976. Largest Perimeter Triangle | [Go]({{< relref "/ChapterFour/0976.Largest-Perimeter-Triangle.md" >}})| Easy | O(n log n)| O(log n) || -|1030. Matrix Cells in Distance Order | [Go]({{< relref "/ChapterFour/1030.Matrix-Cells-in-Distance-Order.md" >}})| Easy | O(n^2)| O(1) || -|1054. Distant Barcodes | [Go]({{< relref "/ChapterFour/1054.Distant-Barcodes.md" >}})| Medium | O(n log n)| O(log n) |❤️| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Stack.md b/website/content/ChapterTwo/Stack.md deleted file mode 100644 index cae1b29c9..000000000 --- a/website/content/ChapterTwo/Stack.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Stack -type: docs ---- - -# Stack - -![](https://img.halfrost.com/Leetcode/Stack.png) - -- 括号匹配问题及类似问题。第 20 题,第 921 题,第 1021 题。 -- 栈的基本 pop 和 push 操作。第 71 题,第 150 题,第 155 题,第 224 题,第 225 题,第 232 题,第 946 题,第 1047 题。 -- 利用栈进行编码问题。第 394 题,第 682 题,第 856 题,第 880 题。 -- **单调栈**。**利用栈维护一个单调递增或者递减的下标数组**。第 84 题,第 456 题,第 496 题,第 503 题,第 739 题,第 901 题,第 907 题,第 1019 题。 - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|20. Valid Parentheses | [Go]({{< relref "/ChapterFour/0020.Valid-Parentheses.md" >}})| Easy | O(log n)| O(1)|| -|42. Trapping Rain Water | [Go]({{< relref "/ChapterFour/0042.Trapping-Rain-Water.md" >}})| Hard | O(n)| O(1)|❤️| -|71. Simplify Path | [Go]({{< relref "/ChapterFour/0071.Simplify-Path.md" >}})| Medium | O(n)| O(n)|❤️| -|84. Largest Rectangle in Histogram | [Go]({{< relref "/ChapterFour/0084.Largest-Rectangle-in-Histogram.md" >}})| Medium | O(n)| O(n)|❤️| -|94. Binary Tree Inorder Traversal | [Go]({{< relref "/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md" >}})| Medium | O(n)| O(1)|| -|103. Binary Tree Zigzag Level Order Traversal | [Go]({{< relref "/ChapterFour/0103.Binary-Tree-Zigzag-Level-Order-Traversal.md" >}})| Medium | O(n)| O(n)|| -|144. Binary Tree Preorder Traversal | [Go]({{< relref "/ChapterFour/0144.Binary-Tree-Preorder-Traversal.md" >}})| Medium | O(n)| O(1)|| -|145. Binary Tree Postorder Traversal | [Go]({{< relref "/ChapterFour/0145.Binary-Tree-Postorder-Traversal.md" >}})| Hard | O(n)| O(1)|| -|150. Evaluate Reverse Polish Notation | [Go]({{< relref "/ChapterFour/0150.Evaluate-Reverse-Polish-Notation.md" >}})| Medium | O(n)| O(1)|| -|155. Min Stack | [Go]({{< relref "/ChapterFour/0155.Min-Stack.md" >}})| Easy | O(n)| O(n)|| -|173. Binary Search Tree Iterator | [Go]({{< relref "/ChapterFour/0173.Binary-Search-Tree-Iterator.md" >}})| Medium | O(n)| O(1)|| -|224. Basic Calculator | [Go]({{< relref "/ChapterFour/0224.Basic-Calculator.md" >}})| Hard | O(n)| O(n)|| -|225. Implement Stack using Queues | [Go]({{< relref "/ChapterFour/0225.Implement-Stack-using-Queues.md" >}})| Easy | O(n)| O(n)|| -|232. Implement Queue using Stacks | [Go]({{< relref "/ChapterFour/0232.Implement-Queue-using-Stacks.md" >}})| Easy | O(n)| O(n)|| -|331. Verify Preorder Serialization of a Binary Tree | [Go]({{< relref "/ChapterFour/0331.Verify-Preorder-Serialization-of-a-Binary-Tree.md" >}})| Medium | O(n)| O(1)|| -|394. Decode String | [Go]({{< relref "/ChapterFour/0394.Decode-String.md" >}})| Medium | O(n)| O(n)|| -|402. Remove K Digits | [Go]({{< relref "/ChapterFour/0402.Remove-K-Digits.md" >}})| Medium | O(n)| O(1)|| -|456. 132 Pattern | [Go]({{< relref "/ChapterFour/0456.132-Pattern.md" >}})| Medium | O(n)| O(n)|| -|496. Next Greater Element I | [Go]({{< relref "/ChapterFour/0496.Next-Greater-Element-I.md" >}})| Easy | O(n)| O(n)|| -|503. Next Greater Element II | [Go]({{< relref "/ChapterFour/0503.Next-Greater-Element-II.md" >}})| Medium | O(n)| O(n)|| -|636. Exclusive Time of Functions | [Go]({{< relref "/ChapterFour/0636.Exclusive-Time-of-Functions.md" >}})| Medium | O(n)| O(n)|| -|682. Baseball Game | [Go]({{< relref "/ChapterFour/0682.Baseball-Game.md" >}})| Easy | O(n)| O(n)|| -|726. Number of Atoms | [Go]({{< relref "/ChapterFour/0726.Number-of-Atoms.md" >}})| Hard | O(n)| O(n) |❤️| -|735. Asteroid Collision | [Go]({{< relref "/ChapterFour/0735.Asteroid-Collision.md" >}})| Medium | O(n)| O(n) || -|739. Daily Temperatures | [Go]({{< relref "/ChapterFour/0739.Daily-Temperatures.md" >}})| Medium | O(n)| O(n) || -|844. Backspace String Compare | [Go]({{< relref "/ChapterFour/0844.Backspace-String-Compare.md" >}})| Easy | O(n)| O(n) || -|856. Score of Parentheses | [Go]({{< relref "/ChapterFour/0856.Score-of-Parentheses.md" >}})| Medium | O(n)| O(n)|| -|880. Decoded String at Index | [Go]({{< relref "/ChapterFour/0880.Decoded-String-at-Index.md" >}})| Medium | O(n)| O(n)|| -|895. Maximum Frequency Stack | [Go]({{< relref "/ChapterFour/0895.Maximum-Frequency-Stack.md" >}})| Hard | O(n)| O(n) || -|901. Online Stock Span | [Go]({{< relref "/ChapterFour/0901.Online-Stock-Span.md" >}})| Medium | O(n)| O(n) || -|907. Sum of Subarray Minimums | [Go]({{< relref "/ChapterFour/0907.Sum-of-Subarray-Minimums.md" >}})| Medium | O(n)| O(n)|❤️| -|921. Minimum Add to Make Parentheses Valid | [Go]({{< relref "/ChapterFour/0921.Minimum-Add-to-Make-Parentheses-Valid.md" >}})| Medium | O(n)| O(n)|| -|946. Validate Stack Sequences | [Go]({{< relref "/ChapterFour/0946.Validate-Stack-Sequences.md" >}})| Medium | O(n)| O(n)|| -|1003. Check If Word Is Valid After Substitutions | [Go]({{< relref "/ChapterFour/1003.Check-If-Word-Is-Valid-After-Substitutions.md" >}})| Medium | O(n)| O(1)|| -|1019. Next Greater Node In Linked List | [Go]({{< relref "/ChapterFour/1019.Next-Greater-Node-In-Linked-List.md" >}})| Medium | O(n)| O(1)|| -|1021. Remove Outermost Parentheses | [Go]({{< relref "/ChapterFour/1021.Remove-Outermost-Parentheses.md" >}})| Medium | O(n)| O(1)|| -|1047. Remove All Adjacent Duplicates In String | [Go]({{< relref "/ChapterFour/1047.Remove-All-Adjacent-Duplicates-In-String.md" >}})| Medium | O(n)| O(1)|| -|---------------------------------------|-----------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/String.md b/website/content/ChapterTwo/String.md deleted file mode 100644 index 1ea29de57..000000000 --- a/website/content/ChapterTwo/String.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: String -type: docs ---- - -# String - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|3. Longest Substring Without Repeating Characters | [Go]({{< relref "/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md" >}})| Medium | O(n)| O(1)|❤️| -|17. Letter Combinations of a Phone Number | [Go]({{< relref "/ChapterFour/0017.Letter-Combinations-of-a-Phone-Number.md" >}})| Medium | O(log n)| O(1)|| -|20. Valid Parentheses | [Go]({{< relref "/ChapterFour/0020.Valid-Parentheses.md" >}})| Easy | O(log n)| O(1)|| -|22. Generate Parentheses | [Go]({{< relref "/ChapterFour/0022.Generate-Parentheses.md" >}})| Medium | O(log n)| O(1)|| -|28. Implement strStr() | [Go]({{< relref "/ChapterFour/0028.Implement-strStr.md" >}})| Easy | O(n)| O(1)|| -|30. Substring with Concatenation of All Words | [Go]({{< relref "/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md" >}})| Hard | O(n)| O(n)|❤️| -|49. Group Anagrams | [Go]({{< relref "/ChapterFour/0049.Group-Anagrams.md" >}})| Medium | O(n log n)| O(n)|| -|71. Simplify Path | [Go]({{< relref "/ChapterFour/0071.Simplify-Path.md" >}})| Medium | O(n)| O(n)|| -|76. Minimum Window Substring | [Go]({{< relref "/ChapterFour/0076.Minimum-Window-Substring.md" >}})| Hard | O(n)| O(n)|❤️| -|91. Decode Ways | [Go]({{< relref "/ChapterFour/0091.Decode-Ways.md" >}})| Medium | O(n)| O(n)|| -|93. Restore IP Addresses | [Go]({{< relref "/ChapterFour/0093.Restore-IP-Addresses.md" >}})| Medium | O(n)| O(n)|❤️| -|125. Valid Palindrome | [Go]({{< relref "/ChapterFour/0125.Valid-Palindrome.md" >}})| Easy | O(n)| O(1)|| -|126. Word Ladder II | [Go]({{< relref "/ChapterFour/0126.Word-Ladder-II.md" >}})| Hard | O(n)| O(n^2)|❤️| -|344. Reverse String | [Go]({{< relref "/ChapterFour/0344.Reverse-String.md" >}})| Easy | O(n)| O(1)|| -|345. Reverse Vowels of a String | [Go]({{< relref "/ChapterFour/0345.Reverse-Vowels-of-a-String.md" >}})| Easy | O(n)| O(1)|| -|767. Reorganize String | [Go]({{< relref "/ChapterFour/0767.Reorganize-String.md" >}})| Medium | O(n log n)| O(log n) |❤️| -|842. Split Array into Fibonacci Sequence | [Go]({{< relref "/ChapterFour/0842.Split-Array-into-Fibonacci-Sequence.md" >}})| Medium | O(n^2)| O(1)|❤️| -|856. Score of Parentheses | [Go]({{< relref "/ChapterFour/0856.Score-of-Parentheses.md" >}})| Medium | O(n)| O(n)|| -|925. Long Pressed Name | [Go]({{< relref "/ChapterFour/0925.Long-Pressed-Name.md" >}})| Easy | O(n)| O(1)|| -|1003. Check If Word Is Valid After Substitutions | [Go]({{< relref "/ChapterFour/1003.Check-If-Word-Is-Valid-After-Substitutions.md" >}})| Medium | O(n)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Tree.md b/website/content/ChapterTwo/Tree.md deleted file mode 100644 index d8a1267e5..000000000 --- a/website/content/ChapterTwo/Tree.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Tree -type: docs ---- - -# Tree - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|94. Binary Tree Inorder Traversal | [Go]({{< relref "/ChapterFour/0094.Binary-Tree-Inorder-Traversal.md" >}})| Medium | O(n)| O(1)|| -|96. Unique Binary Search Trees | [Go]({{< relref "/ChapterFour/0096.Unique-Binary-Search-Trees.md" >}})| Medium | O(n^2)| O(n)|| -|98. Validate Binary Search Tree | [Go]({{< relref "/ChapterFour/0098.Validate-Binary-Search-Tree.md" >}})| Medium | O(n)| O(1)|| -|99. Recover Binary Search Tree | [Go]({{< relref "/ChapterFour/0099.Recover-Binary-Search-Tree.md" >}})| Hard | O(n)| O(1)|| -|100. Same Tree | [Go]({{< relref "/ChapterFour/0100.Same-Tree.md" >}})| Easy | O(n)| O(1)|| -|101. Symmetric Tree | [Go]({{< relref "/ChapterFour/0101.Symmetric-Tree.md" >}})| Easy | O(n)| O(1)|| -|102. Binary Tree Level Order Traversal | [Go]({{< relref "/ChapterFour/0102.Binary-Tree-Level-Order-Traversal.md" >}})| Medium | O(n)| O(1)|| -|103. Binary Tree Zigzag Level Order Traversal | [Go]({{< relref "/ChapterFour/0103.Binary-Tree-Zigzag-Level-Order-Traversal.md" >}})| Medium | O(n)| O(n)|| -|104. Maximum Depth of Binary Tree | [Go]({{< relref "/ChapterFour/0104.Maximum-Depth-of-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|107. Binary Tree Level Order Traversal II | [Go]({{< relref "/ChapterFour/0107.Binary-Tree-Level-Order-Traversal-II.md" >}})| Easy | O(n)| O(1)|| -|108. Convert Sorted Array to Binary Search Tree | [Go]({{< relref "/ChapterFour/0108.Convert-Sorted-Array-to-Binary-Search-Tree.md" >}})| Easy | O(n)| O(1)|| -|110. Balanced Binary Tree | [Go]({{< relref "/ChapterFour/0110.Balanced-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|111. Minimum Depth of Binary Tree | [Go]({{< relref "/ChapterFour/0111.Minimum-Depth-of-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|112. Path Sum | [Go]({{< relref "/ChapterFour/0112.Path-Sum.md" >}})| Easy | O(n)| O(1)|| -|113. Path Sum II | [Go]({{< relref "/ChapterFour/0113.Path-Sum-II.md" >}})| Medium | O(n)| O(1)|| -|114. Flatten Binary Tree to Linked List | [Go]({{< relref "/ChapterFour/0114.Flatten-Binary-Tree-to-Linked-List.md" >}})| Medium | O(n)| O(1)|| -|124. Binary Tree Maximum Path Sum | [Go]({{< relref "/ChapterFour/0124.Binary-Tree-Maximum-Path-Sum.md" >}})| Hard | O(n)| O(1)|| -|129. Sum Root to Leaf Numbers | [Go]({{< relref "/ChapterFour/0129.Sum-Root-to-Leaf-Numbers.md" >}})| Medium | O(n)| O(1)|| -|144. Binary Tree Preorder Traversal | [Go]({{< relref "/ChapterFour/0144.Binary-Tree-Preorder-Traversal.md" >}})| Medium | O(n)| O(1)|| -|145. Binary Tree Postorder Traversal | [Go]({{< relref "/ChapterFour/0145.Binary-Tree-Postorder-Traversal.md" >}})| Hard | O(n)| O(1)|| -|173. Binary Search Tree Iterator | [Go]({{< relref "/ChapterFour/0173.Binary-Search-Tree-Iterator.md" >}})| Medium | O(n)| O(1)|| -|199. Binary Tree Right Side View | [Go]({{< relref "/ChapterFour/0199.Binary-Tree-Right-Side-View.md" >}})| Medium | O(n)| O(1)|| -|222. Count Complete Tree Nodes | [Go]({{< relref "/ChapterFour/0222.Count-Complete-Tree-Nodes.md" >}})| Medium | O(n)| O(1)|| -|226. Invert Binary Tree | [Go]({{< relref "/ChapterFour/0226.Invert-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|230. Kth Smallest Element in a BST | [Go]({{< relref "/ChapterFour/0230.Kth-Smallest-Element-in-a-BST.md" >}})| Medium | O(n)| O(1)|| -|235. Lowest Common Ancestor of a Binary Search Tree | [Go]({{< relref "/ChapterFour/0235.Lowest-Common-Ancestor-of-a-Binary-Search-Tree.md" >}})| Easy | O(n)| O(1)|| -|236. Lowest Common Ancestor of a Binary Tree | [Go]({{< relref "/ChapterFour/0236.Lowest-Common-Ancestor-of-a-Binary-Tree.md" >}})| Medium | O(n)| O(1)|| -|257. Binary Tree Paths | [Go]({{< relref "/ChapterFour/0257.Binary-Tree-Paths.md" >}})| Easy | O(n)| O(1)|| -|404. Sum of Left Leaves | [Go]({{< relref "/ChapterFour/0404.Sum-of-Left-Leaves.md" >}})| Easy | O(n)| O(1)|| -|437. Path Sum III | [Go]({{< relref "/ChapterFour/0437.Path-Sum-III.md" >}})| Easy | O(n)| O(1)|| -|515. Find Largest Value in Each Tree Row | [Go]({{< relref "/ChapterFour/0515.Find-Largest-Value-in-Each-Tree-Row.md" >}})| Medium | O(n)| O(n)|| -|637. Average of Levels in Binary Tree | [Go]({{< relref "/ChapterFour/0637.Average-of-Levels-in-Binary-Tree.md" >}})| Easy | O(n)| O(n)|| -|993. Cousins in Binary Tree | [Go]({{< relref "/ChapterFour/0993.Cousins-in-Binary-Tree.md" >}})| Easy | O(n)| O(1)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Two_Pointers.md b/website/content/ChapterTwo/Two_Pointers.md deleted file mode 100644 index ece49e88d..000000000 --- a/website/content/ChapterTwo/Two_Pointers.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Two Pointers -type: docs ---- - -# Two Pointers - -![](https://img.halfrost.com/Leetcode/Two_pointers.png) - -- 双指针滑动窗口的经典写法。右指针不断往右移,移动到不能往右移动为止(具体条件根据题目而定)。当右指针到最右边以后,开始挪动左指针,释放窗口左边界。第 3 题,第 76 题,第 209 题,第 424 题,第 438 题,第 567 题,第 713 题,第 763 题,第 845 题,第 881 题,第 904 题,第 978 题,第 992 题,第 1004 题,第 1040 题,第 1052 题。 - -```c - left, right := 0, -1 - - for left < len(s) { - if right+1 < len(s) && freq[s[right+1]-'a'] == 0 { - freq[s[right+1]-'a']++ - right++ - } else { - freq[s[left]-'a']-- - left++ - } - result = max(result, right-left+1) - } -``` - -- 快慢指针可以查找重复数字,时间复杂度 O(n),第 287 题。 -- 替换字母以后,相同字母能出现连续最长的长度。第 424 题。 -- SUM 问题集。第 1 题,第 15 题,第 16 题,第 18 题,第 167 题,第 923 题,第 1074 题。 - -| Title | Solution | Difficulty | Time | Space |收藏| -| ----- | :--------: | :----------: | :----: | :-----: | :-----: | -|3. Longest Substring Without Repeating Characters | [Go]({{< relref "/ChapterFour/0003.Longest-Substring-Without-Repeating-Characters.md" >}})| Medium | O(n)| O(1)|❤️| -|11. Container With Most Water | [Go]({{< relref "/ChapterFour/0011.Container-With-Most-Water.md" >}})| Medium | O(n)| O(1)|| -|15. 3Sum | [Go]({{< relref "/ChapterFour/0015.3Sum.md" >}})| Medium | O(n^2)| O(n)|❤️| -|16. 3Sum Closest | [Go]({{< relref "/ChapterFour/0016.3Sum-Closest.md" >}})| Medium | O(n^2)| O(1)|❤️| -|18. 4Sum | [Go]({{< relref "/ChapterFour/0018.4Sum.md" >}})| Medium | O(n^3)| O(n^2)|❤️| -|19. Remove Nth Node From End of List | [Go]({{< relref "/ChapterFour/0019.Remove-Nth-Node-From-End-of-List.md" >}})| Medium | O(n)| O(1)|| -|26. Remove Duplicates from Sorted Array | [Go]({{< relref "/ChapterFour/0026.Remove-Duplicates-from-Sorted-Array.md" >}})| Easy | O(n)| O(1)|| -|27. Remove Element | [Go]({{< relref "/ChapterFour/0027.Remove-Element.md" >}})| Easy | O(n)| O(1)|| -|28. Implement strStr() | [Go]({{< relref "/ChapterFour/0028.Implement-strStr.md" >}})| Easy | O(n)| O(1)|| -|30. Substring with Concatenation of All Words | [Go]({{< relref "/ChapterFour/0030.Substring-with-Concatenation-of-All-Words.md" >}})| Hard | O(n)| O(n)|❤️| -|42. Trapping Rain Water | [Go]({{< relref "/ChapterFour/0042.Trapping-Rain-Water.md" >}})| Hard | O(n)| O(1)|❤️| -|61. Rotate List | [Go]({{< relref "/ChapterFour/0061.Rotate-List.md" >}})| Medium | O(n)| O(1)|| -|75. Sort Colors | [Go]({{< relref "/ChapterFour/0075.Sort-Colors.md" >}})| Medium| O(n)| O(1)|❤️| -|76. Minimum Window Substring | [Go]({{< relref "/ChapterFour/0076.Minimum-Window-Substring.md" >}})| Hard | O(n)| O(n)|❤️| -|80. Remove Duplicates from Sorted Array II | [Go]({{< relref "/ChapterFour/0080.Remove-Duplicates-from-Sorted-Array-II.md" >}})| Medium | O(n)| O(1|| -|86. Partition List | [Go]({{< relref "/ChapterFour/0086.Partition-List.md" >}})| Medium | O(n)| O(1)|❤️| -|88. Merge Sorted Array | [Go]({{< relref "/ChapterFour/0088.Merge-Sorted-Array.md" >}})| Easy | O(n)| O(1)|❤️| -|125. Valid Palindrome | [Go]({{< relref "/ChapterFour/0125.Valid-Palindrome.md" >}})| Easy | O(n)| O(1)|| -|141. Linked List Cycle | [Go]({{< relref "/ChapterFour/0141.Linked-List-Cycle.md" >}})| Easy | O(n)| O(1)|❤️| -|142. Linked List Cycle II | [Go]({{< relref "/ChapterFour/0142.Linked-List-Cycle-II.md" >}})| Medium | O(n)| O(1)|❤️| -|167. Two Sum II - Input array is sorted | [Go]({{< relref "/ChapterFour/0167.Two-Sum-II---Input-array-is-sorted.md" >}})| Easy | O(n)| O(1)|| -|209. Minimum Size Subarray Sum | [Go]({{< relref "/ChapterFour/0209.Minimum-Size-Subarray-Sum.md" >}})| Medium | O(n)| O(1)|| -|234. Palindrome Linked List | [Go]({{< relref "/ChapterFour/0234.Palindrome-Linked-List.md" >}})| Easy | O(n)| O(1)|| -|283. Move Zeroes | [Go]({{< relref "/ChapterFour/0283.Move-Zeroes.md" >}})| Easy | O(n)| O(1)|| -|287. Find the Duplicate Number | [Go]({{< relref "/ChapterFour/0287.Find-the-Duplicate-Number.md" >}})| Easy | O(n)| O(1)|❤️| -|344. Reverse String | [Go]({{< relref "/ChapterFour/0344.Reverse-String.md" >}})| Easy | O(n)| O(1)|| -|345. Reverse Vowels of a String | [Go]({{< relref "/ChapterFour/0345.Reverse-Vowels-of-a-String.md" >}})| Easy | O(n)| O(1)|| -|349. Intersection of Two Arrays | [Go]({{< relref "/ChapterFour/0349.Intersection-of-Two-Arrays.md" >}})| Easy | O(n)| O(n) || -|350. Intersection of Two Arrays II | [Go]({{< relref "/ChapterFour/0350.Intersection-of-Two-Arrays-II.md" >}})| Easy | O(n)| O(n) || -|424. Longest Repeating Character Replacement | [Go]({{< relref "/ChapterFour/0424.Longest-Repeating-Character-Replacement.md" >}})| Medium | O(n)| O(1) || -|524. Longest Word in Dictionary through Deleting | [Go]({{< relref "/ChapterFour/0524.Longest-Word-in-Dictionary-through-Deleting.md" >}})| Medium | O(n)| O(1) || -|532. K-diff Pairs in an Array | [Go]({{< relref "/ChapterFour/0532.K-diff-Pairs-in-an-Array.md" >}})| Easy | O(n)| O(n)|| -|567. Permutation in String | [Go]({{< relref "/ChapterFour/0567.Permutation-in-String.md" >}})| Medium | O(n)| O(1)|❤️| -|713. Subarray Product Less Than K | [Go]({{< relref "/ChapterFour/0713.Subarray-Product-Less-Than-K.md" >}})| Medium | O(n)| O(1)|| -|763. Partition Labels | [Go]({{< relref "/ChapterFour/0763.Partition-Labels.md" >}})| Medium | O(n)| O(1)|❤️| -|826. Most Profit Assigning Work | [Go]({{< relref "/ChapterFour/0826.Most-Profit-Assigning-Work.md" >}})| Medium | O(n log n)| O(n)|| -|828. Unique Letter String | [Go]({{< relref "/ChapterFour/0828.COPYRIGHT-PROBLEM-XXX.md" >}})| Hard | O(n)| O(1)|❤️| -|838. Push Dominoes | [Go]({{< relref "/ChapterFour/0838.Push-Dominoes.md" >}})| Medium | O(n)| O(n)|| -|844. Backspace String Compare | [Go]({{< relref "/ChapterFour/0844.Backspace-String-Compare.md" >}})| Easy | O(n)| O(n) || -|845. Longest Mountain in Array | [Go]({{< relref "/ChapterFour/0845.Longest-Mountain-in-Array.md" >}})| Medium | O(n)| O(1) || -|881. Boats to Save People | [Go]({{< relref "/ChapterFour/0881.Boats-to-Save-People.md" >}})| Medium | O(n log n)| O(1) || -|904. Fruit Into Baskets | [Go]({{< relref "/ChapterFour/0904.Fruit-Into-Baskets.md" >}})| Medium | O(n log n)| O(1) || -|923. 3Sum With Multiplicity | [Go]({{< relref "/ChapterFour/0923.3Sum-With-Multiplicity.md" >}})| Medium | O(n^2)| O(n) || -|925. Long Pressed Name | [Go]({{< relref "/ChapterFour/0925.Long-Pressed-Name.md" >}})| Easy | O(n)| O(1)|| -|930. Binary Subarrays With Sum | [Go]({{< relref "/ChapterFour/0930.Binary-Subarrays-With-Sum.md" >}})| Medium | O(n)| O(n) |❤️| -|977. Squares of a Sorted Array | [Go]({{< relref "/ChapterFour/0977.Squares-of-a-Sorted-Array.md" >}})| Easy | O(n)| O(1)|| -|986. Interval List Intersections | [Go]({{< relref "/ChapterFour/0986.Interval-List-Intersections.md" >}})| Medium | O(n)| O(1)|| -|992. Subarrays with K Different Integers | [Go]({{< relref "/ChapterFour/0992.Subarrays-with-K-Different-Integers.md" >}})| Hard | O(n)| O(n)|❤️| -|1004. Max Consecutive Ones III | [Go]({{< relref "/ChapterFour/1004.Max-Consecutive-Ones-III.md" >}})| Medium | O(n)| O(1) || -|1093. Statistics from a Large Sample | [Go]({{< relref "/ChapterFour/1093.Statistics-from-a-Large-Sample.md" >}})| Medium | O(n)| O(1) || -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/Union_Find.md b/website/content/ChapterTwo/Union_Find.md deleted file mode 100644 index 79b693d5f..000000000 --- a/website/content/ChapterTwo/Union_Find.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Union Find -type: docs ---- - -# Union Find - -![](https://img.halfrost.com/Leetcode/Union_Find.png) - -- 灵活使用并查集的思想,熟练掌握并查集的[模板]({{< relref "/ChapterThree/UnionFind.md" >}}),模板中有两种并查集的实现方式,一种是路径压缩 + 秩优化的版本,另外一种是计算每个集合中元素的个数 + 最大集合元素个数的版本,这两种版本都有各自使用的地方。能使用第一类并查集模板的题目有:第 128 题,第 130 题,第 547 题,第 684 题,第 721 题,第 765 题,第 778 题,第 839 题,第 924 题,第 928 题,第 947 题,第 952 题,第 959 题,第 990 题。能使用第二类并查集模板的题目有:第 803 题,第 952 题。第 803 题秩优化和统计集合个数这些地方会卡时间,如果不优化,会 TLE。 -- 并查集是一种思想,有些题需要灵活使用这种思想,而不是死套模板,如第 399 题,这一题是 stringUnionFind,利用并查集思想实现的。这里每个节点是基于字符串和 map 的,而不是单纯的用 int 节点编号实现的。 -- 有些题死套模板反而做不出来,比如第 685 题,这一题不能路径压缩和秩优化,因为题目中涉及到有向图,需要知道节点的前驱节点,如果路径压缩了,这一题就没法做了。这一题不需要路径压缩和秩优化。 -- 灵活的抽象题目给的信息,将给定的信息合理的编号,使用并查集解题,并用 map 降低时间复杂度,如第 721 题,第 959 题。 -- 关于地图,砖块,网格的题目,可以新建一个特殊节点,将四周边缘的砖块或者网格都 union() 到这个特殊节点上。第 130 题,第 803 题。 -- 能用并查集的题目,一般也可以用 DFS 和 BFS 解答,只不过时间复杂度会高一点。 - - -| Title | Solution | Difficulty | Time | Space | 收藏 | -| ----- | :--------: | :----------: | :----: | :-----: |:-----: | -|128. Longest Consecutive Sequence | [Go]({{< relref "/ChapterFour/0128.Longest-Consecutive-Sequence.md" >}})| Hard | O(n)| O(n)|❤️| -|130. Surrounded Regions | [Go]({{< relref "/ChapterFour/0130.Surrounded-Regions.md" >}})| Medium | O(m\*n)| O(m\*n)|| -|200. Number of Islands | [Go]({{< relref "/ChapterFour/0200.Number-of-Islands.md" >}})| Medium | O(m\*n)| O(m\*n)|| -|399. Evaluate Division | [Go]({{< relref "/ChapterFour/0399.Evaluate-Division.md" >}})| Medium | O(n)| O(n)|| -|547. Friend Circles | [Go]({{< relref "/ChapterFour/0547.Friend-Circles.md" >}})| Medium | O(n^2)| O(n)|| -|684. Redundant Connection | [Go]({{< relref "/ChapterFour/0684.Redundant-Connection.md" >}})| Medium | O(n)| O(n)|| -|685. Redundant Connection II | [Go]({{< relref "/ChapterFour/0685.Redundant-Connection-II.md" >}})| Hard | O(n)| O(n)|| -|721. Accounts Merge | [Go]({{< relref "/ChapterFour/0721.Accounts-Merge.md" >}})| Medium | O(n)| O(n)|❤️| -|765. Couples Holding Hands | [Go]({{< relref "/ChapterFour/0765.Couples-Holding-Hands.md" >}})| Hard | O(n)| O(n)|❤️| -|778. Swim in Rising Water | [Go]({{< relref "/ChapterFour/0778.Swim-in-Rising-Water.md" >}})| Hard | O(n^2)| O(n)|❤️| -|803. Bricks Falling When Hit | [Go]({{< relref "/ChapterFour/0803.Bricks-Falling-When-Hit.md" >}})| Hard | O(n^2)| O(n)|❤️| -|839. Similar String Groups | [Go]({{< relref "/ChapterFour/0839.Similar-String-Groups.md" >}})| Hard | O(n^2)| O(n)|| -|924. Minimize Malware Spread | [Go]({{< relref "/ChapterFour/0924.Minimize-Malware-Spread.md" >}})| Hard | O(m\*n)| O(n)|| -|928. Minimize Malware Spread II | [Go]({{< relref "/ChapterFour/0928.Minimize-Malware-Spread-II.md" >}})| Hard | O(m\*n)| O(n)|❤️| -|947. Most Stones Removed with Same Row or Column | [Go]({{< relref "/ChapterFour/0947.Most-Stones-Removed-with-Same-Row-or-Column.md" >}})| Medium | O(n)| O(n)|| -|952. Largest Component Size by Common Factor | [Go]({{< relref "/ChapterFour/0952.Largest-Component-Size-by-Common-Factor.md" >}})| Hard | O(n)| O(n)|❤️| -|959. Regions Cut By Slashes | [Go]({{< relref "/ChapterFour/0959.Regions-Cut-By-Slashes.md" >}})| Medium | O(n^2)| O(n^2)|❤️| -|990. Satisfiability of Equality Equations | [Go]({{< relref "/ChapterFour/0990.Satisfiability-of-Equality-Equations.md" >}})| Medium | O(n)| O(n)|| -|---------------------------------------|---------------------------------|--------------------------|-----------------------|-----------|--------| \ No newline at end of file diff --git a/website/content/ChapterTwo/_index.md b/website/content/ChapterTwo/_index.md deleted file mode 100644 index c28b73c5b..000000000 --- a/website/content/ChapterTwo/_index.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: 第二章 -type: docs ---- - -# 第二章 算法专题 - -

- -

- - - - -本来天真的认为,把 LeetCode 所有题都完整刷一遍,就可以完整这本书了。经过事实证明,确实是天真了。因为 LeetCode 每天都会增加新题,有时候工作忙了,刷题进度就完全追不上题目更新的速度了。而且以我当前的刷题速度,一年才完成 500+,一年 LeetCode 也会更新 400+ 多题,要起码 5~10 年才能把所有的题目刷完。时间太长了。所以先给自己定了一个小目标,500 题就先把书写出来,总结这个阶段的刷题心得,和大家一起交流。要想把 LeetCode 所有题目都刷完,看来这本书要迭代 5 ~ 10 个版本了(一年迭代一版)。 - -那么这一章就把已经刷完了的专题都整理一遍。有相似套路的题目都放在一起,如果想快速面试的话,其实相同的题目刷 2,3 道就可以了。相同类型的题目非常熟练的情况下,再多刷几道也是做无用功。 - -做到目前为止,笔者认为动态规划是最灵活的类型,这类题目没有一个模板可以给你套用,它也是算法之优雅的地方。笔者认为称它为算法的艺术不为过。动态规划这类型,笔者也还没有刷完,只刷了一部分,还在学习中。 - -那么就分享一下笔者目前刷过的题,和有相似点的题目吧。 diff --git a/website/content/_index.md b/website/content/_index.md deleted file mode 100644 index e9a44e0b5..000000000 --- a/website/content/_index.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: 序 -type: docs ---- - -# 序 - -{{< columns >}} -## 关于 LeetCode - -说到 LeetCode,作为一个程序员来说,应该不陌生,近几年参加面试都会提到它。国内外的程序员用它刷题主要是为了面试。据历史记载,这个网站 2011 年就成立了,马上就要到自己 10 周年的生日了。每周举行周赛,双周赛,月赛,在有限时间内编码,确实非常能考验人的算法能力。一些大公司赞助冠名的比赛获得前几名除了有奖品,还能直接拿到内推的机会。 - -<---> - -## 什么是 Cookbook - -直译的话就是烹饪书,教你做各种食谱美食的书。经常看 O'Reilly 技术书的同学对这个名词会很熟悉。一般动手操作,实践类的书都会有这个名字。 - -{{< /columns >}} - -logo - -## 为什么会写这个开源书 - -笔者刷题刷了一年了,想和大家分享分享一些做题心得,解题方法。想和有相同爱好的人交个朋友,一起交流学习。对于自己来说,写题解也是一种提高。把一道深奥的题目讲给一点都没有头绪的人,并能让他完全听懂,很能锻炼人的表达能力。在讲解中很可能还会遇到听者的一些提问,这些问题可能是自己的知识漏洞,强迫自己去弥补。笔者在公司做过相关的分享,感受很深,双方受益都还不错。 - -> 另外,在大学期间,笔者做题的时候最讨厌写题解,感觉是浪费时间,用更多的时间去做更多的题。现在不知道算不算是“出来混的,总是要还的”。 - - -## 关于书的封面 - -常看 O'Reilly 动物书的同学一看这个封面就知道是向他们致敬。确实是这个目的。O'Reilly 的封面动物都是稀缺动物,并且画风都是黑白素描风。这些动物都有版权了,所以只能在网上找没有版权的黑白素描风的图片。常见的能找到 40 张这种风格的图片。不过用的人太多了,笔者费劲的找了其他几张这种图片,这张孔雀开屏是其中一张。孔雀开屏的意义是希望大家刷完 LeetCode 以后,提高了自身的算法能力,在人生的舞台上开出自己的“屏”。全书配色也都是绿色,因为这是 AC 的颜色。 - - -## 关于作者 - -笔者是一个刚刚入行一年半的 gopher 新人,还请各位大佬多多指点小弟我。大学参加了 3 年 ACM-ICPC,但是由于资质不高,没有拿到一块金牌。所以在算法方面,我对自己的评价算是新手吧。参加 ACM-ICPC 最大的收获是训练了思维能力,这种能力也会运用到生活中。其次是认识了很多国内很聪明的选手,看到了自己和他们的差距。最后,就是那 200 多页,有些自己都没有完全理解的,打印的密密麻麻的[算法模板](https://github.com/halfrost/LeetCode-Go/releases/tag/Special)。知识学会了,终身都是自己的,没有学会,那些知识都是身外之物。 - -笔者从 2019 年 3 月 25 号开始刷题,到 2020 年 3 月 25 号,整整一年的时间。原计划是每天一题。实际上每天有时候不止一题,最终完成了 600+: - -![](https://img.halfrost.com/Blog/ArticleImage/2019_leetcode.png) - -> 一个温馨提示:笔者本以为每天做一题,会让这个 submissions 图全绿,但是我发现我错了。如果你也想坚持,让这个图全绿,一定要注意以下的问题:LeetCode 服务器是在 +0 时区的,这个图也是按照这个时区计算的。也就是说,中国每天早上 8 点之前,是算前一天的!也是因为时区的问题,导致我空白了这 22 个格子。比如有一道 Hard 题很难,当天工作也很多,晚上下班回家想出来了就到第二天凌晨了。于是再做一题当做第二天的量。结果会发现这 2 题都算前一天的。有时候笔者早上 6 点起床刷题,提交以后也都是前一天的。 -> -> (当然这些都是过去了,不重要了,全当是奋斗路上的一些小插曲) - -2020 年笔者肯定还会继续刷题,因为还没有达到自己的一些目标。可能会朝着 1000 题奋进,也有可能刷到 800 题的时候回头开始二刷,三刷。(不达目的不罢休吧~) - -## 关于书中的代码 - -代码都放在 [github repo](https://github.com/halfrost/LeetCode-Go/tree/master/leetcode) 中,按题号可以搜索到题目。 -本书题目的代码都已经 beats 100% 了。没有 beats 100% 题解就没有放到本书中了。那些题目笔者会继续优化到 100% 再放进来。 - -有可能读者会问,为何要追求 beats 100%。笔者认为优化到 beats 100% 才算是把这题做出感觉了。有好几道 Hard 题,笔者都用暴力解法 AC 了,然后只 beats 了 5%。这题就如同没做一样。而且面试中如果给了这样的答案,面试官也不会满意,“还有没有更优解?”。如果通过自己的思考能给出更优解,面试官会更满意一些。 - -LeetCode 统计代码运行时长会有波动的,相同的代码提交 10 次可能就会 beats 100% 了。笔者开始没有发现这个问题,很多题用正确的代码连续交了很多次,一年提交 3400+ 次,导致我的正确率也变的奇高。😢 - -当然,如果还有其他更优美的解法,也能 beats 100% 的,欢迎提交 PR,笔者和大家一起学习。 - -## 目标读者 - -想通过 LeetCode 提高算法能力的编程爱好者。 - - -## 编程语言 - -本书的算法全部用 Go 语言实现。 - -## 使用说明 - -- 本电子书的左上角有搜索栏,可以迅速帮你找到你想看的章节和题号。 -- 本电子书每页都接入了 Gitalk,每一页的最下方都有评论框可以评论,如果没有显示出来,请检查自己的网络。 -- 关于题解,笔者建议这样使用:先自己读题,思考如何解题。如果 15 分钟还没有思路,那么先看笔者的解题思路,但是不要看代码。有思路以后自己用代码实现一遍。如果完全不会写,那就看笔者提供的代码,找出自己到底哪里不会写,找出问题记下来,这就是自己要弥补的知识漏洞。如果自己实现出来了,提交以后有错误,自己先 debug。AC 以后没有到 100% 也先自己思考如何优化。如果每道题自己都能优化到 100% 了,那么一段时间以后进步会很大。所以总的来说,实在没思路,看解题思路;实在优化不到 100%,看看代码。 - -## 互动与勘误 - -如果书中文章有所遗漏,欢迎点击所在页面下边的 edit 按钮进行评论和互动,感谢您的支持与帮助。 - -## 最后 - -一起开始刷题吧~ - -![](https://img.halfrost.com/Blog/ArticleImage/hello_leetcode.png) - -本作品采用 [知识署名-非商业性使用-禁止演绎 (BY-NC-ND) 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode.zh-Hans) 进行许可。 - -题解里面的所有题目版权均归 [LeetCode](https://leetcode.com/) 和 [力扣中国](https://leetcode-cn.com/) 所有 -  \ No newline at end of file diff --git a/website/content/docs/example/_index.md b/website/content/docs/example/_index.md deleted file mode 100644 index 4835b7ca0..000000000 --- a/website/content/docs/example/_index.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -weight: 1 -bookFlatSection: true -title: "Example Site" ---- - -# Introduction - -## Ferre hinnitibus erat accipitrem dixi Troiae tollens - -Lorem markdownum, a quoque nutu est *quodcumque mandasset* veluti. Passim -inportuna totidemque nympha fert; repetens pendent, poenarum guttura sed vacet -non, mortali undas. Omnis pharetramque gramen portentificisque membris servatum -novabis fallit de nubibus atque silvas mihi. **Dixit repetitaque Quid**; verrit -longa; sententia [mandat](http://pastor-ad.io/questussilvas) quascumque nescio -solebat [litore](http://lacrimas-ab.net/); noctes. *Hostem haerentem* circuit -[plenaque tamen](http://www.sine.io/in). - -- Pedum ne indigenae finire invergens carpebat -- Velit posses summoque -- De fumos illa foret - -## Est simul fameque tauri qua ad - -Locum nullus nisi vomentes. Ab Persea sermone vela, miratur aratro; eandem -Argolicas gener. - -## Me sol - -Nec dis certa fuit socer, Nonacria **dies** manet tacitaque sibi? Sucis est -iactata Castrumque iudex, et iactato quoque terraeque es tandem et maternos -vittis. Lumina litus bene poenamque animos callem ne tuas in leones illam dea -cadunt genus, et pleno nunc in quod. Anumque crescentesque sanguinis -[progenies](http://www.late.net/alimentavirides) nuribus rustica tinguet. Pater -omnes liquido creditis noctem. - - if (mirrored(icmp_dvd_pim, 3, smbMirroredHard) != lion(clickImportQueue, - viralItunesBalancing, bankruptcy_file_pptp)) { - file += ip_cybercrime_suffix; - } - if (runtimeSmartRom == netMarketingWord) { - virusBalancingWin *= scriptPromptBespoke + raster(post_drive, - windowsSli); - cd = address_hertz_trojan; - soap_ccd.pcbServerGigahertz(asp_hardware_isa, offlinePeopleware, nui); - } else { - megabyte.api = modem_flowchart - web + syntaxHalftoneAddress; - } - if (3 < mebibyteNetworkAnimated) { - pharming_regular_error *= jsp_ribbon + algorithm * recycleMediaKindle( - dvrSyntax, cdma); - adf_sla *= hoverCropDrive; - templateNtfs = -1 - vertical; - } else { - expressionCompressionVariable.bootMulti = white_eup_javascript( - table_suffix); - guidPpiPram.tracerouteLinux += rtfTerabyteQuicktime(1, - managementRosetta(webcamActivex), 740874); - } - var virusTweetSsl = nullGigo; - -## Trepident sitimque - -Sentiet et ferali errorem fessam, coercet superbus, Ascaniumque in pennis -mediis; dolor? Vidit imi **Aeacon** perfida propositos adde, tua Somni Fluctibus -errante lustrat non. - -Tamen inde, vos videt e flammis Scythica parantem rupisque pectora umbras. Haec -ficta canistris repercusso simul ego aris Dixit! Esse Fama trepidare hunc -crescendo vigor ululasse vertice *exspatiantur* celer tepidique petita aversata -oculis iussa est me ferro. diff --git a/website/content/docs/example/collapsed/3rd-level/4th-level.md b/website/content/docs/example/collapsed/3rd-level/4th-level.md deleted file mode 100644 index aa451f19e..000000000 --- a/website/content/docs/example/collapsed/3rd-level/4th-level.md +++ /dev/null @@ -1,12 +0,0 @@ -# 4th Level of Menu - -## Caesorum illa tu sentit micat vestes papyriferi - -Inde aderam facti; Theseus vis de tauri illa peream. Oculos **uberaque** non -regisque vobis cursuque, opus venit quam vulnera. Et maiora necemque, lege modo; -gestanda nitidi, vero? Dum ne pectoraque testantur. - -Venasque repulsa Samos qui, exspectatum eram animosque hinc, [aut -manes](http://www.creveratnon.net/apricaaetheriis), Assyrii. Cupiens auctoribus -pariter rubet, profana magni super nocens. Vos ius sibilat inpar turba visae -iusto! Sedes ante dum superest **extrema**. diff --git a/website/content/docs/example/collapsed/3rd-level/_index.md b/website/content/docs/example/collapsed/3rd-level/_index.md deleted file mode 100644 index cc0100f3c..000000000 --- a/website/content/docs/example/collapsed/3rd-level/_index.md +++ /dev/null @@ -1,26 +0,0 @@ -# 3rd Level of Menu - -Nefas discordemque domino montes numen tum humili nexilibusque exit, Iove. Quae -miror esse, scelerisque Melaneus viribus. Miseri laurus. Hoc est proposita me -ante aliquid, aura inponere candidioribus quidque accendit bella, sumpta. -Intravit quam erat figentem hunc, motus de fontes parvo tempestate. - - iscsi_virus = pitch(json_in_on(eupViral), - northbridge_services_troubleshooting, personal( - firmware_rw.trash_rw_crm.device(interactive_gopher_personal, - software, -1), megabit, ergonomicsSoftware(cmyk_usb_panel, - mips_whitelist_duplex, cpa))); - if (5) { - managementNetwork += dma - boolean; - kilohertz_token = 2; - honeypot_affiliate_ergonomics = fiber; - } - mouseNorthbridge = byte(nybble_xmp_modem.horse_subnet( - analogThroughputService * graphicPoint, drop(daw_bit, dnsIntranet), - gateway_ospf), repository.domain_key.mouse(serverData(fileNetwork, - trim_duplex_file), cellTapeDirect, token_tooltip_mashup( - ripcordingMashup))); - module_it = honeypot_driver(client_cold_dvr(593902, ripping_frequency) + - coreLog.joystick(componentUdpLink), windows_expansion_touchscreen); - bashGigabit.external.reality(2, server_hardware_codec.flops.ebookSampling( - ciscNavigationBacklink, table + cleanDriver), indexProtocolIsp); diff --git a/website/content/docs/example/collapsed/_index.md b/website/content/docs/example/collapsed/_index.md deleted file mode 100644 index 806bc2efa..000000000 --- a/website/content/docs/example/collapsed/_index.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -bookCollapseSection: true -weight: 20 ---- - -# Collapsed Level of Menu - -## Cognita laeva illo fracta - -Lorem markdownum pavent auras, surgit nunc cingentibus libet **Laomedonque que** -est. Pastor [An](http://est.org/ire.aspx) arbor filia foedat, ne [fugit -aliter](http://www.indiciumturbam.org/moramquid.php), per. Helicona illas et -callida neptem est *Oresitrophos* caput, dentibus est venit. Tenet reddite -[famuli](http://www.antro-et.net/) praesentem fortibus, quaeque vis foret si -frondes *gelidos* gravidae circumtulit [inpulit armenta -nativum](http://incurvasustulit.io/illi-virtute.html). - -1. Te at cruciabere vides rubentis manebo -2. Maturuit in praetemptat ruborem ignara postquam habitasse -3. Subitarum supplevit quoque fontesque venabula spretis modo -4. Montis tot est mali quasque gravis -5. Quinquennem domus arsit ipse -6. Pellem turis pugnabant locavit diff --git a/website/content/docs/example/hidden.md b/website/content/docs/example/hidden.md deleted file mode 100644 index df7cb9ebb..000000000 --- a/website/content/docs/example/hidden.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -bookHidden: true ---- - -# This page is hidden in menu - -# Quondam non pater est dignior ille Eurotas - -## Latent te facies - -Lorem markdownum arma ignoscas vocavit quoque ille texit mandata mentis ultimus, -frementes, qui in vel. Hippotades Peleus [pennas -conscia](http://gratia.net/tot-qua.php) cuiquam Caeneus quas. - -- Pater demittere evincitque reddunt -- Maxime adhuc pressit huc Danaas quid freta -- Soror ego -- Luctus linguam saxa ultroque prior Tatiumque inquit -- Saepe liquitur subita superata dederat Anius sudor - -## Cum honorum Latona - -O fallor [in sustinui -iussorum](http://www.spectataharundine.org/aquas-relinquit.html) equidem. -Nymphae operi oris alii fronde parens dumque, in auro ait mox ingenti proxima -iamdudum maius? - - reality(burnDocking(apache_nanometer), - pad.property_data_programming.sectorBrowserPpga(dataMask, 37, - recycleRup)); - intellectualVaporwareUser += -5 * 4; - traceroute_key_upnp /= lag_optical(android.smb(thyristorTftp)); - surge_host_golden = mca_compact_device(dual_dpi_opengl, 33, - commerce_add_ppc); - if (lun_ipv) { - verticalExtranet(1, thumbnail_ttl, 3); - bar_graphics_jpeg(chipset - sector_xmp_beta); - } - -## Fronde cetera dextrae sequens pennis voce muneris - -Acta cretus diem restet utque; move integer, oscula non inspirat, noctisque -scelus! Nantemque in suas vobis quamvis, et labori! - - var runtimeDiskCompiler = home - array_ad_software; - if (internic > disk) { - emoticonLockCron += 37 + bps - 4; - wan_ansi_honeypot.cardGigaflops = artificialStorageCgi; - simplex -= downloadAccess; - } - var volumeHardeningAndroid = pixel + tftp + onProcessorUnmount; - sector(memory(firewire + interlaced, wired)); \ No newline at end of file diff --git a/website/content/docs/example/table-of-contents/_index.md b/website/content/docs/example/table-of-contents/_index.md deleted file mode 100644 index c7ee0d872..000000000 --- a/website/content/docs/example/table-of-contents/_index.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -weight: 10 ---- - -# Ubi loqui - -## Mentem genus facietque salire tempus bracchia - -Lorem markdownum partu paterno Achillem. Habent amne generosi aderant ad pellem -nec erat sustinet merces columque haec et, dixit minus nutrit accipiam subibis -subdidit. Temeraria servatum agros qui sed fulva facta. Primum ultima, dedit, -suo quisque linguae medentes fixo: tum petis. - -## Rapit vocant si hunc siste adspice - -Ora precari Patraeque Neptunia, dixit Danae [Cithaeron -armaque](http://mersis-an.org/litoristum) maxima in **nati Coniugis** templis -fluidove. Effugit usus nec ingreditur agmen *ac manus* conlato. Nullis vagis -nequiquam vultibus aliquos altera *suum venis* teneas fretum. Armos [remotis -hoc](http://tutum.io/me) sine ferrea iuncta quam! - -## Locus fuit caecis - -Nefas discordemque domino montes numen tum humili nexilibusque exit, Iove. Quae -miror esse, scelerisque Melaneus viribus. Miseri laurus. Hoc est proposita me -ante aliquid, aura inponere candidioribus quidque accendit bella, sumpta. -Intravit quam erat figentem hunc, motus de fontes parvo tempestate. - - iscsi_virus = pitch(json_in_on(eupViral), - northbridge_services_troubleshooting, personal( - firmware_rw.trash_rw_crm.device(interactive_gopher_personal, - software, -1), megabit, ergonomicsSoftware(cmyk_usb_panel, - mips_whitelist_duplex, cpa))); - if (5) { - managementNetwork += dma - boolean; - kilohertz_token = 2; - honeypot_affiliate_ergonomics = fiber; - } - mouseNorthbridge = byte(nybble_xmp_modem.horse_subnet( - analogThroughputService * graphicPoint, drop(daw_bit, dnsIntranet), - gateway_ospf), repository.domain_key.mouse(serverData(fileNetwork, - trim_duplex_file), cellTapeDirect, token_tooltip_mashup( - ripcordingMashup))); - module_it = honeypot_driver(client_cold_dvr(593902, ripping_frequency) + - coreLog.joystick(componentUdpLink), windows_expansion_touchscreen); - bashGigabit.external.reality(2, server_hardware_codec.flops.ebookSampling( - ciscNavigationBacklink, table + cleanDriver), indexProtocolIsp); - -## Placabilis coactis nega ingemuit ignoscat nimia non - -Frontis turba. Oculi gravis est Delphice; *inque praedaque* sanguine manu non. - - if (ad_api) { - zif += usb.tiffAvatarRate(subnet, digital_rt) + exploitDrive; - gigaflops(2 - bluetooth, edi_asp_memory.gopher(queryCursor, laptop), - panel_point_firmware); - spyware_bash.statePopApplet = express_netbios_digital( - insertion_troubleshooting.brouter(recordFolderUs), 65); - } - recursionCoreRay = -5; - if (hub == non) { - portBoxVirus = soundWeb(recursive_card(rwTechnologyLeopard), - font_radcab, guidCmsScalable + reciprocalMatrixPim); - left.bug = screenshot; - } else { - tooltipOpacity = raw_process_permalink(webcamFontUser, -1); - executable_router += tape; - } - if (tft) { - bandwidthWeb *= social_page; - } else { - regular += 611883; - thumbnail /= system_lag_keyboard; - } - -## Caesorum illa tu sentit micat vestes papyriferi - -Inde aderam facti; Theseus vis de tauri illa peream. Oculos **uberaque** non -regisque vobis cursuque, opus venit quam vulnera. Et maiora necemque, lege modo; -gestanda nitidi, vero? Dum ne pectoraque testantur. - -Venasque repulsa Samos qui, exspectatum eram animosque hinc, [aut -manes](http://www.creveratnon.net/apricaaetheriis), Assyrii. Cupiens auctoribus -pariter rubet, profana magni super nocens. Vos ius sibilat inpar turba visae -iusto! Sedes ante dum superest **extrema**. diff --git a/website/content/docs/example/table-of-contents/with-toc.md b/website/content/docs/example/table-of-contents/with-toc.md deleted file mode 100644 index 5345c668a..000000000 --- a/website/content/docs/example/table-of-contents/with-toc.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: With ToC -weight: 1 ---- -# Caput vino delphine in tamen vias - -## Cognita laeva illo fracta - -Lorem markdownum pavent auras, surgit nunc cingentibus libet **Laomedonque que** -est. Pastor [An](http://est.org/ire.aspx) arbor filia foedat, ne [fugit -aliter](http://www.indiciumturbam.org/moramquid.php), per. Helicona illas et -callida neptem est *Oresitrophos* caput, dentibus est venit. Tenet reddite -[famuli](http://www.antro-et.net/) praesentem fortibus, quaeque vis foret si -frondes *gelidos* gravidae circumtulit [inpulit armenta -nativum](http://incurvasustulit.io/illi-virtute.html). - -1. Te at cruciabere vides rubentis manebo -2. Maturuit in praetemptat ruborem ignara postquam habitasse -3. Subitarum supplevit quoque fontesque venabula spretis modo -4. Montis tot est mali quasque gravis -5. Quinquennem domus arsit ipse -6. Pellem turis pugnabant locavit - -## Natus quaerere - -Pectora et sine mulcere, coniuge dum tincta incurvae. Quis iam; est dextra -Peneosque, metuis a verba, primo. Illa sed colloque suis: magno: gramen, aera -excutiunt concipit. - -> Phrygiae petendo suisque extimuit, super, pars quod audet! Turba negarem. -> Fuerat attonitus; et dextra retinet sidera ulnas undas instimulat vacuae -> generis? *Agnus* dabat et ignotis dextera, sic tibi pacis **feriente at mora** -> euhoeque *comites hostem* vestras Phineus. Vultuque sanguine dominoque [metuit -> risi](http://iuvat.org/eundem.php) fama vergit summaque meus clarissimus -> artesque tinguebat successor nominis cervice caelicolae. - -## Limitibus misere sit - -Aurea non fata repertis praerupit feruntur simul, meae hosti lentaque *citius -levibus*, cum sede dixit, Phaethon texta. *Albentibus summos* multifidasque -iungitur loquendi an pectore, mihi ursaque omnia adfata, aeno parvumque in animi -perlucentes. Epytus agis ait vixque clamat ornum adversam spondet, quid sceptra -ipsum **est**. Reseret nec; saeva suo passu debentia linguam terga et aures et -cervix [de](http://www.amnem.io/pervenit.aspx) ubera. Coercet gelidumque manus, -doluit volvitur induta? - -## Enim sua - -Iuvenilior filia inlustre templa quidem herbis permittat trahens huic. In -cruribus proceres sole crescitque *fata*, quos quos; merui maris se non tamen -in, mea. - -## Germana aves pignus tecta - -Mortalia rudibusque caelum cognosceret tantum aquis redito felicior texit, nec, -aris parvo acre. Me parum contulerant multi tenentem, gratissime suis; vultum tu -occupat deficeret corpora, sonum. E Actaea inplevit Phinea concepit nomenque -potest sanguine captam nulla et, in duxisses campis non; mercede. Dicere cur -Leucothoen obitum? - -Postibus mittam est *nubibus principium pluma*, exsecratur facta et. Iunge -Mnemonidas pallamque pars; vere restitit alis flumina quae **quoque**, est -ignara infestus Pyrrha. Di ducis terris maculatum At sede praemia manes -nullaque! diff --git a/website/content/docs/example/table-of-contents/without-toc.md b/website/content/docs/example/table-of-contents/without-toc.md deleted file mode 100644 index 9b1631883..000000000 --- a/website/content/docs/example/table-of-contents/without-toc.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: Without ToC -weight: 2 -bookToc: false ---- - -# At me ipso nepotibus nunc celebratior genus - -## Tanto oblite - -Lorem markdownum pectora novis patenti igne sua opus aurae feras materiaque -illic demersit imago et aristas questaque posset. Vomit quoque suo inhaesuro -clara. Esse cumque, per referri triste. Ut exponit solisque communis in tendens -vincetis agisque iamque huic bene ante vetat omina Thebae rates. Aeacus servat -admonitu concidit, ad resimas vultus et rugas vultu **dignamque** Siphnon. - -Quam iugulum regia simulacra, plus meruit humo pecorumque haesit, ab discedunt -dixit: ritu pharetramque. Exul Laurenti orantem modo, per densum missisque labor -manibus non colla unum, obiectat. Tu pervia collo, fessus quae Cretenque Myconon -crate! Tegumenque quae invisi sudore per vocari quaque plus ventis fluidos. Nodo -perque, fugisse pectora sorores. - -## Summe promissa supple vadit lenius - -Quibus largis latebris aethera versato est, ait sentiat faciemque. Aequata alis -nec Caeneus exululat inclite corpus est, ire **tibi** ostendens et tibi. Rigent -et vires dique possent lumina; **eadem** dixit poma funeribus paret et felix -reddebant ventis utile lignum. - -1. Remansit notam Stygia feroxque -2. Et dabit materna -3. Vipereas Phrygiaeque umbram sollicito cruore conlucere suus -4. Quarum Elis corniger -5. Nec ieiunia dixit - -Vertitur mos ortu ramosam contudit dumque; placabat ac lumen. Coniunx Amoris -spatium poenamque cavernis Thebae Pleiadasque ponunt, rapiare cum quae parum -nimium rima. - -## Quidem resupinus inducto solebat una facinus quae - -Credulitas iniqua praepetibus paruit prospexit, voce poena, sub rupit sinuatur, -quin suum ventorumque arcadiae priori. Soporiferam erat formamque, fecit, -invergens, nymphae mutat fessas ait finge. - -1. Baculum mandataque ne addere capiti violentior -2. Altera duas quam hoc ille tenues inquit -3. Sicula sidereus latrantis domoque ratae polluit comites -4. Possit oro clausura namque se nunc iuvenisque -5. Faciem posuit -6. Quodque cum ponunt novercae nata vestrae aratra - -Ite extrema Phrygiis, patre dentibus, tonso perculit, enim blanda, manibus fide -quos caput armis, posse! Nocendo fas Alcyonae lacertis structa ferarum manus -fulmen dubius, saxa caelum effuge extremis fixum tumor adfecit **bella**, -potentes? Dum nec insidiosa tempora tegit -[spirarunt](http://mihiferre.net/iuvenes-peto.html). Per lupi pars foliis, -porreximus humum negant sunt subposuere Sidone steterant auro. Memoraverit sine: -ferrum idem Orion caelum heres gerebat fixis? diff --git a/website/content/docs/shortcodes/_index.md b/website/content/docs/shortcodes/_index.md deleted file mode 100644 index 9bb0430cb..000000000 --- a/website/content/docs/shortcodes/_index.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -bookFlatSection: true ---- diff --git a/website/content/docs/shortcodes/buttons.md b/website/content/docs/shortcodes/buttons.md deleted file mode 100644 index c2ef1e755..000000000 --- a/website/content/docs/shortcodes/buttons.md +++ /dev/null @@ -1,13 +0,0 @@ -# Buttons - -Buttons are styled links that can lead to local page or external link. - -## Example - -```tpl -{{}}Get Home{{}} -{{}}Contribute{{}} -``` - -{{< button relref="/" >}}Get Home{{< /button >}} -{{< button href="https://github.com/alex-shpak/hugo-book" >}}Contribute{{< /button >}} diff --git a/website/content/docs/shortcodes/columns.md b/website/content/docs/shortcodes/columns.md deleted file mode 100644 index 4df396a67..000000000 --- a/website/content/docs/shortcodes/columns.md +++ /dev/null @@ -1,45 +0,0 @@ -# Columns - -Columns help organize shorter pieces of content horizontally for readability. - - -```html -{{}} -# Left Content -Lorem markdownum insigne... - -<---> - -# Mid Content -Lorem markdownum insigne... - -<---> - -# Right Content -Lorem markdownum insigne... -{{}} -``` - -## Example - -{{< columns >}} -## Left Content -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -protulit, sed sed aere valvis inhaesuro Pallas animam: qui _quid_, ignes. -Miseratus fonte Ditis conubia. - -<---> - -## Mid Content -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! - -<---> - -## Right Content -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -protulit, sed sed aere valvis inhaesuro Pallas animam: qui _quid_, ignes. -Miseratus fonte Ditis conubia. -{{< /columns >}} diff --git a/website/content/docs/shortcodes/details.md b/website/content/docs/shortcodes/details.md deleted file mode 100644 index 248bafd97..000000000 --- a/website/content/docs/shortcodes/details.md +++ /dev/null @@ -1,22 +0,0 @@ -# Details - -Details shortcode is a helper for `details` html5 element. It is going to replace `expand` shortcode. - -## Example -```tpl -{{}} -## Markdown content -Lorem markdownum insigne... -{{}} -``` -```tpl -{{}} -## Markdown content -Lorem markdownum insigne... -{{}} -``` - -{{< details "Title" open >}} -## Markdown content -Lorem markdownum insigne... -{{< /details >}} diff --git a/website/content/docs/shortcodes/expand.md b/website/content/docs/shortcodes/expand.md deleted file mode 100644 index c62520f3f..000000000 --- a/website/content/docs/shortcodes/expand.md +++ /dev/null @@ -1,35 +0,0 @@ -# Expand - -Expand shortcode can help to decrease clutter on screen by hiding part of text. Expand content by clicking on it. - -## Example -### Default - -```tpl -{{}} -## Markdown content -Lorem markdownum insigne... -{{}} -``` - -{{< expand >}} -## Markdown content -Lorem markdownum insigne... -{{< /expand >}} - -### With Custom Label - -```tpl -{{}} -## Markdown content -Lorem markdownum insigne... -{{}} -``` - -{{< expand "Custom Label" "..." >}} -## Markdown content -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -protulit, sed sed aere valvis inhaesuro Pallas animam: qui _quid_, ignes. -Miseratus fonte Ditis conubia. -{{< /expand >}} diff --git a/website/content/docs/shortcodes/hints.md b/website/content/docs/shortcodes/hints.md deleted file mode 100644 index 3477113de..000000000 --- a/website/content/docs/shortcodes/hints.md +++ /dev/null @@ -1,32 +0,0 @@ -# Hints - -Hint shortcode can be used as hint/alerts/notification block. -There are 3 colors to choose: `info`, `warning` and `danger`. - -```tpl -{{}} -**Markdown content** -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -{{}} -``` - -## Example - -{{< hint info >}} -**Markdown content** -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -{{< /hint >}} - -{{< hint warning >}} -**Markdown content** -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -{{< /hint >}} - -{{< hint danger >}} -**Markdown content** -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -{{< /hint >}} diff --git a/website/content/docs/shortcodes/katex.md b/website/content/docs/shortcodes/katex.md deleted file mode 100644 index 4beeaa004..000000000 --- a/website/content/docs/shortcodes/katex.md +++ /dev/null @@ -1,28 +0,0 @@ -# KaTeX - -KaTeX shortcode let you render math typesetting in markdown document. See [KaTeX](https://katex.org/) - -## Example -{{< columns >}} - -```latex -{{}} -f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi -{{}} -``` - -<---> - -{{< katex display >}} -f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi -{{< /katex >}} - -{{< /columns >}} - -## Display Mode Example - -Here is some inline example: {{< katex >}}\pi(x){{< /katex >}}, rendered in the same line. And below is `display` example, having `display: block` -{{< katex display >}} -f(x) = \int_{-\infty}^\infty\hat f(\xi)\,e^{2 \pi i \xi x}\,d\xi -{{< /katex >}} -Text continues here. diff --git a/website/content/docs/shortcodes/mermaid.md b/website/content/docs/shortcodes/mermaid.md deleted file mode 100644 index 3a617bcc0..000000000 --- a/website/content/docs/shortcodes/mermaid.md +++ /dev/null @@ -1,38 +0,0 @@ -# Mermaid Chart - -[Mermaid](https://mermaidjs.github.io/) is library for generating svg charts and diagrams from text. - -## Example - -{{< columns >}} -```tpl -{{}} -sequenceDiagram - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - opt Extra response - Bob->>Alice: Thanks for asking - end -{{}} -``` - -<---> - -{{< mermaid >}} -sequenceDiagram - Alice->>Bob: Hello Bob, how are you? - alt is sick - Bob->>Alice: Not so good :( - else is well - Bob->>Alice: Feeling fresh like a daisy - end - opt Extra response - Bob->>Alice: Thanks for asking - end -{{< /mermaid >}} - -{{< /columns >}} diff --git a/website/content/docs/shortcodes/section/_index.md b/website/content/docs/shortcodes/section/_index.md deleted file mode 100644 index bd5db38b3..000000000 --- a/website/content/docs/shortcodes/section/_index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -bookCollapseSection: true ---- - -# Section - -Section renders pages in section as definition list, using title and description. - -## Example - -```tpl -{{}} -``` - -{{
}} diff --git a/website/content/docs/shortcodes/section/page1.md b/website/content/docs/shortcodes/section/page1.md deleted file mode 100644 index 960800143..000000000 --- a/website/content/docs/shortcodes/section/page1.md +++ /dev/null @@ -1 +0,0 @@ -# Page 1 diff --git a/website/content/docs/shortcodes/section/page2.md b/website/content/docs/shortcodes/section/page2.md deleted file mode 100644 index f310be332..000000000 --- a/website/content/docs/shortcodes/section/page2.md +++ /dev/null @@ -1 +0,0 @@ -# Page 2 diff --git a/website/content/docs/shortcodes/tabs.md b/website/content/docs/shortcodes/tabs.md deleted file mode 100644 index 096892c67..000000000 --- a/website/content/docs/shortcodes/tabs.md +++ /dev/null @@ -1,50 +0,0 @@ -# Tabs - -Tabs let you organize content by context, for example installation instructions for each supported platform. - -```tpl -{{}} -{{}} # MacOS Content {{}} -{{}} # Linux Content {{}} -{{}} # Windows Content {{}} -{{}} -``` - -## Example - -{{< tabs "uniqueid" >}} -{{< tab "MacOS" >}} -# MacOS - -This is tab **MacOS** content. - -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -protulit, sed sed aere valvis inhaesuro Pallas animam: qui _quid_, ignes. -Miseratus fonte Ditis conubia. -{{< /tab >}} - -{{< tab "Linux" >}} - -# Linux - -This is tab **Linux** content. - -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -protulit, sed sed aere valvis inhaesuro Pallas animam: qui _quid_, ignes. -Miseratus fonte Ditis conubia. -{{< /tab >}} - -{{< tab "Windows" >}} - -# Windows - -This is tab **Windows** content. - -Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat -stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa -protulit, sed sed aere valvis inhaesuro Pallas animam: qui _quid_, ignes. -Miseratus fonte Ditis conubia. -{{< /tab >}} -{{< /tabs >}} diff --git a/website/content/en/_index.md b/website/content/en/_index.md new file mode 100644 index 000000000..2faff6432 --- /dev/null +++ b/website/content/en/_index.md @@ -0,0 +1,115 @@ +--- +header: + - type: typewriter + methods: + - typeString: Hello world! + - pauseFor: 2500 + - deleteAll: true + - typeString: Strings can be removed + - pauseFor: 2500 + - deleteChars: 7 + - typeString: altered! + - pauseFor: 2500 + options: + loop: true + autoStart: false + height: 190 + paddingX: 50 + align: center + fontSize: 44 + fontColor: yellow + + - type: text + height: 200 + paddingX: 50 + paddingY: 0 + align: center + title: + - HUGO + subtitle: + - The world’s fastest framework for building websites + titleColor: + titleShadow: true + titleFontSize: 44 + subtitleColor: + subtitleCursive: true + subtitleFontSize: 18 + spaceBetweenTitleSubtitle: 16 + + - type: img + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + height: 235 + paddingX: 50 + paddingY: 0 + align: center + title: + - + subtitle: + - + titleColor: + titleShadow: false + titleFontSize: 44 + subtitleColor: + subtitleCursive: false + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - type: slide + height: 235 + options: + startSlide: 0 + auto: 5000 + draggable: true + autoRestart: true + continuous: true + disableScroll: true + stopPropagation: true + slide: + - paddingX: 50 + paddingY: 0 + align: left + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + title: + - header title1 + subtitle: + - header subtitle1 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - paddingX: 50 + paddingY: 0 + align: center + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + title: + - header title2 + subtitle: + - header subtitle2 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - paddingX: 50 + paddingY: 0 + align: right + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + title: + - header title3 + subtitle: + - header subtitle3 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 +--- \ No newline at end of file diff --git a/website/content/en/about/index.md b/website/content/en/about/index.md new file mode 100644 index 000000000..182343f5f --- /dev/null +++ b/website/content/en/about/index.md @@ -0,0 +1,27 @@ ++++ +title = "About" +description = "Hugo, the world’s fastest framework for building websites" +type = "about" +date = "2019-02-28" ++++ + +Written in Go, Hugo is an open source static site generator available under the [Apache Licence 2.0.](https://github.com/gohugoio/hugo/blob/master/LICENSE) Hugo supports TOML, YAML and JSON data file types, Markdown and HTML content files and uses shortcodes to add rich content. Other notable features are taxonomies, multilingual mode, image processing, custom output formats, HTML/CSS/JS minification and support for Sass SCSS workflows. + +Hugo makes use of a variety of open source projects including: + +* https://github.com/russross/blackfriday +* https://github.com/alecthomas/chroma +* https://github.com/muesli/smartcrop +* https://github.com/spf13/cobra +* https://github.com/spf13/viper + +Hugo is ideal for blogs, corporate websites, creative portfolios, online magazines, single page applications or even a website with thousands of pages. + +Hugo is for people who want to hand code their own website without worrying about setting up complicated runtimes, dependencies and databases. + +Websites built with Hugo are extremelly fast, secure and can be deployed anywhere including, AWS, GitHub Pages, Heroku, Netlify and any other hosting provider. + +Learn more and contribute on [GitHub](https://github.com/gohugoio). + + + diff --git a/website/content/en/archive/_index.md b/website/content/en/archive/_index.md new file mode 100644 index 000000000..acde72024 --- /dev/null +++ b/website/content/en/archive/_index.md @@ -0,0 +1,9 @@ +--- +title: "Archive" +date: 2019-10-19T11:44:14+09:00 +type: "archive" +description: Archive Page +titleWrap: wrap +--- + +archive page diff --git a/website/content/en/gallery/cartoon/index.md b/website/content/en/gallery/cartoon/index.md new file mode 100644 index 000000000..23b8db215 --- /dev/null +++ b/website/content/en/gallery/cartoon/index.md @@ -0,0 +1,10 @@ +--- +title: "Cartoon" +date: 2019-10-31T10:20:16+09:00 +type: "gallery" +mode: "at-once" # at-once is a default value +description: "cartoon gallery" +image: images/feature2/bam.png +--- + +Sample images from [Pixabay](https://pixabay.com) diff --git a/website/content/en/gallery/photo/index.md b/website/content/en/gallery/photo/index.md new file mode 100644 index 000000000..14c484b46 --- /dev/null +++ b/website/content/en/gallery/photo/index.md @@ -0,0 +1,20 @@ +--- +title: Photo +date: 2019-10-31T10:20:16+09:00 +description: Photo Gallery +type: gallery +mode: one-by-one +description: "photo gallery" +images: + - image: beach.jpg + caption: beach, women, car + - image: beautiful.jpg + caption: beautiful women + - image: people.jpg + caption: man + - image: child.jpg + caption: child +image: images/feature2/gallery.png +--- + +Sample images from [Pixabay](https://pixabay.com) diff --git a/website/content/en/posts/_index.md b/website/content/en/posts/_index.md new file mode 100644 index 000000000..e0f80ce0e --- /dev/null +++ b/website/content/en/posts/_index.md @@ -0,0 +1,7 @@ ++++ +aliases = ["posts","articles","blog","showcase","docs"] +title = "Posts" +author = "Hugo Authors" +tags = ["index"] +description = "Post page" ++++ \ No newline at end of file diff --git a/website/content/en/posts/emoji-support.md b/website/content/en/posts/emoji-support.md new file mode 100644 index 000000000..1ce2e12e5 --- /dev/null +++ b/website/content/en/posts/emoji-support.md @@ -0,0 +1,56 @@ +--- +author: "Hugo Authors" +title: "Emoji Support" +date: 2019-12-16T12:00:06+09:00 +description: "Guide to emoji usage in Hugo" +draft: false +hideToc: false +enableToc: true +enableTocContent: false +author: Kim +authorEmoji: 👻 +tags: +- emoji +- gamoji +- namoji +- bamoji +- amoji +--- + +Emoji can be enabled in a Hugo project in a number of ways. + +The [`emojify`](https://gohugo.io/functions/emojify/) function can be called directly in templates or [Inline Shortcodes](https://gohugo.io/templates/shortcode-templates/#inline-shortcodes). + +To enable emoji globally, set `enableEmoji` to `true` in your site’s [configuration](https://gohugo.io/getting-started/configuration/) and then you can type emoji shorthand codes directly in content files; e.g. + + +

🙈 :see_no_evil: 🙉 :hear_no_evil: 🙊 :speak_no_evil:

+
+ +The [Emoji cheat sheet](http://www.emoji-cheat-sheet.com/) is a useful reference for emoji shorthand codes. + +*** + +**N.B.** The above steps enable Unicode Standard emoji characters and sequences in Hugo, however the rendering of these glyphs depends on the browser and the platform. To style the emoji you can either use a third party emoji font or a font stack; e.g. + +{{< highlight html >}} +.emoji { +font-family: Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols; +} +{{< /highlight >}} + +{{< css.inline >}} + +{{< /css.inline >}} \ No newline at end of file diff --git a/website/content/en/posts/markdown-syntax.md b/website/content/en/posts/markdown-syntax.md new file mode 100644 index 000000000..5f8787e17 --- /dev/null +++ b/website/content/en/posts/markdown-syntax.md @@ -0,0 +1,151 @@ +--- +title: Markdown Syntax Guide +date: 2019-12-20T12:00:06+09:00 +description: Sample article showcasing basic Markdown syntax and formatting for HTML elements. +draft: false +hideToc: false +enableToc: true +enableTocContent: true +author: Choi +authorEmoji: 🤖 +tags: +- markdown +- css +- html +- themes +categories: +- themes +- syntax +series: +- Themes Guide +image: images/feature1/markdown.png +--- + +This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme. + + +## Headings + +The following HTML `

`—`

` elements represent six levels of section headings. `

` is the highest section level while `

` is the lowest. + +# H1 +## H2 +### H3 +#### H4 +##### H5 +###### H6 + +## Paragraph + +Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat. + +Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat. + +## Blockquotes + +The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a `footer` or `cite` element, and optionally with in-line changes such as annotations and abbreviations. + +#### Blockquote without attribution + +> Tiam, ad mint andaepu dandae nostion secatur sequo quae. +> **Note** that you can use *Markdown syntax* within a blockquote. + +#### Blockquote with attribution + +> Don't communicate by sharing memory, share memory by communicating.

+> — Rob Pike[^1] + + +[^1]: The above quote is excerpted from Rob Pike's [talk](https://www.youtube.com/watch?v=PAAkCSZUG1c) during Gopherfest, November 18, 2015. + +## Tables + +Tables aren't part of the core Markdown spec, but Hugo supports supports them out-of-the-box. + + Name | Age +--------|------ + Bob | 27 + Alice | 23 + +#### Inline Markdown within tables + +| Inline    | Markdown    | In    | Table | +| ---------- | --------- | ----------------- | ---------- | +| *italics* | **bold** | ~~strikethrough~~    | `code` | + +## Code Blocks + +#### Code block with backticks + +``` +html + + + + + Example HTML5 Document + + +

Test

+ + +``` +#### Code block indented with four spaces + + + + + + Example HTML5 Document + + +

Test

+ + + +#### Code block with Hugo's internal highlight shortcode +{{< highlight html >}} + + + + + Example HTML5 Document + + +

Test

+ + +{{< /highlight >}} + +## List Types + +#### Ordered List + +1. First item +2. Second item +3. Third item + +#### Unordered List + +* List item +* Another item +* And another item + +#### Nested list + +* Item +1. First Sub-item +2. Second Sub-item + +## Other Elements — abbr, sub, sup, kbd, mark + +GIF is a bitmap image format. + +H2O + +Xn + Yn: Zn + +Press CTRL+ALT+Delete to end the session. + +Most salamanders are nocturnal, and hunt for insects, worms, and other small creatures. + diff --git a/website/content/en/posts/math-typesetting.md b/website/content/en/posts/math-typesetting.md new file mode 100644 index 000000000..c0e0b3289 --- /dev/null +++ b/website/content/en/posts/math-typesetting.md @@ -0,0 +1,48 @@ +--- +author: Hugo Authors +title: Math Typesetting +date: 2019-12-17T12:00:06+09:00 +description: A brief guide to setup KaTeX +draft: false +hideToc: false +enableToc: true +enableTocContent: false +author: Park +authorEmoji: 👽 +libraries: +- katex +--- + +{{< box >}} +We need goldmark katex entension which is not yet we have: +[https://github.com/gohugoio/hugo/issues/6544](https://github.com/gohugoio/hugo/issues/6544) +{{< /box >}} + +Mathematical notation in a Hugo project can be enabled by using third party JavaScript libraries. + + +In this example we will be using [KaTeX](https://katex.org/) + +- Create a partial under `/layouts/partials/math.html` +- Within this partial reference the [Auto-render Extension](https://katex.org/docs/autorender.html) or host these scripts locally. +- Include the partial in your templates like so: + +``` +{{ if or .Params.math .Site.Params.math }} +{{ partial "math.html" . }} +{{ end }} +``` +- To enable KaTex globally set the parameter `math` to `true` in a project's configuration +- To enable KaTex on a per page basis include the parameter `math: true` in content files. + +**Note:** Use the online reference of [Supported TeX Functions](https://katex.org/docs/supported.html) + +### Examples + +Inline math: $$ \varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887… $$ + +Block math: + +$$ + \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } } +$$ \ No newline at end of file diff --git a/website/content/en/posts/rich-content.md b/website/content/en/posts/rich-content.md new file mode 100644 index 000000000..3e9173563 --- /dev/null +++ b/website/content/en/posts/rich-content.md @@ -0,0 +1,47 @@ +--- +title: "Rich Content" +date: 2019-12-19T12:00:06+09:00 +description: "A brief description of Hugo Shortcodes" +draft: false +hideToc: false +enableToc: true +enableTocContent: false +author: Lee +authorEmoji: 👺 +tags: +- shortcodes +- privacy +image: images/feature2/content.png +--- + +Hugo ships with several [Built-in Shortcodes](https://gohugo.io/content-management/shortcodes/#use-hugo-s-built-in-shortcodes) for rich content, along with a [Privacy Config](https://gohugo.io/about/hugo-and-gdpr/) and a set of Simple Shortcodes that enable static and no-JS versions of various social media embeds. + +--- + +## Instagram Simple Shortcode + +{{< instagram_simple BGvuInzyFAe hidecaption >}} + +
+ +--- + +## YouTube Privacy Enhanced Shortcode + +{{< youtube ZJthWmvUzzc >}} + +
+ +--- + +## Twitter Simple Shortcode + +{{< twitter_simple 1085870671291310081 >}} + +
+ +--- + +## Vimeo Simple Shortcode + +{{< vimeo_simple 48912912 >}} diff --git a/website/content/en/posts/shortcodes.md b/website/content/en/posts/shortcodes.md new file mode 100644 index 000000000..880f40f7b --- /dev/null +++ b/website/content/en/posts/shortcodes.md @@ -0,0 +1,135 @@ +--- +title: "Shortcodes" +date: 2020-01-25T06:40:51+09:00 +description: tabs, code-tabs, expand, alert, warning, notice, img, box +draft: false +hideToc: false +enableToc: true +enableTocContent: true +tocPosition: inner +tags: +- shortcode +series: +- +categories: +- +image: images/feature3/code-file.png +--- + +## Markdownify box + +{{< boxmd >}} +This is **boxmd** shortcode +{{< /boxmd >}} + +## Simple box + +{{< box >}} +This is **box** shortcode +{{< /box >}} + +## Code tabs + +Make it easy to switch between different code + +{{< codes java javascript >}} + {{< code >}} + + ```java + System.out.println('Hello World!'); + ``` + + {{< /code >}} + + {{< code >}} + + ```javascript + console.log('Hello World!'); + ``` + + {{< /code >}} +{{< /codes >}} + +## Tabs for general purpose + +{{< tabs Windows MacOS Ubuntu >}} + {{< tab >}} + + ### Windows section + + ```javascript + console.log('Hello World!'); + ``` + + ⚠️Becareful that the content in the tab should be different from each other. The tab makes unique id hashes depending on the tab contents. So, If you just copy-paste the tabs with multiple times, since it has the same contents, the tab will not work. + + {{< /tab >}} + {{< tab >}} + + ### MacOS section + + Hello world! + {{< /tab >}} + {{< tab >}} + + ### Ubuntu section + + Great! + {{< /tab >}} +{{< /tabs >}} + +## Expand + +{{< expand "Expand me" >}} + +### Title + +contents + +{{< /expand >}} + +{{< expand "Expand me2" >}} + +### Title2 + +contents2 + +{{< /expand >}} + +## Alert + +Colored box + +{{< alert theme="warning" >}} +**this** is a text +{{< /alert >}} + +{{< alert theme="info" >}} +**this** is a text +{{< /alert >}} + +{{< alert theme="success" >}} +**this** is a text +{{< /alert >}} + +{{< alert theme="danger" >}} +**this** is a text +{{< /alert >}} + +## Notice + +{{< notice success >}} +success text +{{< /notice >}} + +{{< notice info >}} +info text +{{< /notice >}} + +{{< notice warning >}} +warning text +{{< /notice >}} + +{{< notice error >}} +error text +{{< /notice >}} diff --git a/website/content/en/posts/syntax-highlight.md b/website/content/en/posts/syntax-highlight.md new file mode 100644 index 000000000..c95f1f568 --- /dev/null +++ b/website/content/en/posts/syntax-highlight.md @@ -0,0 +1,326 @@ +--- +title: "Syntax highlighting" +date: 2019-12-18T10:33:41+09:00 +description: "Syntax highlighting test" +draft: false +hideToc: false +enableToc: true +enableTocContent: false +author: Jeus +authorEmoji: 🎅 +pinned: true +tags: +- hugo +series: +- +categories: +- hugo +image: images/feature2/color-palette.png +--- + +## Code Syntax Highlighting + +Verify the following code blocks render as code blocks and highlight properly. + +More about tuning syntax highlighting is the [Hugo documentation](https://gohugo.io/content-management/syntax-highlighting/). + +### Diff + +``` diff {hl_lines=[4,"6-7"]} +*** /path/to/original ''timestamp'' +--- /path/to/new ''timestamp'' +*************** +*** 1 **** +! This is a line. +--- 1 --- +! This is a replacement line. +It is important to spell +-removed line ++new line +``` + +```diff {hl_lines=[4,"6-7"], linenos=false} +*** /path/to/original ''timestamp'' +--- /path/to/new ''timestamp'' +*************** +*** 1 **** +! This is a line. +--- 1 --- +! This is a replacement line. +It is important to spell +-removed line ++new line +``` + +### Makefile + +``` makefile {linenos=false} +CC=gcc +CFLAGS=-I. + +hellomake: hellomake.o hellofunc.o + $(CC) -o hellomake hellomake.o hellofunc.o -I. +``` + +``` makefile +CC=gcc +CFLAGS=-I. + +hellomake: hellomake.o hellofunc.o + $(CC) -o hellomake hellomake.o hellofunc.o -I. +``` + +### JSON + +``` json +{"employees":[ + {"firstName":"John", "lastName":"Doe"}, +]} +``` + +### Markdown + +``` markdown +**bold** +*italics* +[link](www.example.com) +``` + +### JavaScript + +``` javascript +document.write('Hello, world!'); +``` + +### CSS + +``` css +body { + background-color: red; +} +``` + +### Objective C + +``` objectivec +#import + +int main (void) +{ + printf ("Hello world!\n"); +} +``` + +### Python + +``` python +print "Hello, world!" +``` + +### XML + +``` xml + + + John Doe + + +``` + +### Perl + +``` perl +print "Hello, World!\n"; +``` + +### Bash + +``` bash +echo "Hello World" +``` + +### PHP + +``` php + Hello World

'; ?> +``` + +### CoffeeScript + +``` coffeescript +console.log(“Hello world!”); +``` + +### C# + +``` cs +using System; +class Program +{ + public static void Main(string[] args) + { + Console.WriteLine("Hello, world!"); + } +} +``` + +### C++ + +``` cpp +#include + +main() +{ + cout << "Hello World!"; + return 0; +} +``` + +### SQL + +``` sql +SELECT column_name,column_name +FROM table_name; +``` + +### Go + +``` go +package main +import "fmt" +func main() { + fmt.Println("Hello, 世界") +} +``` + +### Ruby + +```ruby +puts "Hello, world!" +``` + +### Java + +```java +import javax.swing.JFrame; //Importing class JFrame +import javax.swing.JLabel; //Importing class JLabel +public class HelloWorld { + public static void main(String[] args) { + JFrame frame = new JFrame(); //Creating frame + frame.setTitle("Hi!"); //Setting title frame + frame.add(new JLabel("Hello, world!"));//Adding text to frame + frame.pack(); //Setting size to smallest + frame.setLocationRelativeTo(null); //Centering frame + frame.setVisible(true); //Showing frame + } +} +``` + +### Latex Equation + +```latex +\frac{d}{dx}\left( \int_{0}^{x} f(u)\,du\right)=f(x). +``` + +```javascript +import {x, y} as p from 'point'; +const ANSWER = 42; + +class Car extends Vehicle { + constructor(speed, cost) { + super(speed); + + var c = Symbol('cost'); + this[c] = cost; + + this.intro = `This is a car runs at + ${speed}.`; + } +} + +for (let num of [1, 2, 3]) { + console.log(num + 0b111110111); +} + +function $initHighlight(block, flags) { + try { + if (block.className.search(/\bno\-highlight\b/) != -1) + return processBlock(block.function, true, 0x0F) + ' class=""'; + } catch (e) { + /* handle exception */ + var e4x = +
Example +

1234

; + } + for (var i = 0 / 2; i < classes.length; i++) { + // "0 / 2" should not be parsed as regexp + if (checkCondition(classes[i]) === undefined) + return /\d+[\s/]/g; + } + console.log(Array.every(classes, Boolean)); +} + +export $initHighlight; +``` + +```html + + + + + Hello world + + + + +
+ + + + + +``` + +```css +/********************************************************* +* General +*/ +pre[class*="language-"], +code { + color: #5c6e74; + font-size: 13px; + text-shadow: none; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + line-height: 1.5; + tab-size: 4; + hyphens: none; +} +pre[class*="language-"]::selection, +code::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + pre[class*="language-"], + code { + text-shadow: none; + } +} +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; + background: #f8f5ec; +} +:not(pre) > code { + padding: .1em .3em; + border-radius: .3em; + color: #db4c69; + background: #f9f2f4; +} +``` diff --git a/website/content/en/posts/test-chartjs.md b/website/content/en/posts/test-chartjs.md new file mode 100644 index 000000000..513ad619a --- /dev/null +++ b/website/content/en/posts/test-chartjs.md @@ -0,0 +1,54 @@ +--- +title: "Chart support" +date: 2019-11-18T12:00:06+09:00 +description: "Simple yet flexible JavaScript charting for designers & developers" +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- diagram +libraries: +- chart +image: images/feature1/graph.png +--- + +```chart +{ + "type": "bar", + "data": + { + "labels": ["One", "Two", "Three", "Four", "Five", "Six"], + "datasets": [{ + "label": "# of Votes", + "data": [12, 19, 3, 5, 3, 8] + }] + } +} +``` + +```chart + { + "type": "line", + "data": { + "labels": ["One", "Two", "Three", "Four", "Five", "Six"], + "datasets": [ + { + "label": "# of Votes", + "data": [12, 19, 3, 5, 2, 3], + "backgroundColor":"transparent", + "borderColor":"orange" + }, + { + "label": "Some other set", + "data": [15, 8, 13, 5, 5, 9], + "backgroundColor":"transparent", + "borderColor":"#44ccff" + } + ] + } + } +``` diff --git a/website/content/en/posts/test-flowchart.md b/website/content/en/posts/test-flowchart.md new file mode 100644 index 000000000..5fd14bfd5 --- /dev/null +++ b/website/content/en/posts/test-flowchart.md @@ -0,0 +1,36 @@ +--- +title: "Flowchart support" +date: 2019-11-14T12:00:06+09:00 +description: "flowchart.js is a flowchart DSL and SVG render that runs in the browser and terminal. +Nodes and connections are defined in separately so that nodes can be reused and connections can be quickly changed." +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- diagram +libraries: +- flowchartjs +image: images/feature1/flowchart.png +--- + +```flowchart +st=>start: Start|past:>http://www.google.com[blank] +e=>end: End|future:>http://www.google.com +op1=>operation: My Operation|past +op2=>operation: Stuff|current +sub1=>subroutine: My Subroutine|invalid +cond=>condition: Yes +or No?|approved:>http://www.google.com +c2=>condition: Good idea|rejected +io=>inputoutput: catch something...|future + +st->op1(right)->cond +cond(yes, right)->c2 +cond(no)->sub1(left)->op1 +c2(yes)->io->e +c2(no)->op2->e +``` diff --git a/website/content/en/posts/test-js-sequence-diagrams.md b/website/content/en/posts/test-js-sequence-diagrams.md new file mode 100644 index 000000000..d8d50f71d --- /dev/null +++ b/website/content/en/posts/test-js-sequence-diagrams.md @@ -0,0 +1,31 @@ +--- +title: "JS Sequence Diagram support" +date: 2019-11-18T12:00:06+09:00 +description: "Generates UML sequence diagrams from simple text" +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- diagram +libraries: +- msc +image: images/feature2/transfer.png +--- + +```msc +Alice->Bob: Hello Bob, how are you? +Note right of Bob: Bob thinks +Bob-->Alice: I am good thanks! +``` + +```msc +Title: Here is a title +A->B: Normal line +B-->C: Dashed line +C->>D: Open arrow +D-->>A: Dashed open arrow +``` \ No newline at end of file diff --git a/website/content/en/posts/test-katex.md b/website/content/en/posts/test-katex.md new file mode 100644 index 000000000..5b8b410c2 --- /dev/null +++ b/website/content/en/posts/test-katex.md @@ -0,0 +1,47 @@ +--- +title: "Katex support" +date: 2019-11-15T12:00:06+09:00 +description: "KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web." +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- math +libraries: +- katex +image: images/feature2/mathbook.png +--- + +The following + +$$ \int_{a}^{b} x^2 dx $$ + +Is an integral + +$$ \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } } $$ + +Enable Katex in the config file by setting the `katex` param to `true`. This will import the necessary Katex CSS/JS. + +See the online reference of [supported TeX functions](https://katex.org/docs/supported.html). + +**Note:** For inline math to render correctly, your content file extension must be `.mmark`. See the [official mmark site](https://mmark.nl/). + +``` +Inline math: $ \varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887… $ +``` + +Inline math: $ \varphi = \dfrac{1+\sqrt5}{2}= 1.6180339887… $ + +``` +Block math: + +$$ \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } } $$ +``` + +Block math: + +$$ \varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } } $$ \ No newline at end of file diff --git a/website/content/en/posts/test-mathjax.md b/website/content/en/posts/test-mathjax.md new file mode 100644 index 000000000..2b7f81827 --- /dev/null +++ b/website/content/en/posts/test-mathjax.md @@ -0,0 +1,20 @@ +--- +title: "MathJax support" +date: 2019-11-16T12:00:06+09:00 +description: "A JavaScript display engine for mathematics that works in all browsers.No more setup for readers. It just works." +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- math +libraries: +- mathjax +image: images/feature1/infinity.png +--- + +When $a \ne 0$, there are two solutions to $\(ax^2 + bx + c = 0\)\$ and they are +$$x = {-b \pm \sqrt{b^2-4ac} \over 2a}.$$ \ No newline at end of file diff --git a/website/content/en/posts/test-mermaid.md b/website/content/en/posts/test-mermaid.md new file mode 100644 index 000000000..090331be5 --- /dev/null +++ b/website/content/en/posts/test-mermaid.md @@ -0,0 +1,94 @@ +--- +title: "Mermaid support" +date: 2019-11-17T12:00:06+09:00 +description: "Generate diagrams, charts, graphs or flows from markdown-like text via javascript." +draft: false +enableToc: false +enableTocContent: false +tags: +- diagram +series: +- +categories: +- diagram +libraries: +- mermaid +image: images/feature2/workflow.png +--- + +```mermaid +graph TD; + A-->B; + A-->C; + B-->D; + C-->D; +``` + +```mermaid +sequenceDiagram + participant Alice + participant Bob + Alice->John: Hello John, how are you? + loop Healthcheck + John->John: Fight against hypochondria + end + Note right of John: Rational thoughts
prevail... + John-->Alice: Great! + John->Bob: How about you? + Bob-->John: Jolly good! +``` + +```mermaid +graph TD +A[Hard] -->|Text| B(Round) +B --> C{Decision} +C -->|One| D[Result 1] +C -->|Two| E[Result 2] +``` + +```mermaid +gantt +section Section +Completed :done, des1, 2014-01-06,2014-01-08 +Active :active, des2, 2014-01-07, 3d +Parallel 1 : des3, after des1, 1d +Parallel 2 : des4, after des1, 1d +Parallel 3 : des5, after des3, 1d +Parallel 4 : des6, after des4, 1d +``` + +```mermaid +classDiagram +Class01 <|-- AveryLongClass : Cool +<> Class01 +Class09 --> C2 : Where am i? +Class09 --* C3 +Class09 --|> Class07 +Class07 : equals() +Class07 : Object[] elementData +Class01 : size() +Class01 : int chimp +Class01 : int gorilla +class Class10 { + <> + int id + size() +} +``` + +```mermaid +stateDiagram +[*] --> Still +Still --> [*] +Still --> Moving +Moving --> Still +Moving --> Crash +Crash --> [*] +``` + +```mermaid +pie +"Dogs" : 386 +"Cats" : 85 +"Rats" : 15 +``` \ No newline at end of file diff --git a/website/content/en/posts/test-viz.md b/website/content/en/posts/test-viz.md new file mode 100644 index 000000000..3f442616f --- /dev/null +++ b/website/content/en/posts/test-viz.md @@ -0,0 +1,48 @@ +--- +title: "Viz support" +date: 2019-11-18T21:00:06+09:00 +description: "A hack to put Graphviz on the web." +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- diagram +libraries: +- viz +image: images/feature2/graph.png +--- + +```viz-dot + digraph G { + + subgraph cluster_0 { + style=filled; + color=lightgrey; + node [style=filled,color=white]; + a0 -> a1 -> a2 -> a3; + label = "process #1"; + } + + subgraph cluster_1 { + node [style=filled]; + b0 -> b1 -> b2 -> b3; + label = "process #2"; + color=blue + } + start -> a0; + start -> b0; + a1 -> b3; + b2 -> a3; + a3 -> a0; + a3 -> end; + b3 -> end; + + start [shape=Mdiamond]; + end [shape=Msquare]; +} + +``` diff --git a/website/content/en/posts/test-wavedrom.md b/website/content/en/posts/test-wavedrom.md new file mode 100644 index 000000000..4d47e4e8f --- /dev/null +++ b/website/content/en/posts/test-wavedrom.md @@ -0,0 +1,27 @@ +--- +title: "Wavedrom support" +date: 2019-11-18T18:00:06+09:00 +description: "WaveDrom is a Free and Open Source online digital timing diagram (waveform) rendering engine that uses javascript, HTML5 and SVG to convert a WaveJSON input text description into SVG vector graphics." +draft: false +enableToc: false +enableTocContent: false +tags: +- +series: +- +categories: +- diagram +libraries: +- wavedrom +image: images/feature1/wave.png +--- + +```wave +{ + "signal": [ {"name": "CLK", "wave": "p.....|..."}, + {"name":"DAT", "wave":"x.345x|=.x", "data":["A","B","C","D"]}, + {"name": "REQ", "wave": "0.1..0|1.0"}, + {}, + {"name": "ACK", "wave": "1.....|01."} +]} +``` diff --git a/website/content/en/presentation/_index.md b/website/content/en/presentation/_index.md new file mode 100644 index 000000000..cf5bbb03e --- /dev/null +++ b/website/content/en/presentation/_index.md @@ -0,0 +1,4 @@ +--- +title: "Presentations" +description: "Presentation list with reveal.js" +--- diff --git a/website/content/en/presentation/dir/fourth.md b/website/content/en/presentation/dir/fourth.md new file mode 100644 index 000000000..93b6a6706 --- /dev/null +++ b/website/content/en/presentation/dir/fourth.md @@ -0,0 +1,87 @@ +--- +title: "Fourth" +date: 2019-10-30T20:48:10+09:00 +description: "My fourth presentation" +tags: +- +series: +- +categories: +- +image: images/feature1/number-four.png +plugins: +- highlight +- zoom +- notes +- math +highlightTheme: monokai +revealTheme: bagie +revealBackgroundColor: "" # #fff or rgba() or hsl() +revealBackgroundImage: "" # /images/myImage.png <= static folder path +revealBackgroundPosition: "" # left top, left center, left bottom, right top, right center ... +revealBackgroundRepeat: "" # repeat, repeat-x, repeat-y, no-repeat, inherit +revealBackgroundOpacity: "" # 0~1 +revealBackgroundVideo: "" # /videos/myVideo.mp4 <= static folder path, A single video source, or a comma separated list of video sources. +revealBackgroundVideoLoop: false # true, false +revealBackgroundVideoMuted: false # true, false +revealBackgroundSize: "" # cover, contain, ... +reveal: + - main: + - sub: + - | + # Hugo + ## The world’s fastest framework for building websites + + - sub: + - | + Hugo is one of the most popular open-source static site generators. With its amazing speed and flexibility, Hugo makes building websites fun again. + - main: + - sub: + - | + # Reveal.js + ## A framework for easily creating beautiful presentations using HTML. + - [Check out the live demo](https://revealjs.com/#/) + - main: + - sub: + - | + You can easily create presentation documents using Markdown. + - fragment: + - sub: + - | + # here + - sub: + - | + #### you + - sub: + - | + #### go + - main: + - sub: + - | + # POINT OF VIEW + + Press *ESC* to enter the slide overview. + + Hold down the alt key (ctrl in Linux) and click on any element to zoom towards it using zoom.js. click again to zoom back out. + + (NOTE\: Use ctrl + click in Linux) + - fragment: + - sub: + - | + ## FRAGMENTS + - sub: + - | + Hit the next arrow... + - sub: + - | + ... to step through ... + - sub: + - | + .. a + - sub: + - | + .. a fragmented + - sub: + - | + .. a fragmented slide. +--- diff --git a/website/content/en/presentation/first.md b/website/content/en/presentation/first.md new file mode 100644 index 000000000..6175f43ca --- /dev/null +++ b/website/content/en/presentation/first.md @@ -0,0 +1,30 @@ +--- +title: "First" +date: 2019-10-30T19:45:20+09:00 +description: "My first presentation" +tags: +- +series: +- +categories: +- +image: images/feature1/number-one.png +revealBackgroundColor: "" # #fff or rgba() or hsl() +revealBackgroundImage: "" # /images/myImage.png <= static folder path +revealBackgroundPosition: "" # left top, left center, left bottom, right top, right center ... +revealBackgroundRepeat: "" # repeat, repeat-x, repeat-y, no-repeat, inherit +revealBackgroundOpacity: "" # 0~1 +revealBackgroundVideo: "" # /videos/myVideo.mp4 <= static folder path, A single video source, or a comma separated list of video sources. +revealBackgroundVideoLoop: false # true, false +revealBackgroundVideoMuted: false # true, false +revealBackgroundSize: "" # cover, contain, ... +reveal: + - main: + - sub: + - | + test 1 + - main: + - sub: + - | + test 2 +--- diff --git a/website/content/en/presentation/second.md b/website/content/en/presentation/second.md new file mode 100644 index 000000000..c5c4e68af --- /dev/null +++ b/website/content/en/presentation/second.md @@ -0,0 +1,30 @@ +--- +title: "Second" +date: 2019-10-30T20:45:24+09:00 +description: "My second presentation" +tags: +- +series: +- +categories: +- +image: images/feature1/number-two.png +revealBackgroundColor: "" # #fff or rgba() or hsl() +revealBackgroundImage: "" # /images/myImage.png <= static folder path +revealBackgroundPosition: "" # left top, left center, left bottom, right top, right center ... +revealBackgroundRepeat: "" # repeat, repeat-x, repeat-y, no-repeat, inherit +revealBackgroundOpacity: "" # 0~1 +revealBackgroundVideo: "" # /videos/myVideo.mp4 <= static folder path, A single video source, or a comma separated list of video sources. +revealBackgroundVideoLoop: false # true, false +revealBackgroundVideoMuted: false # true, false +revealBackgroundSize: "" # cover, contain, ... +reveal: + - main: + - sub: + - | + test 1 + - main: + - sub: + - | + test 2 +--- diff --git a/website/content/en/presentation/third.md b/website/content/en/presentation/third.md new file mode 100644 index 000000000..a809c62bc --- /dev/null +++ b/website/content/en/presentation/third.md @@ -0,0 +1,75 @@ +--- +title: "Third" +date: 2019-10-30T20:46:30+09:00 +description: "My third presentation" +tags: +- +series: +- +categories: +- +image: images/feature1/number-three.png +plugins: +- highlight +- zoom +- math +highlightTheme: monokai +revealBackgroundColor: "" # #fff or rgba() or hsl() +revealBackgroundImage: "" # /images/myImage.png <= static folder path +revealBackgroundPosition: "" # left top, left center, left bottom, right top, right center ... +revealBackgroundRepeat: "" # repeat, repeat-x, repeat-y, no-repeat, inherit +revealBackgroundOpacity: "" # 0~1 +revealBackgroundVideo: "" # /videos/myVideo.mp4 <= static folder path, A single video source, or a comma separated list of video sources. +revealBackgroundVideoLoop: false # true, false +revealBackgroundVideoMuted: false # true, false +revealBackgroundSize: "" # cover, contain, ... +revealTheme: league +reveal: + - main: + - sub: + - | + ## Syntax highlighting + ```go + // If an unknown or empty style is provided, AP style is what you get. + func GetTitleFunc(style string) func(s string) string { + switch strings.ToLower(style) { + case "go": + return strings.Title + case "chicago": + return transform.NewTitleConverter(transform.ChicagoStyle) + default: + return transform.NewTitleConverter(transform.APStyle) + } + } + ``` + - main: + - sub: + - | + ## Mathjax 1 + \\[\mathbf{V}_1 \times \mathbf{V}_2 = \begin{vmatrix} + \mathbf{i} & \mathbf{j} & \mathbf{k} \\ + \frac{\partial X}{\partial u} & \frac{\partial Y}{\partial u} & 0 \\ + \frac{\partial X}{\partial v} & \frac{\partial Y}{\partial v} & 0 + \end{vmatrix} \\] + - main: + - sub: + - | + ## Mathjax 2 + \\[\begin{aligned} + \dot{x} & = \sigma(y-x) \\ + \dot{y} & = \rho x - y - xz \\ + \dot{z} & = -\beta z + xy + \end{aligned} \\] + - main: + - sub: + - | + ## Mathjax 3 + \\[P(E) = {n \choose k} p^k (1-p)^{ n-k} \\] + - main: + - sub: + - | + ## Mathjax 4 + \\[ \frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-\phi\Bigr) e^{\frac25 \pi}} = + 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} + {1+\frac{e^{-8\pi}} {1+\ldots} } } } \\] +--- diff --git a/website/content/en/publication/article/_index.md b/website/content/en/publication/article/_index.md new file mode 100644 index 000000000..9030e8295 --- /dev/null +++ b/website/content/en/publication/article/_index.md @@ -0,0 +1,5 @@ +--- +title: article +date: 2020-03-05 14:08:48.459816 +description: Publication - article +--- \ No newline at end of file diff --git a/website/content/en/publication/article/article_any_folder_name_1/cite.bib b/website/content/en/publication/article/article_any_folder_name_1/cite.bib new file mode 100644 index 000000000..770aea89f --- /dev/null +++ b/website/content/en/publication/article/article_any_folder_name_1/cite.bib @@ -0,0 +1,14 @@ +@article{articleExample1, + abstract = {Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.}, + author = {zzossig}, + copyright = {Copyright (c) 2018 zzossig}, + journal = {Lorem}, + keywords = {⛔ No DOI found}, + language = {en}, + month = {June}, + title = {Crossdressing, {Crossculture}}, + url = {https://google.com}, + urldate = {2019-12-13}, + year = {2018} +} + diff --git a/website/content/en/publication/article/article_any_folder_name_1/index.md b/website/content/en/publication/article/article_any_folder_name_1/index.md new file mode 100644 index 000000000..e475e6092 --- /dev/null +++ b/website/content/en/publication/article/article_any_folder_name_1/index.md @@ -0,0 +1,16 @@ +--- +keywords: ['example'] +authors: ['zzossig'] +publication: "abc" +abstract: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +links: + - name: url + link: https://google.com +copyright: "Copyright (c) 2018 zzossig" +title: "Good Title" +ENTRYTYPE: "article" +enableToc: False +enableWhoami: True +pinned: true +publishDate: "2018-06-01" +--- \ No newline at end of file diff --git a/website/content/en/publication/book/_index.md b/website/content/en/publication/book/_index.md new file mode 100644 index 000000000..488693f44 --- /dev/null +++ b/website/content/en/publication/book/_index.md @@ -0,0 +1,5 @@ +--- +title: book +date: 2020-03-05 14:08:48.402839 +description: Publication - book +--- \ No newline at end of file diff --git a/website/content/en/publication/book/book_any_folder_name_1/cite.bib b/website/content/en/publication/book/book_any_folder_name_1/cite.bib new file mode 100644 index 000000000..e218c4ff0 --- /dev/null +++ b/website/content/en/publication/book/book_any_folder_name_1/cite.bib @@ -0,0 +1,13 @@ +@book{bookExample1, + abstract = {Donec vel ipsum vulputate, dapibus magna quis, auctor mauris. Aliquam ut dapibus risus. Duis sit amet magna posuere, interdum metus sed, maximus tortor. Maecenas tempus ut magna nec facilisis. Pellentesque vel ultrices nunc, eget ultrices mauris. Ut eget ligula quis purus porta rhoncus eget at eros. In id felis ullamcorper, vehicula ante sed, cursus magna. Curabitur libero nibh, posuere in urna in, viverra pulvinar lectus. Pellentesque rutrum tempus elit at hendrerit. Sed enim est, bibendum in augue iaculis, viverra venenatis sapien. Nullam sagittis augue maximus mi interdum maximus. Praesent a cursus massa.}, + author = {zzossig}, + copyright = {All rights reserved}, + isbn = {978-1-311-04245-3}, + language = {English}, + month = {June}, + publisher = {Self-Published}, + shorttitle = {Donec vel ipsum vulputate}, + title = {Donec vel ipsum vulputate, dapibus magna quis}, + year = {2017} +} + diff --git a/website/content/en/publication/book/book_any_folder_name_1/index.md b/website/content/en/publication/book/book_any_folder_name_1/index.md new file mode 100644 index 000000000..31a758e66 --- /dev/null +++ b/website/content/en/publication/book/book_any_folder_name_1/index.md @@ -0,0 +1,14 @@ +--- +authors: ['zzossig'] +publisher: "Self-Published" +abstract: "Donec vel ipsum vulputate, dapibus magna quis, auctor mauris. Aliquam ut dapibus risus. Duis sit amet magna posuere, interdum metus sed, maximus tortor. Maecenas tempus ut magna nec facilisis. Pellentesque vel ultrices nunc, eget ultrices mauris. Ut eget ligula quis purus porta rhoncus eget at eros. In id felis ullamcorper, vehicula ante sed, cursus magna. Curabitur libero nibh, posuere in urna in, viverra pulvinar lectus. Pellentesque rutrum tempus elit at hendrerit. Sed enim est, bibendum in augue iaculis, viverra venenatis sapien. Nullam sagittis augue maximus mi interdum maximus. Praesent a cursus massa." +shorttitle: "Donec vel ipsum vulputate" +isbn: "978-1-311-04245-3" +copyright: "All rights reserved" +title: "Donec vel ipsum vulputate, dapibus magna quis" +ENTRYTYPE: "book" +enableToc: False +enableWhoami: True +pinned: true +publishDate: "2017-06-01" +--- \ No newline at end of file diff --git a/website/content/en/publication/misc/_index.md b/website/content/en/publication/misc/_index.md new file mode 100644 index 000000000..7f5243d1d --- /dev/null +++ b/website/content/en/publication/misc/_index.md @@ -0,0 +1,5 @@ +--- +title: misc +date: 2020-03-05 14:08:48.469815 +description: Publication - misc +--- \ No newline at end of file diff --git a/website/content/en/publication/misc/misc_any_folder_name_1/cite.bib b/website/content/en/publication/misc/misc_any_folder_name_1/cite.bib new file mode 100644 index 000000000..9c17df7d9 --- /dev/null +++ b/website/content/en/publication/misc/misc_any_folder_name_1/cite.bib @@ -0,0 +1,14 @@ +@misc{miscExample1, + abstract = {Review by Katelyn Smith In his first full-length book, Annals of Pornographie: How Porn Became Bad (2016), Brian Watson traces the long history of pornography in the West, reiterating throughout hi…}, + author = {Clutterbuck-Cook, Anna and Watson, Brian M.}, + copyright = {All rights reserved}, + journal = {Dósis}, + language = {en}, + month = {November}, + shorttitle = {Book {Review}}, + title = {Book {Review}: {Annals} of {Pornographie}}, + url = {https://medhumdosis.com/2016/11/23/book-review-annals-of-pornographie/}, + urldate = {2019-12-13}, + year = {2016} +} + diff --git a/website/content/en/publication/misc/misc_any_folder_name_1/index.md b/website/content/en/publication/misc/misc_any_folder_name_1/index.md new file mode 100644 index 000000000..7ab8c2fc2 --- /dev/null +++ b/website/content/en/publication/misc/misc_any_folder_name_1/index.md @@ -0,0 +1,16 @@ +--- +authors: ['zzossig', 'teemo'] +publication: "abc" +abstract: "Duis vulputate odio vitae consectetur lacinia. Vivamus tellus nisi, hendrerit eget tortor eget, rutrum lobortis tellus. Donec convallis scelerisque egestas. Vestibulum ex urna, commodo at interdum vitae, malesuada id arcu. Praesent et enim libero. Proin et felis nisi. Duis imperdiet placerat dapibus." +links: + - name: url + link: https://google.com +shorttitle: "Book Review" +copyright: "All rights reserved" +title: "Book Review: Duis vulputate" +ENTRYTYPE: "misc" +enableToc: False +enableWhoami: True +pinned: true +publishDate: "2016-11-01" +--- \ No newline at end of file diff --git a/website/content/en/showcase/_index.md b/website/content/en/showcase/_index.md new file mode 100644 index 000000000..d36b64638 --- /dev/null +++ b/website/content/en/showcase/_index.md @@ -0,0 +1,6 @@ +--- +title: "Showcase overview" +date: 2020-01-19T15:43:38+09:00 +description: My portfolio, repos, works overview page +enableBio: false +--- \ No newline at end of file diff --git a/website/content/en/showcase/hugo/_index.md b/website/content/en/showcase/hugo/_index.md new file mode 100644 index 000000000..13f2ef0f1 --- /dev/null +++ b/website/content/en/showcase/hugo/_index.md @@ -0,0 +1,7 @@ +--- +title: "Hugo" +date: 2020-01-19T21:04:11+09:00 +description: Hugo theme collection +category: theme +enableBio: false +--- diff --git a/website/content/en/showcase/hugo/hugo-theme-zdoc.md b/website/content/en/showcase/hugo/hugo-theme-zdoc.md new file mode 100644 index 000000000..52cdde99a --- /dev/null +++ b/website/content/en/showcase/hugo/hugo-theme-zdoc.md @@ -0,0 +1,10 @@ +--- +title: "Hugo zDoc Theme" +date: 2020-01-19T21:13:42+09:00 +description: Make a documentation with hugo zdoc theme! +weight: 2 +link: https://github.com/zzossig/hugo-theme-zdoc +repo: https://github.com/zzossig/hugo-theme-zdoc +pinned: true +thumb: feature3/css3-bare.png +--- diff --git a/website/content/en/showcase/hugo/hugo-theme-zzo.md b/website/content/en/showcase/hugo/hugo-theme-zzo.md new file mode 100644 index 000000000..ef3943567 --- /dev/null +++ b/website/content/en/showcase/hugo/hugo-theme-zzo.md @@ -0,0 +1,10 @@ +--- +title: "Hugo Zzo Theme" +date: 2020-01-19T21:13:42+09:00 +description: Make a blog with hugo zzo theme! +weight: 1 +link: https://github.com/zzossig/hugo-theme-zzo +repo: https://github.com/zzossig/hugo-theme-zzo +pinned: true +thumb: feature3/css3.png +--- diff --git a/website/content/ko/_index.md b/website/content/ko/_index.md new file mode 100644 index 000000000..2faff6432 --- /dev/null +++ b/website/content/ko/_index.md @@ -0,0 +1,115 @@ +--- +header: + - type: typewriter + methods: + - typeString: Hello world! + - pauseFor: 2500 + - deleteAll: true + - typeString: Strings can be removed + - pauseFor: 2500 + - deleteChars: 7 + - typeString: altered! + - pauseFor: 2500 + options: + loop: true + autoStart: false + height: 190 + paddingX: 50 + align: center + fontSize: 44 + fontColor: yellow + + - type: text + height: 200 + paddingX: 50 + paddingY: 0 + align: center + title: + - HUGO + subtitle: + - The world’s fastest framework for building websites + titleColor: + titleShadow: true + titleFontSize: 44 + subtitleColor: + subtitleCursive: true + subtitleFontSize: 18 + spaceBetweenTitleSubtitle: 16 + + - type: img + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + height: 235 + paddingX: 50 + paddingY: 0 + align: center + title: + - + subtitle: + - + titleColor: + titleShadow: false + titleFontSize: 44 + subtitleColor: + subtitleCursive: false + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - type: slide + height: 235 + options: + startSlide: 0 + auto: 5000 + draggable: true + autoRestart: true + continuous: true + disableScroll: true + stopPropagation: true + slide: + - paddingX: 50 + paddingY: 0 + align: left + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + title: + - header title1 + subtitle: + - header subtitle1 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - paddingX: 50 + paddingY: 0 + align: center + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + title: + - header title2 + subtitle: + - header subtitle2 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 + + - paddingX: 50 + paddingY: 0 + align: right + imageSrc: images/header/background.jpg + imageSize: cover + imageRepeat: no-repeat + imagePosition: center + title: + - header title3 + subtitle: + - header subtitle3 + titleFontSize: 44 + subtitleFontSize: 16 + spaceBetweenTitleSubtitle: 20 +--- \ No newline at end of file diff --git a/website/content/ko/about/index.ko.md b/website/content/ko/about/index.ko.md new file mode 100644 index 000000000..ca6eafb09 --- /dev/null +++ b/website/content/ko/about/index.ko.md @@ -0,0 +1,7 @@ +--- +title: "About" +date: 2019-10-09T11:44:14+09:00 +type: "about" +description: About Page +--- + diff --git a/website/content/ko/archive/_index.ko.md b/website/content/ko/archive/_index.ko.md new file mode 100644 index 000000000..acde72024 --- /dev/null +++ b/website/content/ko/archive/_index.ko.md @@ -0,0 +1,9 @@ +--- +title: "Archive" +date: 2019-10-19T11:44:14+09:00 +type: "archive" +description: Archive Page +titleWrap: wrap +--- + +archive page diff --git a/website/content/ko/gallery/cartoon/index.ko.md b/website/content/ko/gallery/cartoon/index.ko.md new file mode 100644 index 000000000..0b477141d --- /dev/null +++ b/website/content/ko/gallery/cartoon/index.ko.md @@ -0,0 +1,6 @@ +--- +title: "Cartoon" +date: 2018-10-11T10:20:16+09:00 +type: "gallery" +description: "cartoon gallery" +--- diff --git a/website/content/ko/gallery/photo/index.ko.md b/website/content/ko/gallery/photo/index.ko.md new file mode 100644 index 000000000..1dc855657 --- /dev/null +++ b/website/content/ko/gallery/photo/index.ko.md @@ -0,0 +1,9 @@ +--- +title: "Photo" +date: 2018-10-12T10:20:16+09:00 +description: Photo Gallery +type: "gallery" +mode: "one-by-one" +description: "포토 갤러리" +images: +--- diff --git a/website/content/ko/posts/_index.ko.md b/website/content/ko/posts/_index.ko.md new file mode 100644 index 000000000..e0f80ce0e --- /dev/null +++ b/website/content/ko/posts/_index.ko.md @@ -0,0 +1,7 @@ ++++ +aliases = ["posts","articles","blog","showcase","docs"] +title = "Posts" +author = "Hugo Authors" +tags = ["index"] +description = "Post page" ++++ \ No newline at end of file diff --git a/website/languages.toml b/website/languages.toml new file mode 100644 index 000000000..23989a5c5 --- /dev/null +++ b/website/languages.toml @@ -0,0 +1,13 @@ +[en] + title = "Hugo Zzo Theme" + languageName = "English" + weight = 1 + languagedir = "ltr" + contentdir = "content/en" + +[ko] + title = "Hugo Zzo Theme" + languageName = "한국어" + weight = 2 + languagedir = "ltr" + contentdir = "content/ko" diff --git a/website/menus.en.toml b/website/menus.en.toml new file mode 100644 index 000000000..a6b6e1689 --- /dev/null +++ b/website/menus.en.toml @@ -0,0 +1,51 @@ +[[main]] + identifier = "about" + name = "About" + url = "about" + weight = 1 + +[[main]] + identifier = "archive" + name = "Archive" + url = "archive" + weight = 2 + +[[main]] + identifier = "presentation" + name = "Pt" + url = "presentation" + weight = 3 + +[[main]] + identifier = "gallery" + name = "Gallery" + url = "gallery" + weight = 4 + +[[main]] + parent = "gallery" + name = "Cartoon" + url = "gallery/cartoon" + +[[main]] + parent = "gallery" + name = "Photo" + url = "gallery/photo" + +[[main]] + identifier = "posts" + name = "Posts" + url = "posts" + weight = 5 + +[[main]] + identifier = "showcase" + name = "Showcase" + url = "showcase" + weight = 6 + +[[main]] + identifier = "publication" + name = "Pub" + url = "publication" + weight = 7 \ No newline at end of file diff --git a/website/menus.ko.toml b/website/menus.ko.toml new file mode 100644 index 000000000..55467a182 --- /dev/null +++ b/website/menus.ko.toml @@ -0,0 +1,28 @@ +[[main]] + identifier = "about" + name = "어바웃" + url = "about" + weight = 1 + +[[main]] + identifier = "archive" + name = "아카이브" + url = "archive" + weight = 2 + +[[main]] + identifier = "gallery" + name = "갤러리" + url = "gallery" + weight = 3 + +[[main]] + parent = "gallery" + name = "fiverr" + url = "gallery/mine" + +[[main]] + identifier = "posts" + name = "포스트" + url = "posts" + weight = 4 \ No newline at end of file diff --git a/website/params.toml b/website/params.toml new file mode 100644 index 000000000..b16a7d6fb --- /dev/null +++ b/website/params.toml @@ -0,0 +1,196 @@ +logoText = "Zzo" +logoType = "short" # long, short +description = "The Zzo theme for Hugo example site." +custom_css = [] +custom_js = [] +useFaviconGenerator = true # https://www.favicon-generator.org/ +meta_image = "" +themecolor = "" + +themeOptions = ["dark", "light", "hacker", "solarized", "kimbie"] +notAllowedTypesInHome = ["contact", "talks", "about", "showcase", "publication", "presentation", "resume"] +notAllowedTypesInHomeSidebar = ["about", "archive", "showcase", "publication", "presentation", "resume"] +notAllowedTypesInArchive = ["about", "talks", "showcase", "publication", "presentation", "resume"] +notAllowedTypesInHomeFeed = ["about", "archive", "contact", "talks", "showcase", "publication", "presentation", "resume", "gallery"] + +viewportSize = "normal" # widest, wider, wide, normal, narrow +enableUiAnimation = true +hideSingleContentsWhenJSDisabled = false +enablePinnedPosts = true +minItemsToShowInTagCloud = 1 # Minimum items to show in tag cloud + +# header +homeHeaderType = "text" # text, img, slide, typewriter + +# menu +showMobileMenuTerms = ["tags", "categories", "series"] + +# body +enableBreadcrumb = true +enablePhotoSwipe = true +enableSearch = true +enableSearchHighlight = true +enableGoToTop = true +enableWhoami = true +summaryShape = "classic" # card, classic, compact +searchResultPosition = "main" # side, main +archiveGroupByDate = "2006" # "2006-01": group by month, "2006": group by year +archivePaginate = 13 +paginateWindow = 1 +talksPaginate = 5 +talksGroupByDate = "2006" +pubPaginate = 20 + +# whoami +myname = "zzossig" +email = "zzossig@gmail.com" +whoami = "Web Developer" +bioImageUrl = "" +useGravatar = false +location = "Seoul, Korea" +organization = "Hugo" +link = "https://zzossig.io/ko" + +# sidebar +enableBio = true +enableBioImage = true +enableSidebar = true +enableSidebarTags = true +enableSidebarSeries = true +enableSidebarCategories = true +enableHomeSidebarTitles = true +enableListSidebarTitles = true +enableToc = true +hideToc = false +tocFolding = true +tocPosition = "inner" # inner, outer +enableTocSwitch = true +itemsPerCategory = 5 +sidebarPosition = "right" +tocLevels = ["h2", "h3", "h4"] +enableSidebarPostsByOrder = false + +# footer +showPoweredBy = true +showFeedLinks = true +showSocialLinks = true +enableLangChange = true +enableThemeChange = true + +# service +googleTagManager = "" # GTM-XXXXXX +baiduAnalytics = "" +enableBusuanzi = false +busuanziSiteUV = true +busuanziSitePV = true +busuanziPagePV = true + +# rss +updatePeriod = "" # Possible values: 'hourly', 'daily', 'weekly', 'monthly', or 'yearly'. +updateFrequency = "" +fullContents = false + +# comment +enableComment = true +disqus_shortname = "" +commento = false + +[telegram] + enable = false + siteId = "" + dataLimit = 5 + +[gitment] # Gitment is a comment system based on GitHub issues. see https://github.com/imsun/gitment + owner = "" # Your GitHub ID + repo = "" # The repo to store comments + clientId = "" # Your client ID + clientSecret = "" # Your client secret + +[utterances] # https://utteranc.es/ + owner = "" # Your GitHub ID + repo = "" # The repo to store comments + +[gitalk] # Gitalk is a comment system based on GitHub issues. see https://github.com/gitalk/gitalk + owner = "" # Your GitHub ID + repo = "" # The repo to store comments + clientId = "" # Your client ID + clientSecret = "" # Your client secret + +# Valine. +# You can get your appid and appkey from https://leancloud.cn +# more info please open https://valine.js.org +[valine] + enable = false + appId = '你的appId' + appKey = '你的appKey' + notify = false # mail notifier , https://github.com/xCss/Valine/wiki + verify = false # Verification code + avatar = 'mm' + placeholder = '说点什么吧...' + visitor = false + +[changyan] + changyanAppid = "" # Changyan app id # 畅言 + changyanAppkey = "" # Changyan app key + +[livere] + livereUID = "" # LiveRe UID # 来必力 + +# Isso: https://posativ.org/isso/ +[isso] + enable = false + scriptSrc = "" # "https://isso.example.com/js/embed.min.js" + dataAttrs = "" # "data-isso='https://isso.example.com' data-isso-require-author='true'" + +[socialOptions] + email = "mailto:your@email.com" + phone = "" + facebook = "http://example.org/" + twitter = "http://example.org/" + github = "https://github.com/zzossig/hugo-theme-zzo" + stack-overflow = "" + instagram = "" + google-plus = "" + youtube = "" + medium = "" + tumblr = "" + linkedin = "" + pinterest = "" + stack-exchange = "" + telegram = "" + steam = "" + weibo = "" + douban = "" + csdn = "" + gitlab = "" + mastodon = "" + jianshu = "" + zhihu = "" + signal = "" + whatsapp = "" + matrix = "" + xmpp = "" + dev-to = "" + gitea = "" + google-scholar = "" + +[donationOptions] + enable = false + alipay = "" + wechat = "" + paypal = "" + patreon = "" + +# possible share name: ["facebook","twitter", "reddit", "linkedin", "tumblr", "weibo", "douban", "line"] +[[share]] + name = "facebook" + username = "" +[[share]] + name = "twitter" + +[[footerLinks]] + name = "" + link = "" +[[footerLinks]] + name = "" + link = "" \ No newline at end of file diff --git a/website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.content b/website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.content deleted file mode 100644 index 99d483a2f..000000000 --- a/website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.content +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}.flex{display:flex}.flex-auto{flex:1 1 auto}.flex-even{flex:1 1}.flex-wrap{flex-wrap:wrap}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.align-center{align-items:center}.mx-auto{margin:0 auto}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.hidden{display:none}input.toggle{height:0;width:0;overflow:hidden;opacity:0;position:absolute}.clearfix::after{content:"";display:table;clear:both}html{font-size:16px;scroll-behavior:smooth;touch-action:manipulation}body{min-width:20rem;color:#000;background:#fff;letter-spacing:.33px;font-weight:400;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box}body *{box-sizing:inherit}h1,h2,h3,h4,h5{font-weight:400}a{text-decoration:none;color:#05b}img{vertical-align:baseline}:focus{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}aside nav ul{padding:0;margin:0;list-style:none}aside nav ul li{margin:1em 0;position:relative}aside nav ul a{display:block}aside nav ul a:hover{opacity:.5}aside nav ul ul{padding-inline-start:1rem}ul.pagination{display:flex;justify-content:center;list-style-type:none}ul.pagination .page-item a{padding:1rem}.container{max-width:80rem;margin:0 auto}.book-icon{filter:none}.book-brand{margin-top:0}.book-brand img{height:1.5em;width:auto;vertical-align:middle;margin-inline-end:.5rem}.book-menu{flex:0 0 16rem;font-size:.875rem}.book-menu nav{width:16rem;padding:1rem;background:#fff;position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-menu a{color:inherit;word-wrap:break-word}.book-menu a.active{color:#05b}.book-menu a.collapsed{display:flex;justify-content:space-between}.book-menu a.collapsed::after{content:"▸"}.book-section-flat{margin-bottom:2rem}.book-section-flat:not(:first-child){margin-top:2rem}.book-section-flat>a,.book-section-flat>span{font-weight:bolder}.book-section-flat>ul{padding-inline-start:0}.book-page{min-width:20rem;flex-grow:1;padding:1rem}.book-post{margin-bottom:3rem}.book-header{display:none;margin-bottom:1rem}.book-header label{line-height:0}.book-search{position:relative;margin:1rem 0;border-bottom:1px solid transparent}.book-search input{width:100%;padding:.5rem;border:0;border-radius:.25rem;background:#f8f9fa;color:#000}.book-search input:required+.book-search-spinner{display:block}.book-search .book-search-spinner{position:absolute;top:0;margin:.5rem;margin-inline-start:calc(100% - 1.5rem);width:1rem;height:1rem;border:1px solid transparent;border-top-color:#000;border-radius:50%;animation:spin 1s ease infinite}@keyframes spin{100%{transform:rotate(360deg)}}.book-search small{opacity:.5}.book-toc{flex:0 0 16rem;font-size:.75rem}.book-toc nav{width:16rem;padding:1rem;position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-toc img{height:1em}.book-toc nav>ul>li:first-child{margin-top:0}.book-footer{padding-top:1rem;font-size:.875rem}.book-footer img{height:1em;margin-inline-end:.5rem}.book-comments{margin-top:1rem}.book-languages{position:relative;overflow:visible;padding:1rem;margin:-1rem}.book-languages ul{margin:0;padding:0;list-style:none}.book-languages ul li{white-space:nowrap;cursor:pointer}.book-languages:hover .book-languages-list,.book-languages:focus .book-languages-list,.book-languages:focus-within .book-languages-list{display:block}.book-languages .book-languages-list{display:none;position:absolute;bottom:100%;left:0;padding:.5rem 0;background:#fff;box-shadow:0 0 .25rem rgba(0,0,0,.1)}.book-languages .book-languages-list li img{opacity:.25}.book-languages .book-languages-list li.active img,.book-languages .book-languages-list li:hover img{opacity:initial}.book-languages .book-languages-list a{color:inherit;padding:.5rem 1rem}.book-home{padding:1rem}aside nav,.book-page,.book-header aside,.markdown{transition:.2s ease-in-out;transition-property:transform,margin,opacity,visibility;will-change:transform,margin,opacity}@media screen and (max-width:56rem){#menu-control,#toc-control{display:inline}.book-menu{visibility:hidden;margin-inline-start:-16rem;font-size:16px;z-index:1}.book-toc{display:none}.book-header{display:block}#menu-control:focus~main label[for=menu-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#menu-control:checked~main .book-menu{visibility:initial}#menu-control:checked~main .book-menu nav{transform:translateX(16rem);box-shadow:0 0 .5rem rgba(0,0,0,.1)}#menu-control:checked~main .book-page{opacity:.25}#menu-control:checked~main .book-menu-overlay{display:block;position:absolute;top:0;bottom:0;left:0;right:0}#toc-control:focus~main label[for=toc-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#toc-control:checked~main .book-header aside{display:block}body[dir=rtl] #menu-control:checked+main .book-menu nav{transform:translateX(-16rem)}}@media screen and (min-width:80rem){.book-page,.book-menu nav,.book-toc nav{padding:2rem 1rem}}@font-face{font-family:roboto;font-style:italic;font-weight:300;font-display:swap;src:local("Roboto Light Italic"),local("Roboto-LightItalic"),url(fonts/roboto-v19-latin-300italic.woff2)format("woff2"),url(fonts/roboto-v19-latin-300italic.woff)format("woff")}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto"),local("Roboto-Regular"),url(fonts/roboto-v19-latin-regular.woff2)format("woff2"),url(fonts/roboto-v19-latin-regular.woff)format("woff")}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:swap;src:local("Roboto Bold"),local("Roboto-Bold"),url(fonts/roboto-v19-latin-700.woff2)format("woff2"),url(fonts/roboto-v19-latin-700.woff)format("woff")}@font-face{font-family:roboto mono;font-style:normal;font-weight:400;font-display:swap;src:local("Roboto Mono"),local("RobotoMono-Regular"),url(fonts/roboto-mono-v6-latin-regular.woff2)format("woff2"),url(fonts/roboto-mono-v6-latin-regular.woff)format("woff")}body{font-family:roboto,sans-serif}code{font-family:roboto mono,monospace}@media print{.book-menu,.book-footer,.book-toc{display:none}.book-header,.book-header aside{display:block}main{display:block!important}}.markdown{line-height:1.6}.markdown>:first-child{margin-top:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-weight:400;line-height:1;margin-top:1.5em;margin-bottom:1rem}.markdown h1 a.anchor,.markdown h2 a.anchor,.markdown h3 a.anchor,.markdown h4 a.anchor,.markdown h5 a.anchor,.markdown h6 a.anchor{opacity:0;font-size:.75em;vertical-align:middle;text-decoration:none}.markdown h1:hover a.anchor,.markdown h1 a.anchor:focus,.markdown h2:hover a.anchor,.markdown h2 a.anchor:focus,.markdown h3:hover a.anchor,.markdown h3 a.anchor:focus,.markdown h4:hover a.anchor,.markdown h4 a.anchor:focus,.markdown h5:hover a.anchor,.markdown h5 a.anchor:focus,.markdown h6:hover a.anchor,.markdown h6 a.anchor:focus{opacity:initial}.markdown h4,.markdown h5,.markdown h6{font-weight:bolder}.markdown h5{font-size:.875em}.markdown h6{font-size:.75em}.markdown b,.markdown optgroup,.markdown strong{font-weight:bolder}.markdown a{text-decoration:none}.markdown a:hover{text-decoration:underline}.markdown a:visited{color:#8440f1}.markdown img{max-width:100%}.markdown code{padding:0 .25rem;background:#e9ecef;border-radius:.25rem;font-size:.875em}.markdown pre{padding:1rem;background:#f8f9fa;border-radius:.25rem;overflow-x:auto}.markdown pre code{padding:0;background:0 0}.markdown blockquote{margin:1rem 0;padding:.5rem 1rem .5rem .75rem;border-inline-start:.25rem solid #e9ecef;border-radius:.25rem}.markdown blockquote :first-child{margin-top:0}.markdown blockquote :last-child{margin-bottom:0}.markdown table{overflow:auto;display:block;border-spacing:0;border-collapse:collapse;margin-top:1rem;margin-bottom:1rem}.markdown table tr th,.markdown table tr td{padding:.5rem 1rem;border:1px solid #e9ecef}.markdown table tr:nth-child(2n){background:#f8f9fa}.markdown hr{height:1px;border:none;background:#e9ecef}.markdown ul,.markdown ol{padding-inline-start:2rem}.markdown dl dt{font-weight:bolder;margin-top:1rem}.markdown dl dd{margin-inline-start:1rem;margin-bottom:1rem}.markdown .highlight table tr td:nth-child(1) pre{margin:0;padding-inline-end:0}.markdown .highlight table tr td:nth-child(2) pre{margin:0;padding-inline-start:0}.markdown details{padding:1rem;border:1px solid #e9ecef;border-radius:.25rem}.markdown details summary{line-height:1;padding:1rem;margin:-1rem;cursor:pointer}.markdown details[open] summary{margin-bottom:0}.markdown figure{margin:1rem 0}.markdown figure figcaption p{margin-top:0}.markdown-inner>:first-child{margin-top:0}.markdown-inner>:last-child{margin-bottom:0}.markdown .book-expand{margin-top:1rem;margin-bottom:1rem;border:1px solid #e9ecef;border-radius:.25rem;overflow:hidden}.markdown .book-expand .book-expand-head{background:#f8f9fa;padding:.5rem 1rem;cursor:pointer}.markdown .book-expand .book-expand-content{display:none;padding:1rem}.markdown .book-expand input[type=checkbox]:checked+.book-expand-content{display:block}.markdown .book-tabs{margin-top:1rem;margin-bottom:1rem;border:1px solid #e9ecef;border-radius:.25rem;overflow:hidden;display:flex;flex-wrap:wrap}.markdown .book-tabs label{display:inline-block;padding:.5rem 1rem;border-bottom:1px transparent;cursor:pointer}.markdown .book-tabs .book-tabs-content{order:999;width:100%;border-top:1px solid #f8f9fa;padding:1rem;display:none}.markdown .book-tabs input[type=radio]:checked+label{border-bottom:1px solid #05b}.markdown .book-tabs input[type=radio]:checked+label+.book-tabs-content{display:block}.markdown .book-tabs input[type=radio]:focus+label{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}.markdown .book-columns{margin-left:-1rem;margin-right:-1rem}.markdown .book-columns>div{margin:1rem 0;min-width:10rem;padding:0 1rem}.markdown a.book-btn{display:inline-block;font-size:.875rem;color:#05b;line-height:2rem;padding:0 1rem;border:1px solid #05b;border-radius:.25rem;cursor:pointer}.markdown a.book-btn:hover{text-decoration:none}.markdown .book-hint.info{border-color:#6bf;background-color:rgba(102,187,255,.1)}.markdown .book-hint.warning{border-color:#fd6;background-color:rgba(255,221,102,.1)}.markdown .book-hint.danger{border-color:#f66;background-color:rgba(255,102,102,.1)} \ No newline at end of file diff --git a/website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.json b/website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.json deleted file mode 100644 index fe66a39d0..000000000 --- a/website/resources/_gen/assets/scss/book.scss_50fc8c04e12a2f59027287995557ceff.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"book.min.6cd8553a6854f4812343f0f0c8baca31271e686434f381fbe3c7226f66639176.css","MediaType":"text/css","Data":{"Integrity":"sha256-bNhVOmhU9IEjQ/DwyLrKMSceaGQ084H748cib2ZjkXY="}} \ No newline at end of file diff --git a/website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.content b/website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.content new file mode 100644 index 000000000..7922894cf --- /dev/null +++ b/website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.content @@ -0,0 +1 @@ +.theme__light .chroma{background-color:#f5f2f0}.theme__light .chroma .err{color:#a61717;background-color:#e3d2d2}.theme__light .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.theme__light .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.theme__light .chroma .hl{display:block;width:100%;background-color:#ffc}.theme__light .chroma .lnt{padding:0 .4em;color:#728fcb}.theme__light .chroma .ln{padding:0 .4em;color:#728fcb}.theme__light .chroma .k{color:#728fcb;font-weight:700}.theme__light .chroma .kc{color:#728fcb;font-weight:700}.theme__light .chroma .kd{color:#728fcb;font-weight:700}.theme__light .chroma .kn{color:#728fcb;font-weight:700}.theme__light .chroma .kp{color:#728fcb;font-weight:700}.theme__light .chroma .kr{color:#728fcb;font-weight:700}.theme__light .chroma .kt{color:#458;font-weight:700}.theme__light .chroma .na{color:#896724}.theme__light .chroma .nb{color:#0086b3}.theme__light .chroma .bp{color:#b6ad9a}.theme__light .chroma .nc{color:#458;font-weight:700}.theme__light .chroma .no{color:#896724}.theme__light .chroma .nd{color:#3c5d5d;font-weight:700}.theme__light .chroma .ni{color:#728fcb}.theme__light .chroma .ne{color:#b29762;font-weight:700}.theme__light .chroma .nf{color:#b29762;font-weight:700}.theme__light .chroma .nl{color:#b29762;font-weight:700}.theme__light .chroma .nn{color:#555}.theme__light .chroma .nt{color:#063289}.theme__light .chroma .nv{color:#896724}.theme__light .chroma .vc{color:#896724}.theme__light .chroma .vg{color:#896724}.theme__light .chroma .vi{color:#896724}.theme__light .chroma .s{color:#728fcb}.theme__light .chroma .sa{color:#728fcb}.theme__light .chroma .sb{color:#728fcb}.theme__light .chroma .sc{color:#728fcb}.theme__light .chroma .dl{color:#728fcb}.theme__light .chroma .sd{color:#728fcb}.theme__light .chroma .s2{color:#728fcb}.theme__light .chroma .se{color:#728fcb}.theme__light .chroma .sh{color:#728fcb}.theme__light .chroma .si{color:#728fcb}.theme__light .chroma .sx{color:#728fcb}.theme__light .chroma .sr{color:#009926}.theme__light .chroma .s1{color:#728fcb}.theme__light .chroma .ss{color:#990073}.theme__light .chroma .m{color:#099}.theme__light .chroma .mb{color:#099}.theme__light .chroma .mf{color:#099}.theme__light .chroma .mh{color:#099}.theme__light .chroma .mi{color:#099}.theme__light .chroma .il{color:#099}.theme__light .chroma .mo{color:#099}.theme__light .chroma .o{color:#728fcb;font-weight:700}.theme__light .chroma .ow{color:#728fcb;font-weight:700}.theme__light .chroma .c{color:#b6ad9a;font-style:italic}.theme__light .chroma .ch{color:#b6ad9a;font-style:italic}.theme__light .chroma .cm{color:#b6ad9a;font-style:italic}.theme__light .chroma .c1{color:#b6ad9a;font-style:italic}.theme__light .chroma .cs{color:#b6ad9a;font-weight:700;font-style:italic}.theme__light .chroma .cp{color:#b6ad9a;font-weight:700;font-style:italic}.theme__light .chroma .cpf{color:#b6ad9a;font-weight:700;font-style:italic}.theme__light .chroma .gd{color:#728fcb;background-color:#fdd}.theme__light .chroma .ge{color:#728fcb;font-style:italic}.theme__light .chroma .gr{color:#a00}.theme__light .chroma .gh{color:#b6ad9a}.theme__light .chroma .gi{color:#728fcb;background-color:#dfd}.theme__light .chroma .go{color:#888}.theme__light .chroma .gp{color:#555}.theme__light .chroma .gs{font-weight:700}.theme__light .chroma .gu{color:#aaa}.theme__light .chroma .gt{color:#a00}.theme__light .chroma .gl{text-decoration:underline}.theme__light .chroma .w{color:#bbb}.theme__light .chroma .p{color:#b6ad9a}.theme__dark .chroma{color:#f8f8f2;background-color:#171f2e}.theme__dark .chroma .err{color:#960050;background-color:#1e0010}.theme__dark .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.theme__dark .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.theme__dark .chroma .hl{display:block;width:100%;background-color:#000}.theme__dark .chroma .lnt{padding:0 .4em;color:#7f7f7f}.theme__dark .chroma .ln{padding:0 .4em;color:#7f7f7f}.theme__dark .chroma .k{color:#66d9ef}.theme__dark .chroma .kc{color:#66d9ef}.theme__dark .chroma .kd{color:#66d9ef}.theme__dark .chroma .kn{color:#f92672}.theme__dark .chroma .kp{color:#66d9ef}.theme__dark .chroma .kr{color:#66d9ef}.theme__dark .chroma .kt{color:#66d9ef}.theme__dark .chroma .na{color:#a6e22e}.theme__dark .chroma .nc{color:#a6e22e}.theme__dark .chroma .no{color:#66d9ef}.theme__dark .chroma .nd{color:#a6e22e}.theme__dark .chroma .ne{color:#a6e22e}.theme__dark .chroma .nf{color:#a6e22e}.theme__dark .chroma .nx{color:#a6e22e}.theme__dark .chroma .nt{color:#f92672}.theme__dark .chroma .l{color:#ae81ff}.theme__dark .chroma .ld{color:#e6db74}.theme__dark .chroma .s{color:#e6db74}.theme__dark .chroma .sa{color:#e6db74}.theme__dark .chroma .sb{color:#e6db74}.theme__dark .chroma .sc{color:#e6db74}.theme__dark .chroma .dl{color:#e6db74}.theme__dark .chroma .sd{color:#e6db74}.theme__dark .chroma .s2{color:#e6db74}.theme__dark .chroma .se{color:#ae81ff}.theme__dark .chroma .sh{color:#e6db74}.theme__dark .chroma .si{color:#e6db74}.theme__dark .chroma .sx{color:#e6db74}.theme__dark .chroma .sr{color:#e6db74}.theme__dark .chroma .s1{color:#e6db74}.theme__dark .chroma .ss{color:#e6db74}.theme__dark .chroma .m{color:#ae81ff}.theme__dark .chroma .mb{color:#ae81ff}.theme__dark .chroma .mf{color:#ae81ff}.theme__dark .chroma .mh{color:#ae81ff}.theme__dark .chroma .mi{color:#ae81ff}.theme__dark .chroma .il{color:#ae81ff}.theme__dark .chroma .mo{color:#ae81ff}.theme__dark .chroma .o{color:#f92672}.theme__dark .chroma .ow{color:#f92672}.theme__dark .chroma .c{color:#75715e}.theme__dark .chroma .ch{color:#75715e}.theme__dark .chroma .cm{color:#75715e}.theme__dark .chroma .c1{color:#75715e}.theme__dark .chroma .cs{color:#75715e}.theme__dark .chroma .cp{color:#75715e}.theme__dark .chroma .cpf{color:#75715e}.theme__dark .chroma .gd{color:#f92672}.theme__dark .chroma .ge{font-style:italic}.theme__dark .chroma .gi{color:#a6e22e}.theme__dark .chroma .gs{font-weight:700}.theme__dark .chroma .gu{color:#75715e}.theme__hacker .chroma{color:#f8f8f2;background-color:#282a36}.theme__hacker .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.theme__hacker .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.theme__hacker .chroma .hl{display:block;width:100%;background-color:#000}.theme__hacker .chroma .lnt{padding:0 .4em;color:#7f7f7f}.theme__hacker .chroma .ln{padding:0 .4em;color:#7f7f7f}.theme__hacker .chroma .k{color:#ff79c6}.theme__hacker .chroma .kc{color:#ff79c6}.theme__hacker .chroma .kd{color:#8be9fd;font-style:italic}.theme__hacker .chroma .kn{color:#ff79c6}.theme__hacker .chroma .kp{color:#ff79c6}.theme__hacker .chroma .kr{color:#ff79c6}.theme__hacker .chroma .kt{color:#8be9fd}.theme__hacker .chroma .na{color:#50fa7b}.theme__hacker .chroma .nb{color:#8be9fd;font-style:italic}.theme__hacker .chroma .nc{color:#50fa7b}.theme__hacker .chroma .nf{color:#50fa7b}.theme__hacker .chroma .nl{color:#8be9fd;font-style:italic}.theme__hacker .chroma .nt{color:#ff79c6}.theme__hacker .chroma .nv{color:#8be9fd;font-style:italic}.theme__hacker .chroma .vc{color:#8be9fd;font-style:italic}.theme__hacker .chroma .vg{color:#8be9fd;font-style:italic}.theme__hacker .chroma .vi{color:#8be9fd;font-style:italic}.theme__hacker .chroma .s{color:#f1fa8c}.theme__hacker .chroma .sa{color:#f1fa8c}.theme__hacker .chroma .sb{color:#f1fa8c}.theme__hacker .chroma .sc{color:#f1fa8c}.theme__hacker .chroma .dl{color:#f1fa8c}.theme__hacker .chroma .sd{color:#f1fa8c}.theme__hacker .chroma .s2{color:#f1fa8c}.theme__hacker .chroma .se{color:#f1fa8c}.theme__hacker .chroma .sh{color:#f1fa8c}.theme__hacker .chroma .si{color:#f1fa8c}.theme__hacker .chroma .sx{color:#f1fa8c}.theme__hacker .chroma .sr{color:#f1fa8c}.theme__hacker .chroma .s1{color:#f1fa8c}.theme__hacker .chroma .ss{color:#f1fa8c}.theme__hacker .chroma .m{color:#bd93f9}.theme__hacker .chroma .mb{color:#bd93f9}.theme__hacker .chroma .mf{color:#bd93f9}.theme__hacker .chroma .mh{color:#bd93f9}.theme__hacker .chroma .mi{color:#bd93f9}.theme__hacker .chroma .il{color:#bd93f9}.theme__hacker .chroma .mo{color:#bd93f9}.theme__hacker .chroma .o{color:#ff79c6}.theme__hacker .chroma .ow{color:#ff79c6}.theme__hacker .chroma .c{color:#6272a4}.theme__hacker .chroma .ch{color:#6272a4}.theme__hacker .chroma .cm{color:#6272a4}.theme__hacker .chroma .c1{color:#6272a4}.theme__hacker .chroma .cs{color:#6272a4}.theme__hacker .chroma .cp{color:#ff79c6}.theme__hacker .chroma .cpf{color:#ff79c6}.theme__hacker .chroma .gd{color:#8b080b}.theme__hacker .chroma .ge{text-decoration:underline}.theme__hacker .chroma .gh{font-weight:700}.theme__hacker .chroma .gi{font-weight:700}.theme__hacker .chroma .go{color:#44475a}.theme__hacker .chroma .gu{font-weight:700}.theme__hacker .chroma .gl{text-decoration:underline}.theme__solarized .chroma{color:#dc322f;background-color:#faf1cd}.theme__solarized .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.theme__solarized .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.theme__solarized .chroma .hl{display:block;width:100%;background-color:#ffc}.theme__solarized .chroma .lnt{padding:0 .4em;color:#aaa}.theme__solarized .chroma .ln{padding:0 .4em;color:#aaa}.theme__solarized .chroma .k{color:#07a}.theme__solarized .chroma .kc{color:#07a;font-weight:700}.theme__solarized .chroma .kd{color:#07a}.theme__solarized .chroma .kn{color:#dc322f;font-weight:700}.theme__solarized .chroma .kp{color:#07a}.theme__solarized .chroma .kr{color:#07a}.theme__solarized .chroma .kt{color:#07a;font-weight:700}.theme__solarized .chroma .n{color:#c47e00}.theme__solarized .chroma .na{color:#c47e00}.theme__solarized .chroma .nb{color:#690}.theme__solarized .chroma .bp{color:#c47e00}.theme__solarized .chroma .nc{color:#690}.theme__solarized .chroma .no{color:#c47e00}.theme__solarized .chroma .nd{color:#c47e00}.theme__solarized .chroma .ni{color:#c47e00}.theme__solarized .chroma .ne{color:#c47e00}.theme__solarized .chroma .nf{color:#dd4a68}.theme__solarized .chroma .fm{color:#dd4a68}.theme__solarized .chroma .nl{color:#c47e00}.theme__solarized .chroma .nn{color:#c47e00}.theme__solarized .chroma .nx{color:#c47e00}.theme__solarized .chroma .py{color:#c47e00}.theme__solarized .chroma .nt{color:#268bd2;font-weight:700}.theme__solarized .chroma .nv{color:#c47e00}.theme__solarized .chroma .vc{color:#c47e00}.theme__solarized .chroma .vg{color:#c47e00}.theme__solarized .chroma .vi{color:#c47e00}.theme__solarized .chroma .vm{color:#c47e00}.theme__solarized .chroma .l{color:#2aa198}.theme__solarized .chroma .ld{color:#2aa198}.theme__solarized .chroma .s{color:#2aa198}.theme__solarized .chroma .sa{color:#2aa198}.theme__solarized .chroma .sb{color:#2aa198}.theme__solarized .chroma .sc{color:#2aa198}.theme__solarized .chroma .dl{color:#2aa198}.theme__solarized .chroma .sd{color:#2aa198}.theme__solarized .chroma .s2{color:#2aa198}.theme__solarized .chroma .se{color:#2aa198}.theme__solarized .chroma .sh{color:#2aa198}.theme__solarized .chroma .si{color:#2aa198}.theme__solarized .chroma .sx{color:#2aa198}.theme__solarized .chroma .sr{color:#2aa198}.theme__solarized .chroma .s1{color:#2aa198}.theme__solarized .chroma .ss{color:#2aa198}.theme__solarized .chroma .m{color:#2aa198;font-weight:700}.theme__solarized .chroma .mb{color:#2aa198;font-weight:700}.theme__solarized .chroma .mf{color:#2aa198;font-weight:700}.theme__solarized .chroma .mh{color:#2aa198;font-weight:700}.theme__solarized .chroma .mi{color:#2aa198;font-weight:700}.theme__solarized .chroma .il{color:#2aa198;font-weight:700}.theme__solarized .chroma .mo{color:#2aa198;font-weight:700}.theme__solarized .chroma .ow{color:#07a}.theme__solarized .chroma .c{color:#93a1a1;font-style:italic}.theme__solarized .chroma .ch{color:#93a1a1;font-style:italic}.theme__solarized .chroma .cm{color:#93a1a1;font-style:italic}.theme__solarized .chroma .c1{color:#93a1a1;font-style:italic}.theme__solarized .chroma .cs{color:#93a1a1;font-style:italic}.theme__solarized .chroma .cp{color:#93a1a1;font-style:italic}.theme__solarized .chroma .cpf{color:#93a1a1;font-style:italic}.theme__solarized .chroma .g{color:#d33682}.theme__solarized .chroma .gd{color:#d33682}.theme__solarized .chroma .ge{color:#d33682}.theme__solarized .chroma .gr{color:#d33682}.theme__solarized .chroma .gh{color:#d33682}.theme__solarized .chroma .gi{color:#d33682}.theme__solarized .chroma .go{color:#d33682}.theme__solarized .chroma .gp{color:#d33682}.theme__solarized .chroma .gs{color:#d33682}.theme__solarized .chroma .gu{color:#d33682}.theme__solarized .chroma .gt{color:#d33682}.theme__solarized .chroma .gl{color:#d33682}.theme__kimbie .chroma{color:#272822;background-color:#fafafa}.theme__kimbie .chroma .err{color:#960050;background-color:#1e0010}.theme__kimbie .chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.theme__kimbie .chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.theme__kimbie .chroma .hl{display:block;width:100%;background-color:#ffc}.theme__kimbie .chroma .lnt{padding:0 .4em;color:#7f7f7f}.theme__kimbie .chroma .ln{padding:0 .4em;color:#7f7f7f}.theme__kimbie .chroma .k{color:#00a8c8}.theme__kimbie .chroma .kc{color:#00a8c8}.theme__kimbie .chroma .kd{color:#00a8c8}.theme__kimbie .chroma .kn{color:#f92672}.theme__kimbie .chroma .kp{color:#00a8c8}.theme__kimbie .chroma .kr{color:#00a8c8}.theme__kimbie .chroma .kt{color:#00a8c8}.theme__kimbie .chroma .n{color:#8ab1b0}.theme__kimbie .chroma .na{color:#75af00}.theme__kimbie .chroma .nb{color:#8ab1b0}.theme__kimbie .chroma .bp{color:#8ab1b0}.theme__kimbie .chroma .nc{color:#75af00}.theme__kimbie .chroma .no{color:#00a8c8}.theme__kimbie .chroma .nd{color:#75af00}.theme__kimbie .chroma .ni{color:#8ab1b0}.theme__kimbie .chroma .ne{color:#75af00}.theme__kimbie .chroma .nf{color:#75af00}.theme__kimbie .chroma .fm{color:#8ab1b0}.theme__kimbie .chroma .nl{color:#8ab1b0}.theme__kimbie .chroma .nn{color:#8ab1b0}.theme__kimbie .chroma .nx{color:#75af00}.theme__kimbie .chroma .py{color:#8ab1b0}.theme__kimbie .chroma .nt{color:#f92672}.theme__kimbie .chroma .nv{color:#8ab1b0}.theme__kimbie .chroma .vc{color:#8ab1b0}.theme__kimbie .chroma .vg{color:#8ab1b0}.theme__kimbie .chroma .vi{color:#8ab1b0}.theme__kimbie .chroma .vm{color:#8ab1b0}.theme__kimbie .chroma .l{color:#ae81ff}.theme__kimbie .chroma .ld{color:#d88200}.theme__kimbie .chroma .s{color:#d88200}.theme__kimbie .chroma .sa{color:#d88200}.theme__kimbie .chroma .sb{color:#d88200}.theme__kimbie .chroma .sc{color:#d88200}.theme__kimbie .chroma .dl{color:#d88200}.theme__kimbie .chroma .sd{color:#d88200}.theme__kimbie .chroma .s2{color:#d88200}.theme__kimbie .chroma .se{color:#8045ff}.theme__kimbie .chroma .sh{color:#d88200}.theme__kimbie .chroma .si{color:#d88200}.theme__kimbie .chroma .sx{color:#d88200}.theme__kimbie .chroma .sr{color:#d88200}.theme__kimbie .chroma .s1{color:#d88200}.theme__kimbie .chroma .ss{color:#d88200}.theme__kimbie .chroma .m{color:#ae81ff}.theme__kimbie .chroma .mb{color:#ae81ff}.theme__kimbie .chroma .mf{color:#ae81ff}.theme__kimbie .chroma .mh{color:#ae81ff}.theme__kimbie .chroma .mi{color:#ae81ff}.theme__kimbie .chroma .il{color:#ae81ff}.theme__kimbie .chroma .mo{color:#ae81ff}.theme__kimbie .chroma .o{color:#f92672}.theme__kimbie .chroma .ow{color:#f92672}.theme__kimbie .chroma .p{color:#8ab1b0}.theme__kimbie .chroma .c{color:#75715e}.theme__kimbie .chroma .ch{color:#75715e}.theme__kimbie .chroma .cm{color:#75715e}.theme__kimbie .chroma .c1{color:#75715e}.theme__kimbie .chroma .cs{color:#75715e}.theme__kimbie .chroma .cp{color:#75715e}.theme__kimbie .chroma .cpf{color:#75715e}.theme__kimbie .chroma .ge{font-style:italic}.theme__kimbie .chroma .gs{font-weight:700}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}.theme__dark a{text-decoration:none;color:#ffd866}.theme__dark a:hover,.theme__dark a:active,.theme__dark a:focus{color:#ff6188;text-decoration:underline}.theme__light a{text-decoration:none;color:#607d8b}.theme__light a:hover,.theme__light a:active,.theme__light a:focus{color:#26a69a;text-decoration:underline}.theme__hacker a{text-decoration:none;color:#e08c48}.theme__hacker a:hover,.theme__hacker a:active,.theme__hacker a:focus{color:#c7ba00;text-decoration:underline}.theme__solarized a{text-decoration:none;color:#859900}.theme__solarized a:hover,.theme__solarized a:active,.theme__solarized a:focus{color:#268bd2;text-decoration:underline}.theme__kimbie a{text-decoration:none;color:#dc322f}.theme__kimbie a:hover,.theme__kimbie a:active,.theme__kimbie a:focus{color:#f06431;text-decoration:underline}/*!minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css*/html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}ul{list-style:none}hr{border:0}button,input,select,textarea{margin:0}button{padding:0}img,video{height:auto;max-width:100%;object-fit:inherit}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}b,strong{font-weight:700}dfn{font-style:italic}figcaption{font-style:italic;font-size:.9rem;margin-top:.5rem;margin-bottom:1rem}.theme__dark figcaption{color:#bdbdbd}.theme__dark figcaption strong{color:#fcfcfa}.theme__light figcaption{color:#bdbdbd}.theme__light figcaption strong{color:#424242}.theme__hacker figcaption{color:#1fff2a}.theme__hacker figcaption strong{color:#fcfcfa}.theme__solarized figcaption{color:#ffb300}.theme__solarized figcaption strong{color:#b58900}.theme__kimbie figcaption{color:#e3b583}.theme__kimbie figcaption strong{color:#7e602c}pre{white-space:pre;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}.theme__dark ::-moz-selection{color:#fcfcfa;background:#ff6188}.theme__light ::-moz-selection{color:#fcfcfa;background:#ff6188}.theme__hacker ::-moz-selection{color:#fcfcfa;background:#ff6188}.theme__solarized ::-moz-selection{color:#fcfcfa;background:#ff6188}.theme__kimbie ::-moz-selection{color:#fcfcfa;background:#ff6188}.theme__dark ::selection{color:#fcfcfa;background:#ff6188}.theme__light ::selection{color:#fcfcfa;background:#ff6188}.theme__hacker ::selection{color:#fcfcfa;background:#ff6188}.theme__solarized ::selection{color:#fcfcfa;background:#ff6188}.theme__kimbie ::selection{color:#fcfcfa;background:#ff6188}/*!Generated by Font Squirrel (https://www.fontsquirrel.com) on October 26, 2019*/@font-face{font-family:montserrat;src:url(../fonts/montserrat-regular.woff2)format("woff2"),url(../fonts/montserrat-regular.woff)format("woff");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:montserrat;src:url(../fonts/montserrat-bold.woff2)format("woff2"),url(../fonts/montserrat-bold.woff)format("woff");font-weight:700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:montserrat;src:url(../fonts/montserrat-black.woff2)format("woff2"),url(../fonts/montserrat-black.woff)format("woff");font-weight:900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:merriweather;src:url(../fonts/merriweather-regular.woff2)format("woff2"),url(../fonts/merriweather-regular.woff)format("woff");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:merriweather;src:url(../fonts/merriweather-italic.woff2)format("woff2"),url(../fonts/merriweather-italic.woff)format("woff");font-weight:400;font-style:italic;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:merriweather;src:url(../fonts/merriweather-bold.woff2)format("woff2"),url(../fonts/merriweather-bold.woff)format("woff");font-weight:700;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:merriweather;src:url(../fonts/merriweather-bolditalic.woff2)format("woff2"),url(../fonts/merriweather-bolditalic.woff)format("woff");font-weight:700;font-style:italic;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:merriweather;src:url(../fonts/merriweather-black.woff2)format("woff2"),url(../fonts/merriweather-black.woff)format("woff");font-weight:900;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:courgette;src:url(../fonts/Courgette-Regular.woff)format("woff");font-weight:400;font-style:normal;font-display:swap;unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:200;src:local("Muli Extra Light "),local("Muli-Extra Light"),url(../fonts/muli-latin-200.woff2)format("woff2"),url(../fonts/muli-latin-200.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:200;src:local("Muli Extra Light italic"),local("Muli-Extra Lightitalic"),url(../fonts/muli-latin-200italic.woff2)format("woff2"),url(../fonts/muli-latin-200italic.woff)format("woff")}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:300;src:local("Muli Light "),local("Muli-Light"),url(../fonts/muli-latin-300.woff2)format("woff2"),url(../fonts/muli-latin-300.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:300;src:local("Muli Light italic"),local("Muli-Lightitalic"),url(../fonts/muli-latin-300italic.woff2)format("woff2"),url(../fonts/muli-latin-300italic.woff)format("woff")}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:400;src:local("Muli Regular "),local("Muli-Regular"),url(../fonts/muli-latin-400.woff2)format("woff2"),url(../fonts/muli-latin-400.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:400;src:local("Muli Regular italic"),local("Muli-Regularitalic"),url(../fonts/muli-latin-400italic.woff2)format("woff2"),url(../fonts/muli-latin-400italic.woff)format("woff")}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:600;src:local("Muli SemiBold "),local("Muli-SemiBold"),url(../fonts/muli-latin-600.woff2)format("woff2"),url(../fonts/muli-latin-600.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:600;src:local("Muli SemiBold italic"),local("Muli-SemiBolditalic"),url(../fonts/muli-latin-600italic.woff2)format("woff2"),url(../fonts/muli-latin-600italic.woff)format("woff")}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:700;src:local("Muli Bold "),local("Muli-Bold"),url(../fonts/muli-latin-700.woff2)format("woff2"),url(../fonts/muli-latin-700.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:700;src:local("Muli Bold italic"),local("Muli-Bolditalic"),url(../fonts/muli-latin-700italic.woff2)format("woff2"),url(../fonts/muli-latin-700italic.woff)format("woff")}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:800;src:local("Muli ExtraBold "),local("Muli-ExtraBold"),url(../fonts/muli-latin-800.woff2)format("woff2"),url(../fonts/muli-latin-800.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:800;src:local("Muli ExtraBold italic"),local("Muli-ExtraBolditalic"),url(../fonts/muli-latin-800italic.woff2)format("woff2"),url(../fonts/muli-latin-800italic.woff)format("woff")}@font-face{font-family:muli;font-style:normal;font-display:swap;font-weight:900;src:local("Muli Black "),local("Muli-Black"),url(../fonts/muli-latin-900.woff2)format("woff2"),url(../fonts/muli-latin-900.woff)format("woff")}@font-face{font-family:muli;font-style:italic;font-display:swap;font-weight:900;src:local("Muli Black italic"),local("Muli-Blackitalic"),url(../fonts/muli-latin-900italic.woff2)format("woff2"),url(../fonts/muli-latin-900italic.woff)format("woff")}@font-face{font-family:source sans pro;src:url(../fonts/source-sans-pro/source-sans-pro-regular.eot);src:url(../fonts/source-sans-pro/source-sans-pro-regular.eot?#iefix)format("embedded-opentype"),url(../fonts/source-sans-pro/source-sans-pro-regular.woff)format("woff"),url(../fonts/source-sans-pro/source-sans-pro-regular.ttf)format("truetype");font-weight:400;font-style:normal}@font-face{font-family:source sans pro;src:url(../fonts/source-sans-pro/source-sans-pro-italic.eot);src:url(../fonts/source-sans-pro/source-sans-pro-italic.eot?#iefix)format("embedded-opentype"),url(../fonts/source-sans-pro/source-sans-pro-italic.woff)format("woff"),url(../fonts/source-sans-pro/source-sans-pro-italic.ttf)format("truetype");font-weight:400;font-style:italic}@font-face{font-family:source sans pro;src:url(../fonts/source-sans-pro/source-sans-pro-semibold.eot);src:url(../fonts/source-sans-pro/source-sans-pro-semibold.eot?#iefix)format("embedded-opentype"),url(../fonts/source-sans-pro/source-sans-pro-semibold.woff)format("woff"),url(../fonts/source-sans-pro/source-sans-pro-semibold.ttf)format("truetype");font-weight:600;font-style:normal}@font-face{font-family:source sans pro;src:url(../fonts/source-sans-pro/source-sans-pro-semibolditalic.eot);src:url(../fonts/source-sans-pro/source-sans-pro-semibolditalic.eot?#iefix)format("embedded-opentype"),url(../fonts/source-sans-pro/source-sans-pro-semibolditalic.woff)format("woff"),url(../fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf)format("truetype");font-weight:600;font-style:italic}@font-face{font-family:league gothic;src:url(../fonts/league-gothic/league-gothic.eot);src:url(../fonts/league-gothic/league-gothic.eot?#iefix)format("embedded-opentype"),url(../fonts/league-gothic/league-gothic.woff)format("woff"),url(../fonts/league-gothic/league-gothic.ttf)format("truetype");font-weight:400;font-style:normal}.clearfix::after{clear:both;content:'';display:table}.capitalize{text-transform:capitalize}.hide{display:none}.grow{-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.basicflex{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.basicflex-column{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.px{padding-left:1rem;padding-right:1rem}.py{padding-top:1rem;padding-bottom:1rem}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{font:125%/1.4 muli,sans-serif,muli,avenir,helvetica neue,helvetica,ubuntu,roboto,noto,segoe ui,arial,sans-serif}code,pre{font:125%/1.8 Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,lucida console,lucida sans typewriter,liberation mono,nimbus mono l,Monaco,Courier,monospace}.h1{font-size:4rem}.h2{font-size:3.5rem}.h3{font-size:3rem}.h4{font-size:2.5rem}.h5{font-size:2rem}.h6{font-size:1.5rem}.p1{font-size:1.2rem}.p2{font-size:1rem}.caption{font-size:.8rem}@-webkit-keyframes slide-in-down{0%{transform:translate(0,-12%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-moz-keyframes slide-in-down{0%{transform:translate(0,-12%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-ms-keyframes slide-in-down{0%{transform:translate(0,-12%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-o-keyframes slide-in-down{0%{transform:translate(0,-12%);opacity:0}100%{transform:translate(0,0);opacity:1}}@keyframes slide-in-down{0%{transform:translate(0,-12%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-webkit-keyframes slide-in-left{0%{transform:translate(-12%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-moz-keyframes slide-in-left{0%{transform:translate(-12%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-ms-keyframes slide-in-left{0%{transform:translate(-12%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-o-keyframes slide-in-left{0%{transform:translate(-12%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@keyframes slide-in-left{0%{transform:translate(-12%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-webkit-keyframes slide-in-left-little{0%{transform:translate(-1%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-moz-keyframes slide-in-left-little{0%{transform:translate(-1%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-ms-keyframes slide-in-left-little{0%{transform:translate(-1%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-o-keyframes slide-in-left-little{0%{transform:translate(-1%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@keyframes slide-in-left-little{0%{transform:translate(-1%,0);opacity:0}100%{transform:translate(0,0);opacity:1}}@-webkit-keyframes slide-in-down-little{0%{transform:translate(0,-3%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-moz-keyframes slide-in-down-little{0%{transform:translate(0,-3%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-ms-keyframes slide-in-down-little{0%{transform:translate(0,-3%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-o-keyframes slide-in-down-little{0%{transform:translate(0,-3%);opacity:0}100%{transform:translate(0,0);opacity:1}}@keyframes slide-in-down-little{0%{transform:translate(0,-3%);opacity:0}100%{transform:translate(0,0);opacity:1}}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@-moz-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@-ms-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@-o-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.navbar{margin:auto;width:inherit;max-width:inherit;height:50px;z-index:15;position:fixed;left:0;right:0;top:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;justify-content:space-between;-ms-flex-pack:space-between}.navbar[data-dir=rtl]{direction:rtl}.navbar[data-dir=ltr]{direction:ltr}@media only screen and (max-width:769px){.navbar[data-dir=rtl]{direction:ltr}}.theme__dark .navbar{border-bottom:1px solid #4e4e4e;background-color:#403e41}.theme__light .navbar{border-bottom:1px solid #e0e0e0;background-color:#eee}.theme__hacker .navbar{border-bottom:1px solid #424242;background-color:#252526}.theme__solarized .navbar{border-bottom:1px solid #eddc9f;background-color:#eee8d5}.theme__kimbie .navbar{border-bottom:1px solid #6e583b;background-color:#51412c}.navbar--hide{top:-50px}.navbar--show{top:0}.navbar__slide-down svg{margin:auto;display:block}.theme__dark .navbar__slide-down{background-color:#403e41!important}.theme__dark .navbar__slide-down:hover,.theme__dark .navbar__slide-down:active,.theme__dark .navbar__slide-down:focus{color:#ffd866}.theme__light .navbar__slide-down{background-color:#eee!important}.theme__light .navbar__slide-down:hover,.theme__light .navbar__slide-down:active,.theme__light .navbar__slide-down:focus{color:#607d8b}.theme__hacker .navbar__slide-down{background-color:#252526!important}.theme__hacker .navbar__slide-down:hover,.theme__hacker .navbar__slide-down:active,.theme__hacker .navbar__slide-down:focus{color:#1fff2a}.theme__solarized .navbar__slide-down{background-color:#eee8d5!important}.theme__solarized .navbar__slide-down:hover,.theme__solarized .navbar__slide-down:active,.theme__solarized .navbar__slide-down:focus{color:#b58900}.theme__kimbie .navbar__slide-down{background-color:#51412c!important}.theme__kimbie .navbar__slide-down:hover,.theme__kimbie .navbar__slide-down:active,.theme__kimbie .navbar__slide-down:focus{color:#f06431}@media only screen and (min-width:769px){.navbar__slide-down[data-ani=true]:nth-child(1){-webkit-animation:slide-in-down .25s .1s 1 ease both;-moz-animation:slide-in-down .25s .1s 1 ease both;-ms-animation:slide-in-down .25s .1s 1 ease both;-o-animation:slide-in-down .25s .1s 1 ease both;animation:slide-in-down .25s .1s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(2){-webkit-animation:slide-in-down .25s .2s 1 ease both;-moz-animation:slide-in-down .25s .2s 1 ease both;-ms-animation:slide-in-down .25s .2s 1 ease both;-o-animation:slide-in-down .25s .2s 1 ease both;animation:slide-in-down .25s .2s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(3){-webkit-animation:slide-in-down .25s .3s 1 ease both;-moz-animation:slide-in-down .25s .3s 1 ease both;-ms-animation:slide-in-down .25s .3s 1 ease both;-o-animation:slide-in-down .25s .3s 1 ease both;animation:slide-in-down .25s .3s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(4){-webkit-animation:slide-in-down .25s .4s 1 ease both;-moz-animation:slide-in-down .25s .4s 1 ease both;-ms-animation:slide-in-down .25s .4s 1 ease both;-o-animation:slide-in-down .25s .4s 1 ease both;animation:slide-in-down .25s .4s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(5){-webkit-animation:slide-in-down .25s .5s 1 ease both;-moz-animation:slide-in-down .25s .5s 1 ease both;-ms-animation:slide-in-down .25s .5s 1 ease both;-o-animation:slide-in-down .25s .5s 1 ease both;animation:slide-in-down .25s .5s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(6){-webkit-animation:slide-in-down .25s .6s 1 ease both;-moz-animation:slide-in-down .25s .6s 1 ease both;-ms-animation:slide-in-down .25s .6s 1 ease both;-o-animation:slide-in-down .25s .6s 1 ease both;animation:slide-in-down .25s .6s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(7){-webkit-animation:slide-in-down .25s .7s 1 ease both;-moz-animation:slide-in-down .25s .7s 1 ease both;-ms-animation:slide-in-down .25s .7s 1 ease both;-o-animation:slide-in-down .25s .7s 1 ease both;animation:slide-in-down .25s .7s 1 ease both}.navbar__slide-down[data-ani=true]:nth-child(8){-webkit-animation:slide-in-down .25s .8s 1 ease both;-moz-animation:slide-in-down .25s .8s 1 ease both;-ms-animation:slide-in-down .25s .8s 1 ease both;-o-animation:slide-in-down .25s .8s 1 ease both;animation:slide-in-down .25s .8s 1 ease both}}.navbar__brand{height:50px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-shrink:0;-moz-flex-shrink:0;-ms-flex-shrink:0;flex-shrink:0}.navbar__burger{display:none}.navbar__burger[data-ani=true]{-webkit-animation:slide-in-down .5s 0s 1 ease both;-moz-animation:slide-in-down .5s 0s 1 ease both;-ms-animation:slide-in-down .5s 0s 1 ease both;-o-animation:slide-in-down .5s 0s 1 ease both;animation:slide-in-down .5s 0s 1 ease both}@media only screen and (max-width:769px){.navbar__burger{cursor:pointer;margin-left:auto;height:50px;width:35px;position:absolute;right:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:flex-end}.theme__dark .navbar__burger{background:#403e41;border-bottom:1px solid #4e4e4e}.theme__light .navbar__burger{background:#eee;border-bottom:1px solid #e0e0e0}.theme__hacker .navbar__burger{background:#252526;border-bottom:1px solid #424242}.theme__solarized .navbar__burger{background:#eee8d5;border-bottom:1px solid #eddc9f}.theme__kimbie .navbar__burger{background:#51412c;border-bottom:1px solid #6e583b}.navbar__burger span{border-radius:1rem;display:block;height:2px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,transform;transition-timing-function:ease-out;z-index:15;width:16px}.theme__dark .navbar__burger span{background-color:#fcfcfa}.theme__light .navbar__burger span{background-color:#777}.theme__hacker .navbar__burger span{background-color:#dbdbdb}.theme__solarized .navbar__burger span{background-color:#586e75}.theme__kimbie .navbar__burger span{background-color:#d3af86}.navbar__burger span:nth-child(1){top:calc(50% - 6px)}.navbar__burger span:nth-child(2){top:calc(50% - 1px)}.navbar__burger span:nth-child(3){top:calc(50% + 4px)}.theme__dark .navbar__burger:hover span,.theme__dark .navbar__burger:active span,.theme__dark .navbar__burger:focus span{background-color:#ffd866}.theme__light .navbar__burger:hover span,.theme__light .navbar__burger:active span,.theme__light .navbar__burger:focus span{background-color:#607d8b}.theme__hacker .navbar__burger:hover span,.theme__hacker .navbar__burger:active span,.theme__hacker .navbar__burger:focus span{background-color:#1fff2a}.theme__solarized .navbar__burger:hover span,.theme__solarized .navbar__burger:active span,.theme__solarized .navbar__burger:focus span{background-color:#b58900}.theme__kimbie .navbar__burger:hover span,.theme__kimbie .navbar__burger:active span,.theme__kimbie .navbar__burger:focus span{background-color:#f06431}.navbar__burger.is-active{display:block}.navbar__burger.is-active span:nth-child(1){transform:translateY(5px)rotate(45deg)}.navbar__burger.is-active span:nth-child(2){opacity:0}.navbar__burger.is-active span:nth-child(3){transform:translateY(-5px)rotate(-45deg)}}.navbar__logo{width:100%;height:100%}.navbar__logo-link{width:40px;height:40px;padding:.1rem;margin:auto .25rem;-webkit-flex-shrink:0;-moz-flex-shrink:0;-ms-flex-shrink:0;flex-shrink:0;flex-shrink:0}.navbar__long-link{width:100%;height:100%;padding:.6rem .2rem;margin:auto .25rem;-webkit-flex-shrink:0;-moz-flex-shrink:0;-ms-flex-shrink:0;flex-shrink:0;flex-shrink:0}.navbar__title{height:50px;font-size:1.5rem;font-family:montserrat,sans-serif;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .navbar__title-link{color:#fcfcfa}.theme__dark .navbar__title-link:hover,.theme__dark .navbar__title-link:active,.theme__dark .navbar__title-link:focus{text-decoration:none;color:#fcfcfa}.theme__light .navbar__title-link{color:#555}.theme__light .navbar__title-link:hover,.theme__light .navbar__title-link:active,.theme__light .navbar__title-link:focus{text-decoration:none;color:#555}.theme__hacker .navbar__title-link{color:#e3cd26}.theme__hacker .navbar__title-link:hover,.theme__hacker .navbar__title-link:active,.theme__hacker .navbar__title-link:focus{text-decoration:none;color:#e3cd26}.theme__solarized .navbar__title-link{color:#586e75}.theme__solarized .navbar__title-link:hover,.theme__solarized .navbar__title-link:active,.theme__solarized .navbar__title-link:focus{text-decoration:none;color:#586e75}.theme__kimbie .navbar__title-link{color:#d3af86}.theme__kimbie .navbar__title-link:hover,.theme__kimbie .navbar__title-link:active,.theme__kimbie .navbar__title-link:focus{text-decoration:none;color:#d3af86}.navbar__menu{-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:flex-end;height:50px}@media only screen and (max-width:769px){.navbar__menu{display:none}}.navbar__menu-item{height:50px;padding:.5rem;font-size:1rem;font-family:montserrat,sans-serif;font-weight:700;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.theme__dark .navbar__menu-item{color:#fcfcfa;border-top:1px solid transparent;border-bottom:1px solid #4e4e4e;background-color:#403e41}.theme__dark .navbar__menu-item:hover,.theme__dark .navbar__menu-item:active,.theme__dark .navbar__menu-item:focus{color:#ffd866;text-decoration:none;border-bottom:1px solid #4e4e4e}@media only screen and (max-width:769px){.theme__dark .navbar__menu-item{border-bottom:none}}.theme__dark .navbar__menu-item.active{color:#ff6188!important}.theme__light .navbar__menu-item{color:#555;border-top:1px solid transparent;border-bottom:1px solid #e0e0e0;background-color:#eee}.theme__light .navbar__menu-item:hover,.theme__light .navbar__menu-item:active,.theme__light .navbar__menu-item:focus{color:#607d8b;text-decoration:none;border-bottom:1px solid #e0e0e0}@media only screen and (max-width:769px){.theme__light .navbar__menu-item{border-bottom:none}}.theme__light .navbar__menu-item.active{color:#6b8a99!important}.theme__hacker .navbar__menu-item{color:#e3cd26;border-top:1px solid transparent;border-bottom:1px solid #424242;background-color:#252526}.theme__hacker .navbar__menu-item:hover,.theme__hacker .navbar__menu-item:active,.theme__hacker .navbar__menu-item:focus{color:#1fff2a;text-decoration:none;border-bottom:1px solid #424242}@media only screen and (max-width:769px){.theme__hacker .navbar__menu-item{border-bottom:none}}.theme__hacker .navbar__menu-item.active{color:#f3ff6e!important}.theme__solarized .navbar__menu-item{color:#586e75;border-top:1px solid transparent;border-bottom:1px solid #eddc9f;background-color:#eee8d5}.theme__solarized .navbar__menu-item:hover,.theme__solarized .navbar__menu-item:active,.theme__solarized .navbar__menu-item:focus{color:#b58900;text-decoration:none;border-bottom:1px solid #eddc9f}@media only screen and (max-width:769px){.theme__solarized .navbar__menu-item{border-bottom:none}}.theme__solarized .navbar__menu-item.active{color:#cb4b16!important}.theme__kimbie .navbar__menu-item{color:#d3af86;border-top:1px solid transparent;border-bottom:1px solid #6e583b;background-color:#51412c}.theme__kimbie .navbar__menu-item:hover,.theme__kimbie .navbar__menu-item:active,.theme__kimbie .navbar__menu-item:focus{color:#f06431;text-decoration:none;border-bottom:1px solid #6e583b}@media only screen and (max-width:769px){.theme__kimbie .navbar__menu-item{border-bottom:none}}.theme__kimbie .navbar__menu-item.active{color:#889b4a!important}@media only screen and (max-width:769px){.navbar__menu-item{-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start;width:100%;padding:0 .75rem}}.navbar__dropdown{display:inline-block;height:50px}@media only screen and (max-width:769px){.navbar__dropdown{width:100%;height:auto}}.navbar__dropdown--content{position:absolute;display:none;width:inherit;z-index:14;border-bottom-left-radius:.15rem;border-bottom-right-radius:.15rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);-moz-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);box-shadow:0 1px 3px 0 rgba(0,0,0,.4)}.theme__dark .navbar__dropdown--content{border-top:4px solid #424242;background-color:#595b5c}.theme__light .navbar__dropdown--content{border-top:4px solid #e0e0e0;background-color:#fafafa}.theme__hacker .navbar__dropdown--content{border-top:4px solid #6b6b6b;background-color:#212421}.theme__solarized .navbar__dropdown--content{border-top:4px solid #e8b000;background-color:#fafafa}.theme__kimbie .navbar__dropdown--content{border-top:4px solid #d3af86;background-color:#6e583b}@media only screen and (max-width:769px){.navbar__dropdown--content{position:relative;display:block;box-shadow:none}.theme__dark .navbar__dropdown--content{border-top:none;background-color:#3a3a3a}.theme__light .navbar__dropdown--content{border-top:none;background-color:#f1f1f1}.theme__hacker .navbar__dropdown--content{border-top:none;background-color:#323232}.theme__solarized .navbar__dropdown--content{border-top:none;background-color:#eae3cc}.theme__kimbie .navbar__dropdown--content{border-top:none;background-color:#423523}}.navbar__dropdown--item{padding:.25rem .75rem;height:auto;margin:auto;min-width:40px;max-width:150px;text-decoration:none;display:block;font-size:1rem;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}.theme__dark .navbar__dropdown--item{color:#fcfcfa;background-color:#403e41}.theme__dark .navbar__dropdown--item:hover,.theme__dark .navbar__dropdown--item:active,.theme__dark .navbar__dropdown--item:focus{color:#ffd866;background-color:#4d4a4e;text-decoration:none}.theme__dark .navbar__dropdown--item:hover:last-child,.theme__dark .navbar__dropdown--item:active:last-child,.theme__dark .navbar__dropdown--item:focus:last-child{border-bottom-left-radius:.15rem;border-bottom-right-radius:.15rem}.theme__light .navbar__dropdown--item{color:#555;background-color:#eee}.theme__light .navbar__dropdown--item:hover,.theme__light .navbar__dropdown--item:active,.theme__light .navbar__dropdown--item:focus{color:#607d8b;background-color:#f6f6f6;text-decoration:none}.theme__light .navbar__dropdown--item:hover:last-child,.theme__light .navbar__dropdown--item:active:last-child,.theme__light .navbar__dropdown--item:focus:last-child{border-bottom-left-radius:.15rem;border-bottom-right-radius:.15rem}.theme__hacker .navbar__dropdown--item{color:#fcfcfa;background-color:#252526}.theme__hacker .navbar__dropdown--item:hover,.theme__hacker .navbar__dropdown--item:active,.theme__hacker .navbar__dropdown--item:focus{color:#e08c48;background-color:#464c46;text-decoration:none}.theme__hacker .navbar__dropdown--item:hover:last-child,.theme__hacker .navbar__dropdown--item:active:last-child,.theme__hacker .navbar__dropdown--item:focus:last-child{border-bottom-left-radius:.15rem;border-bottom-right-radius:.15rem}.theme__solarized .navbar__dropdown--item{color:#424242;background-color:#eee8d5}.theme__solarized .navbar__dropdown--item:hover,.theme__solarized .navbar__dropdown--item:active,.theme__solarized .navbar__dropdown--item:focus{color:#b58900;background-color:#e8e0c6;text-decoration:none}.theme__solarized .navbar__dropdown--item:hover:last-child,.theme__solarized .navbar__dropdown--item:active:last-child,.theme__solarized .navbar__dropdown--item:focus:last-child{border-bottom-left-radius:.15rem;border-bottom-right-radius:.15rem}.theme__kimbie .navbar__dropdown--item{color:#eee0d1;background-color:#51412c}.theme__kimbie .navbar__dropdown--item:hover,.theme__kimbie .navbar__dropdown--item:active,.theme__kimbie .navbar__dropdown--item:focus{color:#f06431;background-color:#6e583b;text-decoration:none}.theme__kimbie .navbar__dropdown--item:hover:last-child,.theme__kimbie .navbar__dropdown--item:active:last-child,.theme__kimbie .navbar__dropdown--item:focus:last-child{border-bottom-left-radius:.15rem;border-bottom-right-radius:.15rem}@media only screen and (max-width:769px){.navbar__dropdown--item{padding:0 2.5rem;min-width:100%;max-width:100%}}.navbar__dropdown:hover .navbar__dropdown--content{display:block}.theme{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:flex-end}.theme[data-ani=true]{-webkit-animation:slide-in-down .5s 0s 1 ease both;-moz-animation:slide-in-down .5s 0s 1 ease both;-ms-animation:slide-in-down .5s 0s 1 ease both;-o-animation:slide-in-down .5s 0s 1 ease both;animation:slide-in-down .5s 0s 1 ease both}@media only screen and (max-width:769px){.theme{display:none}}.theme .dropdown{height:50px!important;position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .theme .dropdown{color:#fcfcfa}.theme__dark .theme .dropdown:hover,.theme__dark .theme .dropdown:active,.theme__dark .theme .dropdown:focus{color:#ffd866;background-color:#403e41}.theme__light .theme .dropdown{color:#777}.theme__light .theme .dropdown:hover,.theme__light .theme .dropdown:active,.theme__light .theme .dropdown:focus{color:#607d8b;background-color:#eee}.theme__hacker .theme .dropdown{color:#dbdbdb}.theme__hacker .theme .dropdown:hover,.theme__hacker .theme .dropdown:active,.theme__hacker .theme .dropdown:focus{color:#1fff2a;background-color:#252526}.theme__solarized .theme .dropdown{color:#586e75}.theme__solarized .theme .dropdown:hover,.theme__solarized .theme .dropdown:active,.theme__solarized .theme .dropdown:focus{color:#b58900;background-color:#eee8d5}.theme__kimbie .theme .dropdown{color:#d3af86}.theme__kimbie .theme .dropdown:hover,.theme__kimbie .theme .dropdown:active,.theme__kimbie .theme .dropdown:focus{color:#f06431;background-color:#51412c}.theme .dropdown-trigger{padding:.5rem;cursor:pointer;border:none;outline:none;width:50px;height:48px}.theme__dark .theme .dropdown-trigger{color:#fcfcfa}.theme__dark .theme .dropdown-trigger:hover,.theme__dark .theme .dropdown-trigger:active,.theme__dark .theme .dropdown-trigger:focus{color:#ffd866}.theme__light .theme .dropdown-trigger{color:#777}.theme__light .theme .dropdown-trigger:hover,.theme__light .theme .dropdown-trigger:active,.theme__light .theme .dropdown-trigger:focus{color:#607d8b}.theme__hacker .theme .dropdown-trigger{color:#dbdbdb}.theme__hacker .theme .dropdown-trigger:hover,.theme__hacker .theme .dropdown-trigger:active,.theme__hacker .theme .dropdown-trigger:focus{color:#1fff2a}.theme__solarized .theme .dropdown-trigger{color:#586e75}.theme__solarized .theme .dropdown-trigger:hover,.theme__solarized .theme .dropdown-trigger:active,.theme__solarized .theme .dropdown-trigger:focus{color:#b58900}.theme__kimbie .theme .dropdown-trigger{color:#d3af86}.theme__kimbie .theme .dropdown-trigger:hover,.theme__kimbie .theme .dropdown-trigger:active,.theme__kimbie .theme .dropdown-trigger:focus{color:#f06431}@media only screen and (max-width:769px){.theme .dropdown-trigger{padding:.25rem;width:35px}}.theme .dropdown-content{position:absolute;top:100%;right:0;display:none;height:auto;z-index:14;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);-moz-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);box-shadow:0 1px 3px 0 rgba(0,0,0,.4)}.theme .dropdown-content a{font-size:.9rem}.theme__dark .theme .dropdown-content{border-top:4px solid #424242;background-color:#595b5c}.theme__light .theme .dropdown-content{border-top:4px solid #e0e0e0;background-color:#fafafa}.theme__hacker .theme .dropdown-content{border-top:4px solid #6b6b6b;background-color:#212421}.theme__solarized .theme .dropdown-content{border-top:4px solid #e8b000;background-color:#fafafa}.theme__kimbie .theme .dropdown-content{border-top:4px solid #d3af86;background-color:#6e583b}.theme__dark .theme .dropdown-content .is-active{background-color:#424242}.theme__light .theme .dropdown-content .is-active{background-color:#e0e0e0}.theme__hacker .theme .dropdown-content .is-active{background-color:#323732}.theme__solarized .theme .dropdown-content .is-active{background-color:#fbf1d1}.theme__kimbie .theme .dropdown-content .is-active{background-color:#5e452b}.theme .dropdown-item{padding:.25rem .75rem;height:100%;text-decoration:none;display:block;font-size:1rem;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.theme__dark .theme .dropdown-item{color:#fcfcfa}.theme__dark .theme .dropdown-item:hover,.theme__dark .theme .dropdown-item:active,.theme__dark .theme .dropdown-item:focus{color:#fcfcfa;background-color:#727072;text-decoration:none}.theme__dark .theme .dropdown-item:hover:last-child,.theme__dark .theme .dropdown-item:active:last-child,.theme__dark .theme .dropdown-item:focus:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.theme__light .theme .dropdown-item{color:#555}.theme__light .theme .dropdown-item:hover,.theme__light .theme .dropdown-item:active,.theme__light .theme .dropdown-item:focus{color:#fcfcfa;background-color:#bdbdbd;text-decoration:none}.theme__light .theme .dropdown-item:hover:last-child,.theme__light .theme .dropdown-item:active:last-child,.theme__light .theme .dropdown-item:focus:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.theme__hacker .theme .dropdown-item{color:#fcfcfa}.theme__hacker .theme .dropdown-item:hover,.theme__hacker .theme .dropdown-item:active,.theme__hacker .theme .dropdown-item:focus{color:#e08c48;background-color:#464c46;text-decoration:none}.theme__hacker .theme .dropdown-item:hover:last-child,.theme__hacker .theme .dropdown-item:active:last-child,.theme__hacker .theme .dropdown-item:focus:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.theme__solarized .theme .dropdown-item{color:#424242}.theme__solarized .theme .dropdown-item:hover,.theme__solarized .theme .dropdown-item:active,.theme__solarized .theme .dropdown-item:focus{color:#b58900;background-color:#f9eaba;text-decoration:none}.theme__solarized .theme .dropdown-item:hover:last-child,.theme__solarized .theme .dropdown-item:active:last-child,.theme__solarized .theme .dropdown-item:focus:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.theme__kimbie .theme .dropdown-item{color:#eee0d1}.theme__kimbie .theme .dropdown-item:hover,.theme__kimbie .theme .dropdown-item:active,.theme__kimbie .theme .dropdown-item:focus{color:#f06431;background-color:#5e452b;text-decoration:none}.theme__kimbie .theme .dropdown-item:hover:last-child,.theme__kimbie .theme .dropdown-item:active:last-child,.theme__kimbie .theme .dropdown-item:focus:last-child{border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem}.theme .dropdown:hover .dropdown-content{display:block}.theme-mobile{display:none;outline:none;position:absolute;top:0;right:70px;width:35px;height:50px;cursor:pointer;z-index:16}.theme-mobile[data-ani=true]{-webkit-animation:slide-in-down .5s .4s 1 ease both;-moz-animation:slide-in-down .5s .4s 1 ease both;-ms-animation:slide-in-down .5s .4s 1 ease both;-o-animation:slide-in-down .5s .4s 1 ease both;animation:slide-in-down .5s .4s 1 ease both}@media only screen and (max-width:769px){.theme-mobile{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}}.theme-mobile .dropdown:hover .dropdown-content{display:block}.navbarm{padding:0 .75rem;height:100%;position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.navbarm__menu{height:100%;padding:0 .75rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.theme__dark .navbarm__menu--term[data-index="0"]{border-top:1px solid rgba(66,66,66,.45)}.theme__light .navbarm__menu--term[data-index="0"]{border-top:1px solid rgba(207,216,220,.6)}.theme__hacker .navbarm__menu--term[data-index="0"]{border-top:1px solid rgba(161,173,100,.2)}.theme__solarized .navbarm__menu--term[data-index="0"]{border-top:1px solid rgba(133,153,0,.2)}.theme__kimbie .navbarm__menu--term[data-index="0"]{border-top:1px solid rgba(110,88,59,.45)}.navbarm__menu--item{height:50px}.navbarm__menu--item>a{height:100%;font-family:montserrat,sans-serif;font-size:1rem;font-weight:700;color:inherit;text-decoration:none!important;padding:0 1rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}.navbarm__menu--item svg{margin:auto .25rem}.theme__dark .navbarm__menu--item{color:#fcfcfa}.theme__dark .navbarm__menu--item.active{font-weight:700;color:#ff6188}.theme__dark .navbarm__menu--item:hover,.theme__dark .navbarm__menu--item:active,.theme__dark .navbarm__menu--item:focus{background-color:#4d4a4e}.theme__light .navbarm__menu--item{color:#424242}.theme__light .navbarm__menu--item.active{font-weight:700;color:#6b8a99}.theme__light .navbarm__menu--item:hover,.theme__light .navbarm__menu--item:active,.theme__light .navbarm__menu--item:focus{background-color:#f6f6f6}.theme__hacker .navbarm__menu--item{color:#1fff2a}.theme__hacker .navbarm__menu--item.active{font-weight:700;color:#f3ff6e}.theme__hacker .navbarm__menu--item:hover,.theme__hacker .navbarm__menu--item:active,.theme__hacker .navbarm__menu--item:focus{background-color:#464c46}.theme__solarized .navbarm__menu--item{color:#586e75}.theme__solarized .navbarm__menu--item.active{font-weight:700;color:#cb4b16}.theme__solarized .navbarm__menu--item:hover,.theme__solarized .navbarm__menu--item:active,.theme__solarized .navbarm__menu--item:focus{background-color:#e8e0c6}.theme__kimbie .navbarm__menu--item{color:#e3b583}.theme__kimbie .navbarm__menu--item.active{font-weight:700;color:#889b4a}.theme__kimbie .navbarm__menu--item:hover,.theme__kimbie .navbarm__menu--item:active,.theme__kimbie .navbarm__menu--item:focus{background-color:#6e583b}.navbarm__menu--subitem{height:30px;padding:0 2.5rem}.navbarm__menu--subitem>a{font-size:.9rem}.navbarm__collapse{width:100%;position:absolute;top:50px;left:0;max-height:0;overflow:hidden;-webkit-transition:all .15s ease-out;-moz-transition:all .15s ease-out;-ms-transition:all .15s ease-out;-o-transition:all .15s ease-out;transition:all .15s ease-out}.theme__dark .navbarm__collapse{background-color:#403e41}.theme__dark .navbarm__collapse[data-open=true]{border-bottom:2px solid #4e4e4e}.theme__dark .navbarm__collapse[data-open=false]{border-bottom:none}.theme__light .navbarm__collapse{background-color:#eee}.theme__light .navbarm__collapse[data-open=true]{border-bottom:2px solid #e0e0e0}.theme__light .navbarm__collapse[data-open=false]{border-bottom:none}.theme__hacker .navbarm__collapse{background-color:#252526}.theme__hacker .navbarm__collapse[data-open=true]{border-bottom:2px solid #424242}.theme__hacker .navbarm__collapse[data-open=false]{border-bottom:none}.theme__solarized .navbarm__collapse{background-color:#eee8d5}.theme__solarized .navbarm__collapse[data-open=true]{border-bottom:2px solid #eddc9f}.theme__solarized .navbarm__collapse[data-open=false]{border-bottom:none}.theme__kimbie .navbarm__collapse{background-color:#51412c}.theme__kimbie .navbarm__collapse[data-open=true]{border-bottom:2px solid #6e583b}.theme__kimbie .navbarm__collapse[data-open=false]{border-bottom:none}.wrapper{display:grid;width:100%;min-height:100vh;max-width:960px;grid-template-columns:minmax(350px,5fr)minmax(250px,2fr);grid-template-rows:50px auto 1fr auto;grid-column-gap:32px;grid-row-gap:0}.header-main{grid-area:2/1/3/2}.header-side{grid-area:2/2/3/3}.header{grid-area:2/1/3/3}.main-main{grid-area:3/1/4/2}.main-side{grid-area:3/2/4/3}.main{grid-area:3/1/4/3}.footer-main{grid-area:4/1/5/2}.footer-side{grid-area:4/2/5/3}.footer{grid-area:4/1/5/3}.navbar-main{grid-area:1/1/2/2}.navbar-side{grid-area:1/2/2/3}.navbar{grid-area:1/1/2/3}.inner{display:grid;grid-template-columns:266px 1fr 1fr;grid-template-rows:1fr;grid-column-gap:16px;grid-row-gap:0}.inner[data-sidebar-position=left]{grid-template-columns:266px 1fr 1fr}.inner[data-sidebar-position=right]{grid-template-columns:1fr 1fr 266px}.l{grid-area:1/1/2/2}.m{grid-area:1/2/2/3}.r{grid-area:1/3/2/4}.lm{grid-area:1/1/2/3}.mr{grid-area:1/2/2/4}.lmr{grid-area:1/1/2/4}.header .title{font-family:montserrat,sans-serif;font-weight:900}.site-header{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.site-header[data-ani=true]{-webkit-animation:fade-in .15s .1s 1 ease-in both;-moz-animation:fade-in .15s .1s 1 ease-in both;-ms-animation:fade-in .15s .1s 1 ease-in both;-o-animation:fade-in .15s .1s 1 ease-in both;animation:fade-in .15s .1s 1 ease-in both}.site-header__title{line-height:1.1;font-weight:700;font-family:montserrat,sans-serif}.theme__dark .site-header__title--shadow{color:#ddd;text-shadow:1.2px 1.2px 0 #ddd,2.4px 2.4px 0 #4a484b,3.6px 3.6px 0 #555256,4.8px 4.8px 0 #5f5c60}.theme__light .site-header__title--shadow{color:#607d8b;text-shadow:1.2px 1.2px 0 #607d8b,2.4px 2.4px 0 #4c4c4c,3.6px 3.6px 0 #565656,4.8px 4.8px 0 #616161}.theme__hacker .site-header__title--shadow{color:#c7ba00;text-shadow:1.2px 1.2px 0 #c7ba00,2.4px 2.4px 0 #2f2f30,3.6px 3.6px 0 #39393b,4.8px 4.8px 0 #434345}.theme__solarized .site-header__title--shadow{color:#cb4b16;text-shadow:1.2px 1.2px 0 #cb4b16,2.4px 2.4px 0 #4d6570,3.6px 3.6px 0 #56707c,4.8px 4.8px 0 #5e7b88}.theme__kimbie .site-header__title--shadow{color:#889b4a;text-shadow:1.2px 1.2px 0 #889b4a,2.4px 2.4px 0 #453217,3.6px 3.6px 0 #553d1c,4.8px 4.8px 0 #644821}.site-header__subtitle{line-height:1.2}.site-header__subtitle[data-cursive=true]{font-family:courgette,cursive}.site-header__align-left{-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}.site-header__align-center{-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.site-header__align-right{-webkit-align-items:flex-end;-moz-align-items:flex-end;-ms-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end}#container{position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.theme__dark #container{color:#fcfcfa;background-color:#212121}.theme__dark #container hr{border-color:#595b5c}.theme__light #container{color:#424242;background-color:#e0e0e0}.theme__light #container hr{border-color:#ccc}.theme__hacker #container{color:#1fff2a;background-color:#111}.theme__hacker #container hr{border-color:#6b6b6b}.theme__solarized #container{color:#586e75;background-color:#ddd6c7}.theme__solarized #container hr{border-color:#ffb300}.theme__kimbie #container{color:#e3b583;background-color:#362712}.theme__kimbie #container hr{border-color:#7f5d38}html{overflow-x:hidden}.footer{padding:0 .5rem;position:relative}.theme__dark .footer{color:#bdbdbd;background-color:#403e41}.theme__light .footer{color:#424242;background-color:#eee}.theme__hacker .footer{color:#a1ad64;background-color:#252526}.theme__solarized .footer{color:#424242;background-color:#eee8d5}.theme__kimbie .footer{color:#d3af86;background-color:#423523}.footer__social{padding:.5rem 0;position:-webkit-sticky;position:sticky;bottom:70px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.footer__poweredby{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:.5rem 0}.footer__poweredby p{padding:.125rem}.footer__copyright--img{margin-bottom:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.footer__link{font-size:.8rem;margin:.25rem .5rem 0}.footer .dropdown{position:absolute;left:.5rem;bottom:.5rem;width:40px;height:40px;border-radius:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .footer .dropdown{color:#bdbdbd;background-color:#403e41}.theme__dark .footer .dropdown:hover,.theme__dark .footer .dropdown:active,.theme__dark .footer .dropdown:focus{color:#82aaff;background-color:#4d4a4e}.theme__light .footer .dropdown{color:#727072;background-color:#eee}.theme__light .footer .dropdown:hover,.theme__light .footer .dropdown:active,.theme__light .footer .dropdown:focus{color:#607d8b;background-color:#d5d5d5}.theme__hacker .footer .dropdown{color:#9e9e9e;background-color:#252526}.theme__hacker .footer .dropdown:hover,.theme__hacker .footer .dropdown:active,.theme__hacker .footer .dropdown:focus{color:#e3cd26;background-color:#323233}.theme__solarized .footer .dropdown{color:#b58900;background-color:#eee8d5}.theme__solarized .footer .dropdown:hover,.theme__solarized .footer .dropdown:active,.theme__solarized .footer .dropdown:focus{color:#cb4b16;background-color:#e7dec3}.theme__kimbie .footer .dropdown{color:#d3af86;background-color:#423523}.theme__kimbie .footer .dropdown:hover,.theme__kimbie .footer .dropdown:active,.theme__kimbie .footer .dropdown:focus{color:#f06431;background-color:#5e452b}.footer .dropdown-trigger{outline:none;border-radius:.25rem;cursor:pointer;border:none;width:100%;height:100%}.theme__dark .footer .dropdown-trigger{color:#bdbdbd;background-color:#403e41}.theme__dark .footer .dropdown-trigger:hover,.theme__dark .footer .dropdown-trigger:active,.theme__dark .footer .dropdown-trigger:focus{color:#82aaff;background-color:#4d4a4e}.theme__light .footer .dropdown-trigger{color:#727072;background-color:#eee}.theme__light .footer .dropdown-trigger:hover,.theme__light .footer .dropdown-trigger:active,.theme__light .footer .dropdown-trigger:focus{color:#607d8b;background-color:#d5d5d5}.theme__hacker .footer .dropdown-trigger{color:#9e9e9e;background-color:#252526}.theme__hacker .footer .dropdown-trigger:hover,.theme__hacker .footer .dropdown-trigger:active,.theme__hacker .footer .dropdown-trigger:focus{color:#e3cd26;background-color:#323233}.theme__solarized .footer .dropdown-trigger{color:#b58900;background-color:#eee8d5}.theme__solarized .footer .dropdown-trigger:hover,.theme__solarized .footer .dropdown-trigger:active,.theme__solarized .footer .dropdown-trigger:focus{color:#cb4b16;background-color:#e7dec3}.theme__kimbie .footer .dropdown-trigger{color:#d3af86;background-color:#423523}.theme__kimbie .footer .dropdown-trigger:hover,.theme__kimbie .footer .dropdown-trigger:active,.theme__kimbie .footer .dropdown-trigger:focus{color:#f06431;background-color:#5e452b}.footer .dropdown-content{position:absolute;bottom:100%;left:0;display:none;height:auto;z-index:14;border-top-left-radius:.15rem;border-top-right-radius:.15rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);-moz-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);box-shadow:0 1px 3px 0 rgba(0,0,0,.4)}.footer .dropdown-content a{font-size:.9rem}.theme__dark .footer .dropdown-content{border-bottom:4px solid #424242;background-color:#595b5c}.theme__light .footer .dropdown-content{border-bottom:4px solid #e0e0e0;background-color:#fafafa}.theme__hacker .footer .dropdown-content{border-bottom:4px solid #6b6b6b;background-color:#212421}.theme__solarized .footer .dropdown-content{border-bottom:4px solid #e8b000;background-color:#fafafa}.theme__kimbie .footer .dropdown-content{border-bottom:4px solid #d3af86;background-color:#6e583b}.theme__dark .footer .dropdown-content .is-active{background-color:#424242}.theme__light .footer .dropdown-content .is-active{background-color:#e0e0e0}.theme__hacker .footer .dropdown-content .is-active{background-color:#323732}.theme__solarized .footer .dropdown-content .is-active{background-color:#fbf1d1}.theme__kimbie .footer .dropdown-content .is-active{background-color:#5e452b}.footer .dropdown-item{padding:.25rem .75rem;height:100%;min-width:40px;max-width:150px;text-decoration:none;display:block;font-size:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}.theme__dark .footer .dropdown-item{color:#fcfcfa}.theme__dark .footer .dropdown-item:hover,.theme__dark .footer .dropdown-item:active,.theme__dark .footer .dropdown-item:focus{color:#fcfcfa;background-color:#727072;text-decoration:none}.theme__dark .footer .dropdown-item:hover:first-child,.theme__dark .footer .dropdown-item:active:first-child,.theme__dark .footer .dropdown-item:focus:first-child{border-top-left-radius:.15rem;border-top-right-radius:.15rem}.theme__light .footer .dropdown-item{color:#555}.theme__light .footer .dropdown-item:hover,.theme__light .footer .dropdown-item:active,.theme__light .footer .dropdown-item:focus{color:#fcfcfa;background-color:#bdbdbd;text-decoration:none}.theme__light .footer .dropdown-item:hover:first-child,.theme__light .footer .dropdown-item:active:first-child,.theme__light .footer .dropdown-item:focus:first-child{border-top-left-radius:.15rem;border-top-right-radius:.15rem}.theme__hacker .footer .dropdown-item{color:#fcfcfa}.theme__hacker .footer .dropdown-item:hover,.theme__hacker .footer .dropdown-item:active,.theme__hacker .footer .dropdown-item:focus{color:#e08c48;background-color:#464c46;text-decoration:none}.theme__hacker .footer .dropdown-item:hover:first-child,.theme__hacker .footer .dropdown-item:active:first-child,.theme__hacker .footer .dropdown-item:focus:first-child{border-top-left-radius:.15rem;border-top-right-radius:.15rem}.theme__solarized .footer .dropdown-item{color:#424242}.theme__solarized .footer .dropdown-item:hover,.theme__solarized .footer .dropdown-item:active,.theme__solarized .footer .dropdown-item:focus{color:#b58900;background-color:#f9eaba;text-decoration:none}.theme__solarized .footer .dropdown-item:hover:first-child,.theme__solarized .footer .dropdown-item:active:first-child,.theme__solarized .footer .dropdown-item:focus:first-child{border-top-left-radius:.15rem;border-top-right-radius:.15rem}.theme__kimbie .footer .dropdown-item{color:#eee0d1}.theme__kimbie .footer .dropdown-item:hover,.theme__kimbie .footer .dropdown-item:active,.theme__kimbie .footer .dropdown-item:focus{color:#f06431;background-color:#5e452b;text-decoration:none}.theme__kimbie .footer .dropdown-item:hover:first-child,.theme__kimbie .footer .dropdown-item:active:first-child,.theme__kimbie .footer .dropdown-item:focus:first-child{border-top-left-radius:.15rem;border-top-right-radius:.15rem}.footer .select-theme__label{color:inherit;text-transform:capitalize}.footer .select-theme__item{text-transform:capitalize}.footer .select-lang__label{color:inherit;text-transform:capitalize}.footer .social{margin:.25rem}.theme__dark .footer .social a{text-decoration:none;color:#bdbdbd}.theme__dark .footer .social a:hover{color:#f0f0f0;transition:color .2s ease}.theme__light .footer .social a{text-decoration:none;color:#777}.theme__light .footer .social a:hover{color:#444;transition:color .2s ease}.theme__hacker .footer .social a{text-decoration:none;color:#9e9e9e}.theme__hacker .footer .social a:hover{color:#d1d1d1;transition:color .2s ease}.theme__solarized .footer .social a{text-decoration:none;color:#637c84}.theme__solarized .footer .social a:hover{color:#4d6066;transition:color .2s ease}.theme__kimbie .footer .social a{text-decoration:none;color:#ccc}.theme__kimbie .footer .social a:hover{color:#fff;transition:color .2s ease}.footer .dropdown:hover .dropdown-content{display:block}.theme__dark .footer hr{border-top:1px solid #595b5c!important}.theme__light .footer hr{border-top:1px solid #ccc!important}.theme__hacker .footer hr{border-top:1px solid #6b6b6b!important}.theme__solarized .footer hr{border-top:1px solid #ffb300!important}.theme__kimbie .footer hr{border-top:1px solid #7f5d38!important}.sidebar{margin-top:1rem}.sidebar-recent{padding:.25rem}.sidebar-recent__title{font-family:montserrat,sans-serif;font-weight:700;font-size:.95rem}.theme__dark .sidebar-recent__title{color:#aed581}.theme__dark .sidebar-recent__title:hover{color:#ff6188}.theme__light .sidebar-recent__title{color:#607d8b}.theme__light .sidebar-recent__title:hover{color:#26a69a}.theme__hacker .sidebar-recent__title{color:#e3cd26}.theme__hacker .sidebar-recent__title:hover{color:#c7ba00}.theme__solarized .sidebar-recent__title{color:#2aa198}.theme__solarized .sidebar-recent__title:hover{color:#268bd2}.theme__kimbie .sidebar-recent__title{color:#f06431}.theme__kimbie .sidebar-recent__title:hover{color:#f06431}.sidebar-recent__ul{margin-left:.25rem}.sidebar-recent__ul li{text-indent:-.4em;padding-left:.5em}.sidebar-recent__ul li::before{padding-right:.125rem;font-size:1rem;display:inline-block;content:"\2022"}.sidebar-recent__a{font-family:montserrat,sans-serif;font-size:.95rem}.theme__dark .sidebar-recent__a{color:#fcfcfa}.theme__light .sidebar-recent__a{color:#424242}.theme__hacker .sidebar-recent__a{color:#a1ad64}.theme__solarized .sidebar-recent__a{color:#b58900}.theme__kimbie .sidebar-recent__a{color:#a57a4c}.sidebar-hr{margin:1.5rem 0}.sidebar__menu{margin-top:50px;padding:0 1rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}li.sidebar-recent{text-indent:-.4em;padding-left:.5em}li.sidebar-recent::before{padding-right:.125rem;font-size:1rem;display:inline-block;content:"\2022"}.alert{padding:.75rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.125rem}.theme__dark .alert-info{background-color:rgba(215,238,249,.4);color:#fcfcfa}.theme__dark .alert-info[data-dir=rtl]{border-right:5px solid #bbdefb}.theme__dark .alert-info[data-dir=ltr]{border-left:5px solid #bbdefb}.theme__dark .alert-success{background-color:rgba(217,239,214,.4);color:#fcfcfa}.theme__dark .alert-success[data-dir=rtl]{border-right:5px solid #c8e6c9}.theme__dark .alert-success[data-dir=ltr]{border-left:5px solid #c8e6c9}.theme__dark .alert-warning{background-color:rgba(255,249,196,.4);color:#fcfcfa}.theme__dark .alert-warning[data-dir=rtl]{border-right:5px solid #ffeb3b}.theme__dark .alert-warning[data-dir=ltr]{border-left:5px solid #ffeb3b}.theme__dark .alert-danger{background-color:rgba(245,221,221,.4);color:#fcfcfa}.theme__dark .alert-danger[data-dir=rtl]{border-right:5px solid #ffcdd2}.theme__dark .alert-danger[data-dir=ltr]{border-left:5px solid #ffcdd2}.theme__light .alert-info{background-color:rgba(215,238,249,.4);color:#555}.theme__light .alert-info[data-dir=rtl]{border-right:5px solid #bbdefb}.theme__light .alert-info[data-dir=ltr]{border-left:5px solid #bbdefb}.theme__light .alert-success{background-color:rgba(217,239,214,.4);color:#555}.theme__light .alert-success[data-dir=rtl]{border-right:5px solid #c8e6c9}.theme__light .alert-success[data-dir=ltr]{border-left:5px solid #c8e6c9}.theme__light .alert-warning{background-color:rgba(255,249,196,.4);color:#555}.theme__light .alert-warning[data-dir=rtl]{border-right:5px solid #ffeb3b}.theme__light .alert-warning[data-dir=ltr]{border-left:5px solid #ffeb3b}.theme__light .alert-danger{background-color:rgba(245,221,221,.4);color:#555}.theme__light .alert-danger[data-dir=rtl]{border-right:5px solid #ffcdd2}.theme__light .alert-danger[data-dir=ltr]{border-left:5px solid #ffcdd2}.theme__hacker .alert-info{background-color:rgba(215,238,249,.4);color:#fcfcfa}.theme__hacker .alert-info[data-dir=rtl]{border-right:5px solid #bbdefb}.theme__hacker .alert-info[data-dir=ltr]{border-left:5px solid #bbdefb}.theme__hacker .alert-success{background-color:rgba(217,239,214,.4);color:#fcfcfa}.theme__hacker .alert-success[data-dir=rtl]{border-right:5px solid #c8e6c9}.theme__hacker .alert-success[data-dir=ltr]{border-left:5px solid #c8e6c9}.theme__hacker .alert-warning{background-color:rgba(255,249,196,.4);color:#fcfcfa}.theme__hacker .alert-warning[data-dir=rtl]{border-right:5px solid #ffeb3b}.theme__hacker .alert-warning[data-dir=ltr]{border-left:5px solid #ffeb3b}.theme__hacker .alert-danger{background-color:rgba(245,221,221,.4);color:#fcfcfa}.theme__hacker .alert-danger[data-dir=rtl]{border-right:5px solid #ffcdd2}.theme__hacker .alert-danger[data-dir=ltr]{border-left:5px solid #ffcdd2}.theme__solarized .alert-info{background-color:rgba(215,238,249,.4);color:#424242}.theme__solarized .alert-info[data-dir=rtl]{border-right:5px solid #bbdefb}.theme__solarized .alert-info[data-dir=ltr]{border-left:5px solid #bbdefb}.theme__solarized .alert-success{background-color:rgba(217,239,214,.4);color:#424242}.theme__solarized .alert-success[data-dir=rtl]{border-right:5px solid #c8e6c9}.theme__solarized .alert-success[data-dir=ltr]{border-left:5px solid #c8e6c9}.theme__solarized .alert-warning{background-color:rgba(255,249,196,.4);color:#424242}.theme__solarized .alert-warning[data-dir=rtl]{border-right:5px solid #ffeb3b}.theme__solarized .alert-warning[data-dir=ltr]{border-left:5px solid #ffeb3b}.theme__solarized .alert-danger{background-color:rgba(245,221,221,.4);color:#424242}.theme__solarized .alert-danger[data-dir=rtl]{border-right:5px solid #ffcdd2}.theme__solarized .alert-danger[data-dir=ltr]{border-left:5px solid #ffcdd2}.theme__kimbie .alert-info{background-color:rgba(215,238,249,.4);color:#eee0d1}.theme__kimbie .alert-info[data-dir=rtl]{border-right:5px solid #bbdefb}.theme__kimbie .alert-info[data-dir=ltr]{border-left:5px solid #bbdefb}.theme__kimbie .alert-success{background-color:rgba(217,239,214,.4);color:#eee0d1}.theme__kimbie .alert-success[data-dir=rtl]{border-right:5px solid #c8e6c9}.theme__kimbie .alert-success[data-dir=ltr]{border-left:5px solid #c8e6c9}.theme__kimbie .alert-warning{background-color:rgba(255,249,196,.4);color:#eee0d1}.theme__kimbie .alert-warning[data-dir=rtl]{border-right:5px solid #ffeb3b}.theme__kimbie .alert-warning[data-dir=ltr]{border-left:5px solid #ffeb3b}.theme__kimbie .alert-danger{background-color:rgba(245,221,221,.4);color:#eee0d1}.theme__kimbie .alert-danger[data-dir=rtl]{border-right:5px solid #ffcdd2}.theme__kimbie .alert-danger[data-dir=ltr]{border-left:5px solid #ffcdd2}.bio{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%;max-width:928px;font-family:montserrat,sans-serif}.theme__dark .bio{color:#eee}.theme__light .bio{color:#344952}.theme__hacker .bio{color:#d1d1d1}.theme__solarized .bio{color:#344952}.theme__kimbie .bio{color:#d3af86}.bio__photo{border-radius:.25rem;width:100%;max-width:250px;height:auto;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.25);-moz-box-shadow:0 2px 4px 0 rgba(0,0,0,.25);box-shadow:0 2px 4px 0 rgba(0,0,0,.25)}.bio__photo[data-ani=true]{-webkit-animation:slide-in-down-little .2s .6s 1 ease-in both;-moz-animation:slide-in-down-little .2s .6s 1 ease-in both;-ms-animation:slide-in-down-little .2s .6s 1 ease-in both;-o-animation:slide-in-down-little .2s .6s 1 ease-in both;animation:slide-in-down-little .2s .6s 1 ease-in both}.bio__photo-wrapper{width:90%;height:100%;border-radius:.25rem;margin:1rem auto;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.bio__name{font-weight:700;letter-spacing:1px;font-family:inherit;font-size:26px;margin-top:.8rem}.bio__desc{margin:.5rem 0;font-size:14px}.bio__info{font-size:14px;margin:.1rem 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.bio[data-dir=ltr] .bio__info--icon{margin-right:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .bio[data-dir=ltr] .bio__info--icon{color:#bdbdbd}.theme__light .bio[data-dir=ltr] .bio__info--icon{color:#777}.theme__hacker .bio[data-dir=ltr] .bio__info--icon{color:#9e9e9e}.theme__solarized .bio[data-dir=ltr] .bio__info--icon{color:#637c84}.theme__kimbie .bio[data-dir=ltr] .bio__info--icon{color:#ccc}.bio[data-dir=ltr] .bio__info a{padding-right:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px}.bio[data-dir=rtl] .bio__info--icon{margin-left:.25rem!important;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .bio[data-dir=rtl] .bio__info--icon{color:#bdbdbd}.theme__light .bio[data-dir=rtl] .bio__info--icon{color:#777}.theme__hacker .bio[data-dir=rtl] .bio__info--icon{color:#9e9e9e}.theme__solarized .bio[data-dir=rtl] .bio__info--icon{color:#637c84}.theme__kimbie .bio[data-dir=rtl] .bio__info--icon{color:#ccc}.bio[data-dir=rtl] .bio__info a{padding-left:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:250px}.bio__social{width:100%;margin-top:.5rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.bio__social a{text-decoration:none!important;padding:.5rem;border-radius:.125rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}.theme__dark .bio__social a{color:#bdbdbd}.theme__dark .bio__social a:hover,.theme__dark .bio__social a:active,.theme__dark .bio__social a:focus{color:#f0f0f0}.theme__light .bio__social a{color:#777}.theme__light .bio__social a:hover,.theme__light .bio__social a:active,.theme__light .bio__social a:focus{color:#444}.theme__hacker .bio__social a{color:#9e9e9e}.theme__hacker .bio__social a:hover,.theme__hacker .bio__social a:active,.theme__hacker .bio__social a:focus{color:#d1d1d1}.theme__solarized .bio__social a{color:#637c84}.theme__solarized .bio__social a:hover,.theme__solarized .bio__social a:active,.theme__solarized .bio__social a:focus{color:#4d6066}.theme__kimbie .bio__social a{color:#ccc}.theme__kimbie .bio__social a:hover,.theme__kimbie .bio__social a:active,.theme__kimbie .bio__social a:focus{color:#fff}.bio-hr{border-radius:.5rem}.breadcrumb{margin:1rem;margin-bottom:0;padding:.5rem;border-radius:.25rem;padding:auto;font-family:montserrat,sans-serif;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960px}.theme__dark .breadcrumb{background-color:#212121}.theme__light .breadcrumb{background-color:#eee}.theme__hacker .breadcrumb{background-color:#252526}.theme__solarized .breadcrumb{background-color:#fbf1d1}.theme__kimbie .breadcrumb{background-color:#362712}.breadcrumb ol{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.breadcrumb li{display:inline;font-size:.9rem}.theme__dark .breadcrumb li a{color:#82aaff}.theme__dark .breadcrumb li a:hover,.theme__dark .breadcrumb li a:active,.theme__dark .breadcrumb li a:focus{color:#ff6188}.theme__light .breadcrumb li a{color:#728fcb}.theme__light .breadcrumb li a:hover,.theme__light .breadcrumb li a:active,.theme__light .breadcrumb li a:focus{color:#26a69a}.theme__hacker .breadcrumb li a{color:#e08c48}.theme__hacker .breadcrumb li a:hover,.theme__hacker .breadcrumb li a:active,.theme__hacker .breadcrumb li a:focus{color:#c7ba00}.theme__solarized .breadcrumb li a{color:#424242}.theme__solarized .breadcrumb li a:hover,.theme__solarized .breadcrumb li a:active,.theme__solarized .breadcrumb li a:focus{color:#268bd2}.theme__kimbie .breadcrumb li a{color:#dc322f}.theme__kimbie .breadcrumb li a:hover,.theme__kimbie .breadcrumb li a:active,.theme__kimbie .breadcrumb li a:focus{color:#f06431}.breadcrumb li:last-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960px}.theme__dark .breadcrumb li:last-child{color:#bdbdbd}.theme__light .breadcrumb li:last-child{color:#aaa}.theme__hacker .breadcrumb li:last-child{color:#bdbdbd}.theme__solarized .breadcrumb li:last-child{color:#aaa}.theme__kimbie .breadcrumb li:last-child{color:#aaa}.breadcrumb li+li:before{padding:.5rem;content:"/\00a0"}.theme__dark .breadcrumb li+li:before{color:#82aaff}.theme__light .breadcrumb li+li:before{color:#728fcb}.theme__hacker .breadcrumb li+li:before{color:#e08c48}.theme__solarized .breadcrumb li+li:before{color:#424242}.theme__kimbie .breadcrumb li+li:before{color:#dc322f}.mermaid{width:100%;text-align:center;margin-bottom:1rem;overflow:auto}.diagram{overflow:auto;margin-right:1rem;margin-bottom:1rem;border-radius:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}[id^=msc]{overflow:auto;margin:.5rem 0;text-align:center}[id^=flowchart]{overflow:auto}[id^=WaveDrom_Display]{overflow:auto;background-color:#fcfcfa;border-radius:.25rem}.expand{position:relative;margin:1.5rem 0;border-radius:.25rem}.expand__content{padding:0 1.125rem;overflow:hidden;max-height:0;border-bottom-left-radius:.25rem;border-bottom-right-radius:.25rem;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.theme__dark .expand__content{border-top:1px solid #616161;background-color:#403e41}.theme__light .expand__content{border-top:1px solid #aaa;background-color:#f2f2f2}.theme__hacker .expand__content{border-top:1px solid #6b6b6b;background-color:#1c1f1c}.theme__solarized .expand__content{border-top:1px solid #b58900;background-color:#f9fbe7}.theme__kimbie .expand__content{border-top:1px solid #6e583b;background-color:#271e11}.expand__content li{font-size:15.2px;margin:0 0 .525rem 2rem!important}.expand__content li:first-child{margin-top:.25rem!important}.expand__content li li{font-size:14.4px;margin:0 0 .25rem 1.25rem!important}.expand__content--toc{font-family:montserrat,sans-serif;font-size:15.2px}.expand__content--toc li{list-style-type:'📂 '}.expand__content--toc li li{list-style-type:'📄 '}.expand__button{cursor:pointer;width:100%;margin:auto 0;text-align:left;outline:none;border:none;padding:.125rem;font-size:1rem;font-family:montserrat,sans-serif;border-top-left-radius:.25rem;border-top-right-radius:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .expand__button{color:inherit;background-color:#403e41}.theme__dark .expand__button:hover,.theme__dark .expand__button:active,.theme__dark .expand__button:focus{background-color:#424242}.theme__light .expand__button{color:inherit;background-color:#eaeaea}.theme__light .expand__button:hover,.theme__light .expand__button:active,.theme__light .expand__button:focus{background-color:#e6e6e6}.theme__hacker .expand__button{color:inherit;background-color:#262a26}.theme__hacker .expand__button:hover,.theme__hacker .expand__button:active,.theme__hacker .expand__button:focus{background-color:#212421}.theme__solarized .expand__button{color:inherit;background-color:#fbf1d1}.theme__solarized .expand__button:hover,.theme__solarized .expand__button:active,.theme__solarized .expand__button:focus{background-color:#faedc3}.theme__kimbie .expand__button{color:inherit;background-color:#362712}.theme__kimbie .expand__button:hover,.theme__kimbie .expand__button:active,.theme__kimbie .expand__button:focus{background-color:#412f16}.expand-label{cursor:pointer;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.expand-icon{padding-top:.125rem;padding-right:.5rem}.expand-icon__down{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .15s ease;-moz-transition:all .15s ease;-ms-transition:all .15s ease;-o-transition:all .15s ease;transition:all .15s ease}.expand-icon__right{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);-webkit-transition:all .15s ease;-moz-transition:all .15s ease;-ms-transition:all .15s ease;-o-transition:all .15s ease;transition:all .15s ease}.gtt{position:absolute;right:.5rem;bottom:.5rem;width:40px;height:40px;border-radius:.25rem;cursor:pointer;z-index:12;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .gtt{color:#bdbdbd;background-color:#403e41}.theme__dark .gtt:hover,.theme__dark .gtt:active,.theme__dark .gtt:focus{color:#82aaff;background-color:#4d4a4e}.theme__light .gtt{color:#727072;background-color:#eee}.theme__light .gtt:hover,.theme__light .gtt:active,.theme__light .gtt:focus{color:#607d8b;background-color:#d5d5d5}.theme__hacker .gtt{color:#9e9e9e;background-color:#252526}.theme__hacker .gtt:hover,.theme__hacker .gtt:active,.theme__hacker .gtt:focus{color:#e3cd26;background-color:#323233}.theme__solarized .gtt{color:#b58900;background-color:#eee8d5}.theme__solarized .gtt:hover,.theme__solarized .gtt:active,.theme__solarized .gtt:focus{color:#cb4b16;background-color:#e7dec3}.theme__kimbie .gtt{color:#d3af86;background-color:#423523}.theme__kimbie .gtt:hover,.theme__kimbie .gtt:active,.theme__kimbie .gtt:focus{color:#f06431;background-color:#5e452b}@media only screen and (max-width:769px){.gtt{position:fixed}}.hr-fade{height:1px;width:100%}.theme__dark .hr-fade{color:#595b5c;background-image:linear-gradient(90deg,transparent,#595B5C 50%,transparent 100%)}.theme__light .hr-fade{color:#ccc;background-image:linear-gradient(90deg,transparent,#ccc 50%,transparent 100%)}.theme__hacker .hr-fade{color:#6b6b6b;background-image:linear-gradient(90deg,transparent,#6B6B6B 50%,transparent 100%)}.theme__solarized .hr-fade{color:#ffb300;background-image:linear-gradient(90deg,transparent,#ffb300 50%,transparent 100%)}.theme__kimbie .hr-fade{color:#7f5d38;background-image:linear-gradient(90deg,transparent,#7f5d38 50%,transparent 100%)}.hr-slash{width:100%;height:7px;background-size:10px 10px}.theme__dark .hr-slash{color:#595b5c;background-image:linear-gradient(-45deg,transparent,transparent 25%,currentColor 25%,currentColor 50%,transparent 50%,transparent 75%,currentColor 75%)}.theme__light .hr-slash{color:#ccc;background-image:linear-gradient(-45deg,transparent,transparent 25%,currentColor 25%,currentColor 50%,transparent 50%,transparent 75%,currentColor 75%)}.theme__hacker .hr-slash{color:#6b6b6b;background-image:linear-gradient(-45deg,transparent,transparent 25%,currentColor 25%,currentColor 50%,transparent 50%,transparent 75%,currentColor 75%)}.theme__solarized .hr-slash{color:#ffb300;background-image:linear-gradient(-45deg,transparent,transparent 25%,currentColor 25%,currentColor 50%,transparent 50%,transparent 75%,currentColor 75%)}.theme__kimbie .hr-slash{color:#7f5d38;background-image:linear-gradient(-45deg,transparent,transparent 25%,currentColor 25%,currentColor 50%,transparent 50%,transparent 75%,currentColor 75%)}.theme__dark .hr-dots{color:#595b5c;width:100%;border-width:0 0 7px;border-style:solid;border-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDEiIHdpZHRoPSI4IiBoZWlnaHQ9IjQiPjxjaXJjbGUgZmlsbD0iIzU5NWI1YyIgY3g9IjEiIGN5PSIuNSIgcj0iLjUiLz48L3N2Zz4=)0 0 100% repeat}.theme__light .hr-dots{color:#ccc;width:100%;border-width:0 0 7px;border-style:solid;border-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDEiIHdpZHRoPSI4IiBoZWlnaHQ9IjQiPjxjaXJjbGUgZmlsbD0iI2NjYyIgY3g9IjEiIGN5PSIuNSIgcj0iLjUiLz48L3N2Zz4=)0 0 100% repeat}.theme__hacker .hr-dots{color:#6b6b6b;width:100%;border-width:0 0 7px;border-style:solid;border-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDEiIHdpZHRoPSI4IiBoZWlnaHQ9IjQiPjxjaXJjbGUgZmlsbD0iIzZiNmI2YiIgY3g9IjEiIGN5PSIuNSIgcj0iLjUiLz48L3N2Zz4=)0 0 100% repeat}.theme__solarized .hr-dots{color:#ffb300;width:100%;border-width:0 0 7px;border-style:solid;border-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDEiIHdpZHRoPSI4IiBoZWlnaHQ9IjQiPjxjaXJjbGUgZmlsbD0iI2ZmYjMwMCIgY3g9IjEiIGN5PSIuNSIgcj0iLjUiLz48L3N2Zz4=)0 0 100% repeat}.theme__kimbie .hr-dots{color:#7f5d38;width:100%;border-width:0 0 7px;border-style:solid;border-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyIDEiIHdpZHRoPSI4IiBoZWlnaHQ9IjQiPjxjaXJjbGUgZmlsbD0iIzdmNWQzOCIgY3g9IjEiIGN5PSIuNSIgcj0iLjUiLz48L3N2Zz4=)0 0 100% repeat}.MathJax{overflow-x:auto;overflow-y:hidden;box-sizing:border-box}code.has-jax{-webkit-font-smoothing:antialiased;background:inherit!important;border:none!important;font-size:100%}.notices{position:relative;border-radius:.125rem;color:#fff;margin:2rem 0;padding:.3rem .5rem .3rem 2rem;font-size:.95rem}.notices a{text-decoration:underline}.notices>table{table-layout:fixed;width:100%;margin:10px 0;border-spacing:0}.notices.warning{border-top:30px solid #f1b37e;background:#fefaf5;color:rgba(150,90,38,.995)!important}.notices.warning::before{position:absolute;content:'⚠️ Warning';font-family:montserrat,sans-serif;top:-26.5px;left:.4rem;height:100%}.notices.warning a{font-weight:700;color:rgba(134,74,22,.995)}.theme__dark .notices.warning a:hover,.theme__dark .notices.warning a:active,.theme__dark .notices.warning a:focus{color:#ff6188}.theme__light .notices.warning a:hover,.theme__light .notices.warning a:active,.theme__light .notices.warning a:focus{color:#26a69a}.theme__hacker .notices.warning a:hover,.theme__hacker .notices.warning a:active,.theme__hacker .notices.warning a:focus{color:#c7ba00}.theme__solarized .notices.warning a:hover,.theme__solarized .notices.warning a:active,.theme__solarized .notices.warning a:focus{color:#268bd2}.theme__kimbie .notices.warning a:hover,.theme__kimbie .notices.warning a:active,.theme__kimbie .notices.warning a:focus{color:#f06431}.notices.warning>table thead{background:#f1b37e}.notices.warning>table th{color:rgba(134,74,22,.995)}.notices.warning>table th,.notices.warning>table td{padding:5px 15px;border:1px double rgba(166,106,54,.45)}.notices.warning p>code,.notices.warning li>code,.notices.warning td>code,.notices.warning code{padding:3px 7px;color:rgba(150,90,38,.995)!important;background-color:#fbecd9!important}.notices.error{border-top:30px solid #d58181;background:#fbeded;color:rgba(132,56,56,.995)!important}.notices.error::before{position:absolute;content:'❌ Error';font-family:montserrat,sans-serif;top:-26.5px;left:.4rem;height:100%}.notices.error a{font-weight:700;color:rgba(116,40,40,.995)}.theme__dark .notices.error a:hover,.theme__dark .notices.error a:active,.theme__dark .notices.error a:focus{color:#ff6188}.theme__light .notices.error a:hover,.theme__light .notices.error a:active,.theme__light .notices.error a:focus{color:#26a69a}.theme__hacker .notices.error a:hover,.theme__hacker .notices.error a:active,.theme__hacker .notices.error a:focus{color:#c7ba00}.theme__solarized .notices.error a:hover,.theme__solarized .notices.error a:active,.theme__solarized .notices.error a:focus{color:#268bd2}.theme__kimbie .notices.error a:hover,.theme__kimbie .notices.error a:active,.theme__kimbie .notices.error a:focus{color:#f06431}.notices.error>table thead{background:#d58181}.notices.error>table th{color:rgba(116,40,40,.995)}.notices.error>table th,.notices.error>table td{padding:5px 15px;border:1px double rgba(148,72,72,.45)}.notices.error p>code,.notices.error li>code,.notices.error td>code,.notices.error code{padding:3px 7px;color:rgba(132,56,56,.995)!important;background-color:#f5d4d4!important}.notices.info{border-top:30px solid #6bb1e0;background:#e6f3fb;color:rgba(47,103,141,.995)!important}.notices.info::before{position:absolute;content:'ℹ️ Info';font-family:montserrat,sans-serif;top:-26.5px;left:.4rem;height:100%}.notices.info a{font-weight:700;color:rgba(31,87,125,.995)}.theme__dark .notices.info a:hover,.theme__dark .notices.info a:active,.theme__dark .notices.info a:focus{color:#ff6188}.theme__light .notices.info a:hover,.theme__light .notices.info a:active,.theme__light .notices.info a:focus{color:#26a69a}.theme__hacker .notices.info a:hover,.theme__hacker .notices.info a:active,.theme__hacker .notices.info a:focus{color:#c7ba00}.theme__solarized .notices.info a:hover,.theme__solarized .notices.info a:active,.theme__solarized .notices.info a:focus{color:#268bd2}.theme__kimbie .notices.info a:hover,.theme__kimbie .notices.info a:active,.theme__kimbie .notices.info a:focus{color:#f06431}.notices.info>table thead{background:#6bb1e0}.notices.info>table th{color:rgba(31,87,125,.995)}.notices.info>table th,.notices.info>table td{padding:5px 15px;border:1px double rgba(63,119,157,.45)}.notices.info p>code,.notices.info li>code,.notices.info td>code,.notices.info code{padding:3px 7px;color:rgba(47,103,141,.995)!important;background-color:#cce6f7!important}.notices.success{border-top:30px solid #84c578;background:#e8f7e6;color:rgba(72,125,63,.995)!important}.notices.success::before{position:absolute;content:'✔️ Success';font-family:montserrat,sans-serif;top:-26.5px;left:.4rem;height:100%}.notices.success a{font-weight:700;color:rgba(56,109,47,.995)}.theme__dark .notices.success a:hover,.theme__dark .notices.success a:active,.theme__dark .notices.success a:focus{color:#ff6188}.theme__light .notices.success a:hover,.theme__light .notices.success a:active,.theme__light .notices.success a:focus{color:#26a69a}.theme__hacker .notices.success a:hover,.theme__hacker .notices.success a:active,.theme__hacker .notices.success a:focus{color:#c7ba00}.theme__solarized .notices.success a:hover,.theme__solarized .notices.success a:active,.theme__solarized .notices.success a:focus{color:#268bd2}.theme__kimbie .notices.success a:hover,.theme__kimbie .notices.success a:active,.theme__kimbie .notices.success a:focus{color:#f06431}.notices.success>table thead{background:#84c578}.notices.success>table th{color:rgba(56,109,47,.995)}.notices.success>table th,.notices.success>table td{padding:5px 15px;border:1px double rgba(82,141,79,.45)}.notices.success p>code,.notices.success li>code,.notices.success td>code,.notices.success code{padding:3px 7px;color:rgba(72,125,63,.995)!important;background-color:#d3f0cf!important}.pagination{border-radius:.25rem;margin:2rem 1rem;padding:.5rem 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .pagination{background-color:#212121}.theme__light .pagination{background-color:#eee}.theme__hacker .pagination{background-color:#252526}.theme__solarized .pagination{background-color:#fbf1d1}.theme__kimbie .pagination{background-color:#362712}.pagination li{border-radius:.25rem}.theme__dark .pagination li.disabled a:hover,.theme__dark .pagination li.disabled a:active,.theme__dark .pagination li.disabled a:focus{color:#fcfcfa;text-decoration:none}.theme__light .pagination li.disabled a:hover,.theme__light .pagination li.disabled a:active,.theme__light .pagination li.disabled a:focus{color:#757575;text-decoration:none}.theme__hacker .pagination li.disabled a:hover,.theme__hacker .pagination li.disabled a:active,.theme__hacker .pagination li.disabled a:focus{color:#fcfcfa;text-decoration:none}.theme__solarized .pagination li.disabled a:hover,.theme__solarized .pagination li.disabled a:active,.theme__solarized .pagination li.disabled a:focus{color:#455a64;text-decoration:none}.theme__kimbie .pagination li.disabled a:hover,.theme__kimbie .pagination li.disabled a:active,.theme__kimbie .pagination li.disabled a:focus{color:#fff;text-decoration:none}.pagination li.active{font-weight:700}.theme__dark .pagination li.active a{color:#ff6188}.theme__light .pagination li.active a{color:#26a69a}.theme__hacker .pagination li.active a{color:#c7ba00}.theme__solarized .pagination li.active a{color:#268bd2}.theme__kimbie .pagination li.active a{color:#f06431}.pagination a{font-size:1.25rem;padding:.5rem .75rem}.theme__dark .pagination a{color:#fcfcfa}.theme__dark .pagination a:hover,.theme__dark .pagination a:active,.theme__dark .pagination a:focus{color:#ff6188}.theme__light .pagination a{color:#757575}.theme__light .pagination a:hover,.theme__light .pagination a:active,.theme__light .pagination a:focus{color:#26a69a}.theme__hacker .pagination a{color:#fcfcfa}.theme__hacker .pagination a:hover,.theme__hacker .pagination a:active,.theme__hacker .pagination a:focus{color:#c7ba00}.theme__solarized .pagination a{color:#455a64}.theme__solarized .pagination a:hover,.theme__solarized .pagination a:active,.theme__solarized .pagination a:focus{color:#268bd2}.theme__kimbie .pagination a{color:#fff}.theme__kimbie .pagination a:hover,.theme__kimbie .pagination a:active,.theme__kimbie .pagination a:focus{color:#f06431}.theme__dark .pagination .active{background-color:#212121}.theme__light .pagination .active{background-color:#eee}.theme__hacker .pagination .active{background-color:#252526}.theme__solarized .pagination .active{background-color:#fbf1d1}.theme__kimbie .pagination .active{background-color:#362712}.pagination-single{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:flex-end;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%;margin:1rem 0}.pagination-single__left,.pagination-single__right{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out;font-family:montserrat,sans-serif;padding:.25rem;border-radius:.125rem}.pagination-single__left-title,.pagination-single__right-title{font-size:16.8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960px}.theme__dark .pagination-single__left:hover .pagination-single__icon,.theme__dark .pagination-single__left:active .pagination-single__icon,.theme__dark .pagination-single__left:focus .pagination-single__icon,.theme__dark .pagination-single__right:hover .pagination-single__icon,.theme__dark .pagination-single__right:active .pagination-single__icon,.theme__dark .pagination-single__right:focus .pagination-single__icon{color:#82aaff;background-color:#4d4a4e}.theme__light .pagination-single__left:hover .pagination-single__icon,.theme__light .pagination-single__left:active .pagination-single__icon,.theme__light .pagination-single__left:focus .pagination-single__icon,.theme__light .pagination-single__right:hover .pagination-single__icon,.theme__light .pagination-single__right:active .pagination-single__icon,.theme__light .pagination-single__right:focus .pagination-single__icon{color:#607d8b;background-color:#d5d5d5}.theme__hacker .pagination-single__left:hover .pagination-single__icon,.theme__hacker .pagination-single__left:active .pagination-single__icon,.theme__hacker .pagination-single__left:focus .pagination-single__icon,.theme__hacker .pagination-single__right:hover .pagination-single__icon,.theme__hacker .pagination-single__right:active .pagination-single__icon,.theme__hacker .pagination-single__right:focus .pagination-single__icon{color:#e3cd26;background-color:#323233}.theme__solarized .pagination-single__left:hover .pagination-single__icon,.theme__solarized .pagination-single__left:active .pagination-single__icon,.theme__solarized .pagination-single__left:focus .pagination-single__icon,.theme__solarized .pagination-single__right:hover .pagination-single__icon,.theme__solarized .pagination-single__right:active .pagination-single__icon,.theme__solarized .pagination-single__right:focus .pagination-single__icon{color:#cb4b16;background-color:#e7dec3}.theme__kimbie .pagination-single__left:hover .pagination-single__icon,.theme__kimbie .pagination-single__left:active .pagination-single__icon,.theme__kimbie .pagination-single__left:focus .pagination-single__icon,.theme__kimbie .pagination-single__right:hover .pagination-single__icon,.theme__kimbie .pagination-single__right:active .pagination-single__icon,.theme__kimbie .pagination-single__right:focus .pagination-single__icon{color:#f06431;background-color:#5e452b}.pagination-single__left:hover,.pagination-single__left:active,.pagination-single__left:focus{-webkit-transform:translateX(-.25rem);-moz-transform:translateX(-.25rem);-ms-transform:translateX(-.25rem);transform:translateX(-.25rem)}.pagination-single__right:hover,.pagination-single__right:active,.pagination-single__right:focus{-webkit-transform:translateX(.25rem);-moz-transform:translateX(.25rem);-ms-transform:translateX(.25rem);transform:translateX(.25rem)}.pagination-single__icon{width:28px;height:28px;border-radius:100%;margin:0 .5rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .pagination-single__icon{color:#bdbdbd;background-color:#403e41}.theme__light .pagination-single__icon{color:#727072;background-color:#eee}.theme__hacker .pagination-single__icon{color:#9e9e9e;background-color:#252526}.theme__solarized .pagination-single__icon{color:#b58900;background-color:#eee8d5}.theme__kimbie .pagination-single__icon{color:#d3af86;background-color:#423523}.related{margin:2rem auto;padding:.5rem;width:100%;max-width:700px;position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.related__title{font-size:32px}.theme__dark .related__title{color:#fcfcfa}.theme__light .related__title{color:#424242}.theme__hacker .related__title{color:#fcfcfa}.theme__solarized .related__title{color:#424242}.theme__kimbie .related__title{color:#889b4a}.related__link{font-size:16.8px;font-family:montserrat,sans-serif}.theme__dark .related__link{color:#a9dc76}.theme__light .related__link{color:#607d8b}.theme__hacker .related__link{color:#c7ba00}.theme__solarized .related__link{color:#2aa198}.theme__kimbie .related__link{color:#e3b583}.related-ul{-webkit-align-self:center;-moz-align-self:center;-ms-align-self:center;align-self:center;list-style-type:disc}.search{position:relative;border-radius:.25rem;height:35px;max-width:928px;z-index:8;margin-bottom:.5rem;-webkit-box-shadow:0 0 0 3px transparent;-moz-box-shadow:0 0 0 3px transparent;box-shadow:0 0 0 3px transparent;-webkit-transition:all .15s ease-in;-moz-transition:all .15s ease-in;-ms-transition:all .15s ease-in;-o-transition:all .15s ease-in;transition:all .15s ease-in;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .search{border:2px solid #1d1d1d;background-color:#212121}.theme__dark .search:focus-within{border:2px solid #424242;-webkit-box-shadow:0 0 0 3px rgba(66,66,66,.45);-moz-box-shadow:0 0 0 3px rgba(66,66,66,.45);box-shadow:0 0 0 3px rgba(66,66,66,.45)}.theme__light .search{border:2px solid #e0e0e0;background-color:#eee}.theme__light .search:focus-within{border:2px solid #b0bec5;-webkit-box-shadow:0 0 0 3px rgba(207,216,220,.6);-moz-box-shadow:0 0 0 3px rgba(207,216,220,.6);box-shadow:0 0 0 3px rgba(207,216,220,.6)}.theme__hacker .search{border:2px solid #0d0e0f;background-color:#252526}.theme__hacker .search:focus-within{border:2px solid #414141;-webkit-box-shadow:0 0 0 3px rgba(161,173,100,.2);-moz-box-shadow:0 0 0 3px rgba(161,173,100,.2);box-shadow:0 0 0 3px rgba(161,173,100,.2)}.theme__solarized .search{border:2px solid #f7e3a2;background-color:#fbf1d1}.theme__solarized .search:focus-within{border:2px solid #e8b000;-webkit-box-shadow:0 0 0 3px rgba(133,153,0,.2);-moz-box-shadow:0 0 0 3px rgba(133,153,0,.2);box-shadow:0 0 0 3px rgba(133,153,0,.2)}.theme__kimbie .search{border:2px solid #423523;background-color:#362712}.theme__kimbie .search:focus-within{border:2px solid #5e452b;-webkit-box-shadow:0 0 0 3px rgba(110,88,59,.45);-moz-box-shadow:0 0 0 3px rgba(110,88,59,.45);box-shadow:0 0 0 3px rgba(110,88,59,.45)}.search .icon{padding:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.theme__dark .search .icon{color:#727072}.theme__light .search .icon{color:#bdbdbd}.theme__hacker .search .icon{color:#727072}.theme__solarized .search .icon{color:#b58900}.theme__kimbie .search .icon{color:#6e583b}.search .input{width:100%;font-size:.9rem;border:none;outline:none;padding-right:1rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:2fr}.theme__dark .search .input{color:#fcfcfa;background-color:inherit}.theme__dark .search .input.placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .search .input:-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .search .input::-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .search .input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .search .input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__light .search .input{color:#424242;background-color:inherit}.theme__light .search .input.placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .search .input:-moz-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .search .input::-moz-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .search .input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .search .input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__hacker .search .input{color:#1fff2a;background-color:inherit}.theme__hacker .search .input.placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .search .input:-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .search .input::-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .search .input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .search .input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__solarized .search .input{color:#b58900;background-color:inherit}.theme__solarized .search .input.placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .search .input:-moz-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .search .input::-moz-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .search .input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .search .input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__kimbie .search .input{color:#d3af86;background-color:inherit}.theme__kimbie .search .input.placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .search .input:-moz-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .search .input::-moz-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .search .input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .search .input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.search-content{margin-top:.25rem;max-height:350px;overflow:auto}.search-content a{text-decoration:none!important}.theme__dark .search-content a:not(:last-child){font-family:montserrat,sans-serif;border-bottom:2px dashed #727072}.theme__light .search-content a:not(:last-child){font-family:montserrat,sans-serif;border-bottom:2px dashed #bdbdbd}.theme__hacker .search-content a:not(:last-child){font-family:montserrat,sans-serif;border-bottom:2px dashed #727072}.theme__solarized .search-content a:not(:last-child){font-family:montserrat,sans-serif;border-bottom:2px dashed #b58900}.theme__kimbie .search-content a:not(:last-child){font-family:montserrat,sans-serif;border-bottom:2px dashed #6e583b}.theme__dark .search__highlight{color:#ff6188}.theme__light .search__highlight{color:#ff6188}.theme__hacker .search__highlight{color:red}.theme__solarized .search__highlight{color:#e53935}.theme__kimbie .search__highlight{color:#f06431}.search-result{position:absolute;top:0;left:0;width:100%;height:100%}.theme__dark .search-result{background-color:#2d2a2e}.theme__light .search-result{background-color:#fafafa}.theme__hacker .search-result{background-color:#151715}.theme__solarized .search-result{background-color:#fdf7e3}.theme__kimbie .search-result{background-color:#221a0f}.search-result[data-display=block]{display:block}.search-result[data-display=none]{display:none}.search-result__body{margin-top:1rem;padding:0 1rem;position:relative;display:block;overflow:auto;height:100%}.theme__dark .search-result__body{scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__dark .search-result__body::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark .search-result__body::-webkit-scrollbar-thumb{background:#888}.theme__dark .search-result__body::-webkit-scrollbar-track{background:#eee}.theme__light .search-result__body{scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__light .search-result__body::-webkit-scrollbar{width:.45em;height:.45em}.theme__light .search-result__body::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light .search-result__body::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker .search-result__body{scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__hacker .search-result__body::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker .search-result__body::-webkit-scrollbar-thumb{background:#616161}.theme__hacker .search-result__body::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized .search-result__body{scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__solarized .search-result__body::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized .search-result__body::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized .search-result__body::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie .search-result__body{scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.theme__kimbie .search-result__body::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie .search-result__body::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie .search-result__body::-webkit-scrollbar-track{background:#d3af86}.search-result__item:not(first-child){padding-bottom:2.25rem}.search-result__item--title{font-family:montserrat,sans-serif;font-size:1.5rem;margin:.25rem 0}.search-result__item--title::before{content:"📋 "}.search-result__item--desc{font-size:1rem;margin:.25rem 0}.search-result__close{position:absolute;cursor:pointer}.search-result__close[data-dir=ltr]{right:.5rem;top:-1.5rem}.search-result__close[data-dir=rtl]{left:.5rem;top:-1.5rem}.theme__dark .search-result__close{color:#bdbdbd}.theme__dark .search-result__close:hover,.theme__dark .search-result__close:active,.theme__dark .search-result__close:focus{color:#f0f0f0}.theme__light .search-result__close{color:#777}.theme__light .search-result__close:hover,.theme__light .search-result__close:active,.theme__light .search-result__close:focus{color:#444}.theme__hacker .search-result__close{color:#9e9e9e}.theme__hacker .search-result__close:hover,.theme__hacker .search-result__close:active,.theme__hacker .search-result__close:focus{color:#d1d1d1}.theme__solarized .search-result__close{color:#637c84}.theme__solarized .search-result__close:hover,.theme__solarized .search-result__close:active,.theme__solarized .search-result__close:focus{color:#4d6066}.theme__kimbie .search-result__close{color:#ccc}.theme__kimbie .search-result__close:hover,.theme__kimbie .search-result__close:active,.theme__kimbie .search-result__close:focus{color:#fff}.menu-item{padding:.25rem}.menu-item__title{font-size:1rem}.theme__dark .menu-item__title{color:#fcfcfa}.theme__light .menu-item__title{color:#424242}.theme__hacker .menu-item__title{color:#1fff2a}.theme__solarized .menu-item__title{color:#586e75}.theme__kimbie .menu-item__title{color:#e3b583}.menu-item__title::before{content:'📄 '}.menu-item__desc{font-size:.8rem;padding:.25rem .5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:2fr}.theme__dark .menu-item__desc{color:#fcfcfa}.theme__light .menu-item__desc{color:#424242}.theme__hacker .menu-item__desc{color:#cdf5cc}.theme__solarized .menu-item__desc{color:#b58900}.theme__kimbie .menu-item__desc{color:#889b4a}#search-results.dropdown{display:none}#search-results.dropdown.is-active{display:inline-block;margin-top:.25rem;position:absolute;left:0;top:35px;width:100%;border-radius:.1rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);-moz-box-shadow:0 1px 3px 0 rgba(0,0,0,.4);box-shadow:0 1px 3px 0 rgba(0,0,0,.4)}.theme__dark #search-results.dropdown.is-active{color:inherit;background-color:#4d4a4e}.theme__light #search-results.dropdown.is-active{color:#424242;background-color:#eee}.theme__hacker #search-results.dropdown.is-active{color:#1fff2a;background-color:#252526}.theme__solarized #search-results.dropdown.is-active{color:#b58900;background-color:#fbf1d1}.theme__kimbie #search-results.dropdown.is-active{color:#d3af86;background-color:#362712}#search-results .dropdown-content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.theme__dark #search-results .dropdown-content{scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__dark #search-results .dropdown-content::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark #search-results .dropdown-content::-webkit-scrollbar-thumb{background:#888}.theme__dark #search-results .dropdown-content::-webkit-scrollbar-track{background:#eee}.theme__light #search-results .dropdown-content{scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__light #search-results .dropdown-content::-webkit-scrollbar{width:.45em;height:.45em}.theme__light #search-results .dropdown-content::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light #search-results .dropdown-content::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker #search-results .dropdown-content{scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__hacker #search-results .dropdown-content::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker #search-results .dropdown-content::-webkit-scrollbar-thumb{background:#616161}.theme__hacker #search-results .dropdown-content::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized #search-results .dropdown-content{scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__solarized #search-results .dropdown-content::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized #search-results .dropdown-content::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized #search-results .dropdown-content::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie #search-results .dropdown-content{scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.theme__kimbie #search-results .dropdown-content::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie #search-results .dropdown-content::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie #search-results .dropdown-content::-webkit-scrollbar-track{background:#d3af86}#search-results .dropdown-item{font-size:1rem;padding:.125rem .25rem}#search-results .dropdown-item:hover,#search-results .dropdown-item:active,#search-results .dropdown-item:focus{border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem}.theme__dark #search-results .dropdown-item:hover,.theme__dark #search-results .dropdown-item:active,.theme__dark #search-results .dropdown-item:focus{background-color:#403e41}.theme__light #search-results .dropdown-item:hover,.theme__light #search-results .dropdown-item:active,.theme__light #search-results .dropdown-item:focus{background-color:#d5d5d5}.theme__hacker #search-results .dropdown-item:hover,.theme__hacker #search-results .dropdown-item:active,.theme__hacker #search-results .dropdown-item:focus{background-color:#48484a}.theme__solarized #search-results .dropdown-item:hover,.theme__solarized #search-results .dropdown-item:active,.theme__solarized #search-results .dropdown-item:focus{background-color:#f7e3a2}.theme__kimbie #search-results .dropdown-item:hover,.theme__kimbie #search-results .dropdown-item:active,.theme__kimbie #search-results .dropdown-item:focus{background-color:#5e452b}.theme__dark #search-results .dropdown-item.is-active{background-color:#403e41}.theme__light #search-results .dropdown-item.is-active{background-color:#d5d5d5}.theme__hacker #search-results .dropdown-item.is-active{background-color:#48484a}.theme__solarized #search-results .dropdown-item.is-active{background-color:#f7e3a2}.theme__kimbie #search-results .dropdown-item.is-active{background-color:#5e452b}.mobile-search{position:absolute;top:0;left:0;z-index:16;width:100%;overflow:hidden}.theme__dark .mobile-search ::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark .mobile-search ::-webkit-scrollbar-thumb{background:#888}.theme__dark .mobile-search ::-webkit-scrollbar-track{background:#eee}.theme__light .mobile-search ::-webkit-scrollbar{width:.45em;height:.45em}.theme__light .mobile-search ::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light .mobile-search ::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker .mobile-search ::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker .mobile-search ::-webkit-scrollbar-thumb{background:#616161}.theme__hacker .mobile-search ::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized .mobile-search ::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized .mobile-search ::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized .mobile-search ::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie .mobile-search ::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie .mobile-search ::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie .mobile-search ::-webkit-scrollbar-track{background:#d3af86}.mobile-search__top{width:100%;height:50px;text-align:right;position:relative;direction:rtl;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .mobile-search__top{border-bottom:1px solid #4e4e4e;background-color:#403e41}.theme__light .mobile-search__top{border-bottom:1px solid #e0e0e0;background-color:#eee}.theme__hacker .mobile-search__top{border-bottom:1px solid #424242;background-color:#252526}.theme__solarized .mobile-search__top{border-bottom:1px solid #eddc9f;background-color:#eee8d5}.theme__kimbie .mobile-search__top{border-bottom:1px solid #6e583b;background-color:#51412c}.mobile-search__top--icon{width:50px;height:50px;cursor:pointer;position:absolute;top:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .mobile-search__top--icon{color:#fcfcfa}.theme__dark .mobile-search__top--icon:hover,.theme__dark .mobile-search__top--icon:active,.theme__dark .mobile-search__top--icon:focus{color:#ff6188}.theme__light .mobile-search__top--icon{color:#777}.theme__light .mobile-search__top--icon:hover,.theme__light .mobile-search__top--icon:active,.theme__light .mobile-search__top--icon:focus{color:#26a69a}.theme__hacker .mobile-search__top--icon{color:#dbdbdb}.theme__hacker .mobile-search__top--icon:hover,.theme__hacker .mobile-search__top--icon:active,.theme__hacker .mobile-search__top--icon:focus{color:#c7ba00}.theme__solarized .mobile-search__top--icon{color:#586e75}.theme__solarized .mobile-search__top--icon:hover,.theme__solarized .mobile-search__top--icon:active,.theme__solarized .mobile-search__top--icon:focus{color:#268bd2}.theme__kimbie .mobile-search__top--icon{color:#d3af86}.theme__kimbie .mobile-search__top--icon:hover,.theme__kimbie .mobile-search__top--icon:active,.theme__kimbie .mobile-search__top--icon:focus{color:#f06431}.mobile-search__top--input{position:absolute;width:calc(100% - 50px);height:70%;outline:none;border:none;border-radius:.25rem;padding:0 1rem;font-size:1.1rem}.theme__dark .mobile-search__top--input{color:#fcfcfa;background-color:#403e41}.theme__dark .mobile-search__top--input.placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .mobile-search__top--input:-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .mobile-search__top--input::-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .mobile-search__top--input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__dark .mobile-search__top--input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__light .mobile-search__top--input{color:#424242;background-color:#eee}.theme__light .mobile-search__top--input.placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .mobile-search__top--input:-moz-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .mobile-search__top--input::-moz-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .mobile-search__top--input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__light .mobile-search__top--input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#bdbdbd}.theme__hacker .mobile-search__top--input{color:#1fff2a;background-color:#252526}.theme__hacker .mobile-search__top--input.placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .mobile-search__top--input:-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .mobile-search__top--input::-moz-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .mobile-search__top--input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__hacker .mobile-search__top--input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#727072}.theme__solarized .mobile-search__top--input{color:#586e75;background-color:#eee8d5}.theme__solarized .mobile-search__top--input.placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .mobile-search__top--input:-moz-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .mobile-search__top--input::-moz-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .mobile-search__top--input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__solarized .mobile-search__top--input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#b58900}.theme__kimbie .mobile-search__top--input{color:#e3b583;background-color:#51412c}.theme__kimbie .mobile-search__top--input.placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .mobile-search__top--input:-moz-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .mobile-search__top--input::-moz-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .mobile-search__top--input:-ms-input-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.theme__kimbie .mobile-search__top--input::-webkit-input-placeholder{font-family:montserrat,sans-serif;color:#6e583b}.mobile-search__body{width:100vw;height:100vh;overflow-y:auto}.theme__dark .mobile-search__body{color:#fcfcfa;background-color:#2d2a2e;scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__light .mobile-search__body{color:#424242;background-color:#fafafa;scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__hacker .mobile-search__body{color:#1fff2a;background-color:#151715;scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__solarized .mobile-search__body{color:#586e75;background-color:#fdf7e3;scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__kimbie .mobile-search__body{color:#e3b583;background-color:#221a0f;scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.mobile-search[data-dir=ltr] .mobile-search__top--icon{right:0}.mobile-search[data-dir=ltr] .mobile-search__body{direction:ltr}.mobile-search[data-dir=ltr] .mobile-search__top--input{direction:ltr;left:0}.mobile-search[data-dir=rtl] .mobile-search__top--icon{left:0}.mobile-search[data-dir=rtl] .mobile-search__body{direction:rtl}.mobile-search[data-dir=rtl] .mobile-search__top--input{direction:rtl;right:0}.mobile-search__btn{position:absolute;top:0;right:35px;width:35px;height:50px;padding:.25rem;cursor:pointer;display:none;z-index:9}.mobile-search__btn[data-ani=true]{-webkit-animation:slide-in-down .5s .25s 1 ease both;-moz-animation:slide-in-down .5s .25s 1 ease both;-ms-animation:slide-in-down .5s .25s 1 ease both;-o-animation:slide-in-down .5s .25s 1 ease both;animation:slide-in-down .5s .25s 1 ease both}.theme__dark .mobile-search__btn{color:#fcfcfa;background-color:#403e41;border-bottom:1px solid #4e4e4e}.theme__dark .mobile-search__btn:hover,.theme__dark .mobile-search__btn:active,.theme__dark .mobile-search__btn:focus{color:#ffd866}.theme__light .mobile-search__btn{color:#777;background-color:#eee;border-bottom:1px solid #e0e0e0}.theme__light .mobile-search__btn:hover,.theme__light .mobile-search__btn:active,.theme__light .mobile-search__btn:focus{color:#607d8b}.theme__hacker .mobile-search__btn{color:#dbdbdb;background-color:#252526;border-bottom:1px solid #424242}.theme__hacker .mobile-search__btn:hover,.theme__hacker .mobile-search__btn:active,.theme__hacker .mobile-search__btn:focus{color:#1fff2a}.theme__solarized .mobile-search__btn{color:#586e75;background-color:#eee8d5;border-bottom:1px solid #eddc9f}.theme__solarized .mobile-search__btn:hover,.theme__solarized .mobile-search__btn:active,.theme__solarized .mobile-search__btn:focus{color:#b58900}.theme__kimbie .mobile-search__btn{color:#d3af86;background-color:#51412c;border-bottom:1px solid #6e583b}.theme__kimbie .mobile-search__btn:hover,.theme__kimbie .mobile-search__btn:active,.theme__kimbie .mobile-search__btn:focus{color:#f06431}@media only screen and (max-width:769px){.mobile-search__btn{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}}.mobile-search__content a{text-decoration:none!important}.mobile-search__item{padding:.5rem;list-style-type:none}.mobile-search__item:not(first-child){padding-bottom:.75rem}.mobile-search__item--title{font-family:montserrat,sans-serif;font-size:1.2rem;margin:.25rem 0}.theme__dark .mobile-search__item--title{color:#fcfcfa}.theme__light .mobile-search__item--title{color:#424242}.theme__hacker .mobile-search__item--title{color:#1fff2a}.theme__solarized .mobile-search__item--title{color:#586e75}.theme__kimbie .mobile-search__item--title{color:#e3b583}.mobile-search__item--title::before{content:"📋 "}.mobile-search__item--desc{font-size:.9rem;padding:.25rem .5rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960px}.theme__dark .mobile-search__item--desc{color:#fcfcfa}.theme__light .mobile-search__item--desc{color:#424242}.theme__hacker .mobile-search__item--desc{color:#1fff2a}.theme__solarized .mobile-search__item--desc{color:#b58900}.theme__kimbie .mobile-search__item--desc{color:#d3af86}.theme__dark .mobile-search__item:hover,.theme__dark .mobile-search__item:active,.theme__dark .mobile-search__item:focus{background-color:#403e41}.theme__light .mobile-search__item:hover,.theme__light .mobile-search__item:active,.theme__light .mobile-search__item:focus{background-color:#d5d5d5}.theme__hacker .mobile-search__item:hover,.theme__hacker .mobile-search__item:active,.theme__hacker .mobile-search__item:focus{background-color:#48484a}.theme__solarized .mobile-search__item:hover,.theme__solarized .mobile-search__item:active,.theme__solarized .mobile-search__item:focus{background-color:#f7e3a2}.theme__kimbie .mobile-search__item:hover,.theme__kimbie .mobile-search__item:active,.theme__kimbie .mobile-search__item:focus{background-color:#5e452b}.summary-card{padding:1rem}.summary-card[data-ani=true]{-webkit-animation:slide-in-down .2s .3s 1 ease-in both;-moz-animation:slide-in-down .2s .3s 1 ease-in both;-ms-animation:slide-in-down .2s .3s 1 ease-in both;-o-animation:slide-in-down .2s .3s 1 ease-in both;animation:slide-in-down .2s .3s 1 ease-in both}.summary-card .title a{font-family:montserrat,sans-serif;font-weight:700;word-break:break-word}.theme__dark .summary-card .title a{color:#ffd866}.theme__dark .summary-card .title a:hover,.theme__dark .summary-card .title a:active,.theme__dark .summary-card .title a:focus{color:#ff6188}.theme__light .summary-card .title a{color:#607d8b}.theme__light .summary-card .title a:hover,.theme__light .summary-card .title a:active,.theme__light .summary-card .title a:focus{color:#26a69a}.theme__hacker .summary-card .title a{color:#a1ad64}.theme__hacker .summary-card .title a:hover,.theme__hacker .summary-card .title a:active,.theme__hacker .summary-card .title a:focus{color:#c7ba00}.theme__solarized .summary-card .title a{color:#cb4b16}.theme__solarized .summary-card .title a:hover,.theme__solarized .summary-card .title a:active,.theme__solarized .summary-card .title a:focus{color:#268bd2}.theme__kimbie .summary-card .title a{color:#996329}.theme__kimbie .summary-card .title a:hover,.theme__kimbie .summary-card .title a:active,.theme__kimbie .summary-card .title a:focus{color:#f06431}.theme__dark .summary-card .subtitle{color:#fcfcfa}.theme__light .summary-card .subtitle{color:#424242}.theme__hacker .summary-card .subtitle{color:#cdf5cc}.theme__solarized .summary-card .subtitle{color:#b58900}.theme__kimbie .summary-card .subtitle{color:#889b4a}.summary-card__content{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.summary-card__text{margin-top:1rem;line-height:1.7rem}.summary-card__image{width:100%;height:100%}.summary-card__image[data-ani=true]{-webkit-animation:slide-in-left .2s .6s 1 ease-in both;-moz-animation:slide-in-left .2s .6s 1 ease-in both;-ms-animation:slide-in-left .2s .6s 1 ease-in both;-o-animation:slide-in-left .2s .6s 1 ease-in both;animation:slide-in-left .2s .6s 1 ease-in both}.summary-card__image-wrapper{height:100%;width:auto;margin:0 auto;padding:1rem;padding-bottom:0}.summary-card__video{width:100%;max-height:500px;object-fit:contain}.summary-card__video-wrapper{padding:1rem;padding-bottom:0}.summary-card hr{margin-top:1.5rem}.theme__dark .summary-card hr{border-top:1px solid #595b5c}.theme__light .summary-card hr{border-top:1px solid #ccc}.theme__hacker .summary-card hr{border-top:1px solid #6b6b6b}.theme__solarized .summary-card hr{border-top:1px solid #ffb300}.theme__kimbie .summary-card hr{border-top:1px solid #7f5d38}.summary-card:not(:last-child) hr{margin-bottom:2.5rem}.summary-card:last-child hr{margin-bottom:2rem}.summary-classic{padding:0 1rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.summary-classic[data-ani=true]{-webkit-animation:slide-in-down .2s .3s 1 ease-in both;-moz-animation:slide-in-down .2s .3s 1 ease-in both;-ms-animation:slide-in-down .2s .3s 1 ease-in both;-o-animation:slide-in-down .2s .3s 1 ease-in both;animation:slide-in-down .2s .3s 1 ease-in both}.summary-classic .title{font-size:24px}.summary-classic .title a{font-family:montserrat,sans-serif;font-weight:700;word-break:break-word}.theme__dark .summary-classic .title a{color:#ffd866}.theme__dark .summary-classic .title a:hover,.theme__dark .summary-classic .title a:active,.theme__dark .summary-classic .title a:focus{color:#ff6188}.theme__light .summary-classic .title a{color:#607d8b}.theme__light .summary-classic .title a:hover,.theme__light .summary-classic .title a:active,.theme__light .summary-classic .title a:focus{color:#26a69a}.theme__hacker .summary-classic .title a{color:#a1ad64}.theme__hacker .summary-classic .title a:hover,.theme__hacker .summary-classic .title a:active,.theme__hacker .summary-classic .title a:focus{color:#c7ba00}.theme__solarized .summary-classic .title a{color:#cb4b16}.theme__solarized .summary-classic .title a:hover,.theme__solarized .summary-classic .title a:active,.theme__solarized .summary-classic .title a:focus{color:#268bd2}.theme__kimbie .summary-classic .title a{color:#996329}.theme__kimbie .summary-classic .title a:hover,.theme__kimbie .summary-classic .title a:active,.theme__kimbie .summary-classic .title a:focus{color:#f06431}.theme__dark .summary-classic .subtitle{color:#fcfcfa}.theme__light .summary-classic .subtitle{color:#424242}.theme__hacker .summary-classic .subtitle{color:#cdf5cc}.theme__solarized .summary-classic .subtitle{color:#b58900}.theme__kimbie .summary-classic .subtitle{color:#889b4a}.summary-classic__flex-box{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;margin-top:1rem;margin-bottom:1rem}.summary-classic__flex-box[data-position=left]{-webkit-justify-content:space-between;-moz-justify-content:space-between;-ms-justify-content:space-between;justify-content:space-between;-ms-flex-pack:space-between}.summary-classic__content{width:100%;padding:0 .5rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}.summary-classic__text{margin-top:1rem;line-height:1.7rem}.summary-classic__image[data-ani=true]{-webkit-animation:slide-in-left .2s .6s 1 ease-in both;-moz-animation:slide-in-left .2s .6s 1 ease-in both;-ms-animation:slide-in-left .2s .6s 1 ease-in both;-o-animation:slide-in-left .2s .6s 1 ease-in both;animation:slide-in-left .2s .6s 1 ease-in both}.summary-classic__image-container{border-radius:.25rem;padding:.25rem;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-ms-transition:all .2s ease-out;-o-transition:all .2s ease-out;transition:all .2s ease-out}@media only screen and (max-width:600px){.summary-classic__image-container[data-hwm=true]{display:none}}.summary-classic__image-container[data-position=left]{margin-left:.5rem}.summary-classic__image-container[data-position=right]{margin-right:.5rem}.summary-classic__image-container:hover,.summary-classic__image-container:active,.summary-classic__image-container:focus{-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);-moz-box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);background-color:rgba(125,125,125,.1)}.summary-classic__image-wrapper{max-width:130px;min-width:130px;overflow:hidden;-webkit-align-self:center;-moz-align-self:center;-ms-align-self:center;align-self:center}@media only screen and (max-width:769px){.summary-classic__image-wrapper{max-width:90px;min-width:90px}}.summary-classic__image-wrapper2{height:100%;margin:auto}.theme__dark .summary-classic hr{border-top:1px solid #595b5c}.theme__light .summary-classic hr{border-top:1px solid #ccc}.theme__hacker .summary-classic hr{border-top:1px solid #6b6b6b}.theme__solarized .summary-classic hr{border-top:1px solid #ffb300}.theme__kimbie .summary-classic hr{border-top:1px solid #7f5d38}.summary-classic:not(:last-child) hr{margin-bottom:1.5rem}.summary-classic:last-child hr{display:none}.summary-compact{padding:0 1rem}.summary-compact[data-ani=true]{-webkit-animation:slide-in-down .2s .3s 1 ease-in both;-moz-animation:slide-in-down .2s .3s 1 ease-in both;-ms-animation:slide-in-down .2s .3s 1 ease-in both;-o-animation:slide-in-down .2s .3s 1 ease-in both;animation:slide-in-down .2s .3s 1 ease-in both}.theme__dark .summary-compact .title a{color:#ffd866}.theme__dark .summary-compact .title a:hover,.theme__dark .summary-compact .title a:active,.theme__dark .summary-compact .title a:focus{color:#ff6188}.theme__light .summary-compact .title a{color:#607d8b}.theme__light .summary-compact .title a:hover,.theme__light .summary-compact .title a:active,.theme__light .summary-compact .title a:focus{color:#26a69a}.theme__hacker .summary-compact .title a{color:#a1ad64}.theme__hacker .summary-compact .title a:hover,.theme__hacker .summary-compact .title a:active,.theme__hacker .summary-compact .title a:focus{color:#c7ba00}.theme__solarized .summary-compact .title a{color:#cb4b16}.theme__solarized .summary-compact .title a:hover,.theme__solarized .summary-compact .title a:active,.theme__solarized .summary-compact .title a:focus{color:#268bd2}.theme__kimbie .summary-compact .title a{color:#996329}.theme__kimbie .summary-compact .title a:hover,.theme__kimbie .summary-compact .title a:active,.theme__kimbie .summary-compact .title a:focus{color:#f06431}.theme__dark .summary-compact .subtitle{color:#fcfcfa}.theme__light .summary-compact .subtitle{color:#424242}.theme__hacker .summary-compact .subtitle{color:#cdf5cc}.theme__solarized .summary-compact .subtitle{color:#b58900}.theme__kimbie .summary-compact .subtitle{color:#889b4a}.summary-compact__flexbox{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;margin-top:1rem;margin-bottom:1rem}.summary-compact__meta{padding:1rem 0;overflow-wrap:break-word}.summary-compact__tag{font-size:.8rem;line-height:.8rem;padding:.25rem;margin:.35rem .25rem 0;border:none;border-radius:.2rem;text-transform:capitalize;cursor:pointer}.theme__dark .summary-compact__tag{color:#fcfcfa;background-color:#424242}.theme__light .summary-compact__tag{color:#424242;background-color:#e9e9e9}.theme__hacker .summary-compact__tag{color:#1fff2a;background-color:#2d322d}.theme__solarized .summary-compact__tag{color:#586e75;background-color:#fff9c4}.theme__kimbie .summary-compact__tag{color:#e3b583;background-color:#423523}.summary-compact__tag--wrapper{margin-top:.5rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.theme__dark .summary-compact hr{border-top:1px solid #595b5c}.theme__light .summary-compact hr{border-top:1px solid #ccc}.theme__hacker .summary-compact hr{border-top:1px solid #6b6b6b}.theme__solarized .summary-compact hr{border-top:1px solid #ffb300}.theme__kimbie .summary-compact hr{border-top:1px solid #7f5d38}.swipe{overflow:hidden;visibility:hidden;position:relative}.swipe-wrap{overflow:hidden;position:relative}.swipe-wrap>div{float:left;position:relative;overflow:hidden;object-fit:contain;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.swipe-home>div{float:left;width:100%;position:relative;overflow:hidden;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.swiper-slide{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.swiper-slide[data-align=center]{-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.swiper-slide[data-align=left]{-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}.swiper-slide[data-align=right]{-webkit-align-items:flex-end;-moz-align-items:flex-end;-ms-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end}.switch{position:relative;width:28px;height:14px;margin-top:.7rem;margin-left:1rem}.switch[data-ani=true]{-webkit-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-moz-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-ms-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-o-animation:slide-in-down-little .2s .3s 1 ease-in backwards;animation:slide-in-down-little .2s .3s 1 ease-in backwards}.switch input{opacity:0;width:0;height:0}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.theme__dark .slider{background-color:#403e41}.theme__light .slider{background-color:#bdbdbd}.theme__hacker .slider{background-color:#403e41}.theme__solarized .slider{background-color:#dfd4b1}.theme__kimbie .slider{background-color:#6e583b}.slider:before{position:absolute;content:"";height:11px;width:11px;left:1.72px;bottom:1.72px;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.theme__dark .slider:before{background-color:#fcfcfa}.theme__light .slider:before{background-color:#fcfcfa}.theme__hacker .slider:before{background-color:#fcfcfa}.theme__solarized .slider:before{background-color:#fcfcfa}.theme__kimbie .slider:before{background-color:#fcfcfa}.theme__dark input:checked+.slider{background-color:#ff6188}.theme__light input:checked+.slider{background-color:#ff6188}.theme__hacker input:checked+.slider{background-color:#ff6188}.theme__solarized input:checked+.slider{background-color:#ff6188}.theme__kimbie input:checked+.slider{background-color:#dc3958}.theme__dark input:focus+.slider{box-shadow:0 0 1px #ff6188}.theme__light input:focus+.slider{box-shadow:0 0 1px #ff6188}.theme__hacker input:focus+.slider{box-shadow:0 0 1px #ff6188}.theme__solarized input:focus+.slider{box-shadow:0 0 1px #ff6188}.theme__kimbie input:focus+.slider{box-shadow:0 0 1px #dc3958}input:checked+.slider:before{-webkit-transform:translateX(13px);-moz-transform:translateX(13px);-ms-transform:translateX(13px);transform:translateX(13px)}.slider.round{border-radius:8.5px}.slider.round:before{border-radius:50%}.taxo{margin:2.5rem 0;z-index:5}.taxo-root{position:-webkit-sticky;position:sticky;top:50px}.theme__dark .taxo-root{background-color:#2d2a2e}.theme__light .taxo-root{background-color:#fafafa}.theme__hacker .taxo-root{background-color:#151715}.theme__solarized .taxo-root{background-color:#fdf7e3}.theme__kimbie .taxo-root{background-color:#221a0f}.taxo__title{font-weight:700;font-family:montserrat,sans-serif}.theme__dark .taxo__title{color:#bdbdbd}.theme__dark .taxo__title:hover{color:#ff6188}.theme__light .taxo__title{color:#607d8b}.theme__light .taxo__title:hover{color:#26a69a}.theme__hacker .taxo__title{color:#9c9299}.theme__hacker .taxo__title:hover{color:#c7ba00}.theme__solarized .taxo__title{color:#b58900}.theme__solarized .taxo__title:hover{color:#268bd2}.theme__kimbie .taxo__title{color:#98676a}.theme__kimbie .taxo__title:hover{color:#f06431}.taxo__link{text-decoration:none!important}.taxo__link[data-dir=ltr] .taxo__text{border-top-left-radius:.175rem;border-bottom-left-radius:.175rem}.taxo__link[data-dir=ltr] .taxo__num{padding:.125rem .25rem;border-top-right-radius:.175rem;border-bottom-right-radius:.175rem}.taxo__link[data-dir=rtl] .taxo__text{border-top-right-radius:.175rem;border-bottom-right-radius:.175rem}.taxo__link[data-dir=rtl] .taxo__num{padding:.125rem .25rem;border-top-left-radius:.175rem;border-bottom-left-radius:.175rem}.taxo__text:hover,.taxo__text:active,.taxo__text:focus{text-decoration:underline!important}.theme__dark .taxo__text{color:inherit}.theme__light .taxo__text{color:inherit}.theme__hacker .taxo__text{color:inherit}.theme__solarized .taxo__text{color:inherit}.theme__kimbie .taxo__text{color:inherit}.theme__dark .taxo__num{color:#fcfcfa;background-color:#212121}.theme__light .taxo__num{color:#424242;background-color:#c8c8c8}.theme__hacker .taxo__num{color:#e3cd26;background-color:#252526}.theme__solarized .taxo__num{color:#268bd2;background-color:#f8e7b0}.theme__kimbie .taxo__num{color:#d3af86;background-color:#6e583b}.taxo .title{display:block;margin:0;margin-right:.5rem;margin-bottom:.25rem}.taxo .tag{margin:0;margin-right:.25rem;margin-bottom:.25rem;font-size:.8rem;display:inline-block}.theme__dark .taxo .tag{color:#bdbdbd}.theme__light .taxo .tag{color:#607d8b}.theme__hacker .taxo .tag{color:#9c9299}.theme__solarized .taxo .tag{color:#b58900}.theme__kimbie .taxo .tag{color:#98676a}.taxo .is-tags{border-radius:.175rem}.theme__dark .taxo .is-tags{color:#78dce8;background-color:#424242}.theme__light .taxo .is-tags{color:#424242;background-color:#e9e9e9}.theme__hacker .taxo .is-tags{color:#78dce8;background-color:#2d322d}.theme__solarized .taxo .is-tags{color:#916e00;background-color:#fff9c4}.theme__kimbie .taxo .is-tags{color:#dc3958;background-color:#423523}.taxo .is-tags[data-dir=ltr]{padding:.125rem 0 .125rem .25rem}.taxo .is-tags[data-dir=rtl]{padding:.125rem .25rem .125rem 0}.taxo .is-categories{border-radius:.175rem}.theme__dark .taxo .is-categories{color:#ab9df2;background-color:#424242}.theme__light .taxo .is-categories{color:#424242;background-color:#e9e9e9}.theme__hacker .taxo .is-categories{color:#ab9df2;background-color:#2d322d}.theme__solarized .taxo .is-categories{color:#916e00;background-color:#ffe0b2}.theme__kimbie .taxo .is-categories{color:#8ab1b0;background-color:#423523}.taxo .is-categories[data-dir=ltr]{padding:.125rem 0 .125rem .25rem}.taxo .is-categories[data-dir=rtl]{padding:.125rem .25rem .125rem 0}.taxo .is-series{border-radius:.175rem}.theme__dark .taxo .is-series{color:#ea9c77;background-color:#424242}.theme__light .taxo .is-series{color:#424242;background-color:#e9e9e9}.theme__hacker .taxo .is-series{color:#ea9c77;background-color:#2d322d}.theme__solarized .taxo .is-series{color:#916e00;background-color:#dcedc8}.theme__kimbie .taxo .is-series{color:#889b4a;background-color:#423523}.taxo .is-series[data-dir=ltr]{padding:.125rem 0 .125rem .25rem}.taxo .is-series[data-dir=rtl]{padding:.125rem .25rem .125rem 0}.toc{width:100%;max-width:250px;position:fixed;top:7rem;font-size:.85rem;padding-left:.5rem;z-index:4;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.toc[data-ani=true]{-webkit-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-moz-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-ms-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-o-animation:slide-in-down-little .2s .3s 1 ease-in backwards;animation:slide-in-down-little .2s .3s 1 ease-in backwards}.toc #TableOfContents{position:relative}.toc__flexbox[data-position=fixed]{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;position:fixed}.toc__flexbox[data-position=fixed] .toc__title{margin-top:.75rem;margin-left:.5rem}.toc__flexbox[data-position=absolute]{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;position:absolute}.toc__flexbox--outer[data-position=fixed]{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;top:4.2rem;left:1rem;position:absolute}@media only screen and (max-width:1300px){.toc__flexbox--outer[data-position=fixed]{display:none}}.toc__flexbox--outer[data-position=fixed][data-ani=true]{-webkit-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-moz-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-ms-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-o-animation:slide-in-down-little .2s .3s 1 ease-in backwards;animation:slide-in-down-little .2s .3s 1 ease-in backwards}.toc__flexbox--outer[data-dir=ltr]{top:4.2rem;left:1rem}.toc__flexbox--outer[data-dir=rtl]{top:4.2rem;right:1rem}.toc__flexbox--outer[data-dir=rtl] .toc__title{margin-top:.75rem;margin-left:.5rem}.toc__title{font-size:.9rem;margin-top:.5rem}.toc__title[data-ani=true]{-webkit-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-moz-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-ms-animation:slide-in-down-little .2s .3s 1 ease-in backwards;-o-animation:slide-in-down-little .2s .3s 1 ease-in backwards;animation:slide-in-down-little .2s .3s 1 ease-in backwards}.theme__dark .toc__title{color:#727072}.theme__light .toc__title{color:#727072}.theme__hacker .toc__title{color:#727072}.theme__solarized .toc__title{color:#727072}.theme__kimbie .toc__title{color:#7f5d38}@media only screen and (max-width:1300px){.toc__title--outer{display:none}}.theme__dark .toc[data-dir=ltr][data-folding=true] a{color:#727072;position:relative}.theme__dark .toc[data-dir=ltr][data-folding=true] a::before{content:'';height:100%;left:-1rem;margin-top:-1px;position:absolute;width:2px;background-color:#727072}.theme__dark .toc[data-dir=ltr][data-folding=true] a::before:last-child{background-color:transparent}.theme__dark .toc[data-dir=ltr][data-folding=true] .active{color:#ff6188;font-weight:700}.theme__dark .toc[data-dir=ltr][data-folding=true] .active::before{background-color:#ff6188}.theme__light .toc[data-dir=ltr][data-folding=true] a{color:#727072;position:relative}.theme__light .toc[data-dir=ltr][data-folding=true] a::before{content:'';height:100%;left:-1rem;margin-top:-1px;position:absolute;width:2px;background-color:#727072}.theme__light .toc[data-dir=ltr][data-folding=true] a::before:last-child{background-color:transparent}.theme__light .toc[data-dir=ltr][data-folding=true] .active{color:#26a69a;font-weight:700}.theme__light .toc[data-dir=ltr][data-folding=true] .active::before{background-color:#26a69a}.theme__hacker .toc[data-dir=ltr][data-folding=true] a{color:#727072;position:relative}.theme__hacker .toc[data-dir=ltr][data-folding=true] a::before{content:'';height:100%;left:-1rem;margin-top:-1px;position:absolute;width:2px;background-color:#727072}.theme__hacker .toc[data-dir=ltr][data-folding=true] a::before:last-child{background-color:transparent}.theme__hacker .toc[data-dir=ltr][data-folding=true] .active{color:#e08c48;font-weight:700}.theme__hacker .toc[data-dir=ltr][data-folding=true] .active::before{background-color:#e08c48}.theme__solarized .toc[data-dir=ltr][data-folding=true] a{color:#727072;position:relative}.theme__solarized .toc[data-dir=ltr][data-folding=true] a::before{content:'';height:100%;left:-1rem;margin-top:-1px;position:absolute;width:2px;background-color:#727072}.theme__solarized .toc[data-dir=ltr][data-folding=true] a::before:last-child{background-color:transparent}.theme__solarized .toc[data-dir=ltr][data-folding=true] .active{color:#268bd2;font-weight:700}.theme__solarized .toc[data-dir=ltr][data-folding=true] .active::before{background-color:#268bd2}.theme__kimbie .toc[data-dir=ltr][data-folding=true] a{color:#a57a4c;position:relative}.theme__kimbie .toc[data-dir=ltr][data-folding=true] a::before{content:'';height:100%;left:-1rem;margin-top:-1px;position:absolute;width:2px;background-color:#a57a4c}.theme__kimbie .toc[data-dir=ltr][data-folding=true] a::before:last-child{background-color:transparent}.theme__kimbie .toc[data-dir=ltr][data-folding=true] .active{color:#889b4a;font-weight:700}.theme__kimbie .toc[data-dir=ltr][data-folding=true] .active::before{background-color:#889b4a}.theme__dark .toc[data-dir=ltr][data-folding=false] a{color:#727072}.theme__dark .toc[data-dir=ltr][data-folding=false] a.active{color:#ff6188}.theme__dark .toc[data-dir=ltr][data-folding=false] a.active::before{background-color:#ff6188;content:'';height:.95rem;left:-1rem;margin-top:2px;position:absolute;width:2px}.theme__dark .toc[data-dir=ltr][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__light .toc[data-dir=ltr][data-folding=false] a{color:#727072}.theme__light .toc[data-dir=ltr][data-folding=false] a.active{color:#26a69a}.theme__light .toc[data-dir=ltr][data-folding=false] a.active::before{background-color:#26a69a;content:'';height:.95rem;left:-1rem;margin-top:2px;position:absolute;width:2px}.theme__light .toc[data-dir=ltr][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__hacker .toc[data-dir=ltr][data-folding=false] a{color:#727072}.theme__hacker .toc[data-dir=ltr][data-folding=false] a.active{color:#e08c48}.theme__hacker .toc[data-dir=ltr][data-folding=false] a.active::before{background-color:#e08c48;content:'';height:.95rem;left:-1rem;margin-top:2px;position:absolute;width:2px}.theme__hacker .toc[data-dir=ltr][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__solarized .toc[data-dir=ltr][data-folding=false] a{color:#727072}.theme__solarized .toc[data-dir=ltr][data-folding=false] a.active{color:#268bd2}.theme__solarized .toc[data-dir=ltr][data-folding=false] a.active::before{background-color:#268bd2;content:'';height:.95rem;left:-1rem;margin-top:2px;position:absolute;width:2px}.theme__solarized .toc[data-dir=ltr][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__kimbie .toc[data-dir=ltr][data-folding=false] a{color:#a57a4c}.theme__kimbie .toc[data-dir=ltr][data-folding=false] a.active{color:#889b4a}.theme__kimbie .toc[data-dir=ltr][data-folding=false] a.active::before{background-color:#889b4a;content:'';height:.95rem;left:-1rem;margin-top:2px;position:absolute;width:2px}.theme__kimbie .toc[data-dir=ltr][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__dark .toc[data-dir=ltr] ul li li{margin-left:1rem;color:#fcfcfa}.theme__light .toc[data-dir=ltr] ul li li{margin-left:1rem;color:#424242}.theme__hacker .toc[data-dir=ltr] ul li li{margin-left:1rem;color:#a1ad64}.theme__solarized .toc[data-dir=ltr] ul li li{margin-left:1rem;color:#b58900}.theme__kimbie .toc[data-dir=ltr] ul li li{margin-left:1rem;color:#a57a4c}.toc[data-dir=rtl][data-folding=true] a{color:inherit;position:relative}.toc[data-dir=rtl][data-folding=true] a::before{content:'';height:100%;right:-1rem;margin-top:-1px;position:absolute;width:2px}.theme__dark .toc[data-dir=rtl][data-folding=true] a::before{background-color:#727072}.theme__light .toc[data-dir=rtl][data-folding=true] a::before{background-color:#727072}.theme__hacker .toc[data-dir=rtl][data-folding=true] a::before{background-color:#727072}.theme__solarized .toc[data-dir=rtl][data-folding=true] a::before{background-color:#727072}.theme__kimbie .toc[data-dir=rtl][data-folding=true] a::before{background-color:#a57a4c}.toc[data-dir=rtl][data-folding=true] a::before:last-child{background-color:transparent}.theme__dark .toc[data-dir=rtl][data-folding=true] .active{color:#ff6188;font-weight:700}.theme__dark .toc[data-dir=rtl][data-folding=true] .active::before{background-color:#ff6188}.theme__light .toc[data-dir=rtl][data-folding=true] .active{color:#26a69a;font-weight:700}.theme__light .toc[data-dir=rtl][data-folding=true] .active::before{background-color:#26a69a}.theme__hacker .toc[data-dir=rtl][data-folding=true] .active{color:#c7ba00;font-weight:700}.theme__hacker .toc[data-dir=rtl][data-folding=true] .active::before{background-color:#e08c48}.theme__solarized .toc[data-dir=rtl][data-folding=true] .active{color:#268bd2;font-weight:700}.theme__solarized .toc[data-dir=rtl][data-folding=true] .active::before{background-color:#268bd2}.theme__kimbie .toc[data-dir=rtl][data-folding=true] .active{color:#f06431;font-weight:700}.theme__kimbie .toc[data-dir=rtl][data-folding=true] .active::before{background-color:#889b4a}.theme__dark .toc[data-dir=rtl][data-folding=false] a{color:#727072}.theme__dark .toc[data-dir=rtl][data-folding=false] a.active{color:#ff6188}.theme__dark .toc[data-dir=rtl][data-folding=false] a.active::before{background-color:#ff6188;content:'';height:.95rem;right:-1rem;margin-top:2px;position:absolute;width:2px}.theme__dark .toc[data-dir=rtl][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__light .toc[data-dir=rtl][data-folding=false] a{color:#727072}.theme__light .toc[data-dir=rtl][data-folding=false] a.active{color:#26a69a}.theme__light .toc[data-dir=rtl][data-folding=false] a.active::before{background-color:#26a69a;content:'';height:.95rem;right:-1rem;margin-top:2px;position:absolute;width:2px}.theme__light .toc[data-dir=rtl][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__hacker .toc[data-dir=rtl][data-folding=false] a{color:#727072}.theme__hacker .toc[data-dir=rtl][data-folding=false] a.active{color:#e08c48}.theme__hacker .toc[data-dir=rtl][data-folding=false] a.active::before{background-color:#e08c48;content:'';height:.95rem;right:-1rem;margin-top:2px;position:absolute;width:2px}.theme__hacker .toc[data-dir=rtl][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__solarized .toc[data-dir=rtl][data-folding=false] a{color:#727072}.theme__solarized .toc[data-dir=rtl][data-folding=false] a.active{color:#268bd2}.theme__solarized .toc[data-dir=rtl][data-folding=false] a.active::before{background-color:#268bd2;content:'';height:.95rem;right:-1rem;margin-top:2px;position:absolute;width:2px}.theme__solarized .toc[data-dir=rtl][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__kimbie .toc[data-dir=rtl][data-folding=false] a{color:#a57a4c}.theme__kimbie .toc[data-dir=rtl][data-folding=false] a.active{color:#889b4a}.theme__kimbie .toc[data-dir=rtl][data-folding=false] a.active::before{background-color:#889b4a;content:'';height:.95rem;right:-1rem;margin-top:2px;position:absolute;width:2px}.theme__kimbie .toc[data-dir=rtl][data-folding=false] a.active::before:last-child{background-color:transparent}.theme__dark .toc[data-dir=rtl] ul li li{margin-right:1rem;color:#fcfcfa}.theme__light .toc[data-dir=rtl] ul li li{margin-right:1rem;color:#424242}.theme__hacker .toc[data-dir=rtl] ul li li{margin-right:1rem;color:#a1ad64}.theme__solarized .toc[data-dir=rtl] ul li li{margin-right:1rem;color:#b58900}.theme__kimbie .toc[data-dir=rtl] ul li li{margin-right:1rem;color:#a57a4c}.theme__dark .toc ul a{color:#90a4ae}.theme__dark .toc ul a.active{color:#ff6188}.theme__light .toc ul a{color:#727072}.theme__light .toc ul a.active{color:#26a69a}.theme__hacker .toc ul a{color:#727072}.theme__hacker .toc ul a.active{color:#e08c48}.theme__solarized .toc ul a{color:#727072}.theme__solarized .toc ul a.active{color:#268bd2}.theme__kimbie .toc ul a{color:#a57a4c}.theme__kimbie .toc ul a.active{color:#889b4a}.toc__outer{padding-right:1rem;padding-left:2.5rem;max-width:calc((100vw - 980px)/2)}@media only screen and (max-width:1300px){.toc__outer{display:none}}.expand__content #TableOfContents ul{list-style-type:circle}.tooltipped{position:relative}.tooltipped:after{position:absolute;z-index:1000000;display:none;padding:5px 8px;font:11px/1.5 lato,work sans,helvetica,tahoma,geneva,arial,sans-serif;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:rgba(0,0,0,.8);border-radius:3px;-webkit-font-smoothing:subpixel-antialiased}.tooltipped:before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:rgba(0,0,0,.8);pointer-events:none;content:"";border:5px solid transparent}.tooltipped:hover:before,.tooltipped:hover:after,.tooltipped:active:before,.tooltipped:active:after,.tooltipped:focus:before,.tooltipped:focus:after{display:inline-block;text-decoration:none}.tooltipped-s:after,.tooltipped-se:after,.tooltipped-sw:after{top:100%;right:50%;margin-top:5px}.tooltipped-s:before,.tooltipped-se:before,.tooltipped-sw:before{top:auto;right:50%;bottom:-5px;margin-right:-5px;border-bottom-color:rgba(0,0,0,.8)}.tooltipped-se:after{right:auto;left:50%;margin-left:-15px}.tooltipped-sw:after{margin-right:-15px}.tooltipped-n:after,.tooltipped-ne:after,.tooltipped-nw:after{right:50%;bottom:100%;margin-bottom:5px}.tooltipped-n:before,.tooltipped-ne:before,.tooltipped-nw:before{top:-5px;right:50%;bottom:auto;margin-right:-5px;border-top-color:rgba(0,0,0,.8)}.tooltipped-ne:after{right:auto;left:50%;margin-left:-15px}.tooltipped-nw:after{margin-right:-15px}.tooltipped-s:after,.tooltipped-n:after{transform:translateX(50%)}.tooltipped-w:after{right:100%;bottom:50%;margin-right:5px;transform:translateY(50%)}.tooltipped-w:before{top:50%;bottom:50%;left:-5px;margin-top:-5px;border-left-color:rgba(0,0,0,.8)}.tooltipped-e:after{bottom:50%;left:100%;margin-left:5px;transform:translateY(50%)}.tooltipped-e:before{top:50%;right:-5px;bottom:50%;margin-top:-5px;border-right-color:rgba(0,0,0,.8)}.whoami{padding:0 1rem;margin:1rem 0;border-radius:.25rem;width:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}@media only screen and (max-width:769px){.whoami{-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.whoami__contents{width:100%;margin-top:.5rem;padding:0 1rem}@media only screen and (max-width:769px){.whoami__contents{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}}.whoami__image{width:100%;height:100%;object-fit:contain;border-radius:.25rem;-webkit-box-shadow:0 2px 3px 0 rgba(0,0,0,.25);-moz-box-shadow:0 2px 3px 0 rgba(0,0,0,.25);box-shadow:0 2px 3px 0 rgba(0,0,0,.25)}.whoami__image-wrapper{min-width:150px;max-width:150px;height:auto;margin-right:1rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.whoami__title{font-size:1.5rem;font-weight:700;font-family:montserrat,sans-serif;margin-bottom:.5rem;padding-bottom:.5rem}.theme__dark .whoami__title{color:#eee;text-decoration:underline double #ffa7c4}.theme__light .whoami__title{color:#344952;text-decoration:underline double #607d8b}.theme__hacker .whoami__title{color:#d1d1d1;text-decoration:underline double #e08c48}.theme__solarized .whoami__title{color:#344952;text-decoration:underline double #b58900}.theme__kimbie .whoami__title{color:#d3af86;text-decoration:underline double #dc3958}.whoami__desc{font-size:1rem;padding-left:.25rem}@media only screen and (max-width:769px){.whoami__desc{width:75%;text-align:center!important}}.theme__dark .whoami__desc{color:#eee}.theme__light .whoami__desc{color:#344952}.theme__hacker .whoami__desc{color:#d1d1d1}.theme__solarized .whoami__desc{color:#344952}.theme__kimbie .whoami__desc{color:#d3af86}.whoami__gutter{height:2rem}.whoami__social{margin-top:.5rem}.theme__dark .whoami__social a{text-decoration:none;color:#bdbdbd}.theme__dark .whoami__social a:hover{color:#f0f0f0;-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.theme__light .whoami__social a{text-decoration:none;color:#777}.theme__light .whoami__social a:hover{color:#444;-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.theme__hacker .whoami__social a{text-decoration:none;color:#9e9e9e}.theme__hacker .whoami__social a:hover{color:#d1d1d1;-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.theme__solarized .whoami__social a{text-decoration:none;color:#637c84}.theme__solarized .whoami__social a:hover{color:#4d6066;-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.theme__kimbie .whoami__social a{text-decoration:none;color:#ccc}.theme__kimbie .whoami__social a:hover{color:#fff;-webkit-transition:color .2s ease;-moz-transition:color .2s ease;-ms-transition:color .2s ease;-o-transition:color .2s ease;transition:color .2s ease}.whoami__written-by{font-size:.9rem;font-family:montserrat,sans-serif;opacity:.75}.theme__dark .whoami__written-by{color:#eee}.theme__light .whoami__written-by{color:#344952}.theme__hacker .whoami__written-by{color:#d1d1d1}.theme__solarized .whoami__written-by{color:#344952}.theme__kimbie .whoami__written-by{color:#d3af86}.whoami-hr{border-radius:.5rem}.busuanzi{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;width:250px}.busuanzi__item{padding:.125rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.busuanzi__item--label{font-size:12.8px;padding:.125rem 0;font-family:montserrat,sans-serif;font-style:italic}.busuanzi__item--number{font-size:16.8px;font-weight:700}#busuanzi_value_page_pv{margin:0 .1rem 0 .15rem}.donation{margin:2.5rem 0;position:relative}.donation__icons{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.donation__icons a{text-decoration:none!important}.donation__message{padding:.5rem;font-size:18px;line-height:18px;font-weight:700;font-family:montserrat,sans-serif;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.donation__item{font-family:montserrat,sans-serif;font-size:.8rem;cursor:pointer;border-radius:.25rem;margin:.25rem;text-transform:capitalize;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.theme__dark .donation__item[data-type=donation] svg{color:#dbdbdb;background-color:#525252;-webkit-box-shadow:1px 1px 3px 0 #888;-moz-box-shadow:1px 1px 3px 0 #888;box-shadow:1px 1px 3px 0 #888}.theme__light .donation__item[data-type=donation] svg{color:#fcfcfa;background-color:#eceff1;-webkit-box-shadow:1px 1px 3px 0 #727072;-moz-box-shadow:1px 1px 3px 0 #727072;box-shadow:1px 1px 3px 0 #727072}.theme__hacker .donation__item[data-type=donation] svg{color:#dbdbdb;background-color:#43454d;-webkit-box-shadow:1px 1px 3px 0 #888;-moz-box-shadow:1px 1px 3px 0 #888;box-shadow:1px 1px 3px 0 #888}.theme__solarized .donation__item[data-type=donation] svg{color:#f9fbe7;background-color:#c5e0df;-webkit-box-shadow:1px 1px 3px 0 #727072;-moz-box-shadow:1px 1px 3px 0 #727072;box-shadow:1px 1px 3px 0 #727072}.theme__kimbie .donation__item[data-type=donation] svg{color:#d3af86;background-color:#52493c;-webkit-box-shadow:1px 1px 3px 0 #828282;-moz-box-shadow:1px 1px 3px 0 #828282;box-shadow:1px 1px 3px 0 #828282}.theme__dark .donation__item[data-type=share] svg{color:#dbdbdb;background-color:#464448;-webkit-box-shadow:1px 1px 3px 0 #888;-moz-box-shadow:1px 1px 3px 0 #888;box-shadow:1px 1px 3px 0 #888}.theme__light .donation__item[data-type=share] svg{color:#fcfcfa;background-color:#90a4ae;-webkit-box-shadow:1px 1px 3px 0 #727072;-moz-box-shadow:1px 1px 3px 0 #727072;box-shadow:1px 1px 3px 0 #727072}.theme__hacker .donation__item[data-type=share] svg{color:#dbdbdb;background-color:#383b4c;-webkit-box-shadow:1px 1px 3px 0 #888;-moz-box-shadow:1px 1px 3px 0 #888;box-shadow:1px 1px 3px 0 #888}.theme__solarized .donation__item[data-type=share] svg{color:#f9fbe7;background-color:#99907a;-webkit-box-shadow:1px 1px 3px 0 #727072;-moz-box-shadow:1px 1px 3px 0 #727072;box-shadow:1px 1px 3px 0 #727072}.theme__kimbie .donation__item[data-type=share] svg{color:#d3af86;background-color:#403c38;-webkit-box-shadow:1px 1px 3px 0 #828282;-moz-box-shadow:1px 1px 3px 0 #828282;box-shadow:1px 1px 3px 0 #828282}.donation__item svg{padding:.375rem;border-radius:.25rem;margin-right:.25rem;-webkit-transition:transform .15s ease-in;-moz-transition:transform .15s ease-in;-ms-transition:transform .15s ease-in;-o-transition:transform .15s ease-in;transition:transform .15s ease-in}.donation__item svg[data-name=douban]{color:#fff}.donation__item svg[data-name=douban]:hover,.donation__item svg[data-name=douban]:active,.donation__item svg[data-name=douban]:focus{background-color:#072}.donation__item svg[data-name=facebook]{color:#fff}.donation__item svg[data-name=facebook]:hover,.donation__item svg[data-name=facebook]:active,.donation__item svg[data-name=facebook]:focus{background-color:#1877f2}.donation__item svg[data-name=twitter]{color:#fff}.donation__item svg[data-name=twitter]:hover,.donation__item svg[data-name=twitter]:active,.donation__item svg[data-name=twitter]:focus{background-color:#1da1f2}.donation__item svg[data-name=reddit]{color:#fff}.donation__item svg[data-name=reddit]:hover,.donation__item svg[data-name=reddit]:active,.donation__item svg[data-name=reddit]:focus{background-color:#ff4500}.donation__item svg[data-name=tumblr]{color:#fff}.donation__item svg[data-name=tumblr]:hover,.donation__item svg[data-name=tumblr]:active,.donation__item svg[data-name=tumblr]:focus{background-color:#36465d}.donation__item svg[data-name=linkedin]{color:#fff}.donation__item svg[data-name=linkedin]:hover,.donation__item svg[data-name=linkedin]:active,.donation__item svg[data-name=linkedin]:focus{background-color:#0077b5}.donation__item svg[data-name=weibo]{color:#fff}.donation__item svg[data-name=weibo]:hover,.donation__item svg[data-name=weibo]:active,.donation__item svg[data-name=weibo]:focus{background-color:#e6162d}.donation__item svg[data-name=line]{color:#fff}.donation__item svg[data-name=line]:hover,.donation__item svg[data-name=line]:active,.donation__item svg[data-name=line]:focus{background-color:#00c300}.donation__item svg[data-name=telegram]{color:#fff}.donation__item svg[data-name=telegram]:hover,.donation__item svg[data-name=telegram]:active,.donation__item svg[data-name=telegram]:focus{background-color:#2ca5e0}.donation__item svg[data-name=whatsapp]{color:#fff}.donation__item svg[data-name=whatsapp]:hover,.donation__item svg[data-name=whatsapp]:active,.donation__item svg[data-name=whatsapp]:focus{background-color:#25d366}.donation__item svg:hover,.donation__item svg:active,.donation__item svg:focus{-webkit-transform:translateY(-.25rem);-moz-transform:translateY(-.25rem);-ms-transform:translateY(-.25rem);transform:translateY(-.25rem)}.donation__dropup{position:relative;height:100%}@media only screen and (max-width:769px){.donation__dropup{position:static}}.donation__dropup--content{display:none;position:absolute;bottom:100%;z-index:1;min-width:250px;max-width:350px;height:auto;margin-bottom:.25rem;border-radius:.25rem}.donation__dropup--content img{margin:auto}@media only screen and (max-width:769px){.donation__dropup--content{left:50%;transform:translate(-50%)}}.theme__dark .donation__dropup--content{border:1px solid #727072;background-color:#595b5c}.theme__light .donation__dropup--content{border:1px solid #bdbdbd;background-color:#fafafa}.theme__hacker .donation__dropup--content{border:1px solid #464c46;background-color:#212421}.theme__solarized .donation__dropup--content{border:1px solid #f9eaba;background-color:#fafafa}.theme__kimbie .donation__dropup--content{border:1px solid #5e452b;background-color:#6e583b}.donation__dropup:hover .donation__dropup--content{display:block}.box{font-size:.925rem;font-family:montserrat,sans-serif;word-break:keep-all;padding:.5rem;margin:2rem 0;border-radius:.5rem}.theme__dark .box{border:1px solid #616161;background-color:#403e41}.theme__light .box{border:1px solid #aaa;background-color:#eee}.theme__hacker .box{border:1px solid #6b6b6b;background-color:#252526}.theme__solarized .box{border:1px solid #b58900;background-color:#f9fbe7}.theme__kimbie .box{border:1px solid #6e583b;background-color:rgba(124,80,33,.4)}.modal__overlay{z-index:16;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.modal__container{background-color:transparent;border-radius:.25rem;overflow-y:auto;box-sizing:border-box;position:relative}.modal__content{margin:auto;position:relative}.modal__header{position:absolute;top:0;width:100%;height:50px;background:rgba(0,0,0,.45)}.modal__caption{position:absolute;bottom:0;left:50%;width:100%;background:rgba(0,0,0,.45);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:translateX(-50%);-moz-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.theme__dark .modal__caption{color:#bdbdbd}.theme__light .modal__caption{color:#727072}.theme__hacker .modal__caption{color:#9e9e9e}.theme__solarized .modal__caption{color:#b58900}.theme__kimbie .modal__caption{color:#d3af86}.modal__caption--text{text-align:center;font-family:montserrat,sans-serif;font-size:14px;padding:.5rem;width:40%;height:auto;margin:0 auto}.modal__paging{position:absolute;top:0;left:0;width:100px;padding:.8rem;height:auto;font-family:montserrat,sans-serif;font-size:16px;background:0 0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.theme__dark .modal__paging{color:#bdbdbd}.theme__light .modal__paging{color:#727072}.theme__hacker .modal__paging{color:#9e9e9e}.theme__solarized .modal__paging{color:#b58900}.theme__kimbie .modal__paging{color:#d3af86}.modal__icon{margin:0;padding:.4rem;position:absolute;overflow:hidden;cursor:pointer;border-radius:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .modal__toolbar{color:#bdbdbd}.theme__dark .modal__toolbar:hover,.theme__dark .modal__toolbar:active,.theme__dark .modal__toolbar:focus{color:#82aaff;background:rgba(0,0,0,.4)}.theme__light .modal__toolbar{color:#727072}.theme__light .modal__toolbar:hover,.theme__light .modal__toolbar:active,.theme__light .modal__toolbar:focus{color:#607d8b;background:rgba(0,0,0,.4)}.theme__hacker .modal__toolbar{color:#9e9e9e}.theme__hacker .modal__toolbar:hover,.theme__hacker .modal__toolbar:active,.theme__hacker .modal__toolbar:focus{color:#e3cd26;background:rgba(0,0,0,.4)}.theme__solarized .modal__toolbar{color:#b58900}.theme__solarized .modal__toolbar:hover,.theme__solarized .modal__toolbar:active,.theme__solarized .modal__toolbar:focus{color:#cb4b16;background:rgba(0,0,0,.4)}.theme__kimbie .modal__toolbar{color:#d3af86}.theme__kimbie .modal__toolbar:hover,.theme__kimbie .modal__toolbar:active,.theme__kimbie .modal__toolbar:focus{color:#f06431;background:rgba(0,0,0,.4)}.modal__toolbar--close{top:.4rem;right:.25rem}.modal__toolbar--full{top:.4rem;right:2.8rem}.modal__toolbar--normal{top:.4rem;right:2.8rem}.theme__dark .modal__arrow{color:#bdbdbd;background:rgba(0,0,0,.45)}.theme__dark .modal__arrow:hover,.theme__dark .modal__arrow:active,.theme__dark .modal__arrow:focus{color:#82aaff;background:rgba(0,0,0,.5)}.theme__light .modal__arrow{color:#727072;background:rgba(0,0,0,.45)}.theme__light .modal__arrow:hover,.theme__light .modal__arrow:active,.theme__light .modal__arrow:focus{color:#607d8b;background:rgba(0,0,0,.5)}.theme__hacker .modal__arrow{color:#9e9e9e;background:rgba(0,0,0,.45)}.theme__hacker .modal__arrow:hover,.theme__hacker .modal__arrow:active,.theme__hacker .modal__arrow:focus{color:#e3cd26;background:rgba(0,0,0,.5)}.theme__solarized .modal__arrow{color:#b58900;background:rgba(0,0,0,.45)}.theme__solarized .modal__arrow:hover,.theme__solarized .modal__arrow:active,.theme__solarized .modal__arrow:focus{color:#cb4b16;background:rgba(0,0,0,.5)}.theme__kimbie .modal__arrow{color:#d3af86;background:rgba(0,0,0,.45)}.theme__kimbie .modal__arrow:hover,.theme__kimbie .modal__arrow:active,.theme__kimbie .modal__arrow:focus{color:#f06431;background:rgba(0,0,0,.5)}.modal__arrow--left{left:.5rem;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.modal__arrow--right{right:.5rem;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.modal__cite{width:350px;height:500px;white-space:nowrap;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}@media only screen and (max-width:600px){.modal__cite{width:100%}}.theme__dark .modal__cite{border:4px solid #595b5c;background-color:#2d2a2e;scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__dark .modal__cite::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark .modal__cite::-webkit-scrollbar-thumb{background:#888}.theme__dark .modal__cite::-webkit-scrollbar-track{background:#eee}.theme__light .modal__cite{border:4px solid #ccc;background-color:#fafafa;scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__light .modal__cite::-webkit-scrollbar{width:.45em;height:.45em}.theme__light .modal__cite::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light .modal__cite::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker .modal__cite{border:4px solid #6b6b6b;background-color:#151715;scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__hacker .modal__cite::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker .modal__cite::-webkit-scrollbar-thumb{background:#616161}.theme__hacker .modal__cite::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized .modal__cite{border:4px solid #ffb300;background-color:#fdf7e3;scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__solarized .modal__cite::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized .modal__cite::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized .modal__cite::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie .modal__cite{border:4px solid #7f5d38;background-color:#221a0f;scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.theme__kimbie .modal__cite::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie .modal__cite::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie .modal__cite::-webkit-scrollbar-track{background:#d3af86}.modal__cite--exist{width:100%;padding:4rem .5rem 2.5rem;font-size:1rem;overflow-x:auto}.theme__dark .modal__cite--exist{background-color:#2d2a2e;scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__dark .modal__cite--exist::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark .modal__cite--exist::-webkit-scrollbar-thumb{background:#888}.theme__dark .modal__cite--exist::-webkit-scrollbar-track{background:#eee}.theme__light .modal__cite--exist{background-color:#fafafa;scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__light .modal__cite--exist::-webkit-scrollbar{width:.45em;height:.45em}.theme__light .modal__cite--exist::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light .modal__cite--exist::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker .modal__cite--exist{background-color:#151715;scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__hacker .modal__cite--exist::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker .modal__cite--exist::-webkit-scrollbar-thumb{background:#616161}.theme__hacker .modal__cite--exist::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized .modal__cite--exist{background-color:#fdf7e3;scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__solarized .modal__cite--exist::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized .modal__cite--exist::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized .modal__cite--exist::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie .modal__cite--exist{background-color:#221a0f;scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.theme__kimbie .modal__cite--exist::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie .modal__cite--exist::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie .modal__cite--exist::-webkit-scrollbar-track{background:#d3af86}.modal__cite--notexist{padding-top:4rem}.modal__copy{position:absolute;left:4px;bottom:56px;width:60px;height:30px}@keyframes mmfadeIn{from{opacity:0}to{opacity:1}}@keyframes mmfadeOut{from{opacity:1}to{opacity:0}}.micromodal-slide{display:none}.micromodal-slide.is-open{display:block}.micromodal-slide[aria-hidden=false] .modal__overlay{animation:mmfadeIn .3s cubic-bezier(0,0,0.2,1)}.micromodal-slide[aria-hidden=false] .modal__container{animation:mmfadeIn .3s cubic-bezier(0,0,0.2,1)}.micromodal-slide[aria-hidden=true] .modal__overlay{animation:mmfadeOut .3s cubic-bezier(0,0,0.2,1)}.micromodal-slide[aria-hidden=true] .modal__container{animation:mmfadeOut .3s cubic-bezier(0,0,0.2,1)}.micromodal-slide .modal__container,.micromodal-slide .modal__overlay{will-change:transform}.codetab{position:relative}.codetab__links{position:absolute;top:0;left:0;height:30px;z-index:11;border-top-left-radius:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}.theme__dark .codetab__links{background-color:#011220}.theme__light .codetab__links{background-color:#e2e6e9}.theme__hacker .codetab__links{background-color:#1c201c}.theme__solarized .codetab__links{background-color:#faedc5}.theme__kimbie .codetab__links{background-color:#412f16}.codetab__link{height:30px;border:none;outline:none;cursor:pointer;font-size:13.8px;font-family:montserrat,sans-serif;text-transform:capitalize;padding:.25rem .5rem;-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;-ms-transition:all .2s ease-in;-o-transition:all .2s ease-in;transition:all .2s ease-in}.codetab__link:first-child{border-top-left-radius:.25rem}.theme__dark .codetab__link{color:#fcfcfa;border-top:1px solid transparent}.theme__dark .codetab__link.active{border-top:1px solid}.theme__light .codetab__link{color:#555;border-top:1px solid transparent}.theme__light .codetab__link.active{border-top:1px solid}.theme__hacker .codetab__link{color:#e3cd26;border-top:1px solid transparent}.theme__hacker .codetab__link.active{border-top:1px solid}.theme__solarized .codetab__link{color:#586e75;border-top:1px solid transparent}.theme__solarized .codetab__link.active{border-top:1px solid}.theme__kimbie .codetab__link{color:#d3af86;border-top:1px solid transparent}.theme__kimbie .codetab__link.active{border-top:1px solid}.theme__dark .codetab__link{background-color:#011220}.theme__dark .codetab__link.active{background-color:#171f2e}.theme__dark .codetab__link:hover,.theme__dark .codetab__link:active,.theme__dark .codetab__link:focus{background-color:#171f2e}.theme__light .codetab__link{background-color:#e2e6e9}.theme__light .codetab__link.active{background-color:#eceff1}.theme__light .codetab__link:hover,.theme__light .codetab__link:active,.theme__light .codetab__link:focus{background-color:#eceff1}.theme__hacker .codetab__link{background-color:#1c201c}.theme__hacker .codetab__link.active{background-color:#282a36}.theme__hacker .codetab__link:hover,.theme__hacker .codetab__link:active,.theme__hacker .codetab__link:focus{background-color:#282a36}.theme__solarized .codetab__link{background-color:#faedc5}.theme__solarized .codetab__link.active{background-color:#f9fbe7}.theme__solarized .codetab__link:hover,.theme__solarized .codetab__link:active,.theme__solarized .codetab__link:focus{background-color:#f9fbe7}.theme__kimbie .codetab__link{background-color:#412f16}.theme__kimbie .codetab__link.active{background-color:#362712}.theme__kimbie .codetab__link:hover,.theme__kimbie .codetab__link:active,.theme__kimbie .codetab__link:focus{background-color:#362712}.codetab__content{display:none}@media screen and (-ms-high-contrast:active),screen and (-ms-high-contrast:none){.header{padding-top:3rem;padding-bottom:.5rem}.showcase__nav{margin-top:1.5rem}.showcase__box{min-width:270px}.navbar__slide-down svg{display:block;margin:auto}.theme-mobile{top:3px;right:77px}.copy-to-clipboard{transition:none!important}.copy-to-clipboard::after{content:'copy';font-family:montserrat,sans-serif;font-size:9px;border:1px solid #aaa;border-radius:.125rem;position:absolute;padding:0 .1rem;right:1px;top:-1px}.copy-to-clipboard:hover{transform:translateY(0)!important}.theme__dark #search.input{background-color:#212121}.theme__light #search.input{background-color:#eee}.theme__hacker #search.input{background-color:#252526}.theme__solarized #search.input{background-color:#fbf1d1}.theme__kimbie #search.input{background-color:#362712}.search .input::-ms-clear{display:none}.mobile-search__top--input::-ms-clear{display:none}pre.chroma:first-child{border:6px solid transparent;border-top:none;border-bottom:none}pre.chroma .lnt{padding:0!important}.wrapper{width:100%;max-width:960px;-ms-grid-columns:minmax(350px,5fr)minmax(250px,2fr);grid-template-columns:minmax(350px,5fr)minmax(250px,2fr);-ms-grid-rows:50px minmax(0,190px)1fr minmax(0,200px);grid-template-rows:50px minmax(0,190px)1fr minmax(0,200px);grid-column-gap:0;grid-row-gap:0}.wrapper[data-kind=home]{display:-ms-grid;display:grid}.wrapper[data-kind=taxonomy]{display:-ms-grid;display:grid}.wrapper[data-kind=section]{display:-ms-grid;display:grid}.wrapper[data-kind=section][data-type=gallery]{display:inline-block}.wrapper[data-kind=section][data-type=showcase]{display:inline-block}.wrapper[data-kind=section][data-type=archive]{display:inline-block}.header-main{grid-row:2;-ms-grid-row:2;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:1;grid-area:2/1/3/2}.header-side{grid-row:2;-ms-grid-row:2;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:2;-ms-grid-column-span:1;grid-area:2/2/3/3}.header{grid-row:2;-ms-grid-row:2;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:4;grid-area:2/1/4/3}.main-main{grid-row:3;-ms-grid-row:3;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:1;grid-area:3/1/4/2}.main-side{grid-row:3;-ms-grid-row:3;-ms-grid-row-span:1;grid-column:2;-ms-grid-column:2;-ms-grid-column-span:1;grid-area:3/2/4/3}.main{grid-row:3;-ms-grid-row:3;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:2;grid-area:3/1/2/3}.main.terms{height:calc(100% - 250px)}.footer-main{grid-row:4;-ms-grid-row:4;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:1;grid-area:4/1/5/2}.footer-side{grid-row:4;-ms-grid-row:4;-ms-grid-row-span:1;grid-column:2;-ms-grid-column:2;-ms-grid-column-span:1;grid-area:4/2/5/3}.footer{grid-row:4;-ms-grid-row:4;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:4;grid-area:4/1/4/3}.navbar-main{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:1;grid-area:1/1/2/2}.navbar-side{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:2;-ms-grid-column:2;-ms-grid-column-span:1;grid-area:1/2/2/3}.navbar{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:2;grid-area:1/1/2/3}.inner{display:-ms-grid;display:grid;max-width:960px;height:calc(100% - 110px);margin-top:50px;-ms-grid-columns:320px 1fr 1fr;grid-template-columns:320px 1fr 1fr;-ms-grid-rows:1fr;grid-template-rows:1fr;grid-column-gap:0;grid-row-gap:0}.inner[data-kind=home]{display:-ms-grid;display:grid}.inner[data-kind=texonomy]{display:-ms-grid;display:grid}.inner[data-kind=section]{display:-ms-grid;display:grid}.inner[data-kind=section][data-type=gallery]{display:inline-block}.inner[data-kind=section][data-type=showcase]{display:inline-block}.inner[data-kind=section][data-type=archive]{display:inline-block}.inner[data-type=showcase]{margin-top:0}.inner[data-sidebar-position=left]{-ms-grid-columns:320px 1fr 1fr;grid-template-columns:320px 1fr 1fr}.inner[data-sidebar-position=right]{-ms-grid-columns:1fr 1fr 320px;grid-template-columns:1fr 1fr 320px}.inner>*:nth-child(1){grid-row:1;-ms-grid-row:1;grid-column:1;-ms-grid-column:1}.inner>*:nth-child(2){grid-row:1;-ms-grid-row:1;grid-column:3;-ms-grid-column:3}.inner>*:nth-child(3){grid-row:1;-ms-grid-row:1;grid-column:5;-ms-grid-column:5}.l{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:1;grid-area:1/1/2/2}.m{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:2;-ms-grid-column:2;-ms-grid-column-span:1;grid-area:1/2/2/3}.r{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:3;-ms-grid-column:3;-ms-grid-column-span:1;grid-area:1/3/2/4}.lm{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:2;grid-area:1/1/2/3}.mr{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:2;-ms-grid-column:2;-ms-grid-column-span:2;grid-area:1/2/2/4}.lmr{grid-row:1;-ms-grid-row:1;-ms-grid-row-span:1;grid-column:1;-ms-grid-column:1;-ms-grid-column-span:3;grid-area:1/1/2/4}}.tab{position:relative;padding:.5rem 0;margin:2rem 0}.tab__links{height:auto;border-top-left-radius:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.tab__link{outline:none;border:none;cursor:pointer;font-size:13.8px;font-family:montserrat,sans-serif;text-transform:capitalize;padding:.5rem .75rem;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.theme__dark .tab__link{color:#fcfcfa;background-color:#2d2a2e}.theme__dark .tab__link.active{background-color:#2d2a2e;border:1px solid #595b5c;border-bottom:none}.theme__dark .tab__link:hover,.theme__dark .tab__link:active,.theme__dark .tab__link:focus{color:#ffd866}.theme__light .tab__link{color:#555;background-color:#fafafa}.theme__light .tab__link.active{background-color:#fafafa;border:1px solid #ccc;border-bottom:none}.theme__light .tab__link:hover,.theme__light .tab__link:active,.theme__light .tab__link:focus{color:#607d8b}.theme__hacker .tab__link{color:#e3cd26;background-color:#151715}.theme__hacker .tab__link.active{background-color:#151715;border:1px solid #6b6b6b;border-bottom:none}.theme__hacker .tab__link:hover,.theme__hacker .tab__link:active,.theme__hacker .tab__link:focus{color:#1fff2a}.theme__solarized .tab__link{color:#586e75;background-color:#fdf7e3}.theme__solarized .tab__link.active{background-color:#fdf7e3;border:1px solid #ffb300;border-bottom:none}.theme__solarized .tab__link:hover,.theme__solarized .tab__link:active,.theme__solarized .tab__link:focus{color:#b58900}.theme__kimbie .tab__link{color:#d3af86;background-color:#221a0f}.theme__kimbie .tab__link.active{background-color:#221a0f;border:1px solid #7f5d38;border-bottom:none}.theme__kimbie .tab__link:hover,.theme__kimbie .tab__link:active,.theme__kimbie .tab__link:focus{color:#f06431}.tab__content{display:none;padding:0 .5rem;border-radius:.25rem;border-top-left-radius:0}.theme__dark .tab__content{border:1px solid #595b5c;background-color:#2d2a2e}.theme__light .tab__content{border:1px solid #ccc;background-color:#fafafa}.theme__hacker .tab__content{border:1px solid #6b6b6b;background-color:#151715}.theme__solarized .tab__content{border:1px solid #ffb300;background-color:#fdf7e3}.theme__kimbie .tab__content{border:1px solid #7f5d38;background-color:#221a0f}.button{position:relative;display:inline-block;padding:3px 9px;margin:.25rem;cursor:pointer;text-decoration:none!important;border-radius:.25rem;background-color:transparent}.button__text{margin:auto;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.button__micro{height:20px;font-size:14px;line-height:14px}.button__mini{height:24px;font-size:15px;line-height:15px}.button__small{height:28px;font-size:16px}.button__medium{height:32px;font-size:17px;line-height:17px}.button__large{height:36px;font-size:18px}.theme__dark .button[data-color=default]{color:#ffd866;border:1px solid #ffd866}.theme__dark .button[data-color=default]:hover,.theme__dark .button[data-color=default]:active,.theme__dark .button[data-color=default]:focus{color:#ff6188;border:1px solid #ff6188}.theme__dark .button[data-color=primary]{color:#82aaff;border:1px solid #82aaff}.theme__dark .button[data-color=primary]:hover,.theme__dark .button[data-color=primary]:active,.theme__dark .button[data-color=primary]:focus{color:#ff6188;border:1px solid #ff6188}.theme__dark .button[data-variant=contained][data-color=primary],.theme__dark .button[data-variant=contained][data-color=default]{color:#111;background:#82aaff;-webkit-box-shadow:1px 1px 3px 0 #888;-moz-box-shadow:1px 1px 3px 0 #888;box-shadow:1px 1px 3px 0 #888;border:none}.theme__dark .button[data-variant=contained][data-color=primary]:hover,.theme__dark .button[data-variant=contained][data-color=primary]:active,.theme__dark .button[data-variant=contained][data-color=primary]:focus,.theme__dark .button[data-variant=contained][data-color=default]:hover,.theme__dark .button[data-variant=contained][data-color=default]:active,.theme__dark .button[data-variant=contained][data-color=default]:focus{color:#111;background:#6e9cff;border:none}.theme__light .button[data-color=default]{color:#607d8b;border:1px solid #607d8b}.theme__light .button[data-color=default]:hover,.theme__light .button[data-color=default]:active,.theme__light .button[data-color=default]:focus{color:#26a69a;border:1px solid #26a69a}.theme__light .button[data-color=primary]{color:#ccc;border:1px solid #ccc}.theme__light .button[data-color=primary]:hover,.theme__light .button[data-color=primary]:active,.theme__light .button[data-color=primary]:focus{color:#26a69a;border:1px solid #26a69a}.theme__light .button[data-variant=contained][data-color=primary],.theme__light .button[data-variant=contained][data-color=default]{color:#111;background:#ccc;-webkit-box-shadow:1px 1px 3px 0 #727072;-moz-box-shadow:1px 1px 3px 0 #727072;box-shadow:1px 1px 3px 0 #727072;border:none}.theme__light .button[data-variant=contained][data-color=primary]:hover,.theme__light .button[data-variant=contained][data-color=primary]:active,.theme__light .button[data-variant=contained][data-color=primary]:focus,.theme__light .button[data-variant=contained][data-color=default]:hover,.theme__light .button[data-variant=contained][data-color=default]:active,.theme__light .button[data-variant=contained][data-color=default]:focus{color:#111;background:#c2c2c2;border:none}.theme__hacker .button[data-color=default]{color:#e08c48;border:1px solid #e08c48}.theme__hacker .button[data-color=default]:hover,.theme__hacker .button[data-color=default]:active,.theme__hacker .button[data-color=default]:focus{color:#c7ba00;border:1px solid #c7ba00}.theme__hacker .button[data-color=primary]{color:#cdf5cc;border:1px solid #cdf5cc}.theme__hacker .button[data-color=primary]:hover,.theme__hacker .button[data-color=primary]:active,.theme__hacker .button[data-color=primary]:focus{color:#c7ba00;border:1px solid #c7ba00}.theme__hacker .button[data-variant=contained][data-color=primary],.theme__hacker .button[data-variant=contained][data-color=default]{color:#111;background:#cdf5cc;-webkit-box-shadow:1px 1px 3px 0 #888;-moz-box-shadow:1px 1px 3px 0 #888;box-shadow:1px 1px 3px 0 #888;border:none}.theme__hacker .button[data-variant=contained][data-color=primary]:hover,.theme__hacker .button[data-variant=contained][data-color=primary]:active,.theme__hacker .button[data-variant=contained][data-color=primary]:focus,.theme__hacker .button[data-variant=contained][data-color=default]:hover,.theme__hacker .button[data-variant=contained][data-color=default]:active,.theme__hacker .button[data-variant=contained][data-color=default]:focus{color:#111;background:#bcf2bb;border:none}.theme__solarized .button[data-color=default]{color:#859900;border:1px solid #859900}.theme__solarized .button[data-color=default]:hover,.theme__solarized .button[data-color=default]:active,.theme__solarized .button[data-color=default]:focus{color:#268bd2;border:1px solid #268bd2}.theme__solarized .button[data-color=primary]{color:#c5e0df;border:1px solid #c5e0df}.theme__solarized .button[data-color=primary]:hover,.theme__solarized .button[data-color=primary]:active,.theme__solarized .button[data-color=primary]:focus{color:#268bd2;border:1px solid #268bd2}.theme__solarized .button[data-variant=contained][data-color=primary],.theme__solarized .button[data-variant=contained][data-color=default]{color:#111;background:#c5e0df;-webkit-box-shadow:1px 1px 3px 0 #727072;-moz-box-shadow:1px 1px 3px 0 #727072;box-shadow:1px 1px 3px 0 #727072;border:none}.theme__solarized .button[data-variant=contained][data-color=primary]:hover,.theme__solarized .button[data-variant=contained][data-color=primary]:active,.theme__solarized .button[data-variant=contained][data-color=primary]:focus,.theme__solarized .button[data-variant=contained][data-color=default]:hover,.theme__solarized .button[data-variant=contained][data-color=default]:active,.theme__solarized .button[data-variant=contained][data-color=default]:focus{color:#111;background:#b8d9d8;border:none}.theme__kimbie .button[data-color=default]{color:#dc322f;border:1px solid #dc322f}.theme__kimbie .button[data-color=default]:hover,.theme__kimbie .button[data-color=default]:active,.theme__kimbie .button[data-color=default]:focus{color:#f06431;border:1px solid #f06431}.theme__kimbie .button[data-color=primary]{color:#d1c4e9;border:1px solid #d1c4e9}.theme__kimbie .button[data-color=primary]:hover,.theme__kimbie .button[data-color=primary]:active,.theme__kimbie .button[data-color=primary]:focus{color:#f06431;border:1px solid #f06431}.theme__kimbie .button[data-variant=contained][data-color=primary],.theme__kimbie .button[data-variant=contained][data-color=default]{color:#111;background:#d1c4e9;-webkit-box-shadow:1px 1px 3px 0 #828282;-moz-box-shadow:1px 1px 3px 0 #828282;box-shadow:1px 1px 3px 0 #828282;border:none}.theme__kimbie .button[data-variant=contained][data-color=primary]:hover,.theme__kimbie .button[data-variant=contained][data-color=primary]:active,.theme__kimbie .button[data-variant=contained][data-color=primary]:focus,.theme__kimbie .button[data-variant=contained][data-color=default]:hover,.theme__kimbie .button[data-variant=contained][data-color=default]:active,.theme__kimbie .button[data-variant=contained][data-color=default]:focus{color:#111;background:#c5b5e3;border:none}.featured-image{width:100%;object-fit:cover}.featured-image--wrapper{width:100%;height:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.utterances__message{font-size:.95rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.not-found{height:100%;font-family:montserrat,sans-serif;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.theme__dark .not-found .title{color:#ffd866}.theme__dark .not-found .subtitle{color:#fcfcfa}.theme__light .not-found .title{color:#607d8b}.theme__light .not-found .subtitle{color:#424242}.theme__hacker .not-found .title{color:#a1ad64}.theme__hacker .not-found .subtitle{color:#cdf5cc}.theme__solarized .not-found .title{color:#cb4b16}.theme__solarized .not-found .subtitle{color:#b58900}.theme__kimbie .not-found .title{color:#996329}.theme__kimbie .not-found .subtitle{color:#889b4a}.about{position:relative;width:100%;padding:2rem 1rem 0}@media only screen and (max-width:768px){.about{padding:1rem}}.archive{position:relative;width:100%;padding:2rem 2rem 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}@media only screen and (max-width:768px){.archive{padding:2rem 1rem 0}}.archive__container{width:100%}.archive__ul{position:relative}.archive__ul[data-dir=rtl]::before{content:'';position:absolute;right:3rem;top:0;width:.25rem;height:100%}.theme__dark .archive__ul[data-dir=rtl]::before{background-color:#727072}.theme__light .archive__ul[data-dir=rtl]::before{background-color:#727072}.theme__hacker .archive__ul[data-dir=rtl]::before{background-color:#727072}.theme__solarized .archive__ul[data-dir=rtl]::before{background-color:#727072}.theme__kimbie .archive__ul[data-dir=rtl]::before{background-color:#a57a4c}@media only screen and (max-width:769px){.archive__ul[data-dir=rtl]::before{content:none}}.archive__ul[data-dir=ltr]::before{content:'';position:absolute;left:3rem;top:0;width:.25rem;height:100%}.theme__dark .archive__ul[data-dir=ltr]::before{background-color:#727072}.theme__light .archive__ul[data-dir=ltr]::before{background-color:#727072}.theme__hacker .archive__ul[data-dir=ltr]::before{background-color:#727072}.theme__solarized .archive__ul[data-dir=ltr]::before{background-color:#727072}.theme__kimbie .archive__ul[data-dir=ltr]::before{background-color:#a57a4c}@media only screen and (max-width:769px){.archive__ul[data-dir=ltr]::before{content:none}}.archive__li{margin-bottom:.5rem;z-index:0;-webkit-transition:margin-left .1s ease;-moz-transition:margin-left .1s ease;-ms-transition:margin-left .1s ease;-o-transition:margin-left .1s ease;transition:margin-left .1s ease;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}.archive__li[data-dir=rtl]{margin-right:4rem}@media only screen and (max-width:769px){.archive__li[data-dir=rtl]{margin-right:0;position:relative}}.archive__li[data-dir=ltr]{margin-left:4rem}@media only screen and (max-width:769px){.archive__li[data-dir=ltr]{margin-left:0;position:relative}}@media only screen and (max-width:600px){.archive__li{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.archive__key{margin-right:.5rem;border-radius:.25rem;height:32px;width:100px;padding:.125rem;font-size:.95rem;font-weight:700;font-family:montserrat,sans-serif;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .archive__key{color:#fcfcfa;background-color:#ff6188}.theme__light .archive__key{color:#fcfcfa;background-color:#607d8b}.theme__hacker .archive__key{color:#fcfcfa;background-color:#e08c48}.theme__solarized .archive__key{color:#fcfcfa;background-color:#b58900}.theme__kimbie .archive__key{color:#8ab1b0;background-color:#423523}.archive__key[data-ani=true]{-webkit-animation:slide-in-down .4s .2s 1 ease both;-moz-animation:slide-in-down .4s .2s 1 ease both;-ms-animation:slide-in-down .4s .2s 1 ease both;-o-animation:slide-in-down .4s .2s 1 ease both;animation:slide-in-down .4s .2s 1 ease both}.archive__key:not(:first-child){margin:4rem 0 1rem}.archive__key:first-child{margin:1rem 0}.archive__meta{border-radius:.25rem;min-width:100px;max-width:100px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.archive__meta[data-ani=true]{-webkit-animation:slide-in-left .2s .5s 1 ease both;-moz-animation:slide-in-left .2s .5s 1 ease both;-ms-animation:slide-in-left .2s .5s 1 ease both;-o-animation:slide-in-left .2s .5s 1 ease both;animation:slide-in-left .2s .5s 1 ease both}.archive__type{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;font-size:.8rem;font-family:montserrat,sans-serif;width:50%;height:24px;line-height:24px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:50px}.theme__dark .archive__type{color:#82aaff;background-color:#424242}@media only screen and (max-width:769px){.theme__dark .archive__type{border-right:2px solid #727072}}.theme__light .archive__type{color:#546e7a;background-color:#bdbdbd}@media only screen and (max-width:769px){.theme__light .archive__type{border-right:2px solid #727072}}.theme__hacker .archive__type{color:#fcfcfa;background-color:#855e78}@media only screen and (max-width:769px){.theme__hacker .archive__type{border-right:2px solid #727072}}.theme__solarized .archive__type{color:#996b00;background-color:#f6e099}@media only screen and (max-width:769px){.theme__solarized .archive__type{border-right:2px solid #727072}}.theme__kimbie .archive__type{color:#f06431;background-color:#5e452b}@media only screen and (max-width:769px){.theme__kimbie .archive__type{border-right:2px solid #a57a4c}}.archive__date{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;font-size:.8rem;font-family:montserrat,sans-serif;width:50%;height:24px;line-height:24px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:50px}.theme__dark .archive__date{color:#aed581;background-color:#424242}@media only screen and (max-width:769px){.theme__dark .archive__date{border-left:2px solid #727072}}.theme__light .archive__date{color:#424242;background-color:#bdbdbd}@media only screen and (max-width:769px){.theme__light .archive__date{border-left:2px solid #727072}}.theme__hacker .archive__date{color:#e3cd26;background-color:#855e78}@media only screen and (max-width:769px){.theme__hacker .archive__date{border-left:2px solid #727072}}.theme__solarized .archive__date{color:#455a64;background-color:#f6e099}@media only screen and (max-width:769px){.theme__solarized .archive__date{border-left:2px solid #727072}}.theme__kimbie .archive__date{color:#d3af86;background-color:#5e452b}@media only screen and (max-width:769px){.theme__kimbie .archive__date{border-left:2px solid #a57a4c}}.archive__title{margin-right:.5rem;margin-left:1rem;font-family:montserrat,sans-serif}.archive__title[data-title-wrap^=no]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960}@media only screen and (max-width:600px){.archive__title{margin-top:1rem;margin-bottom:.5rem}}.archive__title:hover[data-dir=ltr]::before,.archive__title:active[data-dir=ltr]::before,.archive__title:focus[data-dir=ltr]::before{content:'';position:absolute;left:3rem;width:.25rem;height:30px}.theme__dark .archive__title:hover[data-dir=ltr]::before,.theme__dark .archive__title:active[data-dir=ltr]::before,.theme__dark .archive__title:focus[data-dir=ltr]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__dark .archive__title:hover[data-dir=ltr]::before,.theme__dark .archive__title:active[data-dir=ltr]::before,.theme__dark .archive__title:focus[data-dir=ltr]::before{top:13px;height:24px}}.theme__light .archive__title:hover[data-dir=ltr]::before,.theme__light .archive__title:active[data-dir=ltr]::before,.theme__light .archive__title:focus[data-dir=ltr]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__light .archive__title:hover[data-dir=ltr]::before,.theme__light .archive__title:active[data-dir=ltr]::before,.theme__light .archive__title:focus[data-dir=ltr]::before{top:13px;height:24px}}.theme__hacker .archive__title:hover[data-dir=ltr]::before,.theme__hacker .archive__title:active[data-dir=ltr]::before,.theme__hacker .archive__title:focus[data-dir=ltr]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__hacker .archive__title:hover[data-dir=ltr]::before,.theme__hacker .archive__title:active[data-dir=ltr]::before,.theme__hacker .archive__title:focus[data-dir=ltr]::before{top:13px;height:24px}}.theme__solarized .archive__title:hover[data-dir=ltr]::before,.theme__solarized .archive__title:active[data-dir=ltr]::before,.theme__solarized .archive__title:focus[data-dir=ltr]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__solarized .archive__title:hover[data-dir=ltr]::before,.theme__solarized .archive__title:active[data-dir=ltr]::before,.theme__solarized .archive__title:focus[data-dir=ltr]::before{top:13px;height:24px}}.theme__kimbie .archive__title:hover[data-dir=ltr]::before,.theme__kimbie .archive__title:active[data-dir=ltr]::before,.theme__kimbie .archive__title:focus[data-dir=ltr]::before{background-color:#dc3958}@media only screen and (max-width:768px){.theme__kimbie .archive__title:hover[data-dir=ltr]::before,.theme__kimbie .archive__title:active[data-dir=ltr]::before,.theme__kimbie .archive__title:focus[data-dir=ltr]::before{top:13px;height:24px}}@media only screen and (max-width:769px){.archive__title:hover[data-dir=ltr]::before,.archive__title:active[data-dir=ltr]::before,.archive__title:focus[data-dir=ltr]::before{height:24px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}}.archive__title:hover[data-dir=rtl]::before,.archive__title:active[data-dir=rtl]::before,.archive__title:focus[data-dir=rtl]::before{content:'';position:absolute;right:3rem;width:.25rem;height:30px}.theme__dark .archive__title:hover[data-dir=rtl]::before,.theme__dark .archive__title:active[data-dir=rtl]::before,.theme__dark .archive__title:focus[data-dir=rtl]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__dark .archive__title:hover[data-dir=rtl]::before,.theme__dark .archive__title:active[data-dir=rtl]::before,.theme__dark .archive__title:focus[data-dir=rtl]::before{top:13px;height:24px}}.theme__light .archive__title:hover[data-dir=rtl]::before,.theme__light .archive__title:active[data-dir=rtl]::before,.theme__light .archive__title:focus[data-dir=rtl]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__light .archive__title:hover[data-dir=rtl]::before,.theme__light .archive__title:active[data-dir=rtl]::before,.theme__light .archive__title:focus[data-dir=rtl]::before{top:13px;height:24px}}.theme__hacker .archive__title:hover[data-dir=rtl]::before,.theme__hacker .archive__title:active[data-dir=rtl]::before,.theme__hacker .archive__title:focus[data-dir=rtl]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__hacker .archive__title:hover[data-dir=rtl]::before,.theme__hacker .archive__title:active[data-dir=rtl]::before,.theme__hacker .archive__title:focus[data-dir=rtl]::before{top:13px;height:24px}}.theme__solarized .archive__title:hover[data-dir=rtl]::before,.theme__solarized .archive__title:active[data-dir=rtl]::before,.theme__solarized .archive__title:focus[data-dir=rtl]::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__solarized .archive__title:hover[data-dir=rtl]::before,.theme__solarized .archive__title:active[data-dir=rtl]::before,.theme__solarized .archive__title:focus[data-dir=rtl]::before{top:13px;height:24px}}.theme__kimbie .archive__title:hover[data-dir=rtl]::before,.theme__kimbie .archive__title:active[data-dir=rtl]::before,.theme__kimbie .archive__title:focus[data-dir=rtl]::before{background-color:#dc3958}@media only screen and (max-width:768px){.theme__kimbie .archive__title:hover[data-dir=rtl]::before,.theme__kimbie .archive__title:active[data-dir=rtl]::before,.theme__kimbie .archive__title:focus[data-dir=rtl]::before{top:13px;height:24px}}@media only screen and (max-width:769px){.archive__title:hover[data-dir=rtl]::before,.archive__title:active[data-dir=rtl]::before,.archive__title:focus[data-dir=rtl]::before{height:24px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}}.archive__subtitle{text-align:center;font-weight:700;font-family:montserrat,sans-serif}.theme__dark .archive__subtitle{color:#ddd}.theme__light .archive__subtitle{color:#607d8b}.theme__hacker .archive__subtitle{color:#c7ba00}.theme__solarized .archive__subtitle{color:#cb4b16}.theme__kimbie .archive__subtitle{color:#889b4a}@media only screen and (max-width:600px){.archive__subtitle{margin-bottom:1rem}}.grid{position:relative;margin-bottom:1rem}.grid .full{width:100%}.grid .half{width:50%}.grid .third{width:33.3%}.grid .quarter{width:25%}.grid .fifth{width:20%}.grid:after{content:'';display:block;clear:both}.grid-sizer{padding:.5rem}.grid-sizer,.grid-item{width:33.333%}.grid-item{float:left;border-radius:.25rem;padding:.51rem}.grid-item img{display:block;max-width:100%}.gallery{padding:1rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.gallery img{border-radius:.25rem}.gallery .grid-item{position:relative;opacity:1;height:auto;cursor:pointer;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.gallery .grid-item__desc{position:absolute;left:0;top:0;padding:.5rem;width:100%;height:100%;border-radius:.25rem;z-index:3;font-family:montserrat,sans-serif;font-weight:700;cursor:pointer;-webkit-box-shadow:0 0 0 0 transparent;-moz-box-shadow:0 0 0 0 transparent;box-shadow:0 0 0 0 transparent}.gallery .grid-item__desc:hover,.gallery .grid-item__desc:active,.gallery .grid-item__desc:focus{-webkit-box-shadow:0 4px 4px 0 rgba(0,0,0,.4);-moz-box-shadow:0 4px 4px 0 rgba(0,0,0,.4);box-shadow:0 4px 4px 0 rgba(0,0,0,.4);-webkit-transition:all .25s ease;-moz-transition:all .25s ease;-ms-transition:all .25s ease;-o-transition:all .25s ease;transition:all .25s ease}.theme__dark .gallery .grid-item__desc:hover,.theme__dark .gallery .grid-item__desc:active,.theme__dark .gallery .grid-item__desc:focus{color:#fcfcfa;background-color:rgba(0,0,0,.7)}.theme__light .gallery .grid-item__desc:hover,.theme__light .gallery .grid-item__desc:active,.theme__light .gallery .grid-item__desc:focus{color:#424242;background-color:rgba(236,239,241,.85)}.theme__hacker .gallery .grid-item__desc:hover,.theme__hacker .gallery .grid-item__desc:active,.theme__hacker .gallery .grid-item__desc:focus{color:#fcfcfa;background-color:rgba(0,0,0,.7)}.theme__solarized .gallery .grid-item__desc:hover,.theme__solarized .gallery .grid-item__desc:active,.theme__solarized .gallery .grid-item__desc:focus{color:#424242;background-color:rgba(241,248,233,.85)}.theme__kimbie .gallery .grid-item__desc:hover,.theme__kimbie .gallery .grid-item__desc:active,.theme__kimbie .gallery .grid-item__desc:focus{color:#fff;background-color:rgba(66,53,35,.85)}.gallery .grid-item__desc--text{position:absolute;left:50%;top:50%;word-wrap:break-word;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.theme__dark .gallery .grid-item__desc--text{color:#ffd866}.theme__light .gallery .grid-item__desc--text{color:#607d8b}.theme__hacker .gallery .grid-item__desc--text{color:#e08c48}.theme__solarized .gallery .grid-item__desc--text{color:#859900}.theme__kimbie .gallery .grid-item__desc--text{color:#dc322f}.gallery .grid-item__desc--text::after{content:"➖🔍➖"}@media only screen and (max-width:600px){.gallery .grid-item img{object-fit:cover;max-height:300px}}.list__main{position:relative}.list__main[data-display=block]{display:block}.list__main[data-display=none]{display:none}.list__sidebar.l{margin-left:1rem}.list__sidebar.l[data-dir=rtl]{margin-left:0;margin-right:1rem}.list__sidebar.l[data-dir=ltr]{margin-left:1rem;margin-right:0}.list__sidebar[data-dir=rtl]{margin-left:1rem;margin-right:0}.list__sidebar[data-dir=ltr]{margin-left:0;margin-right:1rem}.list__header{display:flex;align-items:center;justify-content:center;margin:1.25rem 0;font-family:montserrat,sans-serif}.theme__dark .list__header--title{color:#fcfcfa}.theme__light .list__header--title{color:#424242}.theme__hacker .list__header--title{color:#a1ad64}.theme__solarized .list__header--title{color:#424242}.theme__kimbie .list__header--title{color:#889b4a}.list__header--desc{padding:1rem;line-height:1.7rem}.single{padding:1rem;position:relative;width:100%;overflow-wrap:break-word}.single__title{font-size:2.5rem;font-weight:900;font-family:montserrat,sans-serif;line-height:3rem;overflow-wrap:break-word;margin-top:1.5rem;margin-bottom:.5rem}.theme__dark .single__title{color:#fcfcfa}.theme__light .single__title{color:#424242}.theme__hacker .single__title{color:#fcfcfa}.theme__solarized .single__title{color:#424242}.theme__kimbie .single__title{color:#e3b583}.single__title[data-ani=true]{-webkit-animation:slide-in-down .2s .3s 1 ease-in both;-moz-animation:slide-in-down .2s .3s 1 ease-in both;-ms-animation:slide-in-down .2s .3s 1 ease-in both;-o-animation:slide-in-down .2s .3s 1 ease-in both;animation:slide-in-down .2s .3s 1 ease-in both}.single__shorttitle{font-size:1.5rem;font-family:montserrat,sans-serif;overflow-wrap:break-word;margin-bottom:.25rem;opacity:.7}.theme__dark .single__shorttitle{color:#fcfcfa}.theme__light .single__shorttitle{color:#424242}.theme__hacker .single__shorttitle{color:#fcfcfa}.theme__solarized .single__shorttitle{color:#424242}.theme__kimbie .single__shorttitle{color:#e3b583}.single__meta{font-size:.8rem;margin-bottom:2rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.theme__dark .single__meta{color:#fcfcfa}.theme__light .single__meta{color:#424242}.theme__hacker .single__meta{color:#cdf5cc}.theme__solarized .single__meta{color:#b58900}.theme__kimbie .single__meta{color:#889b4a}@media only screen and (max-width:769px){.single__meta{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}}.single__infos{margin-right:.5rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.single__info{word-break:keep-all;padding:0 .125rem}.single__nojs{width:100%;color:red;padding:.5rem 0}.single__contents{margin:1rem 0;font-size:1rem;line-height:1.7;width:inheirt;max-width:inherit}.single__contents[data-ani=true]{-webkit-animation:slide-in-left-little .2s .6s 1 ease-in both;-moz-animation:slide-in-left-little .2s .6s 1 ease-in both;-ms-animation:slide-in-left-little .2s .6s 1 ease-in both;-o-animation:slide-in-left-little .2s .6s 1 ease-in both;animation:slide-in-left-little .2s .6s 1 ease-in both}.single__contents--gallery{overflow:hidden}.single__contents>p>a{text-decoration:underline}.single__contents h1,.single__contents h2,.single__contents h3,.single__contents h4,.single__contents h5,.single__contents h6{position:relative;line-height:1.25;font-family:montserrat,sans-serif}.single__contents h1,.single__contents h2{padding:0;color:inherit;font-weight:900;text-rendering:optimizeLegibility}.theme__dark .single__contents h1,.theme__dark .single__contents h2{color:#aed581}.theme__light .single__contents h1,.theme__light .single__contents h2{color:#607d8b}.theme__hacker .single__contents h1,.theme__hacker .single__contents h2{color:#a1ad64}.theme__solarized .single__contents h1,.theme__solarized .single__contents h2{color:#cb4b16}.theme__kimbie .single__contents h1,.theme__kimbie .single__contents h2{color:#889b4a}.theme__dark .single__contents h3,.theme__dark .single__contents h4,.theme__dark .single__contents h5,.theme__dark .single__contents h6{color:#fcfcfa}.theme__hacker .single__contents h3,.theme__hacker .single__contents h4,.theme__hacker .single__contents h5,.theme__hacker .single__contents h6{color:#fcfcfa}.single__contents h1{font-size:2.6rem;margin:3.5rem 0 1.75rem}.single__contents h2{font-size:2.2rem;margin:3.2rem 0 1.5rem}.single__contents h3{font-size:1.8rem;margin:2.8rem 0 1.25rem}.single__contents h4{font-size:1.5rem;margin:2.4rem 0 1rem}.single__contents h5{font-size:1.2rem;margin:2rem 0 .8rem}.single__contents h6{font-size:1rem;margin:1.5rem 0 .5rem}.single__contents pre{padding:34px 12px 8px;overflow:auto;border-radius:.34rem;line-height:1.5;font-size:13.8px;direction:ltr}.theme__dark .single__contents pre{scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__dark .single__contents pre::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark .single__contents pre::-webkit-scrollbar-thumb{background:#888}.theme__dark .single__contents pre::-webkit-scrollbar-track{background:#eee}.theme__light .single__contents pre{scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__light .single__contents pre::-webkit-scrollbar{width:.45em;height:.45em}.theme__light .single__contents pre::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light .single__contents pre::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker .single__contents pre{scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__hacker .single__contents pre::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker .single__contents pre::-webkit-scrollbar-thumb{background:#616161}.theme__hacker .single__contents pre::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized .single__contents pre{scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__solarized .single__contents pre::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized .single__contents pre::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized .single__contents pre::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie .single__contents pre{scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.theme__kimbie .single__contents pre::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie .single__contents pre::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie .single__contents pre::-webkit-scrollbar-track{background:#d3af86}.single__contents pre:not(.chroma){position:relative}.single__contents div.chroma{position:relative}.single__contents div.chroma:hover .copy-to-clipboard,.single__contents div.chroma:active .copy-to-clipboard,.single__contents div.chroma:focus .copy-to-clipboard{opacity:1}.single__contents pre>code:not([class^=language])::before{position:absolute;top:0;left:0;padding:2px 7px;width:100%;height:30px;z-index:7;line-height:30px;font-size:13.8px;font-family:montserrat,sans-serif;font-weight:700;display:inline-block;text-transform:capitalize;content:'Code'}.theme__dark .single__contents pre>code:not([class^=language])::before{color:#fcfcfa;background:#011220}.theme__light .single__contents pre>code:not([class^=language])::before{color:#344952;background:#e2e6e9}.theme__hacker .single__contents pre>code:not([class^=language])::before{color:#fcfcfa;background:#1c201c}.theme__solarized .single__contents pre>code:not([class^=language])::before{color:#344952;background:#faedc5}.theme__kimbie .single__contents pre>code:not([class^=language])::before{color:#8ab1b0;background:#412f16}.single__contents p>code:not([class^=language]){padding:.25rem .5rem}.theme__dark .single__contents p>code:not([class^=language]){color:#fcfcfa}.theme__light .single__contents p>code:not([class^=language]){color:#26a69a}.theme__hacker .single__contents p>code:not([class^=language]){color:#e3cd26}.theme__solarized .single__contents p>code:not([class^=language]){color:#268bd2}.theme__kimbie .single__contents p>code:not([class^=language]){color:#f06431}.single__contents code+.copy-to-clipboard{position:absolute;right:4px;top:5px;border-radius:2px;z-index:11;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.single__contents .copy-to-clipboard{background-position:50%;background-size:16px 16px;background-repeat:no-repeat;width:27px;height:1.45rem;top:-1px;vertical-align:middle;position:relative;margin-left:-.2rem;cursor:pointer;border-radius:0 2px 2px 0;margin-bottom:1px;opacity:0;background-image:url(data:image/svg+xml;utf8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjRwdCIgaGVpZ2h0PSIyNHB0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPlxhPHBhdGggc3R5bGU9InN0cm9rZTpub25lO2ZpbGwtcnVsZTpub256ZXJvO2ZpbGw6IzY0NjQ2NDtmaWxsLW9wYWNpdHk6MSIgZD0iTTQgMkMyLjg5NDUzMSAyIDIgMi44OTQ1MzEgMiA0VjE3QzIgMTcuNTUwNzgxIDIuNDQ5MjE5IDE4IDMgMThTNCAxNy41NTA3ODEgNCAxN1Y0SDE3QzE3LjU1MDc4MSA0IDE4IDMuNTUwNzgxIDE4IDNTMTcuNTUwNzgxIDIgMTcgMnpNOCA2QzYuODk0NTMxIDYgNiA2Ljg5NDUzMSA2IDhWMjBDNiAyMS4xMDU0NjkgNi44OTQ1MzEgMjIgOCAyMkgyMEMyMS4xMDU0NjkgMjIgMjIgMjEuMTA1NDY5IDIyIDIwVjhDMjIgNi44OTQ1MzEgMjEuMTA1NDY5IDYgMjAgNnpNOCA4SDIwVjIwSDh6TTggOCIvPjwvc3ZnPg==);-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.single__contents .copy-to-clipboard:hover{-webkit-transform:translateY(-.1rem);-moz-transform:translateY(-.1rem);-ms-transform:translateY(-.1rem);transform:translateY(-.1rem)}.single__contents .chroma .copy-to-clipboard{position:absolute;right:4px;top:5px;border-radius:2px;z-index:11;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.single__contents .chroma .copy-to-clipboard:hover{-webkit-transform:translateY(-.1rem);-moz-transform:translateY(-.1rem);-ms-transform:translateY(-.1rem);transform:translateY(-.1rem)}.single__contents .language-code .copy-to-clipboard{position:absolute;right:4px;top:5px;border-radius:2px;z-index:11;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.single__contents .language-code .copy-to-clipboard:hover{-webkit-transform:translateY(-.1rem);-moz-transform:translateY(-.1rem);-ms-transform:translateY(-.1rem);transform:translateY(-.1rem)}.single__contents .highlight>.copy-to-clipboard{position:absolute;right:4px;top:5px;border-radius:2px;z-index:11;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.single__contents .highlight>.copy-to-clipboard:hover{-webkit-transform:translateY(-.1rem);-moz-transform:translateY(-.1rem);-ms-transform:translateY(-.1rem);transform:translateY(-.1rem)}.single__contents blockquote{font-size:1.05rem;line-height:1.75;color:inherit;opacity:.8;position:relative}.single__contents blockquote code:not([class^=language]){padding:3px 7px}.theme__dark .single__contents blockquote code:not([class^=language]){color:#fcfcfa}.theme__light .single__contents blockquote code:not([class^=language]){color:#26a69a}.theme__hacker .single__contents blockquote code:not([class^=language]){color:#e3cd26}.theme__solarized .single__contents blockquote code:not([class^=language]){color:#268bd2}.theme__kimbie .single__contents blockquote code:not([class^=language]){color:#f06431}.single__contents img{display:block;border-radius:.25rem;margin:0 auto}.single__contents p{margin:0 0 1.75rem;padding:0}.single__contents p code:not([class^=language]){padding:3px 7px}.theme__dark .single__contents p code:not([class^=language]){color:#fcfcfa}.theme__light .single__contents p code:not([class^=language]){color:#26a69a}.theme__hacker .single__contents p code:not([class^=language]){color:#e3cd26}.theme__solarized .single__contents p code:not([class^=language]){color:#268bd2}.theme__kimbie .single__contents p code:not([class^=language]){color:#f06431}.single__contents ul{margin-right:0;margin-top:0;padding:0;list-style:disc outside none}.single__contents[data-dir=rtl] li{margin-right:2rem}.single__contents[data-dir=rtl] blockquote{margin:0 1.5rem 1.75rem 1.75rem;padding:0 1.42188rem 0 0}.theme__dark .single__contents[data-dir=rtl] blockquote{border-right:.32813rem solid #fcfcfa}.theme__light .single__contents[data-dir=rtl] blockquote{border-right:.32813rem solid #bdbdbd}.theme__hacker .single__contents[data-dir=rtl] blockquote{border-right:.32813rem solid #e08c48}.theme__solarized .single__contents[data-dir=rtl] blockquote{border-right:.32813rem solid #bdbdbd}.theme__kimbie .single__contents[data-dir=rtl] blockquote{border-right:.32813rem solid #84613d}.single__contents[data-dir=ltr] li{margin-left:2rem}.single__contents[data-dir=ltr] blockquote{margin:0 1.75rem 1.75rem 1.5rem;padding:0 0 0 1.42188rem}.theme__dark .single__contents[data-dir=ltr] blockquote{border-left:.32813rem solid #fcfcfa}.theme__light .single__contents[data-dir=ltr] blockquote{border-left:.32813rem solid #bdbdbd}.theme__hacker .single__contents[data-dir=ltr] blockquote{border-left:.32813rem solid #e08c48}.theme__solarized .single__contents[data-dir=ltr] blockquote{border-left:.32813rem solid #bdbdbd}.theme__kimbie .single__contents[data-dir=ltr] blockquote{border-left:.32813rem solid #84613d}.single__contents li{margin-bottom:calc(1rem/2)}.single__contents li>code{padding:2px 7px}.theme__dark .single__contents li code:not([class^=language]){color:#fcfcfa}.theme__light .single__contents li code:not([class^=language]){color:#26a69a}.theme__hacker .single__contents li code:not([class^=language]){color:#e3cd26}.theme__solarized .single__contents li code:not([class^=language]){color:#268bd2}.theme__kimbie .single__contents li code:not([class^=language]){color:#f06431}.single__contents li p{margin-bottom:.5rem}.single__contents hr{margin:0 0 calc(1.25rem - 1px);padding:0;border:none;height:1px}.theme__dark .single__contents hr{background:#595b5c}.theme__light .single__contents hr{background:#bdbdbd}.theme__hacker .single__contents hr{background:#e08c48}.theme__solarized .single__contents hr{background:#bdbdbd}.theme__kimbie .single__contents hr{background:#7f5d38}.single__contents dl dt::after{content:':'}.single__contents dd{display:block;margin-inline-start:40px}.single__contents .anchor{cursor:pointer}.single__contents a.footnote-ref{font-size:.75rem;font-weight:700;margin-left:3px}.single__contents a.footnote-ref::before{content:"["}.single__contents a.footnote-ref::after{content:"]"}.single__contents .table-wrapper{overflow-x:auto}.single__contents .table-wrapper>table{max-width:100%;margin:10px 0;border-spacing:0;box-shadow:1px 1px 3px rgba(0,0,0,.125)}.theme__dark .single__contents .table-wrapper>table thead{background:#011220}.theme__dark .single__contents .table-wrapper>table th{color:#fcfcfa}.theme__dark .single__contents .table-wrapper>table th,.theme__dark .single__contents .table-wrapper>table td{padding:.25rem .5rem;border:1px double #3a3a3a}.theme__light .single__contents .table-wrapper>table thead{background:#e2e6e9}.theme__light .single__contents .table-wrapper>table th{color:#344952}.theme__light .single__contents .table-wrapper>table th,.theme__light .single__contents .table-wrapper>table td{padding:.25rem .5rem;border:1px double #d7dee2}.theme__hacker .single__contents .table-wrapper>table thead{background:#1c201c}.theme__hacker .single__contents .table-wrapper>table th{color:#fcfcfa}.theme__hacker .single__contents .table-wrapper>table th,.theme__hacker .single__contents .table-wrapper>table td{padding:.25rem .5rem;border:1px double #424242}.theme__solarized .single__contents .table-wrapper>table thead{background:#faedc5}.theme__solarized .single__contents .table-wrapper>table th{color:#344952}.theme__solarized .single__contents .table-wrapper>table th,.theme__solarized .single__contents .table-wrapper>table td{padding:.25rem .5rem;border:1px double #f8e6ab}.theme__kimbie .single__contents .table-wrapper>table thead{background:#412f16}.theme__kimbie .single__contents .table-wrapper>table th{color:#8ab1b0}.theme__kimbie .single__contents .table-wrapper>table th,.theme__kimbie .single__contents .table-wrapper>table td{padding:.25rem .5rem;border:1px double #e3b583}.single__contents .table-wrapper code:not([class^=language]){padding:3px 7px}.theme__dark .single__contents .table-wrapper code:not([class^=language]){color:#fcfcfa}.theme__light .single__contents .table-wrapper code:not([class^=language]){color:#26a69a}.theme__hacker .single__contents .table-wrapper code:not([class^=language]){color:#e3cd26}.theme__solarized .single__contents .table-wrapper code:not([class^=language]){color:#268bd2}.theme__kimbie .single__contents .table-wrapper code:not([class^=language]){color:#f06431}.single__tags{list-style-type:none;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1}.single__tag{padding:0 .25rem}code,pre{padding:.5rem 0;line-height:1.5;font-size:13.8px;font-family:Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,lucida console,lucida sans typewriter,liberation mono,nimbus mono l,Monaco,Courier,monospace;overflow:auto}code a,pre a{text-decoration:none!important}.theme__dark *:not(.chroma) code,.theme__dark *:not(.chroma) pre{color:#eee;background:#171f2e}.theme__light *:not(.chroma) code,.theme__light *:not(.chroma) pre{color:#344952;background:#eceff1}.theme__hacker *:not(.chroma) code,.theme__hacker *:not(.chroma) pre{color:#d1d1d1;background:#282a36}.theme__solarized *:not(.chroma) code,.theme__solarized *:not(.chroma) pre{color:#344952;background:#f9fbe7}.theme__kimbie *:not(.chroma) code,.theme__kimbie *:not(.chroma) pre{color:#d3af86;background:#362712}*:not(.chroma) code{padding:0}code:not([class^=language]){padding:3px 0;border-radius:4px}.theme__dark code:not([class^=language]){color:#fcfcfa}.theme__light code:not([class^=language]){color:#26a69a}.theme__hacker code:not([class^=language]){color:#e3cd26}.theme__solarized code:not([class^=language]){color:#268bd2}.theme__kimbie code:not([class^=language]){color:#f06431}pre:not(.chroma){overflow:auto}.single__contents>.language-code,li>.language-code{overflow-x:auto;position:relative;margin:1rem 0;direction:ltr}.single__contents>.language-code:hover .copy-to-clipboard,.single__contents>.language-code:active .copy-to-clipboard,.single__contents>.language-code:focus .copy-to-clipboard,li>.language-code:hover .copy-to-clipboard,li>.language-code:active .copy-to-clipboard,li>.language-code:focus .copy-to-clipboard{opacity:1}.single__contents>.language-code::after,li>.language-code::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;width:100%;height:30px;z-index:4;border-top-left-radius:.25rem;border-top-right-radius:.25rem;content:''}.theme__dark .single__contents>.language-code::after,.theme__dark li>.language-code::after{color:#fcfcfa;background:#011220}.theme__light .single__contents>.language-code::after,.theme__light li>.language-code::after{color:#344952;background:#e2e6e9}.theme__hacker .single__contents>.language-code::after,.theme__hacker li>.language-code::after{color:#fcfcfa;background:#1c201c}.theme__solarized .single__contents>.language-code::after,.theme__solarized li>.language-code::after{color:#344952;background:#faedc5}.theme__kimbie .single__contents>.language-code::after,.theme__kimbie li>.language-code::after{color:#8ab1b0;background:#412f16}.highlight{position:relative}.highlight:hover .copy-to-clipboard,.highlight:active .copy-to-clipboard,.highlight:focus .copy-to-clipboard{opacity:1}.highlight>.chroma{margin:1em 0;border-radius:5px;box-shadow:1px 1px 2px rgba(0,0,0,.125);z-index:7;overflow-x:auto;direction:ltr;position:relative}.theme__dark .highlight>.chroma{color:#eee;background:#171f2e}.theme__light .highlight>.chroma{color:#344952;background:#eceff1}.theme__hacker .highlight>.chroma{color:#d1d1d1;background:#282a36}.theme__solarized .highlight>.chroma{color:#344952;background:#f9fbe7}.theme__kimbie .highlight>.chroma{color:#d3af86;background:#362712}.highlight>.chroma code{padding:0}.highlight>.chroma code[data-lang]::before{position:absolute;top:0;left:0;z-index:10;padding:2px 7px;width:100%;height:30px;line-height:1.9;font-size:13.8px;font-family:montserrat,sans-serif;font-weight:700;display:inline-block;text-transform:capitalize;content:attr(data-lang)}.theme__dark .highlight>.chroma code[data-lang]::before{color:#fcfcfa;background:#011220}.theme__light .highlight>.chroma code[data-lang]::before{color:#344952;background:#e2e6e9}.theme__hacker .highlight>.chroma code[data-lang]::before{color:#fcfcfa;background:#1c201c}.theme__solarized .highlight>.chroma code[data-lang]::before{color:#344952;background:#faedc5}.theme__kimbie .highlight>.chroma code[data-lang]::before{color:#8ab1b0;background:#412f16}.highlight>.chroma table,.highlight>.chroma tr,.highlight>.chroma td{margin:0;padding:0;width:100%;border-collapse:collapse}.highlight>.chroma .lntd:first-child{width:10px;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlight>.chroma .lntd:first-child pre{margin:0;padding:34px 4px 6px}.highlight>.chroma .lntd:last-child{vertical-align:top}.highlight>.chroma .lntd:last-child pre{margin:0;padding:34px 4px 6px}.theme__dark .highlight>.chroma .lnt{color:#666}.theme__light .highlight>.chroma .lnt{color:#aaa}.theme__hacker .highlight>.chroma .lnt{color:#666}.theme__solarized .highlight>.chroma .lnt{color:#aaa}.theme__kimbie .highlight>.chroma .lnt{color:#666}.highlight>.chroma table.lntable{overflow-x:auto}.theme__dark .highlight>.chroma table.lntable{scrollbar-width:thin;scrollbar-color:#888 #eee}.theme__dark .highlight>.chroma table.lntable::-webkit-scrollbar{width:.45em;height:.45em}.theme__dark .highlight>.chroma table.lntable::-webkit-scrollbar-thumb{background:#888}.theme__dark .highlight>.chroma table.lntable::-webkit-scrollbar-track{background:#eee}.theme__light .highlight>.chroma table.lntable{scrollbar-width:thin;scrollbar-color:#cfd8dc #fcfcfa}.theme__light .highlight>.chroma table.lntable::-webkit-scrollbar{width:.45em;height:.45em}.theme__light .highlight>.chroma table.lntable::-webkit-scrollbar-thumb{background:#cfd8dc}.theme__light .highlight>.chroma table.lntable::-webkit-scrollbar-track{background:#fcfcfa}.theme__hacker .highlight>.chroma table.lntable{scrollbar-width:thin;scrollbar-color:#616161 #fcfcfa}.theme__hacker .highlight>.chroma table.lntable::-webkit-scrollbar{width:.45em;height:.45em}.theme__hacker .highlight>.chroma table.lntable::-webkit-scrollbar-thumb{background:#616161}.theme__hacker .highlight>.chroma table.lntable::-webkit-scrollbar-track{background:#fcfcfa}.theme__solarized .highlight>.chroma table.lntable{scrollbar-width:thin;scrollbar-color:#b0bec5 #eee8d5}.theme__solarized .highlight>.chroma table.lntable::-webkit-scrollbar{width:.45em;height:.45em}.theme__solarized .highlight>.chroma table.lntable::-webkit-scrollbar-thumb{background:#b0bec5}.theme__solarized .highlight>.chroma table.lntable::-webkit-scrollbar-track{background:#eee8d5}.theme__kimbie .highlight>.chroma table.lntable{scrollbar-width:thin;scrollbar-color:#5e452b #d3af86}.theme__kimbie .highlight>.chroma table.lntable::-webkit-scrollbar{width:.45em;height:.45em}.theme__kimbie .highlight>.chroma table.lntable::-webkit-scrollbar-thumb{background:#5e452b}.theme__kimbie .highlight>.chroma table.lntable::-webkit-scrollbar-track{background:#d3af86}li .highlight>.chroma .lnt:first-child{padding:0 .3rem}li .highlight>.chroma .lnt:not(:first-child){padding:0 .3rem}td:not(.lntd) code{padding:2px 7px!important}table:not(.lntable) td code{padding:2px 7px!important}.terms{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.terms__title{margin:2rem 0;font-family:montserrat,sans-serif}.theme__dark .terms__title{color:#ddd;text-shadow:1.2px 1.2px 0 #ddd,2.4px 2.4px 0 #4a484b,3.6px 3.6px 0 #555256,4.8px 4.8px 0 #5f5c60}.theme__light .terms__title{color:#607d8b;text-shadow:1.2px 1.2px 0 #607d8b,2.4px 2.4px 0 #4c4c4c,3.6px 3.6px 0 #565656,4.8px 4.8px 0 #616161}.theme__hacker .terms__title{color:#c7ba00;text-shadow:1.2px 1.2px 0 #c7ba00,2.4px 2.4px 0 #2f2f30,3.6px 3.6px 0 #39393b,4.8px 4.8px 0 #434345}.theme__solarized .terms__title{color:#cb4b16;text-shadow:1.2px 1.2px 0 #cb4b16,2.4px 2.4px 0 #4d6570,3.6px 3.6px 0 #56707c,4.8px 4.8px 0 #5e7b88}.theme__kimbie .terms__title{color:#889b4a;text-shadow:1.2px 1.2px 0 #889b4a,2.4px 2.4px 0 #453217,3.6px 3.6px 0 #553d1c,4.8px 4.8px 0 #644821}.terms__content{width:100%}.terms__list{width:50%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (max-width:769px){.terms__list{width:100%;padding:2rem 1rem}}.terms__item{display:inline-block;margin-right:1rem;text-decoration:none!important;border-radius:.25rem;padding:.25rem;-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.terms__item:hover,.terms__item:active,.terms__item:focus{-webkit-transform:translateY(-.25rem);-moz-transform:translateY(-.25rem);-ms-transform:translateY(-.25rem);transform:translateY(-.25rem)}.terms__link:hover{text-decoration:none}.theme__dark .terms__tags{color:#78dce8}.theme__light .terms__tags{color:#424242}.theme__hacker .terms__tags{color:#78dce8}.theme__solarized .terms__tags{color:#cf9c00}.theme__kimbie .terms__tags{color:#f06431}.theme__dark .terms__categories{color:#ab9df2}.theme__light .terms__categories{color:#424242}.theme__hacker .terms__categories{color:#ab9df2}.theme__solarized .terms__categories{color:#cb4b16}.theme__kimbie .terms__categories{color:#8ab1b0}.theme__dark .terms__series{color:#ea9c77}.theme__light .terms__series{color:#424242}.theme__hacker .terms__series{color:#ea9c77}.theme__solarized .terms__series{color:#859900}.theme__kimbie .terms__series{color:#dc3958}.theme__dark .terms__len{color:#727072}.theme__light .terms__len{color:#727072}.theme__hacker .terms__len{color:#e08c48}.theme__solarized .terms__len{color:#727072}.theme__kimbie .terms__len{color:#d3af86}.terms .is-small{font-size:1rem}.terms .is-normal{font-size:1.5rem}.terms .is-medium{font-size:2rem}.terms .is-large{font-size:2.5rem}.contact{padding:1rem;overflow-wrap:break-word;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.contact__input{height:35px;font-size:14px;padding:.25rem;border-radius:.125rem;border:none}.theme__dark .contact__input{color:#fcfcfa;border:1px solid #1d1d1d;background-color:#4d4a4e}.theme__light .contact__input{color:#424242;border:1px solid #e0e0e0;background-color:#eee}.theme__hacker .contact__input{color:#fcfcfa;border:1px solid #0d0e0f;background-color:#2f2f30}.theme__solarized .contact__input{color:#b58900;border:1px solid #f7e3a2;background-color:#fbf1d1}.theme__kimbie .contact__input{color:#e3b583;border:1px solid #423523;background-color:#362712}.contact__input--wrapper{margin:.25rem;min-width:0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1;-webkit-flex-shrink:1;-moz-flex-shrink:1;-ms-flex-shrink:1;flex-shrink:1;-webkit-flex-basis:0;-moz-flex-basis:0;-ms-flex-basis:0;flex-basis:0}.contact__input--container{margin-bottom:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}@media only screen and (max-width:769px){.contact__input--container{display:block}}.contact__message{padding:.25rem;min-height:140px;font-size:14px;border-radius:.125rem;border:none}.theme__dark .contact__message{color:#fcfcfa;border:1px solid #1d1d1d;background-color:#4d4a4e}.theme__light .contact__message{color:#424242;border:1px solid #e0e0e0;background-color:#eee}.theme__hacker .contact__message{color:#fcfcfa;border:1px solid #0d0e0f;background-color:#2f2f30}.theme__solarized .contact__message{color:#b58900;border:1px solid #f7e3a2;background-color:#fbf1d1}.theme__kimbie .contact__message{color:#e3b583;border:1px solid #423523;background-color:#362712}.contact__message--wrapper{margin:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.contact__label{font-family:montserrat,sans-serif;font-size:14px;font-weight:700;padding:.25rem 0}.contact__desc{width:65%}@media only screen and (max-width:769px){.contact__desc{width:100%}}.contact__form{width:65%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@media only screen and (max-width:769px){.contact__form{width:100%}}.contact__send{height:35px;margin:.75rem .25rem;font-family:montserrat,sans-serif;font-weight:700;border:none;border-radius:.125rem}.theme__dark .contact__send{color:inherit;border:1px solid #1d1d1d;background-color:#4d4a4e}.theme__light .contact__send{color:inherit;border:1px solid #e0e0e0;background-color:#eee}.theme__hacker .contact__send{color:inherit;border:1px solid #0d0e0f;background-color:#2f2f30}.theme__solarized .contact__send{color:inherit;border:1px solid #f7e3a2;background-color:#fbf1d1}.theme__kimbie .contact__send{color:inherit;border:1px solid #423523;background-color:#362712}.talk__date{border-radius:.25rem;min-width:100px;max-width:100px;font-size:16px;height:26px;line-height:26px;text-align:center;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100px}.talk__date[data-ani=true]{-webkit-animation:slide-in-left .2s .5s 1 ease both;-moz-animation:slide-in-left .2s .5s 1 ease both;-ms-animation:slide-in-left .2s .5s 1 ease both;-o-animation:slide-in-left .2s .5s 1 ease both;animation:slide-in-left .2s .5s 1 ease both}.theme__dark .talk__date{color:#aed581;background-color:#424242}.theme__light .talk__date{color:#424242;background-color:#bdbdbd}.theme__hacker .talk__date{color:#e3cd26;background-color:#855e78}.theme__solarized .talk__date{color:#455a64;background-color:#f6e099}.theme__kimbie .talk__date{color:#d3af86;background-color:#5e452b}.talk__date[data-dir=rtl]{margin-left:1rem}.talk__date[data-dir=ltr]{margin-right:1rem}.talk__icons{padding:0 .5rem;margin:auto 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.talk__icons svg{display:block;margin:auto}.talk__icon{margin:auto .25rem}.theme__dark .talk__icon{color:#bdbdbd}.theme__light .talk__icon{color:#777}.theme__hacker .talk__icon{color:#9e9e9e}.theme__solarized .talk__icon{color:#637c84}.theme__kimbie .talk__icon{color:#ccc}.talk__title{margin-right:.5rem;margin-left:.75rem}.talk__title[data-title-wrap^=no]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:960}@media only screen and (max-width:600px){.talk__title{margin-top:1rem;margin-bottom:.5rem}}.talk__title[data-dir=ltr]:hover::before,.talk__title[data-dir=ltr]:active::before,.talk__title[data-dir=ltr]:focus::before{content:'';position:absolute;left:3rem;width:.25rem;height:30px}.theme__dark .talk__title[data-dir=ltr]:hover::before,.theme__dark .talk__title[data-dir=ltr]:active::before,.theme__dark .talk__title[data-dir=ltr]:focus::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__dark .talk__title[data-dir=ltr]:hover::before,.theme__dark .talk__title[data-dir=ltr]:active::before,.theme__dark .talk__title[data-dir=ltr]:focus::before{top:13px;left:0;height:24px}}.theme__light .talk__title[data-dir=ltr]:hover::before,.theme__light .talk__title[data-dir=ltr]:active::before,.theme__light .talk__title[data-dir=ltr]:focus::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__light .talk__title[data-dir=ltr]:hover::before,.theme__light .talk__title[data-dir=ltr]:active::before,.theme__light .talk__title[data-dir=ltr]:focus::before{top:13px;left:0;height:24px}}.theme__hacker .talk__title[data-dir=ltr]:hover::before,.theme__hacker .talk__title[data-dir=ltr]:active::before,.theme__hacker .talk__title[data-dir=ltr]:focus::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__hacker .talk__title[data-dir=ltr]:hover::before,.theme__hacker .talk__title[data-dir=ltr]:active::before,.theme__hacker .talk__title[data-dir=ltr]:focus::before{top:13px;left:0;height:24px}}.theme__solarized .talk__title[data-dir=ltr]:hover::before,.theme__solarized .talk__title[data-dir=ltr]:active::before,.theme__solarized .talk__title[data-dir=ltr]:focus::before{background-color:#ff6188}@media only screen and (max-width:768px){.theme__solarized .talk__title[data-dir=ltr]:hover::before,.theme__solarized .talk__title[data-dir=ltr]:active::before,.theme__solarized .talk__title[data-dir=ltr]:focus::before{top:13px;left:0;height:24px}}.theme__kimbie .talk__title[data-dir=ltr]:hover::before,.theme__kimbie .talk__title[data-dir=ltr]:active::before,.theme__kimbie .talk__title[data-dir=ltr]:focus::before{background-color:#dc3958}@media only screen and (max-width:768px){.theme__kimbie .talk__title[data-dir=ltr]:hover::before,.theme__kimbie .talk__title[data-dir=ltr]:active::before,.theme__kimbie .talk__title[data-dir=ltr]:focus::before{top:13px;left:0;height:24px}}@media only screen and (max-width:769px){.talk__title[data-dir=ltr]:hover::before,.talk__title[data-dir=ltr]:active::before,.talk__title[data-dir=ltr]:focus::before{height:24px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}}.showcase{padding:.75rem 1.5rem}.showcase__bio{position:-webkit-sticky;position:sticky;top:62.5px;display:block;margin-top:.5rem}@media only screen and (max-width:600px){.showcase__bio{display:none}}.showcase__nav{padding:.5rem 0;margin-bottom:.5rem}.theme__dark .showcase__nav{border-bottom:1px solid #595b5c}.theme__light .showcase__nav{border-bottom:1px solid #ccc}.theme__hacker .showcase__nav{border-bottom:1px solid #6b6b6b}.theme__solarized .showcase__nav{border-bottom:1px solid #ffb300}.theme__kimbie .showcase__nav{border-bottom:1px solid #7f5d38}.showcase__button{border:none;outline:none;font-family:montserrat,sans-serif;font-size:.95rem;border-top-left-radius:.125rem;border-top-right-radius:.125rem;padding:.5rem 0;margin-right:1rem;position:relative;text-decoration:none!important;display:inline-block;cursor:pointer}.theme__dark .showcase__button{color:#fcfcfa}.theme__dark .showcase__button:hover,.theme__dark .showcase__button:active,.theme__dark .showcase__button:focus{color:#ffd866}.theme__light .showcase__button{color:#555}.theme__light .showcase__button:hover,.theme__light .showcase__button:active,.theme__light .showcase__button:focus{color:#607d8b}.theme__hacker .showcase__button{color:#e3cd26}.theme__hacker .showcase__button:hover,.theme__hacker .showcase__button:active,.theme__hacker .showcase__button:focus{color:#1fff2a}.theme__solarized .showcase__button{color:#586e75}.theme__solarized .showcase__button:hover,.theme__solarized .showcase__button:active,.theme__solarized .showcase__button:focus{color:#b58900}.theme__kimbie .showcase__button{color:#d3af86}.theme__kimbie .showcase__button:hover,.theme__kimbie .showcase__button:active,.theme__kimbie .showcase__button:focus{color:#f06431}.showcase__button[data-meta]:after{content:attr(data-meta);width:100%;padding:.125rem .35rem;border-radius:.25rem;margin:auto;font-size:12px}.theme__dark .showcase__button[data-meta]:after{color:#fcfcfa;background-color:#212121}.theme__light .showcase__button[data-meta]:after{color:#424242;background-color:#c8c8c8}.theme__hacker .showcase__button[data-meta]:after{color:#e3cd26;background-color:#252526}.theme__solarized .showcase__button[data-meta]:after{color:#268bd2;background-color:#f8e7b0}.theme__kimbie .showcase__button[data-meta]:after{color:#d3af86;background-color:#6e583b}.theme__dark .showcase__button.active{color:#ff6188}.theme__light .showcase__button.active{color:#6b8a99}.theme__hacker .showcase__button.active{color:#f3ff6e}.theme__solarized .showcase__button.active{color:#cb4b16}.theme__kimbie .showcase__button.active{color:#889b4a}.showcase__box{width:100%;max-width:48%;height:auto;border-radius:.2rem;padding:1rem;position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}.showcase__box[data-dir=rtl]:nth-child(odd){margin:.5rem;margin-right:0}.showcase__box[data-dir=rtl]:nth-child(even){margin:.5rem;margin-left:0}.showcase__box[data-dir=ltr]:nth-child(odd){margin:.5rem;margin-left:0}.showcase__box[data-dir=ltr]:nth-child(even){margin:.5rem;margin-right:0}.theme__dark .showcase__box{border:1px solid #616161}.theme__light .showcase__box{border:1px solid #aaa}.theme__hacker .showcase__box{border:1px solid #6b6b6b}.theme__solarized .showcase__box{border:1px solid #b58900}.theme__kimbie .showcase__box{border:1px solid #6e583b}.showcase__box:hover,.showcase__box:active,.showcase__box:focus{-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);-moz-box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);background-color:rgba(125,125,125,.1)}@media only screen and (max-width:1180px){.showcase__box{max-width:48%}}@media only screen and (max-width:769px){.showcase__box{max-width:100%;margin:.5rem 0!important}}.showcase__box--wrapper{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.showcase__box--wrapper[data-ani=true]{-webkit-animation:slide-in-left-little .2s .25s 1 ease-in both;-moz-animation:slide-in-left-little .2s .25s 1 ease-in both;-ms-animation:slide-in-left-little .2s .25s 1 ease-in both;-o-animation:slide-in-left-little .2s .25s 1 ease-in both;animation:slide-in-left-little .2s .25s 1 ease-in both}.showcase__box--title{word-break:break-word;font-family:montserrat,sans-serif;font-size:1rem;font-weight:700;margin-bottom:.5rem;cursor:pointer}.theme__dark .showcase__box--title{color:#ffd866}.theme__light .showcase__box--title{color:#607d8b}.theme__hacker .showcase__box--title{color:#a1ad64}.theme__solarized .showcase__box--title{color:#cb4b16}.theme__kimbie .showcase__box--title{color:#996329}.showcase__box--desc{font-size:.9rem;margin-top:.25rem;height:70px}.showcase__box--img{width:auto;height:100%;margin:.5rem 0;max-height:225px;object-fit:cover;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.showcase__box--img img{border-radius:.2rem;display:block;margin:auto;max-height:225px}.showcase__box--meta{margin-top:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-end;-moz-justify-content:flex-end;-ms-justify-content:flex-end;justify-content:flex-end;-ms-flex-pack:flex-end}.showcase__box--meta .type{font-size:12px;text-transform:capitalize;margin-top:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.theme__dark .showcase__box--meta .type{color:#fcfcfa}.theme__light .showcase__box--meta .type{color:#424242}.theme__hacker .showcase__box--meta .type{color:#cdf5cc}.theme__solarized .showcase__box--meta .type{color:#b58900}.theme__kimbie .showcase__box--meta .type{color:#889b4a}.showcase__box--meta .type svg{display:block;margin:auto .2rem auto .35rem}.showcase__box--meta .type img{margin-left:.35rem}.showcase__box--meta a.type{z-index:2;text-decoration:none;cursor:pointer}.theme__dark .showcase__box--meta a.type:hover,.theme__dark .showcase__box--meta a.type:active,.theme__dark .showcase__box--meta a.type:focus{color:#ff6188}.theme__light .showcase__box--meta a.type:hover,.theme__light .showcase__box--meta a.type:active,.theme__light .showcase__box--meta a.type:focus{color:#26a69a}.theme__hacker .showcase__box--meta a.type:hover,.theme__hacker .showcase__box--meta a.type:active,.theme__hacker .showcase__box--meta a.type:focus{color:#c7ba00}.theme__solarized .showcase__box--meta a.type:hover,.theme__solarized .showcase__box--meta a.type:active,.theme__solarized .showcase__box--meta a.type:focus{color:#268bd2}.theme__kimbie .showcase__box--meta a.type:hover,.theme__kimbie .showcase__box--meta a.type:active,.theme__kimbie .showcase__box--meta a.type:focus{color:#f06431}.showcase__box--shields{margin-top:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.showcase__box--shields a.type{margin-right:.5rem}.showcase__box--link{z-index:1;position:absolute;left:0;top:0;width:100%;height:100%}.wrapper{margin:0 auto;position:relative;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center;-ms-flex-pack:center}.theme__dark .wrapper{background-color:#2d2a2e}.theme__light .wrapper{background-color:#fafafa}.theme__hacker .wrapper{background-color:#151715}.theme__solarized .wrapper{background-color:#fdf7e3}.theme__kimbie .wrapper{background-color:#221a0f}@media only screen and (max-width:769px){.wrapper{grid-template-columns:minmax(0,5fr)minmax(0,2fr)}}.wrapper__left{position:fixed;top:0;left:-.5rem;height:100vh;width:calc((100vw - 960px)/2)}.wrapper__left[data-pad=false]{left:0}.wrapper__right{position:fixed;top:0;right:-.5rem;height:100vh;width:calc((100vw - 960px)/2)}.wrapper__right[data-pad=false]{right:0}.pub{padding:.75rem 1.5rem}@media only screen and (max-width:600px){.pub{padding:1rem}}.pub__section{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.pub__toolbar--search{width:240px;padding:0 .5rem;margin-right:1rem}@media only screen and (max-width:600px){.pub__toolbar--search{width:100%}}.pub__list{margin:1rem 0}.pub__item{margin:1rem;padding:.5rem 0;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@media only screen and (max-width:600px){.pub__item{margin:1rem 0}}.theme__dark .pub__item a{color:#ffd866}.theme__dark .pub__item a:hover,.theme__dark .pub__item a:active,.theme__dark .pub__item a:focus{color:#ff6188}.theme__light .pub__item a{color:#607d8b}.theme__light .pub__item a:hover,.theme__light .pub__item a:active,.theme__light .pub__item a:focus{color:#26a69a}.theme__hacker .pub__item a{color:#a1ad64}.theme__hacker .pub__item a:hover,.theme__hacker .pub__item a:active,.theme__hacker .pub__item a:focus{color:#c7ba00}.theme__solarized .pub__item a{color:#cb4b16}.theme__solarized .pub__item a:hover,.theme__solarized .pub__item a:active,.theme__solarized .pub__item a:focus{color:#268bd2}.theme__kimbie .pub__item a{color:#996329}.theme__kimbie .pub__item a:hover,.theme__kimbie .pub__item a:active,.theme__kimbie .pub__item a:focus{color:#f06431}.pub__meta{margin:0 .25rem;display:inline-block}.theme__dark .pub__meta{color:#fcfcfa}.theme__light .pub__meta{color:#424242}.theme__hacker .pub__meta{color:#cdf5cc}.theme__solarized .pub__meta{color:#b58900}.theme__kimbie .pub__meta{color:#889b4a}.pub__summary{margin-top:.75rem;margin-bottom:1rem;font-size:1rem}.pub__btn{padding:0 .4rem;border-radius:.2rem}.theme__dark .pub__btn{color:#fcfcfa!important;background-color:#525252}.theme__dark .pub__btn:hover,.theme__dark .pub__btn:active,.theme__dark .pub__btn:focus{background-color:#454545}.theme__light .pub__btn{color:#424242!important;background-color:#eceff1}.theme__light .pub__btn:hover,.theme__light .pub__btn:active,.theme__light .pub__btn:focus{background-color:#dde3e6}.theme__hacker .pub__btn{color:#1fff2a!important;background-color:#43454d}.theme__hacker .pub__btn:hover,.theme__hacker .pub__btn:active,.theme__hacker .pub__btn:focus{background-color:#37393f}.theme__solarized .pub__btn{color:#586e75!important;background-color:#c5e0df}.theme__solarized .pub__btn:hover,.theme__solarized .pub__btn:active,.theme__solarized .pub__btn:focus{background-color:#b4d7d6}.theme__kimbie .pub__btn{color:#e3b583!important;background-color:#52493c}.theme__kimbie .pub__btn:hover,.theme__kimbie .pub__btn:active,.theme__kimbie .pub__btn:focus{background-color:#433c31}.pub__metas{margin-top:.25rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.pub__tags{display:inline-block;list-style-type:none;z-index:2;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}.pub__tag{padding:0 .25rem}.theme__dark .pub__tag{color:#ffd866!important}.theme__dark .pub__tag:hover,.theme__dark .pub__tag:active,.theme__dark .pub__tag:focus{color:#ff6188!important}.theme__light .pub__tag{color:#607d8b!important}.theme__light .pub__tag:hover,.theme__light .pub__tag:active,.theme__light .pub__tag:focus{color:#26a69a!important}.theme__hacker .pub__tag{color:#e08c48!important}.theme__hacker .pub__tag:hover,.theme__hacker .pub__tag:active,.theme__hacker .pub__tag:focus{color:#c7ba00!important}.theme__solarized .pub__tag{color:#859900!important}.theme__solarized .pub__tag:hover,.theme__solarized .pub__tag:active,.theme__solarized .pub__tag:focus{color:#268bd2!important}.theme__kimbie .pub__tag{color:#dc322f!important}.theme__kimbie .pub__tag:hover,.theme__kimbie .pub__tag:active,.theme__kimbie .pub__tag:focus{color:#f06431!important}.pub__box{width:100%;height:auto;border-radius:.2rem;padding:1rem;position:relative;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-grow:1;-moz-flex-grow:1;-ms-flex-grow:1;flex-grow:1;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;justify-content:flex-start;-ms-flex-pack:flex-start}.theme__dark .pub__box{border:1px solid #616161;background-color:#2d2a2e}.theme__light .pub__box{border:1px solid #aaa;background-color:#fafafa}.theme__hacker .pub__box{border:1px solid #6b6b6b;background-color:#151715}.theme__solarized .pub__box{border:1px solid #b58900;background-color:#fdf7e3}.theme__kimbie .pub__box{border:1px solid #6e583b;background-color:#221a0f}.pub__box:hover,.pub__box:active,.pub__box:focus{-webkit-box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);-moz-box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);box-shadow:1px 1px 3px 0 rgba(0,0,0,.25);background-color:rgba(125,125,125,.1)}.pub__box--title{font-size:1rem;font-family:montserrat,sans-serif}.theme__dark .pub__box--title{color:#ffd866}.theme__light .pub__box--title{color:#607d8b}.theme__hacker .pub__box--title{color:#a1ad64}.theme__solarized .pub__box--title{color:#cb4b16}.theme__kimbie .pub__box--title{color:#996329}.pub__box--desc{font-size:.9rem;margin:.5rem 0}.pub__box--links{width:100%;font-size:.9rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;-moz-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.pub__box--links a{margin:.125rem;z-index:2}.theme__dark .pub__box--links a{color:#fcfcfa;text-decoration:none}.theme__dark .pub__box--links a:hover,.theme__dark .pub__box--links a:active,.theme__dark .pub__box--links a:focus{color:#ff6188}.theme__light .pub__box--links a{color:#424242;text-decoration:none}.theme__light .pub__box--links a:hover,.theme__light .pub__box--links a:active,.theme__light .pub__box--links a:focus{color:#26a69a}.theme__hacker .pub__box--links a{color:#cdf5cc;text-decoration:none}.theme__hacker .pub__box--links a:hover,.theme__hacker .pub__box--links a:active,.theme__hacker .pub__box--links a:focus{color:#c7ba00}.theme__solarized .pub__box--links a{color:#b58900;text-decoration:none}.theme__solarized .pub__box--links a:hover,.theme__solarized .pub__box--links a:active,.theme__solarized .pub__box--links a:focus{color:#268bd2}.theme__kimbie .pub__box--links a{color:#889b4a;text-decoration:none}.theme__kimbie .pub__box--links a:hover,.theme__kimbie .pub__box--links a:active,.theme__kimbie .pub__box--links a:focus{color:#f06431}.pub__box--links[data-dir=ltr] a:not(.pub__tag):first-child{margin-right:1rem}.pub__box--links[data-dir=rtl] a:not(.pub__tag):first-child{margin-left:1rem}.pgrid{position:relative;margin-bottom:1rem}.pgrid .full{width:100%}.pgrid .half{width:50%}.pgrid:after{content:'';display:block;clear:both}.pgrid-sizer{padding:.5rem}.pgrid-sizer,.pgrid-item{width:49.5%}@media only screen and (max-width:769px){.pgrid-sizer,.pgrid-item{width:100%}}.pgrid-item{float:left;border-radius:.25rem;padding:.51rem;position:relative;opacity:1;height:auto;cursor:pointer}.pgrid-item img{display:block;max-width:100%}.resume{padding:1rem;font-size:1rem;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@media only screen and (max-width:769px){.resume{padding:0}}.resume__header--image{padding:0 1rem}.resume__header--name{font-family:montserrat,sans-serif;font-size:1.75rem;font-weight:900}.resume__section{display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}@media only screen and (max-width:769px){.resume__section{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}.theme__dark .resume__section--sectiontitle{font-family:montserrat,sans-serif;padding:0 1rem;font-size:1.25rem;color:#bdbdbd}.theme__dark .resume__section--title{font-family:montserrat,sans-serif;font-size:1.125rem;color:#fcfcfa;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:769px){.theme__dark .resume__section--title{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}}.theme__dark .resume__section--meta{font-size:.9rem}.theme__dark .resume__section--contents ol,.theme__dark .resume__section--contents ul{margin-left:2.5rem}.theme__dark .resume__section--contents li{margin:0}.theme__light .resume__section--sectiontitle{font-family:montserrat,sans-serif;padding:0 1rem;font-size:1.25rem;color:#727072}.theme__light .resume__section--title{font-family:montserrat,sans-serif;font-size:1.125rem;color:#424242;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:769px){.theme__light .resume__section--title{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}}.theme__light .resume__section--meta{font-size:.9rem}.theme__light .resume__section--contents ol,.theme__light .resume__section--contents ul{margin-left:2.5rem}.theme__light .resume__section--contents li{margin:0}.theme__hacker .resume__section--sectiontitle{font-family:montserrat,sans-serif;padding:0 1rem;font-size:1.25rem;color:#9e9e9e}.theme__hacker .resume__section--title{font-family:montserrat,sans-serif;font-size:1.125rem;color:#cdf5cc;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:769px){.theme__hacker .resume__section--title{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}}.theme__hacker .resume__section--meta{font-size:.9rem}.theme__hacker .resume__section--contents ol,.theme__hacker .resume__section--contents ul{margin-left:2.5rem}.theme__hacker .resume__section--contents li{margin:0}.theme__solarized .resume__section--sectiontitle{font-family:montserrat,sans-serif;padding:0 1rem;font-size:1.25rem;color:#b58900}.theme__solarized .resume__section--title{font-family:montserrat,sans-serif;font-size:1.125rem;color:#b58900;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:769px){.theme__solarized .resume__section--title{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}}.theme__solarized .resume__section--meta{font-size:.9rem}.theme__solarized .resume__section--contents ol,.theme__solarized .resume__section--contents ul{margin-left:2.5rem}.theme__solarized .resume__section--contents li{margin:0}.theme__kimbie .resume__section--sectiontitle{font-family:montserrat,sans-serif;padding:0 1rem;font-size:1.25rem;color:#d3af86}.theme__kimbie .resume__section--title{font-family:montserrat,sans-serif;font-size:1.125rem;color:#889b4a;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center}@media only screen and (max-width:769px){.theme__kimbie .resume__section--title{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-moz-align-items:flex-start;-ms-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start}}.theme__kimbie .resume__section--meta{font-size:.9rem}.theme__kimbie .resume__section--contents ol,.theme__kimbie .resume__section--contents ul{margin-left:2.5rem}.theme__kimbie .resume__section--contents li{margin:0}.resume__section[data-dir=rtl] .resume__section--side{word-wrap:break-word;width:30%;padding:.75rem;display:block;text-align:left}@media only screen and (max-width:769px){.resume__section[data-dir=rtl] .resume__section--side{text-align:right;width:100%;padding:.75rem 0}}.resume__section[data-dir=rtl] .resume__section--main{word-wrap:break-word;width:70%;padding:.75rem;display:block;text-align:right;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@media only screen and (max-width:769px){.resume__section[data-dir=rtl] .resume__section--main{width:100%}}.resume__section[data-dir=ltr] .resume__section--side{word-wrap:break-word;width:30%;padding:.75rem;display:block;text-align:right}@media only screen and (max-width:769px){.resume__section[data-dir=ltr] .resume__section--side{text-align:left;width:100%;padding:.75rem 0}}.resume__section[data-dir=ltr] .resume__section--main{word-wrap:break-word;width:70%;padding:.75rem;display:block;text-align:left;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@media only screen and (max-width:769px){.resume__section[data-dir=ltr] .resume__section--main{width:100%}} \ No newline at end of file diff --git a/website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.json b/website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.json new file mode 100644 index 000000000..d773bfa62 --- /dev/null +++ b/website/resources/_gen/assets/scss/sass/main.scss_b4f67ac5085b89b62b54c1923e5a9145.json @@ -0,0 +1 @@ +{"Target":"css/main.min.css","MediaType":"text/css","Data":{}} \ No newline at end of file diff --git a/website/static/favicon/android-icon-144x144.png b/website/static/favicon/android-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..544582838f7b1ff3660a8da47f42ac0882f3f217 GIT binary patch literal 6058 zcmZ{o2UHVZv%r&(fDn)#iu9sL4G?+_Bvh#)9qABy=v7RlNiPZl0tOI>ND~lHS`_JB zy0oD32SvIHD$0xBdFQV4W~`3_od4Yk-8J_pBeYlpyHJWW_*c^#_R|Ca z*m(_6NUNxKyQQ&Vj&tEDy`lQeXH)KHfMpjo;IR=-83>YYOm1Tm1M3ve`bA5L@!_wE z!UVfkL?m($PChzR7=IQ5h8~q|h7|Vy6ou95g z(|bKo{35$3cdvb3(k?H2YfY`Ub5b*QzlHJ5|G6cmKKV{-_0Yd|W<8(@C+i|PPnum; ztG#8ID;Efv?H0-8jsHeVV8(zhgIK%vF9B#0`tztF0BU%kK#DQ2hU~`Lx924%ubGHw z0N*#Miu|p%a3NF09&bmABMYxB{KkJGv562+!?#9&w@5G-s-}t90I*`TmILEgj&<)k zsE;}wk&AW{<05z}q#As*w!?*>51@zmEqo`QM$#)ip-O5785yhUDm9J~+#LMvl zF?M*|_BueB=M>VcZPCOY1?ZR~%~Lm6I-N2fZXl+-;hlk_AtSMi&c= zu4E*(QTdvo!mkqYYC=Fw{468>B6(D~x8*q&IWXw!p(cY*je$|r9efPlN&uStvv^*t z1ol!BkOPYWYC^lJdliyAyzKI2-0!|*GH>g?$BcaFMK&NK$kz?v*YU8CM}{{NB5{ud zoWGPXZ>>&p(^2Q0oKqd{F(Zq}XXomG@NS<)_^ji))CF%T5WX6Q||E*zR{67NIcAgWK-@Ais;$rZf|% zf-4yvCK_@$o})%kkj}T{7W?PgElpm`O&5Nsj?Zb9b63*-K;0sRbIx1upnOL_(evKo z2kb6ai;?|bisA{-Q&`gzZfl~~*#$H8d$?Ypv;b@pQ%GOJ=t$R^HP(Vgnp`m82)vYQ z*TYk2u^U<|{0?V~>z^;CwMZv^1|3O92^FGA;bPUS*ZF<{Y`EPg!7LVOL|;wwVRW0I ze4I+!&Ks+VAe;=)46iG9+&{J6B;L}*ayW+ia3VT8(3F32QzeZ(^X zX&DDzq`rur4~5M!sEC-4ePMLzDK)8z?JFxnt0rbPsgFL%ilP%sI#54gGh***c(kPH z#eU?^xf#0IK~`loPum2LKM+R_Iro31GCMouhHr0laSWwgtr!9$bkuD?w~brP{A3Pp zlN#~*xCiD^q4C?jwqnX6`#etZJ|1}sZnA|>#0+CtYPD49`r9hLD?Or?)@3xr? zqKhRAXS@fr6%v?G{2WP3X!Ie}9#u|9{HV7#m=pDyyG^oL(F|lpu>X)rik&|ylO3?G zWO{n?8Uf*$O5EfmkCN=fKJ!6f8rPhu{T8|*1WErQ&1N?uWx&fWd)lV7r5;k%5E^pePy4q_Bt$Iz>;S#ELyTN8-dGsU82IIw`1(NnV<&sc+BZzmWEO7y zXWuqnbBxner{V}r1|5xk-5}ATl$N)Veht#-@Hciidp5IN4;z}b-SuSINWoqVl$Y-53N((FsJzKcgdEMr0n$jxQe}Lth-zNj)N<*5s{5+V z-PYDy%VHwWxa)bB*~rUWtt0NRqtvXv6hYcCQ1ttvjDh3L#D_HRNK;1z-vAvsU6p^{ z$mgxnU#%Z9ax^+PnMI2}voR+qMSK4^kzta^HK_^?&P)guPdiDxT9&y@>y*SeON~#hYpDx_-HocLga=O+ zi0e}mxb+HVsdp>Ad0ci(Fd_rmO3Nf_CL&#KREf$Vujr!vOKHYW^}dXgZ@*VEq0zeI zH$jdQER9Xcey;U##KRMk$%Ob;$R?(!;E%*h>`9c-L5`Femf2F@oKpA$X@b>x&y*r z10}ej6`-zX;HBCmKG>1%#-zY$pTjQhr@B7~QX#IL91w!?^kJtqSj9K<-pXsgqhNDU zzxrbu!Ohy9DsS0oG1y@4*87{Gi8kwJh=U7Aw)zZ{7>l*K!L8snkd{7jMCE=FnrNW? zbOJy|A>xvdS_j7DZhK!bJ9k^MN*DEY&7tyvGMh@lXLZdV(!j0T%P>Pj4W?(6G_OT2Yz!>MmY18ePQE34n3TQb_+*1a3Q0($kWA6s6o z=+CBwPIhp=)iV)=5t-3tefAbp40YA1YdKk31w)nFU5{cn3D?g3spef)L(V%Kzax9h zY@bi;gJf7bCt~|sru+`~4Q^j(-1sp&=IQy{)edx&-1s9=DV(N$Ge#}iSUoN?kD=@K z4gD8m+SWw>1j{{sWdn72-IrX^WOn*hLEhVv&Ft(;KU`UUI*#5{aBRR`2Jnk^rS&0= zBI;7PAoE|#zjUo5&zZyvZ#;+>EQF3-R4Y;~I!Knu z!HpE_WkrsG>4=w7oq;Abcc^RfZ3*yBBeqC%7MB!vN85(8_PyzmxuLu#t~q_q=Kd?w z5j%1@xU;o(N{%RRQ2yJWd5-hK>$%%;x=ru0*%)$6;BxT^KV zXjqRSM(CL+A@LHQ`f&DTprcEBn6fnHmki;L451tL0uS|fKip{;gyc6iT-?^nP)Zx0 z{{0qJ2ormvK0J!ab(nh9<87YrR05HB1iW)-!is`JM=RL#;&;rAmH;ceuitefRtn97 zN{NhZ{Pfl8CRVDMx4G+CR(VMMC&Eb0?Kkr^a*}FOmXCtUH5WC-8s9wi2S&r(0JpX! z4j<6&9cRtZdbsag=Ni7jOHhCRdrjgl*AkI91d8SlW5lu^FcQI)jys1itOk~MpkaLL z1E7_k@;KI&GqS(aw;m_AYniv>9qPZAD)Tpv_R;VtWe@BO;`l3HZfQEEa78+?&M9Qu z@o?0+GO(E2e*4^a;54&RYUD19E6uX6DaFm(O}Y|$9@Cioex%FL=p5pbJ{sk`!>7Jv z_0xdNVbvDB{**H`u-R{kc*USc?f!F5)uC!tU<+jT&atx5n29SSVRU+{osBTWF<8Img3SE|iObq0@IPWGJygx8Jp~@|#|__8NM^QnJh(oAWK(pRtXk z`b2TP4N)7KwZu^NZHeXuQ_rQl*#-6zTXzo!r!i_zhQ8y|AqeV&Ix~4J_l9*wPqwYL zdrAWC`rRnuP0DEk_~_Qf)SsE|z)XhA6;e>4bx~E=)FOdP$}FqouU@fLT_wbgqOE2P ztXa`uff6T%+iH-!)(MLYYWhW00?%-tc@vPUH-4*5J;cX0ZHC8ZLaYWouKQqpbbrWb zeM;vgG2)luZFM(fDd;6Co`ml&4(|0t0fzv~BLV)*P-2e{qz5~lG{{UJWe;rbn*rHxN^Yr2V8eMuZj_>>-Pb0EECQd5h zBF4^)h8VguIW^{zG{>nS3$uVD=$&-g znx+0ZCi*zLo3$+K+8%>#3zI<{ImasiT2P6rj@p*6_uwJZljY77u0?@Tu}fgvOa**c zA=FBHxWSVUe!w-0@2k*W@W!{|dqLG6*FR~DzdgbPuhejEnRYa+a<)F7x5+^_-dDgV zy zAqM4lgBxwa?e8Dp9*%{9-!Y5UITk|I!EubcAIv@Yuna5r9)b8yBNoD z{bFVY(LeO3K)UD7>F>^A@B)v8#gbA64Uu_ZC?W=D+P{A7hbQ^HqtH1@m_g)RGzyqh zkSXJn5GlXEUxhIj`DX6|X)U2`EiTU(yS_cF!hGt@#$AY0a1SvUmA13%x=IVLA(a0? zoTb)W>KJz^E1P~mk5*?2QAxQ{Aw|k0X_ddPvb47t+g2pU&SSaZmAm)#e@=%TXN&Cx zQ(>>({G=0M=v`RDdv$5n2oAwnORVo-Ms!_?<5A3hdH*+fsEEHxN9}xyN?H_F$t4Qt z&1iqMbHNeeQLpDTF<-f{|K@$U*j_;3ZVTrd%X;wUyQPscmn$46<}d}%uRs@5u3@2lrIqTw+e?tMG5og%n>2IAZdiNuTVa_f z)wIJ_Dk!a2Kr9Rr)Jgeyo?8B`$9?n-^$`G_^8X?^Yy8YH#v)}w4X=N-=+j(9PE0}F z8{V{KE~~VcOty(Un?CG(F(T2ctf2~v^%g7XL!s27|HMjT1!I1S*YB*}6F-v>b>u+VeaV^N|h}`2*-M9b!L1neC-KhU(&DkM#8jVaF!SkVP{wbO+{E=q1&~2Yp)b^Un zYfY=-!}W-banANdKUf{)0~|8?$3Q?o)_JR<`aytL>4*0Ct%Pl4%Ze#MYs9sy)@Q#A z8u&V#=ajjr@CRuVBfisaQjeba_>h#2u|5*_jp(6WEF-{ei7wS8oZB^1h$^5z)M%LJ zB2RY3KPeT`Tow%xpJ=SPPOFnlEPmk>ER=FJWa@K@TrU^@;|#vWa3GbooEoH)+8>!S z?414HN@MMu%L8-bJ{W7FZ5>P(65%bhBge1I^do4dHcTdxFp?6)9o1P+$9lJziHSZ` zrv}6U;5~I{{)Ozo4CLuoaJgWXhjKx_9tNmPgU<}7(65kJFa)%lHYmNucTC$)Pn#gw z8mV({n(dtK<8`ZFeYK)Lr*h)1hzqXK%|V@K@8i-aAA}|mI8Tz~^b)G$TsNN!HQ&U~ zV9{S~wu)K4JBUATJ4h~X{`LiFc@G2{lAe~<9$36(L6cTR(ogMR3_*2ZEM5mqS$0a29ArSH%i>u(sq3^PyksTiag$maDN1r7tXwvmdn^qG=XArJUQVCVix6Z87k68B zKG_=$Q7v2=3x}!MLUk=)%+8rC?A>)E2%25*aiykvUkWTq96=S=-YWBKVz8T``D~$X z?hO+6^ozZcr66YYp{>HS>Wc8_SK9k}L{C|E^IFefxtT+w=VsNGlp+zjYgaLS{j$0E zhOk&~M9Im1(c0uwjfBzij`4@Y#T_L1(4*SjJAd-28>JG3ZmUx5E*R#^`apgeK-?TF z7XxGAX@Qe^cZzjnQ(1Um(SH3;B4Ib6U71J0G6I9q3~9K9H(_0t0~t8Iya4BNs~=36 zVuorA`F3M^!&6H`S0CZ;0KD05e~We<&4G z(J-`an1^ear>c91Cq)3{;Bs&&xU7^c!U`^{icnIOlaqkMRpIcrqyg0bG6)Fr@bQZN z{|zcj<4-9DdVgmK4e|<$bPe$Y7zVg{dz!d<`?&iFC`v0yD@&;e$iZb1Qg8(+Svdg< zSw#U%SQu7SMkX>cQrhP)O=%QbIw-_@C3%nACEB1Uu33E@B#(l`ZvVH zC%`i-8tV!8S5z|CKyR&PYt#SmV`4?20I~{7$|{PA2!tGH>zGo$1~C4cpX)v`o&dOx z&ix9_FBFyazo~9m8Unn0{5>g`FB1?L<{#uOyk&#!BhpWiRt9Z#F u!{we#U+$|KYFHwu??<(qoSO%+Fg5+Q<&0+cJVSSrOX^Kt#`QkoFSW)1IaOC-qq zdAP>YsuWnrFUP_00YH>4F)Bqyw(m121xk^!62j068NR0e7Z3dgudiw<^5e8Ljr_Le zHj%ltE`Fbz#^u*$WG?4kot*E!!Y&;I$lXoo{vVCy9jzwFFdDs-28nvEM3a8D?4qE; zs;a6;J?foEVXN~*E~ea+VyMwoUn_{t_>Lz4FFvmEY`c53FzG{TZ*I$i8^!XYXVK@1 z+`pmrsJs&jMKnwVb_^K=^hc0e205zs@&(VRwHNu8$lvW*r5l zE}I72->=77p~rz{(9Q(Mydf8f9SIL)5Tp)pMztl1BofIRSMIA(LTq;MX%tgvg7 zh@pR*MJX?1Q1+&OO>BksiE(oV>*gl1X2QBn^U*lCEkPMQHVd^Sn#S!;0yc+bC-*jL zsCOxY4KekjrW4?Qr`SQ!@r@8Az7NBFeuq#Db4pXJ0R;!YG<6!mHNI5x1x<%#DBWIdT(3;i)rKmT(-=jF12Lu`c5X@_z~ zb=#v{d6%1c-i>Py2&bF1SL=j*DDl3EZJO@&E-wy&Q_c%LRBrlSLd&YisX`a$Z!L5G zgtNF7loH=ej?WS06V-<|OCLMB2iYdrj?n!#i&5Lvu{_O@7O=mNHr=IJkh6VWfrIUP zV%M^VHSW>p+l}72=wHd=^ z@eYgQE;2G-RTkt4MZOgz^v}{e&F>QN!WSVvn=tFTq4VO3uOO#yrx_x6N>QkXLnJ;| z%%uz;XzkQWaBa>wv7VeBnefF+yIQ#($UTGSjTqyJt3G4FL9jy;@$Nz!t+hNVSg2c^NaS~t zt2sz8tbZn4b=hiNS7e1G?-5TyqDr7(n<$o`Cc-UK<-IYw8)f|ZU?xG_YG~m8rzd#E zUBCtLx2Qyw6@xsWCG9)uQQ+c=H%^uNhp-CmP$SpXu0b!OVp+3OOi=e0n$yC>@$sLl z%q}^+$C@wE>mmu{$-fr`lAnz{Y#6k z7N?fy>Ca?B4ojlP!Qbv+>KA#ag>;$}tO{=zWx|8_sfVRSopR5z4B8w>q&zpA>?|nS zDCGQate{{gCI@=_byKPsv`2uf=KG>O+gW(|`Jtu9;_YRPa%nEjhGxgFj0OGC0;p7d zDbR1Of5#eY-ZgWUukb6ZKba(+UeNpNUypx%S4xFQ z&jvd)R45DK4Jl7~X_hyD{^^Q-;1t(m)5&!vkKM8GxnR#5T(A${w&*z1IZP9rS|v_} zsWEA@hL`qrhz*f;P<;xG<=pMl3&KtRP`4F*I3`AV9{!xj$QdY#=w%~O`fF>;xsmga zG=Qc7o(!GmLL_Jm?K^P|D|MGAGtAkB=0_DMq5AMiq1T|~puGg@1#MX}yK_2!ZtL$n ze$d}GJbJ#HtlK@I7Jpt%f!imNuN|?%rU4=b%*-0;^Bux|?FVWmCT*H8pri!x;5qb) zXi0{v>4wts2EEcc;6 zD|qkJMr&R32<**O&(fa!m~!`rGpf0G^kLf&hJ*!7Z%wTp z^e&rM-d*!V<$}jw%YiMmF8+Sw)RtER6J~#ADNek?+o*iJfO19YqmgbAAz2l7bt6D2 zK{1pd?6_UB0vvh6x(}G0ZOW+aQ75q-clx|`F8N+U$hQ-A7an|fLUse`j-Ez8tIBNT zmvjyPAcXwn4CnR$R+h}jYo)`=nZk6hIZQvmm$(#4tqdn?hlza?>bV}7h+1h? zw z02M{K>QoIX3tzB;s4W)?S|{UQ5s30km1Q2BO%295(+j)S9o?GB_S?bf&7DB%)FyMq z`}~G=K^&NvW4&vN%0gTuq~W1ez#+u=bVm=N4~dt={-ML^6UOs7+Wi@P_)H^6Lf#LYOfss(;l*+un=a!;8G4M1sDdv$QUjA;V!7a z_cIIC5bO8ZFDf6V`sP0USm8;;U}7rXK$*0JVTvW-zUpz>3HkRjxmkjYUtWPlih7MS z@#kn@Pyet9Z7EH(6!5ZbcdoC_22Aje;Vh3D`3!p=LYB>i z^N-$fqL4gwTvD(zQF8Q5Br~3oheH~QQlw}rQZP$WJ1e)$!IzuMPu9->6UK zdIKq(np~{iW$d|FiVcs?h9#A%7ucIF>ui@XNt7{C5-ErAx+}m)#C>$fs37YKRho(T ze#f>Y2^=4OBExrNa$^t0L4u*bRc1!++8&{LF`twB9q?qcmoCF1d>NItAF4r!UwVT| z?Luwod-Sj26I;QYBB@_vzL=65nydt(?~U>u?2Il8^#SoJD>AjS7jMWf8L;?yPTc#_ zI;+_njHp4pMWH)GHDz>jZ(|2WA0#RA%Fl<;)`cdkYA;Qb%U8ZI&`^mQ1-5H>rIqwL zk2kc$@UpeA3>xHqddbG*j9P2uMZN=!_{-XEw2hO#080mjc=>NLH>km`(7Q53`uq!+ zl|lrEN4a8k0skmPU}$J}O?|OP$BUkuL`B+oRvdMl<+rY;Tcri6!jdwFH;$>`;G)`W4wUIYApsf8xuW`uqT%y8z#A* zEJ;w_tOdz&@@Bw3dM7-0?4H6B`#PTHfvq!<2^Rkb|IyrXDy=~*PwFOB&;1$Tm%N$@ zb)WeIvA?^Zyr?sa&_~PT0&lR=0wqh=ToUq>0ry}H7pgw++`Mw~s6H%Af>RCOfr_qd; z8&44w9i+pp)zP|pA2AQURiGN~CU|l;+NV9iA;be7(`%Iy565C78nE)wpYRtcc5m)C z{{f`cRsKKvctW$UAJ=;FVn3JlhV*ys#oO>Ek#Fl3&4k|I^@OwD@Jy);El9yzcvc~# z+uHswWr_->yi-dAe4KAN=0Nm9UYK>Vrn_b{u%8t;p`o~Fe!118sp9p7nnEnyL3X|{ z3&ZOVmSp|yS4Q?yA~|^8=<6R+2Vl$2#R1^A7_+&&$tlmIp7gd>Rhgx#ZOYN;5K&>hp9kk@&|%%x-sF|3FA|N(tf|T7@yvPDI$Xq6wlV^+pU4JK_%`T>EEc5 ztEDL6#?md`tMVOfJi+W1L}<~XPD%q2lh zL7TT1;ZL1@hp5DtOh1CmyTz-lDu%n<6dfTftc~4!Dumy4OWg-;js*63vZ^J_g$YKg zE^#xhoqiPy4ELXqAtpbs*5i%-dR{s%%N_4fiaclqZ8Kq{Ca444KMI+pfkyc7fq%?q zha5y*Xsbu*qYk4fr*0YlGWFk0UNJ-s0%BOJ7nwr?Z)6s4C`V4An7HbP>BnrmIbH7_ z%WW(sSn#YC9z{~*?C0N%)Wo0h_3Xs<>}(ZNxS}9h zCz=D7uT7WQiR$(ysg6i;Ryvud)$c`GD(f^R8Yt`B5cN{f8f<9_6{9_f$r^H)&cf%Z z*ib3agMcy){t(Z+z7FPngLb^*HvdH$k3%IQ0B#FfZwZ?JC+h)}=gB17lQq$GQ-$SFQIsy0 zZ({x&c^`-|h@j3034NeMb&tvDf#JkJZ%D7#YD|TQOGx4n;Dw#PHI_3(fOz628 zRcbsN(NHw*Wj$cP3ehJu#R!c*0km1!*~Nv4f}U3zCn>pOQyaKx79~)D;K`uYD`p84 z_g*Vm$vrArYf)awW#kVvYa~SA)7v|H44)tz#)Fo(yMnuadZPR9h!j^tN6^Um3%f(~ zb!+lPxkagr(3Htn>n$F#aYDi0xhR_ssh@)0w20G%*<5jB&N)d%vy?~jD->H|sJDU& zO#AMc&2)DOs%S>hLA9(o=^{#x@Sh3}(i*HKee$En>ZJ*k#hLDbtD?N~vV6X@B`}F} zyP}L@z!x0*YL!nlmW^;we_8%K2EL{&c zW6q155bM~SPIT{M5@T^=_JXDoQPD!MX(qFwD2Z*1y}sP-_og;gp67FK|0YUU$sy7? z3UrHWKcopAO+6v0w!};7xA8cL_LwOD#ixTReSTXpzepa1kLPRA-#Fk$h}BB#Fvfwz z{-1t|l4eY0hH@m?Z@obIjDyt&-Zy555fVLLstQI1M+@I(=TgSm#vmd?YNnts*hqA2 zsW5*jUL}6~CgHhWsmT@n_fOs1wXx)QwRS1mTBnX;aD|Slk9GW3e8)&wHtZ0xjoJR* zempHqU043};bTdVIo}NQEi~;SdVVuXi{0oiG-`*c`xcJ09jUql)IHuQdKmg$K3#({ zg}pb(PI#6=M8hA#FibsL#8rJp=~UD^evzTw$9kTuaua4Do2;-EQSxHt;91GMLdn;` ztI<9$79pqZI}8pJ)qZsLnoM?j*;|%h1U4=gqa*RL+l8{C8O0Bm!dB+f&m6;hN+aLh zZ7GqyB@={sW`8hMKC5wEdz^t!OC-)6!I9jvX}SkcoHGqUq8n(Xe-VzQV$n)gg!PI>yE*gIgk$vY~+wV1dqoUq@9p*Mgz@hBJYL4Z9 zmXri_Ym%v&6>!$9`Yi#FeI3^qoR1HzX4Ud%*(!0*Tyc!H4(#>5E}?QD!S^opUUFpT6|z%WhN8TqVi<+={U{RBU8 z35QJi8`tXOCX@&u?A4B~qXw#HIR>fPjaWbdlKY`{F6!uMih^LsEKAf7AhttozzkW1 zWfO0k%7jS2?hcl%;*!^5g|!V}%hInENOL;*-biLokl2>Q>VGhBwMlrd@*Pau;_W*I zm3VPk|HCBDWSw(FREZbxjIAk~2a|PrFIaq3)WfHEMbp3(aL+4{W^M@__SrwW7*JN7 zeu718%2oUGt77%3-n@psQQ*Ff-Bv3fzI6fiRon>n0NYw)7~ebozm=t17dgv3r&JVA zgkD@M?TSkHvHYqn_&sEM!;*<1%UdL0erU^CyfQ&8MK&s&mw6hyG-h|p5DQQS@Abhq zUvCxyB3n87@D!dui@}l+BUh@uM9A zR0CNs&~#d3V|MI$R0#h2Bz4VPNeyEX;Bgc+3u$n|_Zi+6YN=NODYBoF#2gt3EM-DE zRd4XU&P_vd^XW%gyCEok=in}Ld|6g+W{f(n8P@Kt8{$+zrHsdcGuti`4U|4I!~Lq$ zOn{sC6z#e{qLso9MGv=kG-8{L4vd?-kI>Z=`b|sUuu0%Om03$ap|Kt^-CzioSklWM z=d#`Lvxfvs%bU%=pZ)q%E8J!L7bq9s!{B&~gzd|vp2uopF}(Ito-*rStn zX+-Anrsck$oCh}YbgA3%!7zQm1}|rFdHf4npQsW_%0NG0y!)`V({(h5WC^>65+?lY zAMU#9RScIn=Oh+@Tt{>bGUAV+9*fR(^yrg7Ci$2v(oj5nLG1gw0({~bN(rHvi4M-S_+P{+ab<@`=`$cr6|vOXs#!oURO7sK^R zYq3eWTc|8l0?><2yHxXjbqjy0nq6%8I00KdlK!`lHAm}!*eF)V8`t6P3=3r)aw)1n zs1*Ec#q7eLZr?q{6LtGE&a-slsYcBXUSm5I>FYhlNxVVbg+?}+Rq@58=IYtO2YpLDr=YjNa%W#smw8GHuPBtjg%>g7UE?O=;6 zc`Jt$0fEO$LT8K*vv7Pg2bNmy)7$K0BJzJ6Lk#L1U*D7>COOe^pKGU z`4XzfD-&&JbamGb3=j{fS-ICYa?(7z5ucZH=#BU$m(WYPeKpl;Fnxb@ykzmruS%N$ zv=LsrrO2W;~&Opeb(ko%^#Y{IXOBGJ>L z(w*?~&q9Qc)J>~ag$E0n!9tJ$^_e9nO=SMKyQOHFkyzAA$$id6g|YQ!ED_drhS6GB zjgQ1O%*UTXRfbv~Zt<&5jkz4Vgq6p#h%|NbYSr|h zDwm#w`%-uz4xC?d1<>8{S8K=lryL8s>3k3%7I~Xhl!i`=Ojn@OSb$at)jc*c88ulm zU4{D6;{(JWuDm{@<8KxcuW7lH(d`(%l<%@p6q>VwOW8{(|<^#U9DlG!1#@1oOTr(Ts_ zI}06Y?ak651WcdyBdfx%u6qi{0AM%RHRxPPFJ{RoKUl2XKOY;Di`sOzN2V` zsFt0CI>tntL$zJg7rBncQdq3Kfne@%^%vqXRkx9WxqXXERrSi@wqZv3w1!}6X{PCS zq0dSBRnuL4;rkF=E3ujIT*GO|Au?44>@{CxiE58GgW(i_IF)+2>*WM)(F`{``J8Y-;PXNvtLhEC z6v5HUtbUQ-gRy~?TOxsb!`P$rA0&2GH?{ZN)s$4W=Nv^OtKh>kI%oUB6>*OGeW9WB ztL^o_PX7|%3KRFusmsJ1{baZmz7D`=1y*)fG;8^UvR)E6;CX5`>ECCPSkS2HQHU3W za+CVy@GvkveU~7x`elvls>-yHSc;Rfahfj!Rh6<;ZF#N^5eZOE(pDn^2i~u9K6$)Y zVYE6a)}Ai3RY6U};xP{UVr8pev~qju*UA)ztLy?0q*hC;-C!&U$REs49m02qB!Psi zX3I2JtI1}%BSjP_b)JOumnV|}xdf!zP5Od*;f>xZE$dyTH3g>nPoL?8L>z9_m0B|V zT1~H)34AqpB2q*G=ons{&6%DAh<_1Ibw4q5^WF$_F1H}=s?@2JzpzMkuyf8`3=8>^A3^t)@DBi90Lry_R8oJ1iaN!&&?lq+=j-48BuJ^aExw z_3V-3!&(LvMWvy=2%$oDe13?-mQn zFv)@rMlAxdX5Ss{uq(hmZx$M`VLGz)0+P^f`jLgYDXL?X;5T*F!lbx z^StINVpbG>BV=)?O`BRQ#dt3sbCMzO%1lRH{@}SXQl72iZYNcmibc*3Ak}RyVdbt| ziNwLBp*EQDexKT6O7Ogv)_nQMBAk^As^E>}F?p`Ur6|V3rVRb6t0u-npSU0K$0;UE zJsmXBL5uK3Btat=O~mg|q?N5AsGpr!Dm2RfZ$b7}vvp)Rya6qQ1eQE9-1~YfC<9t* Lda6~*wqgGVZpm4) literal 0 HcmV?d00001 diff --git a/website/static/favicon/android-icon-36x36.png b/website/static/favicon/android-icon-36x36.png new file mode 100644 index 0000000000000000000000000000000000000000..1485335c4519470fc84e3b8ef55681a58ffd2ba9 GIT binary patch literal 1866 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpuSH5 zJ|V6^1s{?oy-l6;JgMhH$jr~li$5ey1d5EJVHpDd|Nq}?=C~Rd>q|<4{DOfr2=K_r zi*YdWmL9l$|MJc%X;Cg_&7_XyU;Z6hu-3&;x%biEpU>`1=F>R(yV&W>uWNHE@|XO1 z8ESMXo=Ktk{R3~)^WVx@0P| z@8&MLHBFHFj;zO%088uavko5`X6^nF{8>&bVWN`oO7T68v6CiT?A*$p^5VIz9zlg$b9hT)LL%61;fzb{5$e(hDL^p2)~x5i>V4G&L6AD6oO$^O`jiLkx{>-DsMd zl%k$>o}*-L^J3wMshhcDM1>cxmX0`c_pq?iu@^6&KGS0t`S`7IWzv_g%&R~0C#1K` ze)~X_Lx}rPLsl}68QVu^r-^q@o{$jZ6A9^W;4pG?YrHGdD^=4o&rspv4U3LN6}|%c zih{atBqmR4R9m{lsOhXP^KTtlTR911qsB*(XA)fZ-BfV3{3tQ;z$9*w^PAbVh0d~T z3O#WNKXNL9L4;q2MO*6>%WqL-D@lpa#z#k01T(~X=I(>K#ZLc2kziBI7E$B?kl z&>P8W^2d&3?NGYoxnbEf4%gBJ7RT0iOx!59VuhmU{zXS7sCrAyULcorW&Zdh{Z*0RGVI_C9CggO{rtLq3| z64Hr#Ge1ea&v=1krO}Qk3(FlPDiR;vwRbWwJo~=);Jhd2K`CCf#5JNMC9x#cD!C{X zNHG{07#Zjq80s3DgculFnV4G{8EG3BSQ!{xI&jPdMMG|WN@iLmZVij)*8Ko#a0A&; zoS#-wo>-L1;F+74p6Z*Jo|&AjV5VoTXQ6AUU}RuuqHAEPYiOhpXlSO8QBqQ1rLSLJ zUapr3QVqmF)q43w>37=R0u5x40GSw)QJR}%W#y8eT$-DjS7K!q090DcV7UDMZct`G zRs*)v$|@r@Gd-h(!O+r(pP{G~s74&g9H^S`%#@N0kdn)56ghxOB$1T(X6B}rR2HN% zfL*0uke6=1Da;Se9N!S2Dh5MSa|=r|GZPadrsto5)e8eZk~zVdRjCXHPEJ!6*}VZu zg&|3W26-~1W#*&;y|15}SCW&TuAi1zmYJNNSFDeS7=2??V*^VgW6Lxn6C(rj6hjkJ nW6M+vQzJ9WWJ^mEGc!G)4n3gzY-+SYF~H#I>gTe~DWM4fxFRse literal 0 HcmV?d00001 diff --git a/website/static/favicon/android-icon-48x48.png b/website/static/favicon/android-icon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..a02b556843f6ef025ef152458f658b4565fa09c7 GIT binary patch literal 2206 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 literal 0 HcmV?d00001 diff --git a/website/static/favicon/android-icon-72x72.png b/website/static/favicon/android-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..5041bf827e5dc44b488831696be2e593952e3aaf GIT binary patch literal 2846 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 literal 0 HcmV?d00001 diff --git a/website/static/favicon/apple-icon-120x120.png b/website/static/favicon/apple-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..d13a5c85b249e8518bf0a864249f6be276d9d417 GIT binary patch literal 4969 zcmZ{ocT^Kyw}*!idWnP7pP4p&DOB z6qP0=AkqYhfCvI|<9EMx?|Z+s?wYk{pL6!JfBVdwS@XwEH#aq4VdP~50D#5FP|uR$ zqyHE^E#BTN>y9&2KJjP$q(&hL$D(5GxJw+C^nkNJS4D5_UCIhWsG&nR#T)+1uDlG; z0)TUKMta)T(X-oSard2VB3|?#FT{8mi>svM3=5{yg6efFX7eVd8}c(`f4nmbYCF&l zCKxd2Rz9(8${K}OTg!A0(Y56namr2_Txa6CZdLb$*l4XN=!efqV_;x-S!U#$LC(SyrO0|9Ye9o1vA`F|`^yziCnkK_I zcgvO=v8AQ!4%(qwrPLMqDd==K=?g&`6OJjOx`u^6x_Af+rB@|2uVH!#5Uj|TsQh&P z=`PN3ztrSU&COBoeTD;tx@e-s$d05UwzgMTZkl*&2BUpBk`d_=CIslg$WhneA9i%y z#a1pEsVFzpsAvux1w!2HK;?9kLY)^lM=`Y+bqvBWdcovtmM5+)zl#5nTjnBz;JLlzckl>*9_ENnp~np4^lkZHW776h8!Y zn$G`x_?^A4lOc&atB?(t3t&Y!TrJcsPQIn^9wHB%8l0|P_!YFZhny62J z9>(U*g@TJ%#8crU8NFqx8eTh)G{y=`LqwTQk=c*22#_oFZ;<^?f-CTwrc21=*LSEG z#ua!2^s(-1Z$Io7qA%p-Ka)$g-i{?T`MNkWqb;usC-Po3wCM+&aEeU6@C2~Y!7amA z@r+|1%fSy)X7ik)aMGg6S)%(;k}ToK5OMVVh`p6U z-q$OkG;Q0&rWl1#Nz0den?Ib{hIDT^J%I|)EYQU>wRQ@sT`dx3cA;{*Lv%K&JM_@4 zZr7w8d#OS-Mfz?ot5pGqZq-DwcqizFzZ_C z>lo>rn@UCRK+mb8A#deI&a(H#+Nzd^#;LUMSAyr*YOiw4DQz}`GT;v4h3x9{{hj>i zJ!~UJ)2$Dm>1U8`zeZvV8>iN~GnjsJ{J5G3ITa!&O5mdb8nIvVX9D4gpKwHH+~Zd> zzJkr#1BH$>w)_T;+ii7g%hRYh-Y{3Qcq<*Y+(RTIQiJvcM)Wjh3pmxP<F| z+4_LCu){43;;>p-@w$NcYg}(Wg!Po*gDJJ}Hu{)%L2`gn6%x-J?VPj&qwUKcjE7XI z9q_otTgb7xw(son2l_jWAixQbF4iXK2$t>fg`*-uIE!v5O*gk-m@E62z1&|Kc+qHB z7v1{H{YU{knJ-~>dU-Zdlb3Ka8Z6@L-!rfWlZ|Oz313RPqZjckrPjjqgRGtzyiUXw zH;L)@UV6ehR-knI?jt#Tx4==0T7Emb5(;w(G}&2G+500YB5X0uKUk5_(oNeU!mm4A zb#&lQx>2&in7AK#dky==kJK{vQ-heqg2a?wY8>7m(2lpi?vPA z(iN9jadL+RdVwRFU`nzjNvEx+5M5peeuY0>ta>~4MGXn}#iG8q_Uz z3C`LA<^@ukh4UE$k3l<8cGs20OL0^yCqLb0(gy;-9%dT~!rBLN#ZI^#9(-0%l^5#ScS%h+`#Q=1ed!8-Nm5Dg;AvmMK<~E0LG+%o- zh{4N7DmG`JK!V20BxB@shqT2}(^23Zu4y&e#M_oZX7#(@oh2B)^ONcp zOLdG|tqf`_BIZ@}rVT{Wru!cXW8UE@@36>Dv5z$#n@)4bKa`66x8SI)J?DIi%!^Bc zD1*gi95=!3(bFCwe7!%ZFA-pw-MK<0J|x5j;6s%73Q5c*5R}MPwzKb>29(B>VQA0{ zOMFQ^lh8me2(CEkjhj11Z>ov5IK6L~E>u%^c5%>08LIL4>rx;6g9xtHiIx&p_<$uV zLidwF)nFp^*=4?;n?V9H$qXl1+&U7R@ z`V`JR8i;>vHCPnFmqvaOuwtkC;USzap=8DYsR)kU}YeMkz4 zG7?6TdcoFmYY7}Ujl3D<@JaoSA&D(AFpKBn;PS)pNu<6m!hS7vQ>jN#C6sP1Hx@*L z4$T^@987K-??hA-JWAD_3pU3MbxPbFDFV}F-EdCR@wOmPM`C8mH-b()#MwNUkA|zk zX78Od0}IvvY7|GZVvHBAY^da}fmEo(ZO9B5%0FPPXz=_&xb8WeU8VIz zUF-R2r580%x8yYqx{P!535~#LJly<9czUdVt!kISf>4E?LRLpBS3taQwEDaczemCk zBw-0+T{L2t@$5P*4atb{_iC;K-7CSrf79RYU@$i!A_mGNVxeA)TP|<#>waUj2xmQi z6#lgBK1`*y*+)udPXdwceORD>zK-7of$uTC$uYFoT zV#-MlBHu3O%DBRtU2)Z{dK?TYu|Dj(hx=Z&1J}Oa6aG>}5>i~Q(z#TUx+YJ{aEVwX zX!L+Bf#I9Mn;7fpLNe9Q8QkZji>kWAnJgj_Z#6lzhcbLqb*$E$^f90%1~|8BIh*z> z>G<8ZKL78`vo)IBy7>h#v3N!^Cav(Lc($#o=BIYKP;o5J6|v|= zh(@X5PIMv{Hc@o$S1TgPs7EbH*~U5hiPwo@l+X0(7#-%P#|*ojZVB7f&r7gbH*O}7 z>|v1@qI`^xCQiMWuMRqfs3beYG#yGvx$g6ku5%s0(Dp_#b}pa+;bWpNc;O2lT4HdvhH2;H@CC6-c3*v%BbjR8yQPY}JX*i0{RHo}}>XUltbJu3w;QoAnnXZto>> zR{#cYLCX9MNo2`*?_p7>lP5aj$892u)wMW*Ru$nMMqm^`6}{$lU#b;Bdex91xLRc$VRa!~Gu zxMEbM!e?qzPaSoUgKnYP4*=if2`=Y*Vk#^_F7GB~`YP@3LunSKioo6`WPWex5V9 z0ztEo>3<)L)o(buMkp%|JuYq#p3bVfX#UVX^Xl;;ty7Xx{arZvkuhD$$bwAd5MMVR zK|ME?bz&MSCECYu819xhJv<^28_m4!*!AM{M4Au;ixYdR)cg07Ai@Z3&tUe|5M}H8 zIgval0oC=YK?p{cOY2&J57Ne@^}NG)wa3C2=2Io#%vW4an(30FtX0M-((j(F|Ah_k zVLW6Z-8R&x!>Yd?(kcW^jC{6v$Y&4}>CSj4i>4p(`!=P|;nKqs#KYIr?o%7+g+r%1kXJl7tZ&_r50_I+3fe7%*AFuVGN1M(RYf13{oQky>;@mtM@D( zpYFR}d$=FIf%eNiKFX@QvzwJaVU`D1$`W1c(Cp$>V!~X~d%@hRI9$yN>?jxaa9^=s zkZY!{`jqo*0dH$6C5O4HI+vwf>x>ue;$*>?Rj~J_{tej-yxe{3bnY*@=j z8|n7i@Wna)ajSQQGf%5Uwi>^K52$u%``8S6JVc_e(v^V%_55XsCyIDmi$2g?W+dF! zaT(_34(5B`FO*v3@hmSy^08t6Iav;;G($}Rd#5h}*&>}MMip<-;33hxPdTV#fV@W~ zV0HP&!~XOSGf}xaw+1(_=9r?MZ|wMLY7tZ$xeRkh+hN;>>g*q1x+I?*eXOH*;CPwA zUy{*G!}{W3fyYIdxI+o8DrD?c5ft7?me?&5(7xu|V=nApKEh#4YRD85oX39n=7_%W zHg;t~R>#)*gPcv~n}+G6D%&;_btR!LJfojWvdq>ivP0gEC`>P9RxAH|EBAEv9j0|% zslGIOMIya__>N5ZLL_g-^Co?0PZ#a!E+5J48ri%gIw+$A>Xaf9%j1ZRz4$I!`b7>3 zQ6aBiokrS?(Uq)Gnw|f++U)oxHM`2sn+Y|FIOwR_ymy#zu8YcOp))D-#CYlfm&cqr zA28`Gw(|aro+s1wawjTandO5%?iJA|9Oh{?S;B<<`qp7M>#`|qUkF-$r7!-{gy`wF zsKpoU5Rsu)+h&(rPn+`zPhb!}({8%4m*>qL{r)=k78!;$d_MBapAX}xUxw0VCundP zpS00%eMI_N*)hO9=MJyt4t~DC@hU-Dew0^Jn&i%rT+&y3k1Fs~_$G^XD9=$=cl)*3 zJC??aDU&v?roEkG`x3y;wcOd+k3IE5*=qq38+CO!6-JFT=n-5uVejd?nVzf_V3aI_wFa%S; zmysS@6w24?TCr(x9%VgETag#n>;32)#Azoj|KSl-W3^fS-N@hNYr1}EFWD38k)zAw zu68@C$2wN*PU(GHP4=JlgK-W&1*mU4QE9Fb|DW!`zXzl8L+jh4 zZ@8nqP@Z946bHy7<&m;TIaxVHYor`XQ3WM0FO5W^kjM$bsNVlc2nxC3=N!f^jX=iiK--wm|yALRXCLi7}b=O2iPUyv6%Ce#b~ z*RBwu!9JJTZB73}$HbaK0dh(zs%py0ii+}}wLMDr34r`V$I36(3qb1VTO;K4HPRW2%_NNgq{pSP#BYji7W*s-&e*u6+&%OWv literal 0 HcmV?d00001 diff --git a/website/static/favicon/apple-icon-144x144.png b/website/static/favicon/apple-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..544582838f7b1ff3660a8da47f42ac0882f3f217 GIT binary patch literal 6058 zcmZ{o2UHVZv%r&(fDn)#iu9sL4G?+_Bvh#)9qABy=v7RlNiPZl0tOI>ND~lHS`_JB zy0oD32SvIHD$0xBdFQV4W~`3_od4Yk-8J_pBeYlpyHJWW_*c^#_R|Ca z*m(_6NUNxKyQQ&Vj&tEDy`lQeXH)KHfMpjo;IR=-83>YYOm1Tm1M3ve`bA5L@!_wE z!UVfkL?m($PChzR7=IQ5h8~q|h7|Vy6ou95g z(|bKo{35$3cdvb3(k?H2YfY`Ub5b*QzlHJ5|G6cmKKV{-_0Yd|W<8(@C+i|PPnum; ztG#8ID;Efv?H0-8jsHeVV8(zhgIK%vF9B#0`tztF0BU%kK#DQ2hU~`Lx924%ubGHw z0N*#Miu|p%a3NF09&bmABMYxB{KkJGv562+!?#9&w@5G-s-}t90I*`TmILEgj&<)k zsE;}wk&AW{<05z}q#As*w!?*>51@zmEqo`QM$#)ip-O5785yhUDm9J~+#LMvl zF?M*|_BueB=M>VcZPCOY1?ZR~%~Lm6I-N2fZXl+-;hlk_AtSMi&c= zu4E*(QTdvo!mkqYYC=Fw{468>B6(D~x8*q&IWXw!p(cY*je$|r9efPlN&uStvv^*t z1ol!BkOPYWYC^lJdliyAyzKI2-0!|*GH>g?$BcaFMK&NK$kz?v*YU8CM}{{NB5{ud zoWGPXZ>>&p(^2Q0oKqd{F(Zq}XXomG@NS<)_^ji))CF%T5WX6Q||E*zR{67NIcAgWK-@Ais;$rZf|% zf-4yvCK_@$o})%kkj}T{7W?PgElpm`O&5Nsj?Zb9b63*-K;0sRbIx1upnOL_(evKo z2kb6ai;?|bisA{-Q&`gzZfl~~*#$H8d$?Ypv;b@pQ%GOJ=t$R^HP(Vgnp`m82)vYQ z*TYk2u^U<|{0?V~>z^;CwMZv^1|3O92^FGA;bPUS*ZF<{Y`EPg!7LVOL|;wwVRW0I ze4I+!&Ks+VAe;=)46iG9+&{J6B;L}*ayW+ia3VT8(3F32QzeZ(^X zX&DDzq`rur4~5M!sEC-4ePMLzDK)8z?JFxnt0rbPsgFL%ilP%sI#54gGh***c(kPH z#eU?^xf#0IK~`loPum2LKM+R_Iro31GCMouhHr0laSWwgtr!9$bkuD?w~brP{A3Pp zlN#~*xCiD^q4C?jwqnX6`#etZJ|1}sZnA|>#0+CtYPD49`r9hLD?Or?)@3xr? zqKhRAXS@fr6%v?G{2WP3X!Ie}9#u|9{HV7#m=pDyyG^oL(F|lpu>X)rik&|ylO3?G zWO{n?8Uf*$O5EfmkCN=fKJ!6f8rPhu{T8|*1WErQ&1N?uWx&fWd)lV7r5;k%5E^pePy4q_Bt$Iz>;S#ELyTN8-dGsU82IIw`1(NnV<&sc+BZzmWEO7y zXWuqnbBxner{V}r1|5xk-5}ATl$N)Veht#-@Hciidp5IN4;z}b-SuSINWoqVl$Y-53N((FsJzKcgdEMr0n$jxQe}Lth-zNj)N<*5s{5+V z-PYDy%VHwWxa)bB*~rUWtt0NRqtvXv6hYcCQ1ttvjDh3L#D_HRNK;1z-vAvsU6p^{ z$mgxnU#%Z9ax^+PnMI2}voR+qMSK4^kzta^HK_^?&P)guPdiDxT9&y@>y*SeON~#hYpDx_-HocLga=O+ zi0e}mxb+HVsdp>Ad0ci(Fd_rmO3Nf_CL&#KREf$Vujr!vOKHYW^}dXgZ@*VEq0zeI zH$jdQER9Xcey;U##KRMk$%Ob;$R?(!;E%*h>`9c-L5`Femf2F@oKpA$X@b>x&y*r z10}ej6`-zX;HBCmKG>1%#-zY$pTjQhr@B7~QX#IL91w!?^kJtqSj9K<-pXsgqhNDU zzxrbu!Ohy9DsS0oG1y@4*87{Gi8kwJh=U7Aw)zZ{7>l*K!L8snkd{7jMCE=FnrNW? zbOJy|A>xvdS_j7DZhK!bJ9k^MN*DEY&7tyvGMh@lXLZdV(!j0T%P>Pj4W?(6G_OT2Yz!>MmY18ePQE34n3TQb_+*1a3Q0($kWA6s6o z=+CBwPIhp=)iV)=5t-3tefAbp40YA1YdKk31w)nFU5{cn3D?g3spef)L(V%Kzax9h zY@bi;gJf7bCt~|sru+`~4Q^j(-1sp&=IQy{)edx&-1s9=DV(N$Ge#}iSUoN?kD=@K z4gD8m+SWw>1j{{sWdn72-IrX^WOn*hLEhVv&Ft(;KU`UUI*#5{aBRR`2Jnk^rS&0= zBI;7PAoE|#zjUo5&zZyvZ#;+>EQF3-R4Y;~I!Knu z!HpE_WkrsG>4=w7oq;Abcc^RfZ3*yBBeqC%7MB!vN85(8_PyzmxuLu#t~q_q=Kd?w z5j%1@xU;o(N{%RRQ2yJWd5-hK>$%%;x=ru0*%)$6;BxT^KV zXjqRSM(CL+A@LHQ`f&DTprcEBn6fnHmki;L451tL0uS|fKip{;gyc6iT-?^nP)Zx0 z{{0qJ2ormvK0J!ab(nh9<87YrR05HB1iW)-!is`JM=RL#;&;rAmH;ceuitefRtn97 zN{NhZ{Pfl8CRVDMx4G+CR(VMMC&Eb0?Kkr^a*}FOmXCtUH5WC-8s9wi2S&r(0JpX! z4j<6&9cRtZdbsag=Ni7jOHhCRdrjgl*AkI91d8SlW5lu^FcQI)jys1itOk~MpkaLL z1E7_k@;KI&GqS(aw;m_AYniv>9qPZAD)Tpv_R;VtWe@BO;`l3HZfQEEa78+?&M9Qu z@o?0+GO(E2e*4^a;54&RYUD19E6uX6DaFm(O}Y|$9@Cioex%FL=p5pbJ{sk`!>7Jv z_0xdNVbvDB{**H`u-R{kc*USc?f!F5)uC!tU<+jT&atx5n29SSVRU+{osBTWF<8Img3SE|iObq0@IPWGJygx8Jp~@|#|__8NM^QnJh(oAWK(pRtXk z`b2TP4N)7KwZu^NZHeXuQ_rQl*#-6zTXzo!r!i_zhQ8y|AqeV&Ix~4J_l9*wPqwYL zdrAWC`rRnuP0DEk_~_Qf)SsE|z)XhA6;e>4bx~E=)FOdP$}FqouU@fLT_wbgqOE2P ztXa`uff6T%+iH-!)(MLYYWhW00?%-tc@vPUH-4*5J;cX0ZHC8ZLaYWouKQqpbbrWb zeM;vgG2)luZFM(fDd;6Co`ml&4(|0t0fzv~BLV)*P-2e{qz5~lG{{UJWe;rbn*rHxN^Yr2V8eMuZj_>>-Pb0EECQd5h zBF4^)h8VguIW^{zG{>nS3$uVD=$&-g znx+0ZCi*zLo3$+K+8%>#3zI<{ImasiT2P6rj@p*6_uwJZljY77u0?@Tu}fgvOa**c zA=FBHxWSVUe!w-0@2k*W@W!{|dqLG6*FR~DzdgbPuhejEnRYa+a<)F7x5+^_-dDgV zy zAqM4lgBxwa?e8Dp9*%{9-!Y5UITk|I!EubcAIv@Yuna5r9)b8yBNoD z{bFVY(LeO3K)UD7>F>^A@B)v8#gbA64Uu_ZC?W=D+P{A7hbQ^HqtH1@m_g)RGzyqh zkSXJn5GlXEUxhIj`DX6|X)U2`EiTU(yS_cF!hGt@#$AY0a1SvUmA13%x=IVLA(a0? zoTb)W>KJz^E1P~mk5*?2QAxQ{Aw|k0X_ddPvb47t+g2pU&SSaZmAm)#e@=%TXN&Cx zQ(>>({G=0M=v`RDdv$5n2oAwnORVo-Ms!_?<5A3hdH*+fsEEHxN9}xyN?H_F$t4Qt z&1iqMbHNeeQLpDTF<-f{|K@$U*j_;3ZVTrd%X;wUyQPscmn$46<}d}%uRs@5u3@2lrIqTw+e?tMG5og%n>2IAZdiNuTVa_f z)wIJ_Dk!a2Kr9Rr)Jgeyo?8B`$9?n-^$`G_^8X?^Yy8YH#v)}w4X=N-=+j(9PE0}F z8{V{KE~~VcOty(Un?CG(F(T2ctf2~v^%g7XL!s27|HMjT1!I1S*YB*}6F-v>b>u+VeaV^N|h}`2*-M9b!L1neC-KhU(&DkM#8jVaF!SkVP{wbO+{E=q1&~2Yp)b^Un zYfY=-!}W-banANdKUf{)0~|8?$3Q?o)_JR<`aytL>4*0Ct%Pl4%Ze#MYs9sy)@Q#A z8u&V#=ajjr@CRuVBfisaQjeba_>h#2u|5*_jp(6WEF-{ei7wS8oZB^1h$^5z)M%LJ zB2RY3KPeT`Tow%xpJ=SPPOFnlEPmk>ER=FJWa@K@TrU^@;|#vWa3GbooEoH)+8>!S z?414HN@MMu%L8-bJ{W7FZ5>P(65%bhBge1I^do4dHcTdxFp?6)9o1P+$9lJziHSZ` zrv}6U;5~I{{)Ozo4CLuoaJgWXhjKx_9tNmPgU<}7(65kJFa)%lHYmNucTC$)Pn#gw z8mV({n(dtK<8`ZFeYK)Lr*h)1hzqXK%|V@K@8i-aAA}|mI8Tz~^b)G$TsNN!HQ&U~ zV9{S~wu)K4JBUATJ4h~X{`LiFc@G2{lAe~<9$36(L6cTR(ogMR3_*2ZEM5mqS$0a29ArSH%i>u(sq3^PyksTiag$maDN1r7tXwvmdn^qG=XArJUQVCVix6Z87k68B zKG_=$Q7v2=3x}!MLUk=)%+8rC?A>)E2%25*aiykvUkWTq96=S=-YWBKVz8T``D~$X z?hO+6^ozZcr66YYp{>HS>Wc8_SK9k}L{C|E^IFefxtT+w=VsNGlp+zjYgaLS{j$0E zhOk&~M9Im1(c0uwjfBzij`4@Y#T_L1(4*SjJAd-28>JG3ZmUx5E*R#^`apgeK-?TF z7XxGAX@Qe^cZzjnQ(1Um(SH3;B4Ib6U71J0G6I9q3~9K9H(_0t0~t8Iya4BNs~=36 zVuorA`F3M^!&6H`S0CZ;0KD05e~We<&4G z(J-`an1^ear>c91Cq)3{;Bs&&xU7^c!U`^{icnIOlaqkMRpIcrqyg0bG6)Fr@bQZN z{|zcj<4-9DdVgmK4e|<$bPe$Y7zVg{dz!d<`?&iFC`v0yD@&;e$iZb1Qg8(+Svdg< zSw#U%SQu7SMkX>cQrhP)O=%QbIw-_@C3%nACEB1Uu33E@B#(l`ZvVH zC%`i-8tV!8S5z|CKyR&PYt#SmV`4?20I~{7$|{PA2!tGH>zGo$1~C4cpX)v`o&dOx z&ix9_FBFyazo~9m8Unn0{5>g`FB1?L<{#uOyk&#!BhpWiRt9Z#F ue`gz{YOo|L5Fw&RX}ZedF|W)JTaKhyVZpsfIdC|IX+9Yruzh zce-9S_B)5?q^PY30HBkJuWa$}+V_0*)sz6W6HGgI4K{mqeQf|Bgc|^O5d{ET+;zR! z1_1np0DxT^06_Xqjn=E682f*;Y_e~;2m$OOk`j~;e@ppg~zXUf_2gHuS$e#hT+Y~DUg zQor9U^7*XX!P(!LGE7y~GV-izMP_TU(UQ-wT<@JyG!gax^$?j*y+SKAjO(&(%wU1X zitNJOYvhl_~ z|3a?1>m3JOOOd#%nI2qS3+*`Q2FkJ}f2B97fMvzhKhQ=DwPk3RFXU@~7%|M3*R|gp z=A0+js^1*me!1c%*laY;AWJ{_ar$^AnHPwdwy7}99*?)x zw&A*Y5cl`Gu(H;xpByoio2~h+G~@m3`4g+J>soX})~oCEE1FLoOpSDTJ0IN=eO)zM zgtf@2LnGdQLvffKS3heQBQe<0Q=Sllg*=o;ZJn*^r|V@JuT95c8uTWOi5L$9LJ1;X zxyB02-3_#@zf|sr;n)>Rq zhPw1WkMg+kA?Za6#(!BgEH_QCz`DmCuhL0g8}3q3_CjT7l4bgD4=A~=Lf0k|jfpZl zo~In}wRb|Fz!-y2;u470Ia;{=gy?xBVfceG`|D7;A*K{2Ae5N`c_g~XKZY_;$*?5` z4}mJ?I(Xb>AEF!{xNk_PsV+GF@)?mgna7L(N}G_k#s|MH3_FEj;jbVQsBkr=opMvdM? zG4~Fgu?w0r8vjXlSQ=a)8fqcUpY1b>C_JRRM#WqB4)9^|ovO^eQ)J4@=$@e7uY}aC zUMqiiDo1)iu~GS%e$KXJ!{1~El17>sk9eJ!$HX8aCKXI{1H4rQwa0%PKMxDVud!Ni zc%WE+wetzav~Ss4ZoPQ$(~M1>qc-?nmzrmoLzr=@RQqnP%LO}oJD(4A3`uuvD`x;LEc0wz@fx#s; zmb8}KwvdO==};6l*KZa{KGYoHw? zl4rBLg0VURDOA>bZI$!8JF5dww3tvFU~ zQ{Nn(Uiqi%#iTbXSq0#b1% zd?O*6^^u6$Goq2%DmR=U_X!eZ7?FVafluc?^V6SS;bu-rr_J5LZ|-}8QPz7i*YEAU zVnLbmbjyD&LLWwOjJ^D#K9`=41m^!FJLS&zW8J5%Jn-!Ixpp)gZ^_#IkruX=m^|Ma zYP}F-9v2bUN_6_ot!Rbi3M9|g;G%Vudiv#|dDIHk2A{d0&T3Iq#>H#Bmt=7k72dlS zsn_j$qFZdcY~~|DX<@wS;qk|?BaM=n>_(XE9_c%9xACBcX10xJ14pK>;_qmd>^*u#d z{PM0D7~$}&jN{j*(j&oZ&v{?S+B?**eKX2pZEraPz#7$lU=5irk6AW+y4TRe13EbS z{E_j9RYlXc4*kG-aFgaM{An%y3xP@HcTyq@q(lMI_)cr2lB;i%o3E~-`gM*h3nE#y zn;lN`45P&OwNdZKC<+9bke%Gd6i^(2%Gp#sth9s&SVeAQ#-vf`i04R~z@_gM7)({F zdCsn?67|kmfIQ%LUA#quLA?4A@AN}t$MR*+{$mLn`?M~Bh>OcNP+3~BL8vOdlBVD@ zTfcWgHwwJPB-T_3nUGKDQ)SsztH zH5_BEY4F;CJNYZ6f^Ggm-6OMsi@_2%1mSwUyvD%W?FuD$?Vjp$8qNBk`7eY)jmzaj zm}teT@YL%R2K#(5d8r7)wN;x_62b;g@`WO=G&2~FJO>9g{4F@Df4W0ToxSjip2Rwu zG=#HrpVoEFC$&nv4pGy-_8t9;j(#Z_64yfLN$y(XEUR(Seclym*AkP!0m5+=^r z6Gpy?^Ipxt-e14lJj8hxF};;&ZD;pBxF*qYEb>C1snNf0fSLL26V$BA?CAoGK{Gd} zpVrHT`=_bnri~rpA{)bw9Bv8CLap1^NUN*ufAXUk7=Qxe3N5~{Ijv!OyH7u6Og!w= z`%EVjkPWT`{j`2t%*PXiEk+UdSuFXuU3w;_?`AE$0?xesEbIygEQJxnFTptQwUb3tX zpI4;(mLZlu@gY~uYveEGNBs&NEx+oYG^)KmwMY9fwb7(Tq6Tr?ra9!+G+(;ZXQJ~E zW2Xtsl+{uqu0CJvuqN$QLvrW$zqu!k(yE@92}F4cEXCheDGzNcs@r913T(`codTFC z1rBnOcFbMHkZ1qIkr$5rN z8^=w`8O8oT%<6LF$Tc$gxHQ8Ii@?R+S068#vhD_Ih_3kF-zR?LhZ zUia&XwEBmZL2*RrBgK+_jrpX5%HaAmD_>QLxHvK@uWEznnx#*rVYx=Sz<>s4Pg6(D z37V@&BY3EPtYB}zF3r#|@%yrwrp@w`&8PK?H`1iZkYLn)zb@a7c;JRF6buR4p%^`6 z5-^i!nd*=->JQ}T$s$5!<{pbj=fk68&pD|vutCqN(RGqIZtoH%z4)I;gv%g ziyYs~*Q98mANHvEe5~)OA+e9djd<{o1-Pl|r+d_@uGGPMOoGoI8^9P*r;_a_i1^K6 z{9oxc{J}l}yb$H%*nie3^J6V>@xai!$LL`xO!MZGosJROi)7RSx0>Co^Tdn{d6= zUpy_CL956YA1AvQy>#l1K9+$~2J`ok)jy=j1&mG4cC&k-wJeH5Ia#OdZ#-cYhV*T^GxA2l!~0YEi6xm{ z)ex61TaT`K9pGHAb%J4Daq6Las(`VSDMm$v7f+Eqp@HGmRvt#y3H2iYS5wSBKZh#Y z(6La-EH(h@&kODwJd?T*PjL0++usqhECWenEZ$3U`dAq9L>PcN;}wnE2z}SdqULs> zhwinQ6+c+LMF)afj-%@>GA$`VM=BzoIrD_?VG=)-g6yY4yp>(x*#$#~AhwhARzjzc}FZ$wO5!&lM$IP>4WTg!duca zg-<$g>JFGaBAx2d?**!2ZZcNO0V+oO{CREH))aZ20Mc;MZh;nznZHF6^5LFZ<=yl<6B_3`O43ff!lJBDH51@4 zCH~j=u>4J)p0{0pn}y%D-Vh?QQs(Vl4EWNUO~T+R)hwKp+*)-|PMH__zdIOMgOPPZ z&sLua*~<*j#!)mC7F*}18*dBhP%RZByVQbI>Z6kxZlZBAl@Ok~`g*iZ6OOO(!H<$+ z4&430*Qp7>5&sUBI+lfUV9SeV#I2u2Gp!xZ>AvdO_Sk8LsneY&T=hId0GHKS})Y$z^CNKZ@eSw`Pe+wW1(5yo49v>dk2 zrM3SW&?85z7K7)l1GMV1$~i6p9*q$m71v>+H+&f}79q_1KF1yIhK(wSn-FClm*<&y z<~hy>wufurJ3;*N*)Xth+w zaQley=$fR8xNu9~F0~4>0!vvhaXhoI1R2Sc^jbHD4wk+g#PP>v6-cZ#2Wcdjfkx~K z8`KAa+qW?nQDCxQ0{N#G>;vfuzay6$wTV0xQ%vn9z8jzZI8lVN z75_b`RavvRR_8XA|MRY&KWam|c~p77pRP-Dj!#QDL$#j1Q?ZVGr=^wYB$e{0=+IWM zu9qm_ZjTHGmhH;GB3G$UN6@L!Q`cZtT(n1aGwX-MAH4T*p3|Kh94vp1 zUy+1`4dB|}JMv@{l4YgaK;(Ibe{(j<_2=TWPeVhQ7!5XgQ5l%ygC&j-fh)909E;lG z3&(E{wkh*CXIhw2z*M|xPJCIJ?p4* z!uidZgLPj7jo=trbIH7jVpm}NIK4dg@6iRaKB9LX3LM0G#s++354l{gPJ>I2_ zD(73L@$9r{k#0kT=-PmOMg1tyHMv^&qrUr) zX|^+bgv5=V($dR{tDvl#d!?^~4M9m9rFH6s+3o7L%VShsIPRcv0;;VT$Y2Y(pz7BQ z@{w)>4lHfHk@a+vGrO&smUUT$&4wpBVO@IBkg;3v@8zfQhf6YE5sbU?#g3__AIvfuSeZSa%kUu2V{8?dKvC0Hpxi(z@~-Xl9GS@xss~_{v>61PubQ% zwzqEWfcg75|0I6!_BW;{E{XEyx6>5ALZA&mnrCDCCni5N5%LNIe5$s-Nu9P=;gFUtsSkP$N?m z3T`8cT-KUXdg-5MyUhzk%=YIibAViO^@4fU+wEpA4cXs>Xq4yD(W1W-o69z}=mu>nIBn-<1I-G^M?Y`uqBiL(rTAt?{-G^51{;Z@(LDpxqN_hpl@hx82uzNwMs?)$= zHWxelL&{DnqV!aJK`>2xNW1FbS}EF-8a?0LM@C`Z*e6iGga0tk=CiC@Q&?u-IX>1D z=cIDV!t8(`@BjPy2?5p^vD-nAE^-ON9Ct6Yto`%2D(NMU38Sb5y;{Ozy+nKt+`2`5 z=bi`cjz$E#uP4jBqNJ;RctrtXhC|2`I7pH9FMJU=<e9S#oIqx6!in&*euhJCIvQ~ z0a-zbi>$<)XRcThNRMw6-!`YZ>;TD(5g~(IJWB3;`;_=k+;h9&?L3uR%WjiV=4N8x~h*+ zMR@SG_t&wdoQO%f1#q9W{d3y4=m~Mf@{;JJ0ER-){m*J~UXvo73#o{rL$@Si);WbZ z>1a024N|KL@u=}7N6%GJ!%X&Mcu4)9r;oVkNPSi{{$GXd|CG8{)rW2gUc70= z&i*rPc2|=J`Kg%rIoSHarR{y-cMc#TBqAgzBrGT_W+)^qEhZr?BEl~uBrPQL<>Mgi ze@k%pbZ~JD{{JVGya_+QOHloH1Yb`_zd&0bI6%YQ)(Ng{>*QkZ#s&pTfF%W`*hGYc z#RP@K1%*Y}o(V(Qoc;W~q#=;Nz(BCezx18m(O^#>r^Q#l?gRmJ|0)_f`@7poOT#?v z{oUane$vuPXZO-u%Dy)_ULj)_QNpGhPLipUja2m=6`GAJ+Yi3x3>|9u^G!0U02pM(aFqwak}03hrx0Dy`G0R9lV zP+I^%AOrx|wgUhZ@&Ev4pMnk(C4zy(;hv5r;QF7Zq`NAc&_nK{`^cZ5b^j&WACW2m z0Ox|9Cd@2kVXrW}z}h)i$XkP7kQ-Zx- z%cf#^!M*#Kx1uGJ9Nu7`T}%9mQDh-n7Gn-;vhGr&0t)HUk9fKUznfni3%wXVC|LTK z=HW8#8MJb+DLKF7BZU``4!B=iyW2 zWX46Yts{VPM*G?WIU_MF4ySat8(4udv0okRw{$=1{rs$tyaPyL{)~UH(iA~`zlB?6 z0VN-p(ZAly>WCq+7($uYi99hw1MZ=qz@de0YY+R03 zROx1*KROO04&Vm~qsq~P7*GkAe1VdigbYP)$FfCQ1Z)La^}kWKAp#4(8G4D~ zY5VSiJ9mm&9zq=euR-4?iLFQh6Tb~^5N(2c!AihOz?onp@feu}9+Zq+$v<4>*O_6y zD|>XB)3+a`Uf;xmq`9=ha~)mnE@7Wb=qs3||)F!|4y6TbuN1-Vz3-z?&Ud@$vY{XUE}l2~b=oMgeyc zI=0xJpv(+>4xXTla=j4(crW@yi6%UyBkJpe=GiAhY2$iz@uaSCC8S}u9oT=)S~Nxi zqtA8Ur=aiX0zUN*f5C6^p}k5d&nrWJkmIy*lnAnGJ`|JJ!^*B*A#E@SQKhqW zCTk#6`1#+PQ~_G5t>so*btr$7t-86qw~Eg<#>`xslL*%V}wgd_vyMI{biChG#7r~kJ4t6Z6=HKQcd zoXi61p?N|PQZhG-WDnV&Mtn@M+2p<$`O^bBQ^q|+mBafo`Bbz~i|CA7D~lUnE!zr8 zc0MRE%dx*_ArFHJeGRxh0P$13Vw;Oi5Z!1r>Z~AAhFfZoa;8EgNY4TppDDz>=*51b zjKLgZew-<3iAFu^aAwl~t6W#}f~`FD4<-dm@z<;%Z^{Yi1H{vSo&^*}A!ml)af|XH z!~u?}O>>*z1D$>CBFSLM+&GMu#j=9W&biHT8f|FF9U>dS2K#15vAYmq)F;$$pDVv- zBE-w-uQhavGz-IFJ5Hh%5gtdHxCjh)X<3*~YXMmoWrOp=FWzlyaf*TL^>R%;ar|9I ztDtpoN`ELfF&9yEJ#$if3$`?Gvt;_1-(=N5IHf&aBG{zuG~_I}Ar&^eNsnV0=}8oP z&ZNNTuUM-Zsfw5Q)eEREb8oX*EvLUyilt{b=51ZQaML+F;qXvu#VLJLL?h+Rl!@S0%}DYl9p$$qrhV1cXC>h_f6B(w2noFm z!%cjAo>y1RxBl3S=yzSA~io>rrnHluDQaP?``c1+*K)|QiN`4tV~o z-dA4)8ka3qScyE2{~lSj``y}7fcDayQLekJ!^Zw1NQT-nGi8B_sm>x_3Ze0@cfQ+F z?Flu|Bt+~6CQ(%1+10$gyP`RxXnb{Igp;f`v11oxmT(r^f{$@xkZ9WM2Itn1(Mu}w zGcl*MHlE_S=u|}TXpGgL@X@@+h7Z%JO+|Z}F<#@u%gL8}UG>tf;Ope=>SBX;>r#@i z15@c!OB`RdvXCcK$A6o!@a^Iivo#|_{F~pJ5w*rwrHM0wr)3P}H zKcY+3k!g!4Vcn*6schND{2QTLt>@1Xec7#f{P26%$_SrN+UqU`CFg#NC||t5Nw;u{ z>2ZOXzB3h5ieSljL2$|U(!uosOWJbnZy9Cj&p(I;)<(a!4luNEc7jE&uxI8O-^!-tz| z2M#UFOZ~eGJj%7D*TbwyJcQ0}SXgAL4c~K*rg`}D9x4S3+Q^f#y_P3~#~-YqRB)4k z-F_xUf6a<2su}PusBsgdEC8K)bc&Q-UmJ&+RKA)|XY;)N813EvXwJ8jr{<9k5)bFw zDSmq`Rb0;k^Iug-a_RGYH8@BG?|S_l(l3Wty*DBeDf1-iD}Hteb*=reEQ#dthL1db zJ69EZ#Cs!t;NOb7wfZ&R;x0RXj|@9FQwl}wYPjvX&)jOiU7a&}g9vwFV{svbqlKFu zf^Y|D?sB$N=Ik!6pih(CT#dZYSPk!Gj}z!ct4zBY=vXGc?Q;e8rrot1TnNocj(eRmsv?BF);+6y``yiq zI*1RrGVCbAW49_YkE#;8TA}H>aXv{~j{If6j^wxT?;&N)CB{6QB=vB#Cb{E_WG(u@ z0G~8@=sz(70qPgjgReeWz8hr851kSBEIYLl%pFFNrhPq<>KzJ_YC0myX)*kAr(oEO za%mosl2L^Xt8}9eln=^%4Y~tgHVBetV;B*NBD!<0HRLhs&`)_%$b{EEVR1@J)mtt5 zTGlu7h{^YJ4t8fX(dZ%g_EagTQ?w zG+I%#UMJ;4v-Q9`xXzdCk(+MGA4CEw%qrDZD=-z+^dfr@8&u_2Tl+>@zs&Bx9K1^6 zd>Cp0a*3iZ_kzK1fJ{U76%2F%A$I(wM5FVsxaS)&*MNs0+D8WP-JL)O6(XC6Zq$7A z_6u1b-24|`N0hCW^s?a&Gzga9pu+YbvioVkTlld>j@o-RQ6i+#NJ0#A$sTT|w7)^h zB0WpgKfmRRp2ZeTj#4OPc$MXp1Ahn03Sg)(kM=p6-7t2eXvIP3UEXa^1mmx0mtp~O zSTI-|RygWrs&%#UdA zWT|>~rVo`m&@IrJHw5w(bO(8{d-d-n1~xJMQMExNM=qFQKlbt;EZ$u&L>S}sYm{P> z^T%PqOSgZL*{)R<%hL6vEUN3|cX8+A^H-j;E$IGYnpXIcm;lgH^x~~FSoXJrztiz` zV=$&~E7>ex#x#o_y~8{|L^gdTl3O>vsO^3a4(#Pmf=#A7x02fo-QB`2S;R}I?veMN zht-ZKte~YER4yUG77d16IzPbW2cbabFR0c9v$74fy=+`~J6Mm>>Q0X1FH9 z2}$Uek4T7DCAs&$7irFTvgxlYYyA+GudY%!+|DW)SGGM!ioML@gsT2!sg3SpyD1=A zPX4^*XQPcx^?o3NO3ji85xZCT%G4jSSW}i2o%W$~t2ic0wyjL>^&2PmKU4NAfoqLe zE+LUn(VtAW(mITOJDjs3B;N~?(##I)Q{kL<4Qgco>65<|5GsU=hy)y@M4dOFxKh@SD z&FKwYmRNuPE<$~Ku!2c6hL|84@7CJG9!ibYpne@x4PKJa4zl=g&v;oiUhNU4tbV9$ zAMffIxjZ9ejV? zv!fp7UYGOQ^GuJ8J^;Z)DPZ>eBxYCFWBY;Z56ge-;{Sqp_(A>ry3Zv0n}CS7c&PxN>etof^E z0gKsi)4E!|w9)gsWeh=FLR-d*>c%ChSquR|R0$dHe`+ro2{NCtt0{^*L+f7ahnYrj zkh;V=SuQESH-i_5uSlE(-|2d!Iv;hU3u^0WV^#bVyRLF5FGV|knCYI*ct1UmnTgH+ zfhdAzk>|5Di+y^9iDJ1~`|42&2esNfr)SXCNGvpK2V_e$<~D6D&9~)?(|HwsK}+_D zng3Gi!iVz$uH~ikO?$A!*UmF-h>b8E7Oy1G@qg|-omFM&L|>rEReg5)smL>7_sTx? zfDvt#(BikOl$<4?(u1t@MSFBHfY#o?(|$$KG(>M0MwSUnx#(bDSDkR1F7;^D_X35B*;}4_)^+A0=(NPZvIE~14 zY+R@F+W0y^LeeUCzE?Xg_f2o)>a}wjm)g86BEvAvc046!bwul6X}V?^!fg_6ebutp zL{uOV8b!iSjXB%SpOEa02Pi^1Mgl`zjeH}-2YZ$g8AnL0jRLdd+{;#MX|>K%oR|(} zo7{4NmhZmA%Mn}OHHu$aO>dr`KxIk-r(5eYNFCe@DdJ>O?`}phQb)N}vLR((e)&C% z0Oxxejh%m}MQ)K|HtI8o9d?ORTZw;5SNw{>v>^7st&)Wk&TMBQ_(i)&n$bUwljZy&y~;`ZZ$Ifcw#_zEFWD=+&D;i zPXmcj=ie~52hL9q9q91B+e(gj4urhlwu~-OAW@2!&WJnKT%O)BuY>1ZI_XTEcNAt? z#rtr4YeHCzjWGs%h;Dgq)P4BiAq>}N#tAS{A0fiFEGNB>lfT)X{UUpz87^xRHT0H@ znq9~xf+utT1K%(eUx2I;B{wzmkKrVS=5kgAtiTW3kw0p@1tpx+be5Y8=;zs=i}p!B zkS|OMka)^PNysO9Y0AMA*?tH}>4)mgklxQA_?ejV>=X=oJd62Gv?u4Woh9hDuO}}` z;7GH}tb?lVfajU{5juR$<*}n(gg=wlKNbjcMMriXb~2qm|#1G*C>@yruDx0@?4F$VNsF zby3@U3^;F1?+B<+-6&650g<)tWp|8m$^1%Fnw^m*b||C-a4D~`%G;mRaonhLRuanY zP4bxjbc*jXPIF10uxTHIf7OYIVZISngCM3Jee>b`RT5dp zT(BSlur`1R#n=L>*zrOY61m2gI`rZ@iAm@pi5UkB2Wh=}@Z$UV#FO^az^IV?eNm?K#;;hLVlIu~~I5$gKShzSj zW6M6-uoH(NMX7?*NvrFvCA;}kgD!+Z&NTR_a?JTd&)%iu)6bP~_nTQ#ksCvD3$5Q5 zF}6TkP<#q`D%?orSXqf`0kGv#Y2N$^#f9@WXLzk?mSCb9@i|GQ=|Qb!{_aYIV+c2?5xMv_iE-2sgNkl$u&f%)#$0 zc5{q0TxLQ0KhO(3y6GZOf;&V5Ts$sNYma^j;Qgn##&T6?#x+EZfGwRyrYhx7GAoq%o#$`*yT0qB7VlT+4$aT8p6#1C7}1dkZI@&|Cc97QCNjp`hxmKnagYjc=N`aJe|qF?wez= z-cx(GKHk>9VYyu`au_3E5YU)9{jQqt>>egYx|lQ4Q-Y_LBLX6(#+~{G^bmZVBJIes z6I4cB<3HSi_D7$VQFO>j+nGe!iQ`dygl+%NyS);W;a}Uig|Q$1YD_M8|7DOX)PRhRwb9QjC7zcrqFor?LsFvEBV04|E(()#K~yNFtk z=m|PYn+cDPxaUbO#2><{pIH#EUaaRTC4#?+8?fURJL%>>@xu<>36756`u+$L0Pam1 zWu4$vx%R%HWw=k=lXU;*1jKDyDLLX`^n~Lm7PM@|>nT9@HO+lALqlDKcyBvQ>Z8aR z%}@sX*&!06$wj3uMob<1b04s-Q;gQ9jY2n%3N z|8Q1bMmGi3E#bdp_}r6q+gZZ*_ej z_$@9Uet|V=zLBiSrOexZVEEVeAiU`F^guJZFvB{Lxs3SmMKuUY?_1<@V_*9Y>GKP` zrl@O+r06XKYIIZrmfu&mAeOUz1?bq)6MN!55|+V7*~75pE}M|y3J2o>^yi4Piw9-W zR&!GEmn%WjJl~RP$urbfTYey1X9ib$+p@*!bf|!Bybm4AN&BKXl2|R>?orTQzPtl3 zJv$zWjs!T9WxGe?2Xqwa?VYq@@FwDClX#@`*)fDCHCAcfV^8cS!7 zctbr{Ck}d?!DKaVX$*~3&pIuy{>(5E!J=LPWMFY$JuRQPFAZ^POWFA)?vi&aI==h< zfKKW5TUkDC#dOO|^P#e5)$IMl#*Mr3xLjG&>j6L!dVI%HW8|VIjMB`O8A77e{7k{Gbf!NS10V7eP04f9}o$wwNsq= zE;9%CLii%az6W*(Y%S8Io^#=8F&CM+9qf11UBC<&S?UcFZ3Oy+zzsI?r-}y6zEVjhMQz&b5Vt-@{Cut~urrNf+5y+H3u@ zzfT`=BgZ_{8y?a!U4+Hd)83_aA*>8RHeGDqUzpfMW+d~(a=t{;2~jA3&$Mpu&j?cI zmBsh_5~k)|6!?#8%r(_J1MKmxkj6MLdXt?8dm1CYV%D$Ej##m0cQ2cINB41<5eKpOk>LG?~i7*4HNO3K+0( zJfBJ5{fG#^qr|-N^A^(c_A4anZ3u&I*Ixwg$An4YV0pD2LUI(4Zs$RbOuS3O{3ieW zN>UDXFxah(lw-wcTS~=uUO zo8b%sqRPpdimC1yq$XxA%#8!J+YKw#BawO4{S)^GWr47e-5CgUq3=7p*vCK3mB|c8 z{_vme6elk}&&YcVYVcW6n}2NXNXQ_v1uRgFHT~%U3=PL_F3_XWh&Xd!&TRM4ZeNN0 z3H_yEH}D2Vy>nni&SjCjlYj8a&AFh2HU|AgS`8%~q^eV@od$}WrX;g)Onb5Yy0&fN z;>vZ9(evnFM&Q%~^ls(m+rSkT%c`ON|F3LHuvxymCKc^@eVeSV@g1SudnZ84BEZQ$ zz*)i3&zYbA5)cW9Cr%1JGr@p{@)Jeg^_0j z2kn1G@b`8J2)6fg2IzU(yE+@%ySh0dd1S<7#pFcgc_biEDN%^DC{%*S1S-RW2ng^| z5El;)4iTi(|AguoeF?92E4hZ#e z2K*~3aUU;N)wkwG|G{HuMnD0e(z0^$GBQ$95}?iBgxWiR_TP9+-NKv!5OwvOGL>C| z$^73;5AN#$T--dI37;?S=@sDN?JDkKALQof?d322KZy~Sl$M0ZOGwJQNJvRQWSyW= p(vtGda?%nq@{aQIQZh1P1P?Jnd`eG*|H%MAPs>R2wYpvOe*rbFRkZ*B literal 0 HcmV?d00001 diff --git a/website/static/favicon/apple-icon-57x57.png b/website/static/favicon/apple-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..4d9abe1805937b0e00280589cdf6508cd33816c4 GIT binary patch literal 2370 zcmeAS@N?(olHy`uVBq!ia0vp^mLSZ*3?z3SE8Y&ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZk1_q{r z0G|+7pn?xclRhL)`j9mFQ_`ewKz7Q+k4ck1q)+;g1{54cM1{b6(gJGoa1PjHoFVrA z|9_Kxho%D4+_{nGw=7y$y_FkAEfB3A6ed`dh1S4Pnd+tQA~;QrcT7XWwUo47E?u z8<&O_+Xgr|UVNit*Ud3SS=Mdc8qs4O?k_DmpQv8n?R@9a#Oy1rTT=P9af`pLocnIt znH95|O0Kpusc5WzajRF``Xc9Cpm!LPyxm>SH{Uyy3FL4VctjQhX%8@VJDF|Az`&g1 z>EamTas27D@5)mOB@Wn{d{HW#ekbzzxfAzN=SF@zV`0oEDd@CFHNmWwziRF7KmToWKRq+^?|r6@dHW8=9j@8r}c;whMK2_I@`U?jq@^dsuojG~)=+(1#nU@~DeERnD3yJae^?V{* z)-vlb*#^1_dR$!aU_wCIbjCx6S~XVBkV|xC{L;TDMyV%2Rbuo+V|Q! z)qXVgX>@P{>AW_P1rCWM9h-l?+UHJiO=p@Z@5DA)7_ z>pu7xRK7WMhNGeC)bt6PR~4}?Q0xrg$V!>?r&vXzHZJ<>{MZ7Opvbz3b(i>dxTx*e z(y43xu!wWvWgm7<0rpEN-rCi9af(L9Pqci~CO1xvOJ1+)k$<@4R!uHPQ8WvwW8OcsqiynP3kd{v>l_6iQid~wILuZ5*N7y6IK zdM!P1`z_1Mi|0MJ-8;DD-L=c>eHBg|sGgG&r6YHTv1^UAN|gUi0riv8(~@IPPWX2| z?0v7-ig)|Y-;`jK+mi5v!?#H%e@m{;`k+{EQBjQv(mMV@?60IOZDhigOobXc*X2%1 zsxFzm#s;2gFrN}lK z+rnE{h%chz%EBj<)n}!u{J{(PsXbiQ#zt)CzVuSd+pZelXaeKpz zxED>du(8TdS@rJf+lUE^icGfOe6QQg`eC}{na2kmCrd>v`};^CjNAKc<2gXjE@zELSPmdP4zH*8DtlXZYn;vKVKbtOWcX*JvYty&v zcjaxzR%;!YurbiYN4Gce<+mbgZgq$HN4S|t~y z0x1R~10w@n14CUylMn+#D-&}oBO`4C11kfAO9zg*plHa=PsvQH#I0fR+`1n?4Q?PC ziu2P-$`gxH89Z|n(^GvD(=(H^70mR^^(=HP6^slFO>_-Rbq$Ra0u9X+GD=Dctn~HE z%ggmLL8^fms9G<-DE&^`TcCjq5+D;pGD>rktgKw}lS^|`^Gd9&0)R@384Q>I->r|P z25hI5RYq!NdPWI@p`{T&Ls2VGjX07yP&MJ1DJ2;oC70JIasZV`A}R6B%uOw+EJ$Sl zyGp+xFWr7qm>-%sz9B$W42GuW7M5maCMHHq&p!j36%71H<^*R}r7{>eIZat)_Xa2x zh9nglo84J?g}Ez^ulj10_E3{6ap mEmJK_jm#{QEiFyV%=Cad^nmWOsnG_-0E4HipUXO@geCwBR!FM= literal 0 HcmV?d00001 diff --git a/website/static/favicon/apple-icon-60x60.png b/website/static/favicon/apple-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c7db9fd00fc4e1499b7a144e1273e09f7854e9 GIT binary patch literal 2514 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 literal 0 HcmV?d00001 diff --git a/website/static/favicon/apple-icon-precomposed.png b/website/static/favicon/apple-icon-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..1df71f3433d2be9e1d4fbe792f82230b28a4a0db GIT binary patch literal 8373 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 literal 0 HcmV?d00001 diff --git a/website/static/favicon/apple-icon.png b/website/static/favicon/apple-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1df71f3433d2be9e1d4fbe792f82230b28a4a0db GIT binary patch literal 8373 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 literal 0 HcmV?d00001 diff --git a/website/static/favicon/favicon-16x16.png b/website/static/favicon/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..135cf032b2c0eb6abeccf3bd33162ad345030c0d GIT binary patch literal 1253 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5)Ta>O z6XFU~@F8i^hos5xlO}>0K=x2T$&=~e&j0`ab965R1`$JCNsu2X@EI5doTkptH{vZj z^WpES!x8+GfB)K?oiOqF6Bnk|AA(jZ|6SHGoXsJAyteA2Ome^MX zctjQhX%8@VJDF_*! zk(-07G1QQ&yQ8bq+r!KA_{kGYt`bk5{1jax(%7bOYHl+oORW8wo71>%Q}aj3 zw~u8SqGaaIiFL@5kc_>1$F_l~XI|VryM0A{YIXmN7zJiJykGEO!i5bVCUDG1k5O8@ zD0xrvTLHPWw3Nn5d4~Kc;-3yYo%0UpCDjtwh?11Vl2ohYqEsNoU}Ruqple{LYiJT; zU}$AxZe?VoZD3$!U~uWcF&7jKx%nxXX_dG&ES_8U1E|3bWJ7U&T1k0gQ7VIHZen_> zZ(@38a<+n*p1GcduBC#JfuV`6fvK*ckwT!MnL&BSw9K4Tp!fB2 z^Gb5^)AiF5%QBPm^NRHm5uWNevcWMX7so?>WXYHXQmVQOS%nQUokVrHfX Y)S(A-pG}Q6C!lvI6;x#X;^) z4C~IxyacIC_6YK2V5m}KU}$JzVE6?TYIwoGP-?)y@G60U!DEG{{i+y8-8M*xCo_zk`_2yoCu`kywrC0nty>!OP8;6x-)_-tgmWw&M zN>XCux~V^V_=>)^b7b9R9j@?#BddRZ+yQky+IUV=>lQ~`D z3@hiKRgA2472WIQF`HF9J1bW({K`{qwOzl=4m~OBH|lnRbMC)>xAz|NcddDkEzcb@jAv{JUB@QhP}u8p>EyKqMm6k-b8l?@__Q_oGKYf1 zlWS&@_xPSadlz^5A7g&wl4UYic3b>*D2sSvb?a*h*YRsrE~^hKOZfSHO;_U#Wjgv? z{M%{mBX5)5PbsKvezDHvX3X~T>3O@Rto?rA`~9B_KCb!FtNrcc?c)VDw)}f1?B-hf zr}WYD^{fx`6TkiZ-mkv+jX3{5nfWWWcH12J-Jt`FOVtwBh?11Vl2ohYqEsNoU}Ruq zple{LYiJT;U}$AxZe?VoZD3$!U~uWcF&7jKx%nxXX_dG&ES_8U1E|3bWJ7U&T1k0g zQ7VIHZen_>Z(@38a<+n*p1GcduBC#JfuV`6fvK*ckwT!MnLqSKfs@meMRsq1Qej9^p+TMu zX_+~xK=144=9T2+r|YLBmSraA=N0QCB1YfX)Y!n%$k;N?$i&FNJjKw&)YvlB!qmvj gGTGA7#LP?&s6!9vKAReCPz*45y85}Sb4q9e0979Vd;kCd literal 0 HcmV?d00001 diff --git a/website/static/favicon/favicon-96x96.png b/website/static/favicon/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..bc051845b359fa07a93a21442a705fb6337c6b11 GIT binary patch literal 3718 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 ushND~lHS`_JB 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 KpUXO@geCwPxjeT3 literal 0 HcmV?d00001 diff --git a/website/static/favicon/ms-icon-70x70.png b/website/static/favicon/ms-icon-70x70.png new file mode 100644 index 0000000000000000000000000000000000000000..61fdbc272230d7b4685f626aaa7473b138e5c62d GIT binary patch literal 2792 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 z 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 PfS;qSi%qT7Z literal 0 HcmV?d00001 diff --git a/website/static/gallery/cartoon/robot-in-space-4556429_640.png b/website/static/gallery/cartoon/robot-in-space-4556429_640.png new file mode 100644 index 0000000000000000000000000000000000000000..2f92f8e6af07df904528056e8d2c2c06bef0cea9 GIT binary patch literal 172122 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�fE<&AT>l|Cxs{NEiE(#27^OG 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%0D+*)Z-79IJ|^o{|tt*Gcfj8@{c&ieB6XH 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%0DaNLuIgBz7(Vfy~xZY(@gvi%@{;=5RQZ-Lj(Qu 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 z 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

;%TBhjW0!@v#RJn;sfNw5%)Av< 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 Q4_F5KuSx#^pCl48 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�_kyDSTZHoPiMv<3vF*Ot)7Z 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 &bFkRJG~Po4>X@Hnrc3q)UXhGV=+zB z_?^aF3o}sh-bqzmO&y0iAfFWyjkR?NP@O!(OLe`^NlstmkA>CoB(KHPv?Yb~W(xGA zdw%c$e#GOKJUx8OEu?mcJ1ITk^4r(aY3HyT_J(%bE+hGo-XAT!VyAe_MBl})3>G$& z_=CgRR9xFJh?{)@z5wPvKJY>ogNIhXh$>2wt3^!9702^UCY1~7MeTvv!7&%rl`N~& z5IsqNJ!zJ3d_nUFVP1Ji1I(QVsj2pFn^0t#eA%XDIEI=9)a*siumh=LYycaQaTDOk ztN52Un~n2oaRho=pDw4qqZ$%5yB>t>7UR*qZev*7 zwu|lo?<)XE*#HLkwxWtCB1mA3V~#Zlh@!z%3jhaUgKkpR5X!AkLY`KNBV>+g9ZBYT zX-?dBM=aVyh)c zKQw4QNWbX>-~2_rv7~z-;MZ}?Sr-l`_f5i;QlJXz8uun(j+MBQdPxHVrd2Lg{Vt?`dBQ3076Z zaN$j#U`up9_#GCekyt5Y+%ERp5)H^1sv_Y@{5+_1S!j*rF1A&=f(G0A;h3b=C+_Xn z<~=sS>VYu_K%vy9;5bE=G|L#wJB|f6-gsn6-$%P zERnplkfb{nx{XXd`|q|3OC9{A54Z;p0Pl`;T#N>{6us(Q7KlKBOio`&>#6AAc73kV zDZlB6#a{>|W^FxpItXc8fFg>Wbyy1%bFe3Ka6K?rFylO`p1m@P7ZsI{GC`pYm06er zcCi-#l0fOCgKQQMDuAHeTG$DnbG}lNAz4nm_4E7jsVgUqvWlBJ#C53J@UIR+EHY|G z{{R%x30w1PfhcxJqAj`gjk}wGL*kJt7tZS&Q!_%%3YC6~0QoZlgmHz-dNTS}^ z8U!SI3Xm6WD^)D|nyt8xgEHC~9=5Y6j2{27+QgI-Rn|RNNuMF|;dwnrrGrPW#EB zG&EeuzA2%nF9fAP&<5X@_*Q7@X(TUCt^p!^(GrL0<*~xP8Sq~f=bjmGes`DU?KM4j z4P`PUhM`Nb_&A294ZX=yci(;SBmV$lxZDm^PEgON9=dd?C)W6jMVeedDsE?8s@5@U zS9{8FI`WaHhowVjqpq!?s5P~1T^056=O$1XcLDE#)VU=!a=L!XrHqgyU-x9N{X62u zso;Jih6QPIX(a;JT3}w|=mqe?Y=4{S)HppJTTByq;lt+g>lJAPP3WJ-1` z5DbKcBy0`7m^+uk(@L>xK#jN-+--*&vbP#!Pry@GmnB2ApfF@~ZsMgV;c52_$qEmp z$Q^BhU$V0HgvVEw!8mdOjo?NX`VogUU{TBjGFmT{fjg7-#}zZiuq^XRvBsA-ZLjTx zqSD#90kr%D1h zV0EK~8OQ~UG7TU##q>3=dkw=2K8|=Ks`!Ngzyu9l@9l=%SC%zIV!JGgH>->Q%4`gY z)O}cX_37z{ech5IAbCKi+Cor!GEThuAJeGkOk4IewK1%jMH0x;X<%tq_w)kYaBZ>< z91*=kWchFb0AeYVP;X9{qI_gb+dA;SK1`1?ugi0lhNendsH*0IMX8RCq0wB&XE%~K z#g5luaf=^?_`UeEgLrd_q=_ga;tZEB&V@F+n9{DDCQxtG0QUM}hHR{){^1OV>j`L(SXP@^7o zD$J<(YDA49;q0^^K7CYZZaqM@BV0|CWKKC$*&bY30A?*o7z7`-34CezP!d5TjCB^h z?x&y!5uEEZpW{R|5iyNOQ*&Uubi$WmWC!{v{{X1{DnAdma5yrk>Em7GJU78vu5AuU zp75SgT9r#Gp=vY*WdJZ5fCqI}?}?2Ugx(p^HmLkQ$pc>2l8{J0`|pTd14~U+4q%7( zu)55)>E$=K+->*8!z}Puz_Y^VOscM*LNA9H!>m=i2$B6M{VJu#PTkquhZuQjO2)xN z0-?V++btoKWjQ`WK$&hqmr`Z)aWlHXO$d%K%yl)CY%X`(2PqGP`Gj4+O&$zlT$aoc5_p2|Z^qS(?k*{r#|% zv!L=L1E_Z!;AKrvb{1Qh$hG>6K8CYYCEg*}4G*O|nU+Er5)HQ?^}~0Z0P!xz)b}{z zO3q>{5EO&Bw_GPYb3NsR0K;+)9!fbHg?{5asl9xuXe#8VbNiy!8*kSd&+EI z6N=oqfv@+3q~`!iK-i^6kv}g3SIjepar`Fy%H zRnYn}oz(q)qihr6z6#;aHp^Qo;yM9Q2H_<}DI`tS>f>?Hepsn%{2b%{0Uxxu7Pej> zph4w_%N}70-uhIFEQ{QMYv1H-e8uep*pq+VQ%0_b>Ik+Wv-m0D^A48vw2K@_jINKNxsL zL3;GfC{;zvOF-^FIJJymUg3^mD=f8`M&KFvr}Y(JZo?R`(%dQ!@)-xv9egyT4}!cX z&2rKv$7rdklwAE{I5(B}bHX`PiBOqLbu|(EvsE5*DfSKJU;046sXTA+$}ms+M?2E^NFXu(}*uS zibIj&3P;4it4pW7@d?j-P|4|QMpcr|m6L)+MM4l^rngb6qrYIH;2yq)56$r_#yW+f z;rMG?C%&48jz5K>ZOHRVOEiMkB||muy5i>W-@$BygJpuZFjdTRC~VP4%V?lB{si?M ziQm%L(fBvm_9u)u9=Q;Y<};LeZJhWH?^RS~>BDdokAHJJ$7a*W{{UJ3A1|(=mGJX` z+FFSCqdcK_bh)06nxKC7S^og*OMUf!C_9VXi`WYbH>s15um(D{@%4rW!xp?fg`6`EQAC3)(=kyIpHUJy2!Q}aQExBYzJIoNSlDs{r9?75 zHPnj+daD}`FT|*_lm0d8hxGblTCTDvWMIm|;Dc~SsK9*lg|htTRHOacsE_#ZkDLBs z{6qEk#A=>g_k-$05~><$8_I=`CBNlkx;MAzaY#=P@dp7YGsMX^HgW*DK<_7z?NBx8 z-X9f{0rJhg=*@54U-F;G{rXh@02zU~Mtwn?C;PmbWdiLJk*I%|_ZTIOQxC-LF>6%b zSU4PQTPY?-`RWd%V^M2uO{*fr8qvmg#_f#3VofHp_{?TA9ObQgno!Oqh+kp}9evIm z17dc>Zig_Yqd?U)0ZDdLQP*}h)&0BR%1u1w3}Ap579~jA+W7P6$Y?uTjL8W*)7_3W zuo%$4Om5g{8KbLK?~O<-20A|2(+iKLI+3kYUcME;*w)mm{01&=4X0*us9l^Pa&xw+e52ITY~dsi&1)q3w{+1IUG{8`7mDZ?@a&v=(D z%b5QF4NXcVhp7bJcEULyiyjx}GAub?h zf|4hid89T-qeU#v$It*t`eD5ACppYAYPQ5)z?@Z|i4G!{F7WOw ziKIyX0NO0d8VL>TO+0Az6Az)~BA;g?zAc!o;&96+Zw|Q2E-feeQ|E^SBRAn$xD)PM3PC)B06lr*Q*m{j$$^{b^*r3>}+>1Ns>vj zjFwuuE?R_@QblX?K$(aH4ulpr9c)I})O5+1mWEkKjOq;)h#`CR=sodbv%Y@`d^v7; zCryC_1Fy$J%asWVNs(TL2K})Nq=UnRI`AxWtWJSxg=kQqlukk1Lcs7Bk~N`vTR53Vj1DF zNHPkX)}l@2m9@6U!96YRZT7^PlQE{QSC*ZL2z0Pzu^5@*W)j96gRxwzH;!ulQ}^K19nK zC|4z$NM%K5D}Pg?Z+*Mt(D%vc6(Aei#nxd#2dOZ~AQiVW6n z4+BnGn0Y70rhW?2Q_y%jz_c{4%!ZqWvbbY^=2fMP1NX$v*ok;U{{Z%*g6|(M{{Y?W zx5=kYpZ93?w{NB;*eQ?nlN|@rnqT5It70$WR)yf|=^aA|+7{oj=BU5xiB2P)Ay6F8 zgL7&n3#v+XW!2K_<{zr#u7XgYI#D=!f-c%pwhB+wRUm2xwv87;={Gmp_s4X#m2pWD zg*F?r6(Ep(@WvTpgqoFb>lo_ZhuhNxWTk5AVDKq(DFEH}wYJ+3$(2^CaHO^%jSWtC zI=d&X&tasRo(Xx#(b`lGb^_z5xA2@FSO zE(!To_G9^9^~a&cB`r>5YgzU_*KKmrgMJM7ON99E@WBhtqnQvU$cQ#YCXD&w9Gt&{!dh5SLzDTHjq zvco?rrAfc5OD6s7df-x!n}8!iKA+}|MeWIHP6rj35v-Ym%4cciUV(1~JU_7H<<*c7 z!GVh~oLG+k05%sM6=Vq-!yR^DsHb3LM?d_T3x2qoV=zZ%fy$BlTKMkjkC`XyQ5d{6 z%3*C$=9!4;U<@`N{{YVr-ap}5OpdyWRcWeWs8?&uRGxBJf#m~Yr2hc%#leXG02<}% zUy`$!!?i4lI_=O6n2&ud-+gwo z4d!t+Uo8XQnM)y2w)$9Ie&04Dre}(=mZ9TSu(ps$3^q7xmsd+e#dPmGa_O@LYDWw< zFY`v;$7Ub(VJ#38CXV7uRo+-F#C{|U!^mzv5`4g^kc}i)488B|hcK0i0FLF0bOZIq zsp*lJ6p)Qu-_T(pN=({Jq#NGnY#$)$HIXF>L?{hS8=#k*32mKry}RLBf?;rO0$YE4 zGNr1D2)Ry#mA#Ly8`b76UrApp9f>#}vn5(>Qcm0TPm*1BGekf`2e15N&)VFbeV|wQ9A_9YS&#s9U$q!UB)VgjY%z%Lc@CC$HN9z9IRf z?gMNIJ#cQQK?{TkL!S5xn2ktfZ7ZVs0quzvVCh-*DwTy5PNR^e<8sl+S>shiX&J5p zs)2GzI{|IUJ7SFS1IGHi+CjrU7|A5>RQ~`B_3*@596y_`;bM&Q}F z`-G&)sWU%=s}8cjb-0C{chf4V^P%5k(Af1DU&1d6vR@7%Y|5f<+PU26qDt8iD2aQ= z3hq&T?{jU>Y*e_8+a1I%1%-hPFhDDG5u2Q)BXE32#BEwXv-{2s!fX|dV>12f6hn68 z9?w7saca~kYI~=r;W`l=@RRWT{5K4ILB`Q6*@6=!8D6E9o|vA7PNG>y)Tli*8#XU0 z26iRnv1{G8-~RwO)UpMDO7<5Q`eBd9h|07IcifyvVHho@5pC|)NP*1rQR<`2{Wbs! z6N&h?{{V<_FWMNZ#Yd8Vg&^z_oq!(`xg^P{6m;DG05d2ldw@FqP7F~+97Kzyz_tKU z)(4GbS0n-0_QY?+jwNh^!wx9Tpqb&Qk1moJC5?)_a!OVx$UTU80lpi=7HzHEd3zud zeFW6!4~Fk9*|%hO+)`3KOb@M3b4;5g&m;JJ=P9MFirWd{S08Kt0BlDqJRsnS*7Wof zQg!mdF(^Upq4h86fF1JPaQlIH2NwgX$s59=DT^f1%$ER=rL%=Fp!X_ zcEw7;yf=%m)^QuVRH!&41*Iw=ObtjofjV`ot--j$E>~*Xq(O;EARj<#sjd7q_NwOkmJhb394I8KgMUzSR+)lRMI45ZlY)MCLGzT+6iz_I8C z_&(PG!mNlk_RXis37QsQ64!y8P=P$VELiYn#x}8kbmU*Y$5`i}$5^r_Ls5pa3C#pG5wugpl1AdpuD1+5!N+|%V|Z~% zONl8^kaSJfyA1DlA~y03c^zW43vf_Thk0g%D{%f@OR+NtV^mTF&#$E3+Y! zaT1m!DvpD%UZ)0j#~0k=tM?dZIaw-Eno1i>V=6=n=xuyu?lGah_}Rkgb%0|VVT=Q8 zY0pe89c!D`g|Ua*8v6ZlgyHHX_41RK*yS=sGnyy~VqMh_5_Rhi!mkVQ*326HMf-PGLNzTdOhB0oucB-|dK|ZA=LP zLdhJUlW&<%ayw$lX1Pd8s-uXv3MDiPKhFOEWbo!~pHw&z<=K5rV}$If8xnT*2Ob5e z;+*e4uC1=DaU|8!HEg!I1j^c&4`F)`U@`6=6tcPF@S}|66I}kltpKR8(qbXb-{CF! zW5!fenJqq1M417Ws#sO!s>~e>e-i8zDkNl*sG|LCd*dYbvv3QnG7f+f>P&uBFT+VK zwzZL|BAL?GQVAk@rejoFPL}ejDcBS1)AYok*HX|_LS$gf!AV^^8}%mLukC>JG;m2f zt$YouPOmq&r*XOMj`IpiUTr01nHo?O4sXgwQcl>&P@@tm;FFkZRz6W*Ge()6BI}86 z(kyGNq4mG%ht-)i4PMxdGewv`F{I$wgK@{=0CGnhnlI|DHXpQX=DL}H31n}k&f}}59d*{5E|FHHYD*A z>B64EpHWg2JExjpgCFf6M~5vcHF$ew={HCap}&rs`Tc4EmebSb5vYtJW;Un+sKD8d|@)(M;WX??p87_^1tGqT*_H0risSdoRfPgQN8cFp1phHYiL|rp|-5ipCAKOWq;< zRdBX{mgW+)H8g@r+D<|N)z&U2;9t+D6v=p>iHd`9o{#2$5 ze|ujQSKB^F~#L0Ka5S|mqgf#gupssKgO))w1uOa+QPh>J%* zc9@Oxeo;?bA&%8BqdryX-V4k)cOcfByiJO(_=h_|L=p)!#0ClEH3%Z$lmW zYN$bf*9>z$B;j_TsT1)IR*12&W_q~7jk}UneB6!X6Y#XA{X0j@UZ?QMy#ZN&;J0;bt$$<2RZnE zdTmRc@YP)OutmjL9F0)is$`Ecr!6V#rAEEmrrmKRsaK_lMNg@x0D_%2>xzDV!iRww zerWKw3rs&{)+@&xOo`2CWx9zOV+_EQ7xMyracaq3TbRsciaie3VPn$!o$xCPb_jVO z9|J#?XhFwr24#U2%TU)mi9gR5Yfnj?MaMjS z8_Nnw6GL4}0$g6oB&Twq6L10B1vcyHBrt%lGar$t9C?(Kwx^W?Sb;q}Yu6Izc{~6a zvuZf+(^Tp&^ts1rn`M%aBg|=Bo|1A^C5FVB zdYUcIV7;)EfBI*55fs98;(j*{7e&QY05KmD6N0t~>`!!~P67*eZGM^8gf5V;2BBc}^}y4ZC%IJeKQ9JH&HU)#8~&onySC_>hKD^ z!`2+!5g#d5nkonpNAm?rZJYdEaD`9)on8`FJcg^pPZ8vbL=o~oXwfWTM?eD73?Myv zcW8gx{{YQ*v$y2o{{XM|t0Obytwil4@W>JLvn-!0t;2#ot9$ppAvv{V`NT3cEQlti zVI?zyca<12U+xAgsQ&;BJO%h@@elTg2iI{GU+uh%(nls|R~&&6Dg#K1qBI*34_nwV zw_HeaUMi!j%oaUu7>Ma$MS~u<{{Y53g{fLNGM@uKJu64TtyKM>e2mE><+1qeYtR`M zXBKId(q_sGD^m(c6q}K8=2Pws$J-CJ#EZ-+bAA17d_lMui*owv3aUt=5w#rbil=WY z`PAFc`M)EHR5_PA%1T)G9qoy90^)Ou!7(<*6ME%~niQQUrz7ejoSES=7gQUY08dOY zu98XOx>(!W81*o#9qvu-ZTI@&IICj|%Ve_O^TX&yU1}NYkl^gpsG7{Z+Ke7?B%Xrb zt~XyjOk|WI=hWO0>y1535$W>Xj`zM9Nm3e6lHTI_YzD&)gl1M~sEepWU7A%x^GPSE zHim9nrR)!(>T%UNM>Gi=xN-%x9;DkDREW~IH$Y2(*Vx<8V@QyNjZuixeSy8k3;qxV zRi0@@Wk*`(Ou1>w7){F?>D-KU64lc*ob>XObpr<}CCU|4DP!3ZIV91TEf zKP~Tu+;9yA8DnI(2yxX7)a?DQSPK zON(ej10X8})QyO4w#8BSgh<*B7s}-zr^Zc~N{xF3iZFzdI$NE8wkaHKcp1R1oKcS9 zANKB#t!!S-@WXA6+Qbl*1$rb;Bl+wjqhNJgd&o zfY^?mf%@PFhg1^La3)O-lgyTlDjxlHOL-U{yWsE=f)c?MM)n(=cL1~&SWUIJ@-~G0 z5(n0e#GF#ETyv__ekvwD6!o=R%WNkQke@$cWA(zSEH8`%`dbn^3Rz5$O$FmV9*c?i zZo4LN=bAlGk+Bk~)Q0~6^8tuYg1L%8`%i|Xe>%zW(V--j)n%1_&H?`buNIAuY*c27 zZX5AtBSS?~BF{Ny5J1eo4NwlE+C_j_1@3z;Gu|p~+&db>v9_i&b}Nl#E8Ed0G4qPC zVM-6#+*v5{&OFn<$3a%_Y;PQ{{{U=tjTQ|+O=dG0eeI0LMDwmzV=3@DkBxuc=}(`-nelO5#+Tl z(ZiU=%^O+9_g`~yu=nUO;?mI|ig6FNun0TROXG*@j$oQ9nAUoEQb^ogSsLJvV~*Hu zgru3LYeS|R*X9%%Wjj^oRn+v5N4rZrs))Z*dSC}1akW1M4#0gdr9I6}JwCp(=c z0P{NhK9VbtYVe=OUI>#gmo3TVmoRu^<}~`_rKTVd4w+|U4tMB*uiFeW4;?5eD5a`e zT)oU=_$y_VLwagRG@o)B-scp?OGTE)6LBSSLt9e;ni_gtPTcC7E{<^vWrzl6v0z)4 zRBe0)SZ9_;r>mzjM5qLW?2T((kK}PubBl2-p;C}lIsvfdyvM}tFeFlvp0y~>zY*0H z)4fET43ep3US&RL(cBZ+9z8m(*6m|%*nPsDEbxaA)JAhEeAg(E$wc^s6;SH#OU33< ze^fZBxRN@2k0`Fpqsu-fI7%4f4Q15CDE|PIU4i-xRUkhB)sVvQP?eD0C?wPyzYV4q=Qwb0}A~c!wv0j5udI;izU=pv|(nngo&t z45g)okPv-tM#k9r;ZZC!xpfeRoFvjxuP`c*%EM+-JwaB*o5Ox5@izl!Ntooht#2_U z0qN$MnI=KlhPVgQYyiz+%X4hwHO?Ybp`*+zYHI1|t}P17A$=-+12b4}vBO+Z#0>E> zOuLgKsE|a+Ai)G5Fmye4G*%sls>w?P%1)w#WbGbp1mcz{iwiW9$k*E42dC2-&nTph zg;F*e<547zQ1{z^Pkbv4R5?t`O-8Y(1%#v%xEtZ~XAyxfE<({trHi~^o1V7)F;Wer z3Y7Aw)T>=ZLXyKgS3m<5f0z!JAABbH{akcGDI_f^)2yp`g}VN@6~q~pQOsfxLnet9 z&97~VwXKI)R}I$HA*-EcQmi#-HoFn9_83oR0!?t$gTNWgw2vKZ(yZ)A0c6>hdHcLfJ%BUldYFARE22f9H^&_Shl9?c-mORRpOkr-@ z0zqz;CwvFZbL5(Ek@D4MV2l)>C!rsZwkQ4_@cLKfv1Y0kO1UI;g{6;BiBX6R=I%&4 z`T>EKQsafT>x))Vr6J(E=6PLZLeyo`$3aaaOB>3(wUuQ?j&wrXpC?8e0(#<0Ps8w4 zN1aze9YOt{POnbdG>dalJm10?t84+i)Y|xw!gCrXf^?0h&K6LV;Hi_8p#1tb)a0Ki zBEr|PHn(*71k=nZ)CQ7CmNJhui#_)TS3`UCwXo-A5YibSswYns2p+o_@EXa|HONug zqWMKIcUWbfL=w5>>+>-_p7@$@R#GR=Dsu{96mU^M$n2^`H!Ag*8KYP?}OeR(M=sCRCNz5O7+qMapoEk5EdWv2I+&iX56n9ZKaRH zDn6S}PV`f@Ez8LrHTYD9k}gJnK|HAPMrTyDuWQ_1-%>GS!5CI!=q-Qi{jpxOGqr3~ zXc?MG6;%KQEHD!5+jY#6^%uswQtY$MAiCTuN#Uc2|mKZz=;t8r8 zswEw8xa`eAQmOv{-d7iXD1XMEF}w}TB8?IGl~G1jmsP<@0o&Kp-w}A)`z$%-kuZ{e z6h)wy&^&6`@c#gA2I1kTHL|Kb$A8==Bp8qQeMv0`0&wLF_U2P%6mY$|YFH2-)M7z{ z*#7`cK11nDukjkpX!OSMtUF1nBaUgSX*h>9N@hhys4@d@=d&Nm=MgyTgf%Hm&D1y6 zLHU8+&H7sGV0;UY(BLt|K)3FASwgB3RI=FG+u|M6E3`R! z)`w$w-@7M1@II9e%`2(GqZD-4Crc7W$FBQ!{Qa@$4+<;)0BGZ>A#{Iv$d*0PsK zG$uNv+~MJAAB2PGbo|9wxXflV5>-d6$B=&&i%Y{liN6K-(x43$RGEbfyS9{9rOa~5 zz&+T&D+nHn*!A{2q5lA=&PQKS;V%nuUQEdjVZ+>ImuRSyWQr=}moIYXs9*P_B#xRv z?S?J{woN~5e|QI4^>W(VbQ@!MjreWFQgPRZd@aWE(u!x|9F~VQXhUid8i*27x9?*1 zz9g7<84@XyAjM`g8H~qkl}3Ioa*BrFDn2ctgIxIyd}dRqi&Ip7=0joFJ3{B#3CEr? zDW-VDQ4qutt;yLxn!~N}?rtZ@X!xUtvo0O4jUJyerIwaOVR2_tKTF^3k0QlDX=%k2 zw8$ronl_D8Ye`h;Z%*LgCzzKriq$wT6iTr5S*&V>Nb*eM^wt9Af;DM?cWq8ZIx?{=<4RtbOsp?%(84zzRUsZ+ZPWC z=YQ=kLr0v(2C9g^ev8#7LRM9`v#WivD~2n$T30Pc-`@3;du75@)#Dh$Bf8+oulFZZ z{{Y!0KjTtLb%#%$<@T_>v5o)YW56m-w$$M#9xJ3!$i+ro8^XBQgj)PTw~Q6fXd!ReTX2BsKah!cxx{9OMM|; zWBdxto5HW0Xe+TGc|rN>R!qCb+}-Xk)1mdpG|Q<~c}#SjTl#uo9IHIabC^v|RhZLO zM0yyd4`J>)+wF&uRID!O03@9t4xfBVp=og$n=%f>ZA_uKTsfyBBU(aOJ}O4Nk$N#3 zpUV&O?3y-iY^>!|<+sXy*lw{*Cm~tbxv>hjz5Os+hAHE6q!$Q2T~{0Xj`&NfQd0oZ zn!|#Zok^M_1u%e?4Z9BFz+O75&%QZjqk>ptdTGpOOqxpqHwSecu=;_LoU=#{m$i>fNGarvqf;5Wk+veS zOC~ScHuoqCLEIgTYxS#-4qm-#p!+Mz;Mjwxw|n7gc_kWz!qyi8_$V?61vKjmQWjfulhEr<0Jg)XIG0s`Lt@9S zG$nZUZ#Dff)T{`;s{{Jug_xr|K%|<*1TOgM*y1+?X(!AFOm)+I4x|(sbqWd^R{ogZ zzBDXxym2R5QLOsoF__FdNvy^Ze)!C0876n7R%0=k%yd8%?sb^VYf#2&_Q$(HT#AbE zMNMR?>qa@c3GxBZkAKe)${`I6NHtP0lt`>eRJk5^r~ zlW)rd>T;A2YGr**<`x^Df9Z*fH6@f~JnFf4+MRPau2fN%q5$OHr*_R?uzbxZdC5_v?oB^?b-#UN%4gHVqoazYim;kBd7*SvR==2r+Tfd?H_hqO1M{qcqFJ7Nn=Pr$DcyOI%Sj7Obv>LV z%Ce9_4Q_<=vBnE@hi{atnUbPO_1EF_)54|QWFaD=a7ZXCW{MFswusE(5wxIBHny<- z8=kv$!qZ6El(I`cf~s{`_9OX${P1jL)wy*wU0nHnT`+n^qhTa37*~{qwcB&$)wlM* zeB&p2I#;NIGR*gPWdyJX+YFQ`w2AYNzglf6CYa5YP|p=a6 znA-O}2KKq>Qf9KGm8n+*C>HnDTS-;E>u*vIOh?>0l@Jm(q8m=MUpAwrk|nKbwO(;5 zLPkyOHa9&zF&3?+ntCfj?#AVngOU|3`WxW@Up^5umIZE`eJT4btk8eoVz%Ym6WZCu>PLCaOzqvYe^=n_o1Vu zn55<@>R0%j1}%NS`VUMy=EoaFJn=nDZ*)}~04;q$-?0|NmpS07RjW>1ZiNtox6J0- z>KK7$5lxro3r$}zX;XXBW@w17l6e}Q3P`Qp;xb4;KnxoAiu_erkV8b}i&=&Dq4lL3`_ESu7AMr$V#5@b6Kbi3O)eRicDB2lu_x_s&jEI-YF3_f z4a>QI4O;a1wrm=vDoXhbcT(J)xsinh4x#2N(1Fu@NoTFfvnT~r`B0~Mzk57-!GJm3 zvJaSCl5Bl(0^vNyXk(6v|hPGN|4yZYe)@>e1gy08f;Y)7stfFX5ga zo(z_aYQbu^Q$0gi0@BD#kFe|u5!1FJTo@zF^Vn$>n8Xyh)!g|&KdJn&ZJf50YG~rn z&Pgmf-xux#!`F5lzB_1vuKda8;q#{$e=mPywE@eh=S=D_ZbW6B$riT64Zh%W7IFVpY%x)K=Wozj8W{Yy{6I6_BK;h_3;(>Y~a~zE=Q~xH})H#qq1r zWR)N$PmYx?Y*%=+sY-x!k*!(ccn?XF{{WE2Jwy@PT+yxiU4X?WHG9)kA)uO7Cdx{= zQ|-{<)>|{y67?^63!j~}5IuLo(~Xsw2>Jg2Y9U-aP@Ls@d4GDhPGy&^^;c7iY;P*< z`r?B8Vb{`Ea8C))Qr5vy4Nn?nboG$OC_KnnC%Q2Q$`0F`Vp&NX06cFDWES!^fr_W` zK^-n%;e45kg;54|mefX32CYbDH{06(0Gi|xGZH}@yhVCj zg(_*s3*`XRMSp;&{vbd4YumO9iJ?6uPyRy`#z_KT}Ih42o3gCg=_A+V{ih zU=2!FREuqiEo*(TEY0GQ(nelGopD$yN{Q_`^#1j18Q~pfLH__y#tGm%38Ozo7^dgV zb9|@wGchw zW)}MGZ+r#I;t_!)kh3bSfz(OE%CNG+5hEyW5Ln*F-_r=~Go1ebDw9R3SwL!a+Guuh zRV7^0R-`1n^E8Bu`HK>NOWP7Y0L?P|hQ79=GMXw#>nWnU8`!!tZLsuwMVsPac;KEl z(v5Q0zNSC<##O751g=h%cGGT~Ty2jbL@PBM<+^Sd_i|w;r{9HJkKzXgMr|(=(5L+J zY5urt{{Xt)9Rp*=Iau>)-fM6EUihV25^2k!Dp(IQ4ZTJiR{T{xAgC)TkD9|irEw%Aoz8~JQDJ9qRsL; zsz+i6l17M>Vf1xV_Q#ayT1r$jH2L7N(t_H0NY`#-mi2so3%HDDKZU;x-nOKQ;z0GUKNI0G2*)@T1pf-XJtlXW4}$a^}Y`h^1`zr$(HmzF}(%`}Vz77S!f+ zyhFq(3d-_A&%_nNK@f6L4W$D5c0Dk(Tos7|opagJn^8%)*h%hfI}gQQLXS*&d&Ve- z3HXUTkiphO<6Nad2H7pGjIGqt{zd$BA>vxZR{rGytRcOf(U{M>GP=*m^1idmU#5@ z6cB>LQ(I%V=WJ6RJW_G4S(iz{`CffB9}DMh^|QfDG)YrX#TDRo2IeaTeps+(X4P?F zi*|-s-i3rxsu&~;vT6r^<=X(b?H7tTb2E+wGF4Dz^_A4`YqFSOX-<*X<&5<7IE}{I zam+o?(uh=Y-Ug(4icb+*cKCaMiA#O(2$;*Pj~JNeUP8*V`YfJLfXrxlFA{|eBhm>5 z)*y7ZUZ18Xd|RAlTsN0wVN|?>hw|o~3fe_7LJF^;v~3>vrt^&Xb6oeENmA^Q!X+(z z%Nr4EZR?E9xTdo-r$bRvlPxSl6<|Ez1=67Ug%%z5wlTDYAtf=qR%EnhHFR)~ikY7W zOBP{}RLCR$0Es0eu2MEPuqnThhx0F9gb}tqd*J7axj%|o0%ougPnc7Jm6U8iWMFI@ zTV@1W`fp-w>5rQfxt&u|2^Uk}NCb|8+uygoE+50+iLv;7#c@(*a>GeYo5>t2S1gx` z2PVqW{{Spz`dp5R#k&kxxNnGG!7f8msif|jlks9#ZyPffr>-m7e;qh-S&|vDOyV-+0?Ls{7X8Rqy}sC* zdecO@K7ZoWg>-uOaXzDK>78}vQKCfjiiXlf|gziy(o^{qoJ zlF0F2uGYhtP@*huI)VwqSZHU7!PWzTvBTr%7E`*N#vWM%MD0XcC2&;eGg%yEZNE=k zHm*qu8#k8YZ%jIh%DQ!fY;x$Y(QZNRFqD`xL^{xMtb?5~rFJS=FKETDgyzg{RSoan z#=_Ws)VGYJM^3%XuoikQQ<1DWC%(h!hmw>!Ow>i+yjnJtqi%Fsgvp`Hor_!(*ADQ; zgo3JzWdM?WPS|!^NWI735wE17L<*X-RI&|sjK+buzBh(~sG=(|n9OE6M>_DV0@%!E zGXD5ZgG%jkdi2Jzw#Km1j2iVuGb*Y#%w|a>Q6z4PcfE$+_s2E4ku!3{mJGf^MTNbv z2C}v4tLlO*oVKW8b6|X?#Quc+Frcn@>Qw?Ggf_kZ08#0S2)BR_g;t!q2`Y|ewVA@v z(@7+n*dYagZSDQ=CW+(|s?B7D`d@H=%LQ|)#Cmq6kf@nKHeJQ~fqX~lz9Kj|wGydq zTUhVw_Bb_!lHRlnkEA#vra41F3cWaOA=^}KtIK`C4eV?;!2n>I}&#q zlz>4WU%n#|W=k{*$tCa5YwzCpe@~n&%tWvaQTc!tw#U~3KWW;?R>yjpwZ2ABkZOcp zILWeHl9BWL*Wk>ks-e-zAru3$gSXeYwjj^r4-RG0)yZ61u4a*h66Ms*8VL5#nxrbl zy4>2^;s@hIQsmrq#q<>{55VS66n4GLOo;Jz>7m!#6^3=1!pcQ9r4hysf_EhK`W$@2 zbKBd#t8z6#DfI>_+y-<74UJz^{x{|E)oF(#t*MGNI%Jxx5DonRHu?f^$BMjM&oh*4 zzMiB~($5}_L?XejxmRL!5&2`z&BZc8s?7r!*xKkvPgDMQFGa))Q9LgUq%NiN4xzm_ z>4w+u2^#HO2>?{ec9K+c3l(4j04xAsVd;PwOFj4=^Q0tGeUK{j6@n=zVG&I}k^%2xe}@9l?j z=TVtOBPzUZ!%nTX>Dyu75xo06c*um<(!lzT_9Tx@`u_l)ILWGBvZ0t=bT>BOACz_j zz6mX^J43Z{c~yy$R)?5nv9qg4%-Vn(f-P(I-xJD7Dk*5Lw*5U$BiZc|Eh@Ac zQ=4-NAl!dzf1Wz(U~62`p!G$n+9ZlnWFwR}vk*5Me|$*tJo1v7mPqO(P_bzS%kv9& z1AlA)s>tM{s7cZ1CCSnNxdZe1@9&8RhZ#Is#}&~$(IJMDRZPk^1ykiy{{UHBMLQ}~ zO*HDDRnwPc(Luws`D`*O$sA$kDxPyAjchILaz4WZ=rXwL=_2LG#KbIEHtp-v5xnn+ zUYX=d8C*FBQ)vTztUY%Ft{U*~5!a(6MmJcU+fV@cJKp_o^}vt5&|X93Q7(t4I4Z;2I4rENTDvvOzZ#S>NgUih!FI{K<`YpPV(5NzvnZ*NQ-i-_fE zj)ep!$zYbuOSH4>}(>16sHIDWE^Jt151+utum&taXw=AC=GF7IoJUUkGE6 z@Vu4MAO@FPhG zCGiVzr1qd{H}a{hDbgG)lM}a{Lf$nRvk=zVj@HC)i@412mTklNTVz#LqdTfd8fZufOs!E*2Dk5R zRZ(;u{qZ$GpmJ5pv#}n1#t3OmJ{H2n#)Nr^j~xvP>RNP=o?FxGrYbzPf|D$!g`$d< z2pD?FfJy3X2KXf&ghu9_OgFvyj5o{ZRyd1DenG3udXH~RJ%WuTLO`~z?02{J z#F`Lb2&mWAgvb>b%w&u)jZ||Sk_a8}wpmM0H=GSpC^lBy``ZiVR7|rdg;mftuQK0% zToj_DjVV>xRFwx&*js#Y4fnOBxav^QDd$X%U&}0HLW+J{^&{xY!P> zj_PXkC^3U$>D&I;V+~xwR!I`b+XJhAzqSbgCWSfOPPB$^G$|<5;gtozKh)qvf+*^K zE>>sqYy$W6!3^GqnN!Y^r$x<$&d1vUGo0fm$zu@J=F}8-QpmLxF~rSnt~D?uUu<_$ zXw0s32%%fA4-uLvt4BDJP0>aHAvaoXd3t_5wk-{^6;rPQP zj!1=ye$a>$>~7!F0yCa8$!lZNmFIa}j;LjFE2C|?8(EGV%Bb3xYl+#Va&8a@`_ms< zZ<)d+MWu~~xWRQoZfcuQN%B4HNt-XLRFhpCOfo1~=MWWN*QcupLQO7(xZ*DDZFIYg6r)b#L zb=_Vjq%_&qhIj{QJm*FpiVHzXshdH8C`0MxEUg#P^Bs1kU262kqMEO z;Dk$?IT*5dGdWs}z)3}z)8>@Oh$Oks)c#B}!BX3jimLO{9+gj~R3z^$u`nEXji^ zyp1O+CSVC;Vh`}|zi-zF=ZQ=yRRl7GQf+a!+Q#F)61MXQt{}8YWkWDlhI(}PSI<8b zxLNoE#SHs|vPkDSZeLvQLn9Ik<`9aHW?7ul#9j>6kkCG+AV)1QB|-GOa%??N+Y~NZYO1pu8Zu*%>nb9QGsqK_ zt-^z-><0HY>5T5@4Gg}dtO(`eD;ULa_2E};S~>hDPY`tn%z`JzuDqWyjVT}UYEzyf>u zZG2rC;)hNc&69d8Xr**WFpxZBbN%A5-MM1vPET~|2ahvT$m*ueq?Wffsi>Z23=ERJ z4` zaaPh)v~^HOIS&cZA|F+6OB)f;`e3~ZNel!t2&29@6gmq0IN_w@j#W5zzjr@`y{w#l#n;T*_S3tv| z^~ant>LFMa=XF$d^Txu#yLQFX!Q4|8ZY0X;8r8I@toJ|hSEjN3$Eo+l)?ETzgbHgqQBj^e5y~46$bVezBVN9YIy>pDd_Qqof zz9ZBkq(x>k8H~b`Ys6M#p4Z1%%ppQ+wZ;2m3AQ%-Z-kyz8!_$E45-GH!a&}kd5~7D znjIHWIoj3&{{Z*H8mMXLViGAR#=*6Gt8V8StB$U8FD%C9MF^4P8l9+CZBF~0tI7lQIC~XTanr{v(}aG3RDQUE)^QAMLq;dYh8kaDys-}q47Di?#SYCqL zZR_6;dy>=!V_r@s5J^a?6Y+z?@?^YI2OrYevd$)oIx4ppAuH+9$VluYfp+yVFvpg& z8iuN#M$4pC49#*$x8?cc-`rutw0ohqeEiaL> z1A7tB;x~|IH5E+H5CsK`={DP^Q?>ACGnyd8(vYBl#DjCM{a+LpSyEldsJu9N-SLMzT1!23ea&(6p~5tbqh0_ZlcA9PtV^GZe&YNz@sa)V1*qH{mwX` ztVyZg;v)ov3<-<$C({k8(F76(mCWRtDV)!j<`qSBur8sLF%}j*`{2Gs6g1r0h~x^Y zbm>#DKU`Opbub4ZN}~>l3EzIi^uhif&kVor&!H7=7$~vT^*C|+MJ1R{)xdSDUnG zI*D+}r|gAfbrWfYFTKZ@cEH%Bs;aMCzJ}7xEYZS*n+;^xD;|R6j2+CRhIqjdp1UBh zVn=^|zL=134+)B1GRhitc37S38Ex~rqc9}>LiNLluwC2eWxiwy^D#&%E+`~b_req> zB;jnYDLPBjQz|)8U|;x%`ms1D)0I16I3W;IMFsx=;UceI;9)0XSb?_o$JCZ~$hEga z2^u9JdI1$Qlq6_2r)eEj$Ru7^Ru=%1d^XH-YOKbNdMBukHJx;pRV1&t!DL+ss6T`O zjLPH~tVS+X`y z){gzLd;I?ZA^KOA{{RrVDdFBC;2f2+Lg}4mv~-N-6jF-W_C%~lUF@sBt-50Lhr?X4 zPPwy6`5yPU zn=Koc(Hjx-NUtvbKu^fT%N8$j} z!Jg36YZ^{em$(Fwv&(U~{{R@lsW`VYT9&0oPH0^$HC+4su}OIA$Fz}gB_3b<_LiS6 z4=E(*9NCztKmP!%^!CAcO~6&kN1af;w%`t)5w)o4F@=KFmyYi;;c8u;CKF-v`*(gj#Rw9TXdO-)tzA@KGLR zDxhTVw)gbFk*b*|qqmR~9U_-9EpbycV!)L0$X;@+42Fi>!VQ6ktZ5=kIa+~YE= zt!-TAepm-Uxv)L`{+O}Q_;DMVz$c(oUSU3ndRrDA zXIlzNBS?vOp5O}~t?{ZXx{Hcwf7y6*spx9+s+h9)>SGoLNr^;REJfmGWmmbjg4eyR zj@zD!RW9AHc*Oh8AYW%b%R1vaH@p8?VCDca4 z%3G=LupYjn9!T(8i7WWSFUzXwrKq#PDTiAU$kCQklK%iP*>7&A7xx2j?tLSQ$Q+$PpaVb#o3KBkDDtT33K|@Sq%xeVFRwb2UZ3O@~ zux*9#0voS6eRKy^T^RGN?h;c+ikH^ z$DJ0)FDPy!@8?v1X&7o*3}P+pMn!pzQ}U7MDDMTyKkY?Im}W?)iq5TO`VoWK4r<%@o*)H}T_1M?n4m-lGQrAP`o+T>r~=rLtv+(%DM zAg8LQ)>(m*&!)R2nWB@1_yhwPPF_CwLi?WY^oM#c^W-HAR255w_G=-&7KvSIb4+=Ba5xq(EDPy z&$If7BN9zc6vQs9#N3Zz^|lt_49=@EK-F`yNLNa$wV0AN-uA$&OzTXz>6sNhgEy&$ zXqBH@NcvJcUiUlu;>F?G`7+$npFEk@=hEy>#SMc1e&X1#a!wqkSj5RYF1a<6D{8ZK zAfHT3BCeu^4HG$*T2u;$VyEqa^Qo1k#`GY_^A*O_q>!q<)s=uMZV0%>@C$--TAb^K zXmbj<^i0a}xb-OPm;33z-v@EF+P*HBL*r!tej;kvg@+OpHZ_>cW-|}ct6lNDW-}hI zR%0=k%y8{qt}&Ry*BOA^-jpjbpbhb}wmH;&u-PKJU0h=@z*m^_MxmUbSyUJgsRHb$ z`j5Y+AK{C8rmnMw%;hB~z>Y`K2=E}+tA`ishLtd}U17QdW761odt;UXg^m=Vtv2If z#KEX7QkkAe<_sN~!vcJ_)ONlF8X9_eT*jI~Q+qAe{+N<+9C1r4)5YXs*I*5`U`9}xV{2r6*P3=T^U%r08RI|f7iYzEs@>I2K7<9 zE6HSP^6tY=}QbR_P5@WQ^OA&z98q0$)ljDK&-z6exQYlT^43Oz0_*RAj~ zIHyTaPVwr9Y%XjGH`wA$om4Z_diK(zoIRXUW;N5$&03NL1DhVZ=^erL$DDr{o)$@8 zTmJyPc@!d|c;b$ai&7A7QFO;knYXRRih0|yNF40UMekF?@}$#LP$^lQC?Pr*6(&it{G?l0Py_6LD3rgxMV$?09X844}GyvMMuf2^C|@mqz_a5EsvUCu=iVqvv48A z7(SnW3fh@{7cC{`jHNI}|UYF3pGkg41obnAQJy2${H z#T`P4TErDMQR%S46;!PYw31AW_8>Ctx25nQN)|{WDdD9!%hnn5c_C*wvHSMJcUI+T z?&>t9K;EZWB^2`JD9UZkabVXcZ`0SlC3)25l8z{%RaLMIS97Qxjv_QXRJ5%fDyoSi zTY$D8`yba2<;|*dh(wJvV6nEHC&~w?#clT7D+*ZBxJZgWLz>g(ERfFez*Rz*YlN`v z@89#mjKa4rSj3d_q~&z^P09mqpn89nBDn@znC7xeMM9U;^RcodWcsn#b?J!?Pr)?n zTn2ZVJjdi{X$c74#m@Hn0rkKSw$cgAsG*#6ZB|!-l=C)j`P`8@QNojQrqTeCW*Tgy zjqD2>jk;pmsCqK)myh?Wk@;gljWsGLC#8vH z1M7)qLiALyJG9L5%^;6c8-=jBTaE4i0DN@{2u?w<)}!2eE|f&XkyFP#Y-u7YDk{dC zB7x=8=qx|38w|mvjiXY$x4A3|+<)5##56NguffeE(lV7|50n%1+iXXw_dT-OF8o5H#s&y0!)_13LHBd)Xkj+q!BM@#)?tT3+cKBIFm6@FNGel%+c&*L; z8@0O`|zU$|kK3t~ZDh`0?P= zE~xxZ;i(3ogeGAd5Z1kj2H@MaACDEd3FD4vc!efOMdL8j%`UO(x=`GGFu=UGJ2;<+ zp}QrG!KrpL5TE_(@S#Skjz7t%yxJ{QP#`+JEhUZc%CGSY;B5>~Jx_~#B#4_6`&trj z($)s#`wVm6ZNK#s@gJ>wvRVEURd3?amXnSACCuaHd`wyV6w!kSl17ef&nyxM$=y$p zZbxHo`1GLf^~aMubn!pKemLVk0OAfB;|#Mf%Q!zVrp&XP!YPNsw#nHKz!;ICw{=4{@9MOeWP`7tl|kwYs)Cx)<&HuhZY0)c#7Bor z$*~{pB`7_8-|2~9`)U%E1M5r{oExP4D&5A8DS`OW{3dFV58^Y!)iKG-VA=IJ^Lt&l z9^-5ze;WS)gujYPB>Y409J5H8)J2>{Cau5<3X%&FMV9)HrWct#X&FySgJ=1>)5Se? zAk`C8)G<9Y-gn%e*K9+0hczt(voyv{E4!!7um;xj7+WLp8^b;{rWtPxah^+@)E<1I z8fhHJ(Fsl5236Lhn3rX^8h|8XJ(y)IwN(;UR2EcXs}i=K%lz>K=qerFb-ZASw|O#? zvEO;9mSdmOR4kJU)`?c={z6y}U)L0Wi#gq8Rc#J_M=va^f?TOyNWda^97|*AsV4^h z*s!>^CIG}hJHJ}Bp$Sx)m6_#*x3&ESJm=${W1dsdW%Qw@Y6^+!*FlgKX+&rh{-II# z>tnt-hq_t1N&DKI_PfK)VjKf_Q@HHZCy)-K=g-oTpv`C_;sm021k~=@keAdI{RO_g zu_np0xGCn5<`Juz40h-V1NeO{(-jvB(pJw)MN2FZLhu5>mp4Ls?b_#jSlJ#{?=(hL z4&Ob6nJu;b{qb~V#T{b5J+XTh8I-A00zMr5YQlzT>!}4|0~0$Ch)u(KV=3sG8jHuv z*J8vdH@|)G;*3*hja}Fn`l$4`Y${$5?;=c`xXp>zW9xiKr>Uv}oFJ5>X;FOQlB{Mh z%#(ma4fXD%^*>A!%XDS=f+U=0nnxIGn9u-?F5wj(vOJhWjl$Z8{Mc*ALQ^IdOdzoGi?iwDN_$|2&0N(jChcqrnj ztTWV^mU#@alyy=`1R+SzOBlArRZYb+K75nV297C)fF%P%h53UYOjjeaceC+|-Ei#p ztfuK5=}1<)Yz!YAPr|)7_(9HdeCsEwrlq8q2s2n<(GUYv)2lpcPw?vHxVi3)z3egU znr{gyx+XPfB;`hIMSvUnZ`^gq&p!@xBavs%K24Z>Ee>$8Qs!!PEL^sc9Ztk~ zl0-%g+s%E6zoe)WH-;w5Va*NA$cbbZM%8;;(Ee7#kEKknU1wVQr`bjFIHLmW9asvs zR!}2cr@Way5>htNBCklZywa^|NR}Q%goT>-E;=yl{;h~#64XgFx|XUUwCFCt=^Ng_ zeKF2gO<5*OOGx5(f09e70O~ym>vDD$^}uc;ppPugC?TF1r)gWy0)wU<$mL1W=VDsN zYk_;-!aTT5Xsj~R4-g2QVh2ipPn`_)c@Qt5GL0K7S$UDd6e7zg{sC{`UWVHfx2`P@ z7dTd%KJeo;$T_PVQqvx zEyisp$fsRAd3>wI9vbDdaaLwxT*ji3C}|!>5J_nqD=4+k%h#>DV&SJ+9I}Yy`Aq}U z($n9Vhz_Y-@2Ii!F*X~VQr-pCG}L*;bc#&UOHTx?uw?;Vii>pfTlDnB$4+Z19cU@( zS?Vf58iNf=6lyKG04NtFj=%$ZV6(q(ub}Us?4~HJ*=wE_^UXdGt6qo@2Vzy-o%iq z2FRl3%Ar(t7=5)ggcF)o&}=-4OzBR4qd#RQHUh%ms@70GDhz$~bQ|s>$l}9FjDsN_vqD(5NNC=niCG=C+_LH}Ahp zIFg1c%)HCW)v2_Z2;6qI-_r_V#I8b4qk8fU0Gem1sAx$p@U6zNwY@O!ERB(jvpT7{ z2%`1_srI%SX01m_12l`EfKue1y|3+w*BtnHFAqr_btKY$$j}UIPNqq1y0Pv}i3i@@ zu%{eC7M9d?RL7_JuBc5v;cVV!m7x`cAzgusQs}>5?TL0z9Mv^VQW;gmnoxz?ZQl77x(0S4M;QlxL+YlHQ~=6VInS}s{YBCv8cvtOYHzhAxwaEU3U zc4`O?9luJqcqT4JM39BDq_PF~8n69tgZL4`sFCCpMITU-E@rD*`i<|m*AMCDGrW!u zkw{hizweE23w1X3cFe2sDIz@+C(wSCY+*3cd;q5y%w{ta6y;_!8I4?H)#~0D)K?lh zq*{WaoxIXxe;jSfTh%Mtl@_!P4FgkrUuVzV6 z38>c>hf>qUHikxy%r`2*Sb{$#+XeW4Jcm4>T7@BJjPmLt?;Mu?hp0Y>130#yPy)u% zIxx4W4iD*U1Ig+S4`wmeJ6f7xBB~$ZC(8E!00}>lY*O9F6@YPjjju*t$`#;$gtK2QaWy1$S(RM8h$*0XUBP3nfX+1t1@Z%Rgt$onc_x{NZRWnI95kr zP|86b#B{_{i8zjuom!5e;*7eI8O4dY`A8iwmxp=8b(wWP2=f7-FNK~E>^#t)F+~1l zT}*5~UHe+mzZ)8xhB!z4pr0z9be}e%rl@#~ZBrB)XD5;+1~$8_WTRLxQZ*qVg#HJ{ zn0?*=oPETSk(WAC5|w5NR^$yQHu|T|qHeIaMe(u+c_5yVKa_dVIt<-wD1};7GerZ1 zA}6}vwfme#xa-C0ZV1kDN-WwB{{Rop;+Y_*rdcF$Qw)V=47;tANdWeN zr!|I^vfBC?XsaW0OEojHMOxtowN!DgITvu$@8?TwWJ0nOJV)VLekJhgp=;xwYQ7(= zi#LT#T9P%fil_w}*^tKeJw6>yCwPw$O7Js|;7)~x$XpI-5)_pU!~-N4P>x22u(NHu zzjVD!W)b2J;Dh534xrC5R^8pqE*vs)5i;5=ghOA(m@0*@gSs*r+@i;vDCNxl}McJzh~*_IO%B7sEMk zG_kR|uU|5?lbNH;l_KgTwl zO~X&zVQ!YLn996>_mh=C5yU&FpN_*GruM-eVnQq$GaRxdt=c85zm zTU}fDORc~qe5@?O*DAh>uga&Vl8(D6nxc}jF?i;RLXt%NE(q;zpzKFn8{WKe{JSCh4ntQ7pK|&x_egZ=t)?=oPYE1CivF z^e02KjUv-!+Tly=gsGG2QhYj&qkdzZcs^+%qM#9%K{Bx+n`85Kz8k}t3inuAQ?qV0 z2I;vTo$)W?jvB7W^GeKzh%)IYa~d{iB!)$0vxc$Vh9D8d`9({sQ!18XQMA~pzid9r zLh~g;6gt(6EGSA$ijYdn91+v$u?yw4=H&0azSv~7QN2S_O&p7$Y}&7J+--$cN0nn| znTxLdLAdL=$2AnjDPpQZC5(<|sJ;IHwh)j8hL@aFr!1jJqDd95FLZWoz}ok|Cj2*$ zX8cIeB`r59pHm5{6Kz(u%1*?aeFg;Z9}kSuo;=?;QZnUW76Z38ZmnLcwG!z1kDiVaQi$!uT)SX>e zn{IH=_D90PjZZQw>HwERa6!J_xU|kw4JnS9>a-M&#?5uOy@=`9;4#PrbxhQWD1{{b z?3E6eSYyAMMzzg=-rf3l7=m?`6XQcHnqP-%GhDBRDl(~^wP$ZnB!DOy;f0xyhU^+m z{rO|A*ddkE=2JXi%2YQ{qjeoR{{Vb8qN$^4rk0J_X+aUe@dRpEk#xjdb|fe^2EdzQ z!QiR|vWa0vT|B^3aJ|ph9ZC(#(%3o;2b9mul6`0gRhY#d;hd(UCx@Ramxo9o8+~;j z*RB~>2&*d`#+r!?<(yk@VYm7imBx|HPb8s8jgFQM51e$rz5!+jE`$>q5f->bAdnBB z1J`^^KEQ3Hq#Xq`y#!GBr+Qj~<-)}kuHXwY+V}MAap>*_%jztt# zGBdd>$4r1+l26|joXlg1opvBxdz?I{i<1gP{E7wrai_e)PseDGsM)H=F(se-4~LhCKVjrOc4FvXz;wbjn)Ry`Ew^U-LK)-+9gJm) z>MImuRkc}dd`NhXf;xH$L{szSxzVX@=N;~M!_ET8W_+$PDp1rewP^zzu@b%S{wx0g zTo~e9o#a50h#gdoZb3KPkQ8?}1NFo+a;D^p-`Z8Zh0kKl1cR^uRa=;4*u_$b>^qaw6pxP_4L)(hSu#aU93Kf+ByBVArKEwpwjE0aKDM{MJwGKJI%-QI&B`Iv zCnLHu(%|&65H3I1Yg|XnxQt1*LU*coR~klqlGX@3sk2<<#ae z8>&0AcQ?P+52`5zGz}_5146e3`(osP5+GOR{q8EOr)6eI_*7M^9zr6UP`#8JR>$oJ4KpOMjtV+t-I-HzR z$4=DXfdeZowKc7A>FbYQcqsn>?N<&^aeYh>Jmm~k%jFv9i^|RkKPwdt?W-Of$@q+% z%q>f_^z*T0c5>=0TGv}xdwntM?*M{lTsxTM8B}sKRQ2%?5%jbxJS$uFG@b!$t*1b)`Rs1tcmr>T&#`PJZI?oj<6^fn_ zxs9ceg6`J}`V;^cNG)<~!-q0Vhcx0CIDW1Y$^**rv)oG>A#v_5Y;FzhgsHNK^6atd zWsuZFB=fY_G9lBp{p>CF`eE;ewAA^(8Bo=wOoiiGr@Ig}kflH#paOQpI`xUI)!>%W z>&a2)uSk+UA0DLD&6Ucu)UiUe!FgXID%nv7pc`PE@Ijiw%PHod1Tr5kr6Sh+js@3M z#h1eB2m(9mQa2Yr*BZ;~jYwLQ8Y5-s#`m{goiLRiRZnrXEOwwpP>Dg`p?YlA2SS5EzITy5-q zG3XvL$X_?&+?zL~s5Fo=tQAb8Ye5+@M(R2i`IqiJF0OFaVBP*lSJGHa=&nGcp# zJ0L{@>O*Wny@_7f!>?KvxRu3=niQy%_@!Op{{UH!81OZMV|GHq^~OMmIu8S=_yZo5 zA@Ii_%X3c-s3e*4fUP4uY>Z}wg3@k<>d`G~Urw3*&PaKA`E~;bj^ESiR zOoy}ngbR+~TX}sC>`E#;wg}Z$mYOPXsx73d1t5LF!^ra0%pjVMzLjOBm}!wDH`c!1 zhW!svaY?ejTQ8`QAw-i=XcOJ%L%bl!(vyapL@b{bT`Ztp;Mgi&{+?5V9C5&JS4k#e zkw>Po`s9s&`kv$bR{I=DI6o(gC&}T;>E(G+of}KZZAR={dw1XT!3kbcNQs5d@p^BI zFi>Gd^nVx9r!DQ0T7`{Gd3!mCNE(*DGpNiWWhreSkO&~}_Un&QO_o#U6tmD(LmZUy zDUHyLivIwgrXpNr;axWsifqeRr>}-+wFiNDx%D4C}pSxDl+PUG;%L%9oOhaBs8X+G*QSof*Dd_ ztGNc?Bmn;ag;Wdu z?T2|)Z0_`C$rLnu=mR9nO#c05;pN+tV5I9A9^X zU7R}@PI%d10HQjS?0OO-z#1s998PxWyqR**OwonYpq&gl+qdX&Pc5#}7M^oqZz(;! zzMsx3gfcIk?v4;%{=F5ya+RAdfB9z+-*jk?p>61L$&4Ix`f zi&Z)@0ci^L0p%x z>_J!7Cn?NG@+M=U5v41$4kQD;FT@oT^JVbWsq(DKjee>a5x?Hwo+7iTs3CM*TTh$6 zwhB~2%(5vi7E1;M`AwKGzuaI|M==W!0AfynewYJ@@h{uANxCS?qL36hNGDO?L{LgW zNy>JkH2h5_Uy@W)x|gn_hVZqRdW4d4(zub!Hq6dW?0%-_ z?}@~sX=%Z_7Ya@z8PCAbL*Z&^PHB zblR5i^NQ)KGkzq?qM9iu5=3d^z1`JJt07U$BA6X@X4b%3sU!um{+%gdqt zel-E6imQj~GTNt#Pl?OtiNvZ&BTaz>ZLwRc3-n`&SB!O8HxqbGU0F@8N_lE1KRuZlfTHp1a#XwozOEeF)%nZlU)!q~dPpFg>M3IoBwJBQT3K8KYTeQX|e zx10P(KM-_3sH&%iX=}24##yo&n9@1dmn0HElSMVGMznB406-v-aCcG;EAMiKxH?Q=-ybF%Z>CHyE*KGkT1_CrqAtp*l?x zE26F0AtXs0C9Xp#1UMGDT!2N`Vy;%qja^1zUsXJUSp&%=k~2zuOI(u2-vqyEy<~x* zpf^cKVu#FZ_^)I{m%cOMNXgb)N&!#AFhsb!XlSy_~q z4lDuozxKsh#5J|mY}AyHt2%%sZ~;~H8||z9*q23BJ!pDFoIfN0^S;3^e#fcy?QBLS zqiEUUq}3n<>SDVKox%4fz6Y{OT3IUGQ*N(5)H6P>pN+CAjEBT5uB$$fBR*N0wN0z? z+K{DDgv<{*6J-w*-s5mpfFc(c;rA=7d6ut@8irXIH9A%0a!QQ0>RJ|JhWmV^dyH6g zm2)IALnuguY8BU~eZII49%GojdTO**k+dr}U^WEa*W7LWacpZG#54gy5;^OqEqBxD zNp00IGN9F1dY`%eYhpk8lC(Fu?d_#C6myQ57W` zK%cvi3e^n6j>6YF-=;kUlGSE8L)J=^w9dJ%T|Fzt<5_A+*GsUm1r65fdf09Xu?33o z{8?H zXjx-;CQQC?l1FycxE9%h8{2!IOa*McY>!}A9Rd1j#joKee^(%=$kirlXpyH`K{{Y! zKq-EfZOy$w_rz0}i^Ndq*UU;N6OXcH7?sBZ7_80}L#{-BiS;!vYlo(xaIsDx?Kqz>i`v9ImR7FHTj0ESGdMG~0|Q^QgCgnPeG{h_zX#E^Fmkdq^CQDS2O( zpr2hK&)Xi5U5)S8rXijh(2@QdUhCn#A1v z;;DeSsE_{un8m#BPAnOUR~dwUGLrWAsBixOIKz4K%$AmMOH-TCMKcXTH>gEoJ#05f*qm^XH?F0% zsK5riY54PoqKEMd_*&x1BcZbHJf@+jb@{n9b(E2n{{WQfHyHNd{`l~}{-9M^WlxH~ zhuLD8B%l4X%O<0pDilJdJl=t1X*b*fGF#J8KDhSXR&$i);QV%HNl#|6=FW*@ew&;M z#D%y|Uz88dY3C54lq3yf^QYL%HKNUO+{p~Neql{ifY`J%D}a8-3dvCfAxyHOYC2a_ z0dwduT=S+1R1Q)#rE#NuVNCukah6q2n6ze#KdXtNKo`#P z^8nv()ySli)a z&Qd8=H@h`7+Clq<`{G5PaaA^LRV96V(o|0`n#SAh=(YfF&{$g#zZKxb6-1Bd6a6*^nPe9cw)Hrqj=GRq$Siv)AH2o>f&#Bob7HSit~*Lhg3| z09L_V+KOo?L4;|zv)o?y7>hu)wDX45s1gWuI|1l%BB;zNDr1c!VhdX9*eLhKy|rj& zzdCLjQWk=PAXPP;WO9Er)g(@pfAjPQ~U&WK+JKyB_0y z*tt9?%yOz4h_hH}qIb%kIm(6VgXdcx;wo5u@Li<1*>9~IiMTM^wy{RSvoxft2E>94 zA3Xu^ub@z8m!qU;b2%BNjijk*qahL8?;0sLU5bL-;zO1Nc>09jn6 ztQtO9)nIqI)H;1}T0ItBM_D8l^F;7M@l1vw3e+sItg%aQZUd{S1GUa9{{Rc}Don$Q z6ETWG5uu=+qf3_6dnN6D+KK7uh{6tNHT8|%#jVwdy0=ue;&UX%;X+5m5#?6|*-K_M zX*DeT#e1Cu*ng|~;Yysoe4d!9YIb38N6H(eu(AreM~I>oBXHVw2h(k^^ERu1QZ#{z z$jxQ#x$kTtLt3P*=K)GaqJznpQBuJiHPUXtEres(&%+D=zkjVh~!sZ-2tCSt$*vlHLA#%o~UPBXpUkYO zwV^xI=9v zdJ2?brofczPcrBucLBw~7qRJl6=-8&VvG4;Ofv{bVn7$)+XbSKNP)m3>M^x&d9)Uu z?vOK$PmMDEY|~nfArWGvoksiNOb6o5Cd;@(BdE`FHf~flRgE`!WMgDS9mymQ*Pz8P z{wVm7m{mS$6tGfIF(Nu-rvxbNcQ##LZNF?mxEsVz+tWdo=0qh_=t>d-mS8SM+Ymq` z5o5K8=uGy&jm8eL#2Uq|i?)i6TJk<3eRuVsF6|w$bh7w@KJ=hc)>Tg)hmBniMhZb6 zm-NC4HtEw6Cyg9=kQ@)F%O+`yz*9jNvy;~u<~zbzin81X3*>3GpniU&np;nxX%Rz~ z;P2A-P#x~Q@urQzD$8OC2iW7dqtb3ohps8s%sQ7lD324$h*1$WwnD=H0M{I{3ttNB zC(1e;B;*Z-BraQIAgF6dNi@!`2Ax0~TLG(JRDCSnZ(-?!6%&Lc88q6*rTgG!VJej+ z4yJ2Z^tSk`ILZ_Xx!0TtAd|fZtCkTPAw~e)UiLVQ=W8j2+B0wgxn}mk+V_yFC>J~G zBv{}R%vKpgL|g!F2K(Eo#d`fY&O=rE*8 zrZdnmtap|uS6Ow~-u*xCivZ2>378|X4r^*+QpZuSnS$^10Aeh1hen&7Dma)}gg4)} zTu3^Q2~9S+CPh{`hF2t&%Pk5r!T|&s11l}NpIhS{Gbv9diGdKR^Lv~1vwGrPE=5yK zQym0U?Hd4Ov9+u{@!WhlQI}6Gag|{WyD44U{QkHdY2`>jRMcjdG|X!u5eUSr=s-cT zsU7h7;F2t**URw|Dv(qgmcL9);>gD)I*K@MuYDs=%08G?vUvGr#7Z7C)XG#`+r97` zt%0=~lql6Dn&g?JwIX_gB9YFbx=n)r0G+qC5`!zK6LP57kd3BEi3dwH?O;y*{+PA% zT)EykC59r}loYz}wXQFLSw2{mbE-^%WU9<5hOq@sl@$bUrB6jCwf6dATEhUv@q0C0 z*|1iG9Y~3t2>?u!1Z)q+z1R>g021`f2OFiA1BQtOdY z&Zt(DvjP`;5>KxE?SOgiQ3X6rRSOl69j-c`?~4~U%758>!lxv!hD5ETlanYE z&!`}S+!2V~PEl7<8f6jAhkG!wU$OrHSH)x(ZQUqxK}muR{vguaY(xP-s3WVM5RCfQ zMyAv{Ty+>d!Q4YH3+BAh{{ZB*j;T_K(?$HQ2lFW;`-_YUtEa8WAFaqonlhg1Qxx8@a~PP0~N7#Cc^&!*A$*l z#ynNS@QQis(z=;ZZ5?4Giwgj*Jiv7I>5Er|xXy=(=!In?6?lTA@E@8cBiFi{8z0Wc z1X;M)AW0EQPj`JPQYMWG2~MM`#{2&Op^j=~F5)tvYG4>!axbtL7-Nr~)lV&ny@jv$ z$8@hGu(^g+<^WwJ)p9N06PE8T<-u+SsxUsEI#?=NvJQ1+aD_Od;pzpj9LUVZ-mb;J zz6-eAkT*C3!Sd9}ml{c%SHfwIF>Ul|+ULEjcl_{lu~A}dMn1Q&VHUQnFy6>WNb&+d zDwcJw#bq5U0Mp*s!t3k4I3%6zjT5D8cJ{%MNs7l_>U!dp@dquAULnk9fw!l=D_rippsQ5Nsh4Y`ya{%w5)eNz>l^o_Yi~?8s7M7&|EDoCt2tBy?O8PG5cqU zSBI+d-W{5_Qr4v0+6V=rWD^iruF5VVB#~ki^dMlIyhB4%Qm)w*2bx}L7Ktq&3=eU+ zJN>XKwzU;U??kdp<>YtVfqlZaq1$1NWw14FTGVjI9I`Ch)Rg%^9WF<|Oje$_H#u7z zr`BS%yc>lW!S1fF%8I*kjW!9$oVt1LW~bRbW>K5VRXmvm6j8tcENQ~t{YPuq3_g%55h(8=ISG4zJgB74`Z;u-wyLGBB-Z=T(YJ%42lx)FjMAH*4^)Y`rua$WaBfd zEmIVdMn9C?>g&^~=zmNh?)s9-1fF#_Yi5gl@42F5K{HaAl7}mxT8y@xpsiSgb19~p zHjYHxwb6mN7vIyS8?TRkH)J7BQ{vwlQmVbynmqokqek>0-1X~YgS9ciL&Mz0qn4qq ztVjo#?f_Bu_4GJ`WqBXR)iz^N@kvFg#D+k@*qhi8K2v_@U~o&VINFkylt+<@i*>6z zmK;^nNn9V|0bdE2sohOhc}<+t@dk66)MmN#@jgEQj~6*8U-;iFEug?)Nb)4f9;Qc6wBwXbCWT!DX=1%#<82~MP#@ss-1 zFR*3Ci;s{3Q{*=K4ThUnrzXuMsA?K&XzEfIit#!^=a>;mYZ0)pxi>ceZ((d2;@{ah zkA)mbS0tmGlpLwz0re3im9fTp3j?IcE$B`?LBZS;lJNHc(RgtbvsUEMP(2LGRM+^W zl(CesQY>7v8w*Fu{{L-Km$DI2txJE+_q-SBpumT1+ckdo%gJwCXcLZm>i&MS*W zG`Ufz=4q2Gnyc1PW+piUZ*N2Gh!uO*($yF;&|#61<=QYyk+)vv*2S@!MNG=^iz>;v z7QM~_R^<^@QkYRd5y$0q8>zRiY&N7CpTlt;$bRrh@%z@QMpsB)e9~=GMYe`*AzO2H zu-fcEtRhVXR%M!dyfzm>%Kx=e9gdcxwS-e9-mTGEw;WA4kc6B3HmfJD)BNeX| z<@MCGt5=iMjWR&-SX`U!Yx)zu8zo2;qu}o~aIWxzt*2q7L^CfGs^}};iE1XQffAyT zwIb`~%@e~i8{J6d%OD$E5)V)@Rxq(3_Qk(J;hb5BpEZ@#wt&*YH*iIdUe~v52;vV5 z>*}eJr-rH8vaSkBn!4I}jmUzY6Fjpm`sj&WoD0|?ZpREbm8^D(ttSe^Y#LCrx8L)L zHC!XQ5K)LA+M>cC)SIyCQ#8I6@4L2XH@dBXXtlKbAB|H~XrrYj8?gw#; zFNb({G@_%IE=;))r~pXfz_)$D*!_L5<%-H&%qe*F!z#8cl?glQHm^kRM;f;i@K*{? zmsd2kxog$%^?XHHSz~~#)N%rPhJvBu1E}~@+Sv8S;rhIO*33Dq>F~4)jPKN!a4b(_ z1J@&3O@}M1Zl1aQa9AcOa~d`3>>z-wQZGn}jmA%b|{G`I2*I zsE}RiWFB2c{{SceY@?w1lZGyvQ%{n1I@aav{{V<>@xBj5vQ;W!MYGlc3QtV}R1!SA zD&CVar(}$Yiyexd=juC*1I;Rux*&#N9d#8Q0I~0axn(6Y1r9YbEs@C=)AauMbxW3I z&0dpMQmKVn?!h&c>PFWW7qKhe*1*KgDQ-7!Fb1sUDb$^~7d3g$!E@e$9hVYH4Qm#Lze{<$;8i}gFYw>+qy(w8 z@9+6x+DWn~lVAzAudY68v`AylvZe=R=SLD9M62(p19e**5Q>t2-H6eGAL1RbJ1CY} z9ZQR88{2SkF{e}%n-4qwR>bNOms=~EvD!43TPJE|63H1+BQBnR91?^q;46!k{!!Bz zPfY`>A}!BTZpQ_wC?$|;L;wM8M;x@Ue(}K52`VR$)}?J&EsV-KQ&?#h5&+x*ex32! zKIZ4ATsoEqgy?>!p~H{aWlH&$MYz-s+hS>+8@_qMhEb{yd%||pbLljAaR?ALuJYO- zh_y5MrE#cwAnXUfsl)!5(_9ZIzqUHY&xhEvhcKIV1Of9sPf}F-2Qx+IH+6q= z?^dv607Svlr0E|B@trMLPB_iAptg8HNhBS_9d+k3@f{;rw+m#n=Re9;CLb3RrfoJQ zmNfa;p2Fu(xnMDHj)MX+9v90vf1NELmTIb7K*DSWakWRoTxw5DVE^IeAF^R4l z!PkS@lsaWI zhyB)xw&VyKoEAdO`H2)Gv{9+=duQ_K#)VKtFk zVbpco8Ku?WTDv6E!e4|mg#Dg`EJS_-9Tdjvo zMnnGg#Q<)W9gnUcu22xD9OyfxWj=JzHkv+L1#7*mN2j(UvNYOcCCc0qyX}IRwarG} zSKM6nKDY}ka~Rm_y9GLW;J}CU=5BLtFY0b^ z+Jcqjsg@YiX#lwgRgMW%E>w+KM<|RGuBii43#sP0w%=Rf9KKTn^61 zks9G+K3fC5k8ktC`czXaGEE~y5lOj2xW3o7d@!*zTP>k#p)}7GH67(LEc+&r>EHT( zxOJ9NQ`Jspm87$!m4N`M^gg)E_Lh~Znc;BiPU6Hd{I++17`dl9|0;rE4{9hqblS@w08!hO>tgh{0B6MJ&VsHze(B zZ`>h(+;HWJtnL<-4B3GaHv&PQ5%Z=Ntj1_$TrrYC#FZRb4GJb{RZ5g|PBt$RwxAEa z?Y~<9I}8=Yb((m+5>DxmVA=eLbRy&;kOL&J;jOiSQ{M)~u;D4dRal zYq-0_3jQgs&Le`2{uybaRWA086dT^ad9`i*F>J*WLmI;xg+u{WM?eQbj_}T>H_GU$ zVxz0fX<(jlc;c32M{(0-Cg<&md@}&E!!94Wwn^JLx0n*+f8!BK|9X!cdr4`yh)qVrA)HZu>wemjgF$)SxuN~?k)|mrd7b1mSqIl_E$jl z5Ymv2W89nD%B$6g*qaTnhuJ+m)h|(5S4YX_yE_D5Hm4+;dvAl>IA+OndVI=(S~U`d znK_mcsM&!XHy5!z4YBfyRSL_lQ%&|+wKWo{f~Fdi7Hb62%&5P*nlg@{?xcfbYhmV1 zoJYdBtu}K@A2fo=JR$5PjQq>_ZaoMX^duDgKbug&n{p$lMhqf(qgH6nt1|8lw;jH? zsr*RF=pT#Q;lwtQ7(~j8Ye}bm*1fd;cqZn}R%s4}0yNsV<0?q0Z8s6++4U;b~RwC_b<$Zbvb{)pvxj9p{PXx z%&gZcP5jnUH@4OT5_sw6f>~ljFJp1#!$^JhUro{^9z;y~bo8JIS{%(p&3#-l2~#ww zjg;9Y9)877nsOK=Nse@r7zu*owS z7;HuDzTViE97~O~;K_30b^id=SL;e$!}F?-#*I{Q?-r@F8N_xZ?$nVIHs}qo)%-`| z=^djPoItICB8okawi#5!k~;_(-qs$z*lAX=qy!{rG>e-Ho7&dLt~kGm5K5DLrJZR@u*cie-rr1H02!5otTZ8=p!wEu>|@N zKMBJ~@TR34%GSJ>=u~JU&~J-p#(ojv{I5OYPA{v;Gg_RkN!oPGW2JV0M8QA~;1IfQ z7VTlM81qLE)CQ>#O9Z!7<}odDE=_^#I^X-_Z{e(05WTfRuHG)@0Fqz>JH!FD-`=da zSF~;?!xS90yCCnX8$VQ<2bTD|l}6A-#=I?^(!j5xPucUuJE1<2$)e|P=KJE;{{YN zk2HLz>5oBv7eDm({6KyoI3`XvhdayoMXrbfreBU-IEug4A$eBOW9`9^Z_qv%Dd zH0e8nO^b5bm!RKqYwQjk<-R$LtKp=}xMr?nBm^J#xYVu9#`d^9dtxW!x8cXd@56T< zo)P29Nabp$b)wASR%&{nwmOu!1bJ+CA3|(xoE5;cac>f3c{CHoD)Twwp^ipk5KPTr z-Sz`>x38uU`*?k_J?SJyq?tUo)07ZroQ-MQ-)@{_#kg$TpnyO0(aZida&X6rX~vcC z@Wk9B#1iI`YK|D_f>jn8b!s74SSY>Cwj1Kb%Q!QNX%e?9so=D@B-Q8_)JQ1ZPfK(g-vzu6$aqu1&Lg1XzAfOsGR*jvBUs5(MD){9(ktpk zkzx!ac?vTFsfqJ!y$&sm!&~c!3&g}+o|m>8O_wW}nxa9=Pzl=%*?UpNEuBNW&rQtkOK&h$gS4N-8MP)>+FjMo^3aznFCv8(*d?>0p6m zl6Zp@zNBC}{#c)QJHy`_;uc8DR^Y`|6-u_FvxySl)c#nw+52I|Z>}4+eS{q34FZAG z`H}LfeV??9XC1ixpK!}rU6c}#ph8vMBudq=B@sewEu<0|OU-AuF@ z9YstxUh5=k(Yo5g>cn;57EK?8UOCgyit5h}bIi6e`^jX@C}*Zs^k0#P^xto$KB|^$ z-DQvh*RgVKg;9BfQcB>C!HzV>c!}{NAo%|PYL~wDZ-!m>ij)ted?0;mSS;5)-PR7I>o~bSFK~G=nkFc@p zi*qBJo$kjA2V>G#-~49=qlgxTx0E$h8?oOg9bCYjp~w+;_GjxwQskm)HCbYm}NwVH!xwQ40kKY#YtG-rl4fec_r} zK=RZ{aej_)n!Qu0)ib&kA(XYj`s2rl0!(&teCl1k0%@__dIV|R{`K&}Djcewp0%>< z+6Iz%$k4MX)9u#}I6sG%FPdqNVKg5TN10GfQ41kuinfNLj$Hwbt|O^(En)ore+zh0j7+30MIK2@6wx2% zQX{qR>MVK@hsO{hK!VTy==`asxFYJ=Va9IY$TCqof6H319=FrGQth)s)6HU#pe0#4dt)Z4U za~K=_*0mO@1|rv20hjM%ijRdn49zoB1y*I5%})ZIOwiTyWt3bUBd81LSnYn8x#Hof zJgXq1$zXRdQNpo8SR+aTt%cuB$pgMB*Iv}Hi>8B(H0dMyQUrK+=|0c#xAjQ62w1*Mo&}CWF@aZW}I|_(`?PYuUe#{>NB+J%1 zl`+4N{{RiTV(YKr+@mvyM^{A~6;i1syy_35f1!vB{5>=o^6>m?d8!n;IbSa>=I`_Z z+jY4Ep$8Q1C*enJ?o0OR1r94fHw8y;Q?*6h*aG2Nb|!^o&`RbQAqC`_)eIXyX{wT#Pr~%TO*3To0PISGo|YyMh$n{{Vb$ zg|t*@UzR~@dJ)s~z9dt`Y`u7f84{9UlcAHe4>+0lQad6NNupTdH)kz$D`H0d@!m5Q zLJ3eH>Gh_oL<5R*iRkILM>@zBVf=i3f2pwxi&FQZ$+s!dX1LJHoj>K|JDV zGRg{iH;{C8jx|EU{-j`}ktC>6MY^8Y+orWEsh0iJ*x+?^4uL_MM^-%o z$Nkm2l1dB_%k-k;jVeD`Qu0JlShdL}-ED!AQnr&bAoBu7*ga7}8x=vYzUKX~Gcu5( zn4=y=8{BlnWA=q0mw8avDUR~0GnhlqArKpZy8*rM%l2fkq>R@MVossdTM{VgB&k5x z3Pt^f8dcIs1a9M2q7KdU#50y4j?jv)y>FQIgjE-tq8j|dwWLLm)zlHAvvZ#Q-LU5_ z%*7;88mN_{zKu=2uk`7*1aT!xrxR4eLm5~FT&0Gu;x2A~JKTBNC~YGjZ)$Os&>usv{AB&rLprgF-pY6{l|-Fo5^mUEI}cUYa5 zO9a@HZ(i7yNg|3N@XKa|092drVYu}eWTI&H9nwvAnb$(~4I{;;NCikgOAn{{;R$$! zYgX!FDHyXW9=}Wvo^+L(7^%=M`n5I76aBE27K(uM+_VBF3<`9;w-{k*)+z6KRKPTI zn;l6K>MEiz1>0@S`uD`sfjm-v2V;?Dbn{kaMndXg8l|N!ZrT_4(@`X-^8!wgb{L1O zF+&G3R0@ryV?xAf{{UO!W8s$o(D7b-K4X}|ub1V(B#|HftjwW;G4u*SKl3Q{#MceC zh$9kj_F}TSbnuPNVa+fk`Dv_D*6CK2dSv;=U7uyp=GjeJRMJ!eW0gSxtVlZ$2q1z8 zBWqwci1SGY2iKV0lu62lMjH_vlA<~P0OHMw98pIEYYZr;h@n+fSSTF;1E9iH^fbAZ z9Ql20D=j@lZ4|M$MphOhA46hRZ(rfA+64f$p-GXT1f+@FkSD~NZD}e&NZzR_>0pan zMk7L-713c~*bmDbWb)5RoMo~^g=K2^1bR;1X8@0(Qo|C8uMhLgy;_QzKiX8+v{J0d zlUug6dkcZJ)bG~A1$axt`RH>9^PKS0iD~X>X<;RnHX_`|Vg{$NAOI}4Jx=51>kb0O z-^AKzu%_~;5~KK10g^(tQR$TL8)`tI3(N=+Q?8>PZt>&rubJ`1Rc{$^Zxl~cotJu{ zm1l)2XzClZNh2wEQ~*M$EQ@`DT(&(U(_xL{>pV9Txx$|p7N!q~kVir(+nZLd(b>8r zSC&5q-YxMibDrnE5^;qUWgUJ)37KhXnVL#6j;SOBwa5Uv5D6m3%1V)MQ&?XR%)7%J zr!MhlIq_mAQCpkj^m$9dv4B5wB#hHDe-pa2DeSNy!7e(_^PU*UC(d$gi8Dv1^GzF6 z82NGAc{Wxo7pVfq+xEhEn-;PzIf%B5h{_b80Wf2|00Kyv<>N@QWy^NEHw?isrlCDLmUQDrt4WOtU3I71jC%j$8 z*~c2?LX$D2b0avGHI7zT;w!l;8vMWxtmUn7Z8(TQkU>!!&7_G!fq(I1 zGL0ouO6bfIOUcx4(+g!84-)6=Fvzl_RFGL@m84jdHG$F#b!!{j++NohVN+6Rroo!IqfkZWRorH(HC&-hi2F~pr};Yveord5=QB$xma z2y20p*Z%iu1N>mS#C^WR%&R8`4xqyG1A-UclTE2>Kjc{1wC8F~q(d<&^a~ zRArisQ`AUM36gZW%60VzSZ{8dTN4`GuPCXRD>DiTNo0w1B(p@UR1?q>(|jo%1wAb^ zl=*Z~QU}z)#S(xV{{R)b6MgZr@RzeT_*VMi;^29w5>gVRjL|cxnAcEr0O))uhAhJ? zDwzg?Wc(45Wc(#33Qa{7eJu3P1zO1p+O1tkb!9tPf<~U3@;JZgz8gw=}90V7v<)u*}yfeLFIn z5Kh*_^GIQ00S9iKaXW8eYmKMf(1qJB*klOqz>o?|jKM+#h*wZ`nkw@SK?pMTZG1o?F(3r|#hl=H@QnIvY=qRV~5Ft*0$AAC3)g>udZ;Jk~2GH7{J85Ubj zmeVJ395E^_{p`E@;+OGP@Ll0Y8s_kEp9*9&Ts6fM)%4ZoqKynx)h`t3Dd$4IMkhhL z1-U1Clrtx3E zI_9N{nKPW8q8gmOY1~Gf!r%mFJ1UkcE^pNO;(+`uei5r=$Y}F!8_Ou6s*;dJUBxxR zMoC=TTvT!2Q%0w4Lr85Tmn7RCMKesREzam=%QI>iD=8INLg z8b+ZJKng4X9R>u&xKS9*)V|>i7%D<^%&oOQ%K&N2&{&oRj8WiTSq<|@(=p{Ic#cDT zHPXC?;tzscSK+=&GpdZECi;G-})@r!Us&qrD z_cq&3J%!`$X$233+3g#uyxEl$)Nr9aORbB26cXQ12Yh)NnPYX5NdQm{`U~R&_Kkqy zygi8}tUo}c$xM?6%^F+a$a6-1w*3QuF4cl)NN>@rH(dO z$YKa@F4(ZY5751TiS$qgD;*Uq_0kT2h_t95cbN~Rf%e2gN9PV?j0ghY;==qfs?W!n z^=y%a_*|Yik*#ZUYC&($l0Ph4I88miF3DdbKM6Ef4KkGDcF0D>N92-!D)iGwsNHS| z7ToQOgfch-*8Om*X=S>%UtDysfZ>U`y|MH5Y)19bV(gFiKk#f=wl*RQAUu z3F*@dX&Vv-Iz+bP^2fUj#w*#Pkyybyb?J@rMb4!R4Z#PY9mW^XJ7aoJTs$p+)YmiD zpXJJb*(}>J$YLjxMO5nm>O>7^j1%mP2ip&*;T0|(RSYeDg3I(6k@%04qGhg0OHGmIejj{lz1IS$cm;e+pv92ji*X! zSC7@Y9cbQPIgVm+Q4$13*?>VCa`_$`fF58%utZMSsMC0ZyM<~7^SrcsC6 zh*%o=)`v~;$%-bCWihFdRH$oi0U(ioLt*(01LHn4$@m{C8K!PzVI+bWA>KG=vkR z4ufDxB!B?G-UZ{a#r(-$C@HV2mjcLL*2i$iU`Yi?u6ZafJhTGqx3vt2QD`fQP zCt*B+GImeAIoRW^PIv8DmrD=EYmnu zQT6pb02`CA#dv=aULA_V2|3@xDY32nlQ$#}TU%Yd^kTK~hl(n=tB&&wp(S&d@Vu!_ z3`_F0Q$!wFNbbNoqMh{F?eiQ(^4KA1BrF)SsR2p3Kjn%}A;izOaHg$5%99dA$r>JG zN&RP)X;@DNTCUAE7v))$0Rbck2T`~(V_t)3uUh2!&Q-)2Y#F{wnA6u$RIa$EfP5wYwk%jqBl}9* zwjvY^5#!#2dkS-ua!V7&GZ9&Iwsw*3a=N@OR|fg9pW!L<@gl^7%}MLdQy)zl`$54G*|0~KBb6!NjIjxkqb$l8TIy_n zJPoO#XhyUpkZtKaB8HCR4hPJv=&dCV^)zZE3uUELQuRB|NDNV_R+Sg{(pI zU`}t&k+xH&+nXDGF`1VO2`(gRbfZbiCX|-CJtN3ZP<^o0u8&=vLEIbPxx;E{Ri^SC zY)B*#-v$+$V4x+fy|Lyg|B12Bp= z2UL1@3^%v=;+|6^lU3Hv>Qx~u&oqf8Dg|jQS*!)W?}I!$u34q0t*np8NZ9N_?0)!) zL7s>bNdEwK&Ra>;H#_aNH0eau-fN^Ef!&E9`enT??!&QMjKktGxjuKGS7KE_@kS^?f@vOjQ(MW|EfRL*z zG1z-s)2ugfK=p{tx!Yo!3o z6oC~FkddtjMCfh}_8{#6Xr2(YJmg?a_q~9>Vc!KJS9#)+7j!q&_ffd)KTI2kU)*7r z3Awf~vFjk|2gB@Bs9CF~FBWpT=$rOdNt(?qwpxgmop0`3-|`0qxFbBxxPqF#yEOP{ z!c~}Ih6Q3GRYWWco!shX-pV%V-w<4pGRYD$I}wXn~ExS~w% zji|F;Tsh4q)ldQj)SoPg{K`eQ9SC9D0GwLS-jiq?1!@F=JtI#(gPb0Qy~=3iMrW5% z)YDN_R>KVSjLAvT!jaz1A7kGaLTTwSwjLWK^=XuT5%l}KZx8>9Su6uRb}~X z62ux&c-~fY=D4=)qR61B9%ClsPV+2>E2!bDx=MQd>RQ+$CF6O67KSjpsb*$o0>q6( zk<$Gz6_zgT<;$oIe&HqqnS>YvG=s<)5+}%SU4uZlBY`rUq-J$e&~H&!Jv=EVNU4#^ zC|=`Li(kFRY(?YX49zKX2&n1blCsK+c!`olM_>)f7rKB&uY2N9o+Se(#7UE~<@$&3 zIk%J{{xX)etZqf`Z_5%q`h4g1G_r8y5lvkpg@>5oRWJN|^|0Iy=EH8dp|ywbpA*>> zVah5N;Zhq(3purr3T0A3%MuCDQO-4SWJhY4pT0(_&KIj%h)z#YX%Y%?B|Sx~+7yAM zzcFLi*A26BP`@%iEN5Z|To>R@AI&7Jsidezq>3d#|wkFw^17wwX ze6;k?a%Esj$Yf^ocGYrkjNcF7Y+H!1^;}zkoU%L83W)v@q1$Oxbn6MaC@Bf&RV6hb zkyck=s%}b-fE;dRqNQz1pf!h1nC7h~hN7a0<1rd`F|sk;SP~CTxY^3wgbGRiA`5r_ z04!y0EVnI$_lAaf9jY@gB#lKOQ%KV&k~>ECwyT>TOk3U@(9%p_-;4Eku9~ zPbnu=&wCqz=moJ`Ei9i5S&%iaaoX6Hcx#x}#UH@IM^QZ#lCyJCGs}#f$<}NR{X*ZU zKDg4olwUE2@dP}HE}*0kB&5hQpwJkCd1*RRiDxRacvQPJ;cTNfhDfG>#AQZ}o*OF_ zVPX!%9=*m0($hsnO%)^x7C0kV&;S4mqQF>t3@eHg#;?RJPYmXBaCZef12Lzttgn_K zD$|{=h=kdn)V9L*u{XETc&+vm!!4^4xd8=GBo6Yr00!smnwG*ad%Sk!TG^&mxjcaC zPfxL}Ut}u_5D53i@#EZ^@f+g4Nn86vFwH4Aj)_|HQPk2!Pa`LB46udL_UWxydfTY= ze+}^tTg7=54-w?@G?ZC{2~i1U(!p3>%sVjXM`8{d;m$6@IGiioRC6bEs6mdqnI1>Z zq%rOmzv0}fx`LHx6p~1uhCm?sjd^To?9{aN5bF=(8=QIn z0L2f+*Mj~U=Jh-|4Mu0g`K=tL3YaoT7D(Wbe8}^=ELxYLRc0XUKsU4B##e}$?}wfW zRmsD364K@zL0tw#6rFRmP9?Dmm8|E-C2PfjC|h9GAeh9H58!|A1aGj4`4A& z;;t!H46wrkyhM_Dbgi4&zq6Y@BeYg6iz!`@QA$#i1w;WPo|?b{2{WjTew%nd_@(fd z#+vrYxNkD8%kz;Lm}ObLH^WrOfY`KqvP)}kp_qZW0~YsDwmvoqb1Z_smpaI5X3O&& zwxKF0>JX67N{w|O`}8BYBxCE3hdfC)7;qjz#PuqxK4q7|Q97^6vXvUZ_SLHdaK93q zY$=z7ED6(?`y!(Kr0^xT39YNFJ!G=vh*qU48twp)M%=_1nuhqb;pZCh?Oaji)p=Zb zZ7f5T1ky;dNiM6gVyZ>9OM8rY+l;sei8v;&m!IV|6p&8ZW0^>j37f5!McVyNmeO`M z820uBaXv>w#C$)PWSNa3RKZyT#L=)Dl02jn(1T(RVlRjuD)wz)*@D);7KRcg#L9q!8Q(l*X^7d zB`PD=PoXtqK@nJ#qmyr3Ie`FPW0R{5)6V`^+S^+WkP;5xY;X3dPLayB<<==rnNR)j zvbEE$_QN({jCR-@V#>@;n_C2;i zQPPrQl`CtEV%#3M}@(1oRjyNmi8b z^JF1aw)GEZQ%?#R+cDzYCpUgqI3Z2G}>c-oldln5(wv2FOJzy^-9>ih`AB56URxL#)aGp&-b6{5*SxU09kzxw59Y@<4&l>PnDRqtmDasdExgM=UhWC!d25rJW#?K zTE~b)M4NeRq^n-%e<|ChCzuz*nFS{fWpQP+q_9htax7hsQgBlmrwrO(*+lRA9&hkD5$mpxxwR}u8F^Lra0EFAi{{T&}4d)D(t`zGl z04T`>Y)i`s0hAf$PgD1x@Tx8;i93qis^#4$ zVbF3Pdz#E6Q&j~deA(m(y#@Q9L4~my&uTfDi$dqi5~xx27eCwb#2*;(5#gLL-L{aW zsDz{)q=IC|umC5=X&cb2HQKK!+MhQPQY%=)F&4el0)HTIN|vskvK5}5KJ^cD#B`?mJ)5THBmW zGAyj+IeJq&hmex;Fz8tNdku%%1T>DA-YEPrz}CDua=YTZ?y5w_P>@WROr844(?J@^ zw>PS|KyDxk)$zpA#S~?wBTq|u`(dVFB#uRuWRN3`3>Am~_CM5qSRTsCbpp~iV(eJ{ zxRJ$pg;oxmWVA}TYo@&8b3>u5!e+YEQB)o5EN*b#s40z!0`}OC>5MV}WQ?_>L2?gK z_Ba)oRuZg;FF)C&=Nj~))U=^9O`@j>D?Chf6ThYkWrfjBq7D9Sx*nJj3$rt- zf$TRI!ECK$zK4y2DBsZFJ0+zn1vD!~Ikck)PMcg@_reu05fiXG=^*}CP{vBw4!v>A zk}|}}*2-}@_10u%Skg42CM)NU5!GhA8^(FeITmYBw9QodP@PHUA-tg60;G{~W40CH zel*N8AyJi8Jd;mKR!Hhtl4Mq5G?V^${Bugw}rCFm;R_(u+`hVvPO%p`O(#9AAYulhZ-0gySU1~`XguROO zEHs~S?}VrcrxCujBdDVdGiaExkll2P0ByJEF~ww65>g=$gQma*?T7h0(kyFC@@shx zy;u1M{kf}=)+{dkr+yi?ZD`0JF0ccG%HC-i5CSjGMjh!g!r2=;wiHTYjSAl*DsPd42e_CStTkNlmd!IkjZ=h05!WDYCIm*t+UYK zJ*kkL@{s_Yyg~d%G!Q1F6bfJ+s*~dX01&EptHq8Y;X3@&h$!+-7M2d^*ec3JThTnpWo-#%$5anC6wb1l0yL(;5XpsT@cN2^xR~rY7vn z$8Nm4!`EV#+5A~jGRC1oGb&;=gQz5#0FIW6%j`MKH7znBc~T-Z3K1%pjdj!+G65YO z@eWhLIei62ZJp8O^if2m-mpfoNQCd@bpf>#&<)8pvA!wD^ZE(eIP)qra>x#u;a4kv zP;aE2t_OXwJMnjiY0?<@)fMGxBODblv$HQLm?)ApHwfy?2_OwhSR2?{nax_MW;IDp zS3xR*{{8XuN3%H&{H*gJK8+k)2?Qs`kaRrB8CK*{CFndU}IOE=oyG z2B;7XzyuW|Z;&nod}9It^Af`r89|e~dVPiI9HD%o0g-Yj_wHl0EE0Deex( z?dmXZ8m|oS{s)CHUCN#$uy98zp6N%riXJnmTIv zrwLI`hWw2P0;SIFvAz4>ZLNtZ>5T|#H?m9&6Vc2T#@x%30BBp>X4M6~>brFGic zxvX33xgh>nH-sx|AfTj{vZ1uc3YTMR?T9vbKLEpx#oE|OE)^|mSO;=R-|&IZM~t0o zgF`9jP~4A)X{$3TifZtZ!Iv;o7N0E7b^x&M0A8I5KG>WERRL500I&nLAkf#UyTqy-%Ovp^ifHq7nQJ4>r;)WOv&8ML zCmx}rWh4IB`X!3{#V-W-L&Z4asLe%17H3YJxN{0ZqEMTi4j2`5xxI+E-o#wq!^b=_ z_YzqpHplmfG666MJC8l0u6zZ=>~PKU)pn9wa6uz+20`&1N3SS88iz7|XD$>PO5I62 z40~tr3$t4qGSI6=`@neJ%JbR>5J+(qlPt#BveEJRa962IsiKiSG}L`Rqg?F<@NL=l;sHq zcOa5T(~yr{xy^e(;|xC>VHQ|-c_8L0AdNsE01O^_=qs!JahJgC{{SPW&+_RgCzeQ9 zi^VidRpNfk2q67Oakd)pu1`~yP?fHlc`6#n+{%`iS$4QAO|=`fyIc;~(U)~}o8;RD zWwHs+n_@W>#`{LP>(JI$QNJ9#FN4M34YNKE=SKx=a_aKhhxuWwg|)=Z{t`x(w)$DE zzCLc(<(ZER=k**t#aUdLHf=)sC!wn$WK;ef?C5%{t<{ByIQqgx@E?e{GlY1)1*PJ? z7s_*}Q{|5^qKctc=p9YI*nr}W5^sodx`pI%A|@me(Ehcha4)nsI7y}1KG$l(jKDBb zt%({CK>$cS0R(G5HM~CX_c!rRjA{5^h9DJMoHbOy2_d74R`NdWKDtl= zf>?Kj_*uRkZA7a(irn}PL-XsUNAbTJxy8>QAsw4d&Q#2jPUM{g^c<^{XEHjN$W^tP z}o2Sj#*JZA_sA+P4}=O`;W^I8u}XSu6;GM zv(mJJ>L!JwEIqXWe0st@72(+Bo`2Z%&m~N)G_5Lg3p*Q==Ds36D{ziZ{1=*6(!`W< zQo+p&7_?GpHwt4OU0=$;1_s;MkbZmOZ)A?VZn1vc1roL8j_hiv*d4j`s`dU2+XcLp zLbWyKX-q_cBO6$CIP`CX^s7(d#}2|!e)5Z+Z_`w=JcR!M_v6jg6cddyNajY2Gh5cf z9-d$N7hs@DfqY)l} zUmesokO)2fajs>}w4J?ivj~`iE-l*|sze~6s=o7+O=J)ADw4-zjZ#N6c2>39uG@9P z@dAyz^~VyU0vT`D^TTG$r9ssltD$qK=eGlT9f|(wU-x?v9-YI*A)kf zv<8!lA*}%D%qYVV>m+AGU)Ji$`C^sr38Lm0i=>@fSIJr*o?3&()0W@08bSK$`c!tF zvPzi)^Fce@18ZVWK(X@BJXa^7>@f+Tqnb*FQyH;f!reAIVpEr_qibnZHnsQ0F4fwm zs+PB_QneK=$?NkRpxZ90MT$n$@W{H5xAP8!6YYr=E_s_))KW&q7*UTXh z2N4Pa(&!)!H~W!^PF+(^4MY+#AwzCYVPZcm@piy5%hsG~+qY6$%$XCQ5+}%cK&y>_ zE+S`2mX4U-IC&B@*6ad-a!K0(PHy8d6&HVn)5{~U9d+B*{{W^pOj8}R!V77+R27gs zhw~o+%+bLmTT$FFt;~KEnM#3fgztT@^&MRUs{#nPBe=wKIH`tg$)HBN#-K3tz#LhM zxrO1~y}F@9fIVkw>HsDU7s{*7V@zi;=qn?}NBpMPdwd7TUAeU}B9k7l<$%~Z7G?M7 z58n@KD-2eG8yTb^E&46b%y9M*i>1sVtJ{@p5J}QVF{fE0NZz@WgO<9cu8N{rVFOFX z!~jps2HJ)lU}RZb(A2{>#H$F&)#R}tf;~luv4qPNiIEx(NFZmS-WjRC=vxcAc+;@Jfkhksq-AiG)%HD zh^wusl*?IHza>BC4Eo&2v_{{w2x&PSN@zD(@R}UK@m?+Q5}y)NfC$SK?e-8 zJnM%zT8cSyjN2~CDHhR2)m0JG#w<2aSb?w|1~wcghm&D(+O({|hypd%CvEoWPnAHD zbQKYy&hw~zQs7=kJMZddrD{|%BzrP8Dmn;wUMQ&pen*-Tj}$!%m${mAoadEQlqjnpjpB&|vYUYA6c)C|-7jOku?el3B&C(&y2_fa*DhOMsSSJI z>N{hcC&Jda)*u+WSxP`A28BdMfc!~~U}@Ai+HwgLCx(0=%lLM-n>GEtm`hnq+SQOG zXm7JFn-ipsh`;Iq#Qy-cGUFK6(rj#PwmyQwuxlI*lExn1M4dq_3L?lAEJ zz3b-7a%zJGJPu-MWBKG^*3H-h>FL)1a{e&Svbxosb9$N9{%Gfwq(VJB-`fFm%4ssp z-m-?JG_(~Cq!VI6C6xWa2MxL9n?V=9TkXC+9LM;#h^{f0Zr{0D97@apq5>esP$mEy zc=M7?c~>Y%jiS8;kY^C**<3lC3#3R0WG3Yt8xi^7fl$K4Tw)*LT{Q6UzdmIlYN{lf zEB8wU2k)exrudlS?QRpkxy5iRTg%}NIND0Ii6n0vr+D$N0u`vBqlT%{xhi5{u?8&B z+uNY+gFQAF-ZKYbxHX0k+Iy2>8O~!JcJ%TZQk1f->qOfd!)l6GsE`v?Dn_B!5vM1FhwMSJxLjTB!X^0-qr^Z?8n8g z4|1L%sNsyyiJ+#;DP%~eSz?u9iJeuHG}?J<<#ju@*B8X9T53wZTh9z~^3J%+0M;a0 zEoxTk)obx43{n-ozOk|kO&7E7Z!U>x!}A_78k6c(5CZu6jDKw zH3TR@jRem*I2Qao1i^C@jD{;^Izf@g{7k772+wDSt&Dk5-}yVidcr8 zUHe>FfbZt?#s2`>204gu_7U&cdO=WHLZnP2%=}CbTDEYu9cPN-0^0PDk_g~N!>f7>g(J*nQxLHiR8qI!t;zoY z?HJBDN7@!O#Q6Ib?gWP6S(1=qBk>t0V-c_u;%3>zTrGuQxKocbR8~}+r9@AN&;hZN zry*AjMMN}^NmEfENTO2i$DjaQoKZd{c#A(2qGh=SLY%t#q-ggte=XbSZ(;KHI<{Nr zfO_J*@f*Wx4BnD_? zs7@bjG+am>KRV%JC$YX2P#31y+5*F&7|vTSOl}B5P$X4|s z>Tt5)ookv_*>AQvEEL#oaG(PAzBJ0Wxx;IDDH)So29ahL+j4QS<=^^aq=*)|>4h{U ztOc;kZiS50yueaGo7qM>2-g6;@A4UhC(h zt5v`FBn3$P^dGh+jd9lj__HscGvTblik(Bu@Ro=k?xZr0&29I@W%pjNkM_) z1gGW&1ANbKY_xMA{CRxpm87WTRR|b0hWeP0H^J!VNZCvV!2H7jYRomUp^5Z@q1SEg zU_ijwrmPho3?(W)V#NFO$IW5lgQm5Z3&Uo-q-F%@MOd^FL|asC<~!Tecfr152ul|P zw$}Ez0@YI_=Z%gfLO%F^qN?g84+I6Rd%#CJkBH_CJc&PEG z3EgoRw?(DTW!aOw^N3J`B}t7u&ZC?5@1>c{CTVz?nH8OMu>g_ianb39b7r)Z^0ZSk zqbacR5)Rke-&_LBIF7EOIijVEQ>fTTP27)AE#>`jJ$uBMb{N?XyO}~n4OJtk8V^_$ zBGeJ7qH|}k!F~z!G>7yMR7D+0Cty9!7R3SL-xA53_=fy5Sr0!e z$RMYbQMkNQ)=C-qvM)ywpg^G924+1%k$=N*^LXiPCIFIo>HbVq&JTsJ7P#zEU;s%z z0tTKWkUeVJ%6v)i{{TI&8D34snJsNw8zeB-M$YH_ARjl{_>u#BP?>H=PvW(7+$kht zET)DysrP`f7WjLKZKWLC(qP8XsEzlC&_)o5jdE~V42mwR($W+7sZ`&{l#!iKT6fO;Hwi^Ph#YdG_aGkng?GiNmvXP7q; zKzVSg`T&7X{bcvRjJ6g@I|`TJ%ms{k`AE8)h!Q~1lOO>+hcnMe(qvp&C*rp)t;|xB zH{kiG;*o-@)7J^zuhPiTrlaf*qu3L+FC42j%d^bB4A&{Ej;4~O1d&RIW*^iLZU{Sq z2sR@hIBN3%m6js#TcJ0&^f>ib;S-8;Jo_QyN($*DmMp(9iK3Cs&Z%Hlb-%6DG4(D< z+?*h(wa89{Rlkln64MB<{i9$qgvMbc?m*H>GbD5V*REkk^|34~FhtfF!CUJCw^82T zmIl@2lLBUe?)}BhkJ|?^qCgj702|!m4-&wvu}NFwy%96FmmygU@~G;^%0eU`FKfVlXtwXk^ z9j@#}hp4^2qZQv1d=wnihGrd01J>tz`}7#AUP4x5O=_&M1e)q>>E~pp<`~qdvV&kf zutO%zCT&o`5Rh1wW;e0!2dAbY*-(a86J~O<-%aj2TeYxnC0QxzFbGC0Qhag zbs04e5a*OM*{x-DI#eK?1d!9l<5I^O9kvH{Ah9>x3jiO(%(3{n>dkqUo*FQTAzKG| z8s@<7U;r2Izt<9qt`Xu68>g0|gE)?{B2dr!I(TB99Ym5!4JyErNzxbsPp@4chj8@( zF-NWYR^Y(UkU@e%NfWUhdILw07Y3%WLlrzL1Tm~}#sVTDfU2Wl02=@XK5zKZ#JRT} z_>-Sc#VE;BL0?l(1vPAJtxZUhym2B%{{SkLTk22)vol=ZZ=swkCVxIl1y2%5Olv0` z!jM4GENVc~q!waWcROxvZLweY`QQdo<9=P0{{Z;1L=^1sHqv^J?s7~vAdyTEo_r+)6zks|g z;LRmu*?mO$rgfQwTI|xP6=ZZmO2ry4mMFm_=@%rMv0??JJ|$&&m2VGATb5=O@kv0f zJJZutG(xH{F6c^-*U||VBIjeVz6J=ihr>wGs&qkPC_(P;!5aY04#GB@_+`)%$k{pvJ>-M*D>ca)xkV;PTG-eXWGX7 zeem+OqK=-8MF|NDj$~#(;wQh~uf7FJ>jfgs6M*h~3^m*2Q(@DJlgDAdYiRw(h_hy1X{bIR5}Q z&FZ4g^NN+EpkR_iEHM@>{H4O)$LrI3?lEZFYhnZ7=4VHl@byJZ601nk#jF$N3Mt}6 zzqgQpeUG8U;E&H|(hn;y#%__{b69P;LCqM*F z!e)$-8c*()QbMm& z>^0{_G-w=Kv;GQC=&htFOF3IF-S!$$o(f}l1aun`G@6!UZL0cYePfW2o z)U8Ztt7|g8q1V$NAESN-4aM*Wj<~-r;7%8<;*8QcWP*)U2;y6`k~;*A2Vtq%Ma_V{$-&?(Fw-{5 zvh4RQsmb$tD5~hIB4}zLlwD*-79fm$jLAS+OQKUEK;Ajk9^AB-kY5C%M1i3qbpZ8> z@r<<<`K3i>ZJJE7<~6kv)zz5(Q!Iw%SJeR0fFI#ek4XL=YwL3l3bMH><#|#Wt0}2u zb8^(t)X0$w_W@KW_ECT_ei%4bD(C+I_p6B;D|WkO=4iKD?-`s&&e3hYZC3s)Ta*+u zSw3F|U6#?uO-V-z!vqkZRY=rXRY2$f76TSca~8F_w+ykapzRO&oN1=>#8#u(MTH+Jee#Rqzs*J$-Mi3M-h(`;N^ z3k5Yl3FV@jK{7zH%F1tfTX(;{qDR`@u~oco$DF$n+zyA+1Tx&iJj&uPlvc|M$#!V$ z9SeGeYk+;lu>tJUi>!)jZ}K$@}jbXdk~;?BHw&kW2Qc* z;Vv(;!7mRfYlUiM5<05}N_i?> z;Zi@sPUF~;F*uGGpp9aNHAFxaRX_ni>;UP6s%zHKZX^-pT+v>LxYv8+4;CuWqj(+_MF^oD|0BIo&p1- zoyEW-^9KMk?-BC<0EeEBC#I>Xm5{2a-k>y4pk1} zOqHs5yC$cqUS^8XJ23wM^lHw(s*GOTyVxJDA^a(jLrIz?OT+`luczwEZ|RAt78sTG zQHB<V8IDP>s8v4yOWoWw;6t8k-v<0>p=G|}h$6rig+ZuUJl4#1|uYJ0A$2Z=? z9TR@o<;}1gxl`Vy4wZ*t^~SD0Omgj|hTU<5l1;$?U?toMAabQea`ON+Ut!l8hE-r} zPR9YWDJSPJQo(lVh3FiJiSw~zbF026ZE=F1#g%7}fQi)ejWiz*pQ%RP8_hIid8}`a z!2_Ygc%(W*5n+XIakeyDdz7si#^!`6gIL2;Zf%U{FSa;wq~7G?3AwNsM{SX2Mz!dw zXECIt%kxUwcLidlshThf?f`4A+RQ9)+B#U~V=k3sQ>bmeB;FzARWRr4T>_|rz5%F_ zf8R&tHy-L!{{V@=nk>BN5yGDCdDoFkM8EtZi&IiiA9i8dHlCZOPvY*Q>`)vBwK}JfwTz zR%IzOQg+tn-KAy{J!!dqS|=o_Am4t676%D&JuY=jDO?C^Y1hvQJy)}@sOj`Qdt$t% z_?pRAFQ%b-iNf3@OL7OP><78TlZN<1h%)T%lQEVUAcip9(q+`;N|C0(Tdj{?*wA44>IiD5e8ASg84PBW=vw?FGD@fpbg#?ejK83rzwyt*V1N7(9yB843Qu*EmyCx-k-Uz{fz@LdSZCwNkuGRxLQj!9NB#yO%a zLYGkNtfY-grpD`LwR4Q>izbO4szI(&L{WodBLRN<0qRa4F6s*a2^)+%hvI(cbbA5{ zk~JKl@;-kZjZR^hlh{?jxnc<#5OyP>+x3_tyzk)y_=l14gqnC0IW!r%!wzI?DSi-B z2+L@lUP1%dJ1ZjGk)(s=vGh(d$`3(};H*ab_JiHAKuL(wb&kJEdl|()Y+QTEY#_h} zCs@!EC#IT4gVwc=KK>wl1>z1Ut(%N|K3J+Ns#QN|WpYd+_?JZrvqbIXSu}-KR3+ENhl8FN(D+ZmaB$QWBCfJo4PIkb6G*73U;{8+^r%%-QQ1&l z=H$*S2W(}qgrp~Go8k^Q#dwn4Hn&+)fMya1lgebBxqM8WX*!O0j`Zad@gu}@I)&3PIw_}UvgIo6p=7N z=cmr9DNs(Pni8;0blp!191s_ZI3fNJi09m9es^ z#$3t?oiwMJQB?G=H0EH-nbo`r&551vTH@QE_4#5Wn&ePGr1g=OI@~)%{d7jrjdw;F*8FGTMRpV8m22DWeqLM(yc60+| zxVZp&;djhqjar@(Rao7v)z3ryFlF+Z!z6|VB#nV!eAn%ca;&;2PMp~Yvk;|idk%u< zp#1S05_(dE(~cL)o=N$F2_$N@W#(JSd*bqr~T?!?fxK8j@xgGBf_5!vRvCNlZdm5b(l#}EL7B~BXZ(IZ60z6 zE=f{sb^wj9bBhKGgS(18n|pFI5J{O31Z%gCDco(TqgY801!sbp@QXOi@?6HHdG+CH zX^^$AplNjj*488sLyL&-ft0*4!<16RJtjeyLo5eWaz{#v$bCav;NUlj+;jfG@WW=b z^n$LwrgWpAfr$w7xFi=KTp}vFu^Z__ZS9TIhA?}(8&qNLC@oTAG~CP?=t<9Z{`4B{XnpzyAQ4Xq;QnGcmVTCwyHV z2zZa5@zoA%mvKEMFwC+kVTMY|RVfu>OAwJCmPs+V8#3IB?xx1V=X-!$Sh4Q~Nl+0n zGAB-8b0BH(t1c>ci$X1EMzLYsni>Qd9zMuqN1v@TOgv$(`o8-gynG^({Pm9V(X9r7ky6 z3N6P{tbd4sPQ=`KMY~oB1;eU<{2*#|f&n8zK76XJRo;F0e9RjmSh8Lu6IIhf0#i=_ zSf(lf3#=VVPpP=}7^0~29L5bobNAq=u9Agd0*au&##}9LVAD_G$RLxHq)Mkr5Db~n&)k7> z!~mx10a;NUDH6FFr1_M$%l`mZrV7${YsdUUm5wRl{vMWUHie9B&y8fB#QBjJg4O9fBV;o}Vv#gflY@i~MD)-@HXbO2NjmC%C6xkLQN7TgrjQpL)G z6+{BsK-%7zcMkS*dv>QS@19axK_M}yS1@v&0Q~gjsSL75L8A)2d9@-i3XO^#ZA7WafY>-#SI+Bnn@j}3C!h2g`YE$04fcE3y#!0hWj%JK?Njm;{AC{C3YEY97PRBlcjxUjds32x!Aun15D0}4ry zMDqt@O}Tc9Ce-_j$dC+@U;)lgN+FHnzHb+(5>S6&*O&?2!^fx(T{rzNiIz*9<=OoT zW;ta*nitsiD&5tGVlZmiaiJ;@DjN*qOe+|5OxV5_q03NXs00ZfB1J#Oj`&WdqB>X} zqFq`e8jh7Le<8WRHOuR>m?W-T(ct)kbVd|1sttfW4ffybivBB%F3H5(S~6aEf~N!SfnJv-y)d}G-@ zD|c+o`w1$2^{B1A0BUV)Ww{`!w%xDvI4wsEvcQqU5ZOT|w)+pv<1bbXb8Cq? zhC1KxkV;4z>){_6_|onBCsv~o6v8Sv;sRE=u>?1JgL~iYiE?pGIi?bFPcW^>)B@l7 z{+MM$k&4c3Jz~^Tl>qsCy?R)YW8WH!Ag+oTW~z8&-u3*fwoXAJ#p+R{{R%Tx^od>^V>Q2xr5SDWDqru zVoti6c}+GzNfeE3T-EdQokA*&D3`s5uh$4Cm5qSD96E(MMevhEZ*Xmj{vs}}u2ppU ziri6^A0MZHjR4x8MpUFEZA3Ci{Ouv!*#2EVxxt@)*dLLpFtgS3)>bKhzWyD3QevJvB=+R{cn!k7B>eP0Il%~ zw$!D^DsWdNK{mEHv9T98Uc(%+4!tmkZ3!8LbSj!XDiFl)dtT!l(|`fg2Hgl4a!%z) z#<>cj<6(#uVX5td*6A8d{As|wAl54>Un$sZancZbj3Fd?NIKgMUZz-NL<)S@z8ks5 z1{^}JQ>KGWcYr>%(B5sRk>CFSIPG@Z1K_E7Pnd-}><#eg9^+R_;zq+3X6y%B*!}&@ zAx)I%Xa^n9%Tbp@SqWeFNg3D?xdlku?`%Y2GKI4}+Q6H37R8C1z?GR*R0q6FNBqEC zexnt_$r8x$yXh-pZPV9pY-WDYEizxC@jEympA_lzkA*_tpdrxbU#&S6e7V7CY{Ux# z(+O2nO7gP+#1Xyl%^?%i^BQeRE_cTjk5&Hw4HOl)-Hok^4`^drjB@FHnVqLdsmF%7 zg#|?&Z8AEF#i%bRBFxA@(0#zM9>)H-n_`EenxcZV*3#5+vs zMr$*ov8VKi+OEvZO--^_p@#(7uKl46w%Ds{6Ked^;bj7`i{L|yejjz zY&473DlEr>v)r1b#F4b|17ws71|Fx-;v?G5AAal1UAB^@Kp@7s zRXd)UgaCXaq_K?K+&rWyw3Q@u-h8WBJxtkdXHA);_IRC8*! zZbQMDmS;3CSf&b5BD|V`)ZtC^kEtDfF=;5bYhqj3MWyY%qwYQkX+x*VL!Zw(yR_k(?j>?q~HP^c_uY^(R zNg(Aq)N_R^>ZtO{nw-*&si;=<5!61!srj`pPzA4hbUxUU(^b;fQ!QN`L{q^ay2%@c zRvyG*EX84(m8j(s6|1}lmZXpv5KYHTuf7zerlz5$j*^xYiWrnCB8vbqDTP_NhBk{J zyy!w=PvV*I(j(Wz(py1n1d||qYv(r|@Q)W}z9;ehJw{$qx`&CXC#ia>=qbpCre|tN zM?OW>8$yZ$Ey9GcwXtjd6}W#k{{Y_;cZZiZN1Fad!sr=Myb3VM$S2MGaAi6Xp@fK`IFwfNgQ@gM2;1Ts^{B zTv;azCN>5T102e*aQ;k~pjm7pE?x;i(ke>h`0zs2AtOyY!QyRfF zf)v~bbLb9l6Rd&ynKRIGB+3|AfJdRmbQm9;(&qJ1L^6EIDCAcf%fua74_&(4brvJv z5iTgoGhDKmW)+#V_4M*O$50waj38rW@+)a6asd{;{rAREisFvpt*z9sr6nRslz|@- ztvUB}-lvx4K`~GBjv{I6;cS|zWE9d^kjIwiqXxFbb_aVKp2HFfZ03S^gS|v?HMduA zE%)z;4qnvh7-R~z04k`k9@fLjYN6!3OoH~Xy^j9a&n=xhR=35)9XjhD%(1+ot?WQP*md~Gmogq0QBzYZ z8Y-OToh!8WRY!Qke}u}Z_Y036(bA1>`cIbN1HSmwa7+^3^53_AStm)@4=#U~oot)~ zz_?~NhN}?7Nl_{(2?hX&)W)+swus(q=?@5Tj}P(IMNh@9Qf>_c^^>A!Q za0uvq?0%T8<18l(ea73B1nMJmAQ@ z6cgtX%MydjjZ#uOz3u_^ARp9WXO8i(9)}GnBXyb8)uAx$$-hhPSfAn~-+%9XI+8)9 zfg`3dONUVNuDGoLnj zwLr4S!e1e_`;Oz&5S*Vn6LCgskmi*FD5`TBmZj~cZfk7b%q{-_SJx9vs*yfDVh+He zv0{3Y++u>Imq`Hgilw2#Vx8p4RwGDVz;+>>@BB6=d>hMhc(Wyyk1^R!qNLbb-LKaO z)FGy-O$V5&2_T@}<74#4Ts@kYYGsmQIW)BL%2xO0HME5T)U&U(fx=SSdq9QMgG6Wz zO5-suTNENijm6c0+V=jtcELUi;~MS^t&*031yvP8^CqQ{h`UYvI>J>qexKMq0W!cZg`Xn=ToqT$2iRVyMz4koM|S^ku%Dq= zY502Zhc~a6GN|C_ppv2algCF@JuEXZ>Ru?FV`6*Vckg^ovW%ZA$THe|pCrqvs3>U= zM+G%BLO7ydMOD~h&xzxf*EY&!gsN2&FaXpYAeq#7RmU9St2_H8TiYR0xCb-ZgK@ zc{9B}+9aNT_=?he%N$xXAze<)#ZsoDlx8&p!~8jU#BY{uU;(*14~IPra`D=|h1YCy zv7(kLpcXofhf`}@{eZ`Z_%p};KH*%|V*dbWDl-O_L9UxNt(K~mVs=>d%c@#-H?Wai zkPMH|93HB|IaNmW-oaKjSnc_eVEgSjN^1{FOq;m^ij9Ol{o02#@_ zCaK0zlN3`%x8=_%i5;YnbaVT_stv#jPgcW(grQCyk|*W|)Y5oIhFs#jO*RN#K?O=w zOaU7WB*_DDUd+h&!-V*nNn+v7C(3hHgkD9Vt%`Dj_VWZ|Z@vju3ZqFdp=iZHjkzX4 zbq{YX?b`OfK2T)lvnS19&a!%^%X2DL4@+A~Xr+P2LK$swdtG`Fu@*S`W8lvk)p&{F zcMb8KdLq?kbV~Ia7fP9wlyV1PSxNihhMX5I5;W!GRz5uTdae&ccPzcyG_#jc1S%vA z$RL1q(`~ucb;6&AjQ50d8tl#vCyKrE1txT#QtObmqU3-5c@ zf;EmUCMjK%u#>)>Cv~wFZMqR`O(&^>nlmj#s~Q1vSlbok-XPFsd`}#?MO4*PnPlxx zRUI^-lKLBFTiasFY6%<)iG}(l;AH9u}{v=@k0K{iexzp==HrwF}O!}%JJkh$KmP09wDP>FB z%02J&xj25?jqLDNTW0R(-c+e2NlsD$CM0blAc8`KjUt=Ft?pW9CDWPLCs@m;ArfkF zihssAt6PXDAW*^>=}V#PS)7JHPyio%TKRdbYE*jQf@a*Rt+bB7?sxU~z>Y5AN^U2j zSlz@`P!eF2jX+^;;Ga8~k5;)I&Mpyw;kkeAc$H zD&djKJB89>2Vvzm*lad9Ba~8AJ1M4>BPnl~Tv%JT`s;`=@kpI>zNs>5TIh{ey(@7r$ZQ#kKgA-XU4!=7k>joSB&u$T@Dx!$fm5 zcZf3@tiBjUGb$NasgR55u;?$f&-TW$sx*mDQr>NIgKl-=-3f z={8f>87=kl(xtlqNhiCY9tj;feCYHiVM;rPQpfFtb%nV;xbIe^)98ILl&T8sFNjOm zoKOxR$&Z~lkOqd2WU56WC%cpS3_d>CZ)R{(d$&fT%ThwF?drTgFvx*kTAP3l}C?xgn?7-EQL)L0NM3X|6aofU@r z;k24{X>EnO3{-KO1w80+)pvSz^E5+h06?bDJEV@b1d9#2VdQpH>OFAQo(GOX&mbV3 zt?B89Ayr#R+}`+)!BX>0OMs0|gpDN6F0`izCra))5yqAlzSi{z6#ZPaRMi0|h$^y! z86$HaKz~Dvd=OiH*n@GEBui2eBNs+yT|Jgdy}$VhFb5f18=NdURjX&?Ivqats7z^v zJ#Co=3P?Yd1Izv*zyYWe+-^n*S5e6H;g~2VpeK9}q!Uv~9MQehby7NDXp2U z)NgxZF<=F!DX7a9LyZ=dGefv$hK5Y)f{Laatdo*MZWx6u2h!>>ZvX}=PlhG$tcca_ z2qZGwp$Diqb1x8a8b)GV@}Q!grBD(*HEF&yz6awQE*7)Bq%3dt-JTaTMTu$*Uf+Du>r92;4bqvny)*>_#O_!Bn#w z0gcN7#nFw}BM?Z+l}?ki5;gc#qiaj43Qca<#uo%!i}x6X#&>mU;rnj@9B#YI=X3NGNi~+Maj4p`ubrQPCaFeh4u>7B!W4>CJ&Js*O1~| zoTqAp_~*pDMZw+?@jnvqq-^<}1qpbZCbI&TRg!%@`AA+%bn4QfOvdje%A|KOzYJxPj%q0eDT6 zW`i}$xIUg2Sp=&9nqP)j4X6c3PE@PWz%aUdE(lW@xdWSAjHi>WhvPaBGx0j`c_?L%Mdme_z+Z))6 z5w<9JwW4urcWvh)T##dsJAw47Rl*Z;l_2O9J9Ip%E#aF=I7XJ1cmy)iNi{pBoi-~W z-rcX)?|%4|V}wME5QwS?xv;kQ5yYHl!n_|&l{`0F;3wnA@q^jbb_C6Dsg#Y*>N*?m#E`wGBV5u(u8I z&j|5yGjP`sQDy}N*&&n8qtvOh0rtTx%PXVJ>HZSFGbB3JLV?*qDsC@gE-%}rJ&Ia7 z^{ckA3Q|;^WJHM9opBE}e8FA1!jeG%f(ZDEr|C0zsoPV!ki?5GU)KjI=6uGgI%+z1 zsFkilDNuZ(wS;Y5^PsoA;w?(g~D~&mT^y6!_Ae}v{em9Qp6I9 z7_z>QO8NZ4-9|af^GbNy$ zI_gSKcx$G|V@_J)4Ba$`S~8W12XBZlN5ZB2Rl?a99B}P#4RHk`)#df^=#>Ll>~5^A zH&#{vf;tc}=c>QKd6PCKhs2qo%AAtX%atURO1J1F4kIW0MnAE~rYWIXYG|p@0I?uY z0NY`NDsxI|O1f$(OLHo9X|UNqw&&91fIZGMn`~m^3~NU+0}?bMOb%mtf#aoHFpen2 za0Dq94-_R^hy+g43IqeTqg|+10&ph|_;tf{{4v8c&lMyEot{_MEb_MPERXz7$EoSi z0000;0|plc{jr@!ARJL1Tb5>(6HiqIFq{c2@@NE~n{M|a_xHtjh;g?triJ3upD}|b z4zg!sJ5&|z+paBF4;;!-l1bE)xhAC9tnnK75)us2h7%RvOk`{u>ejIKIO0{+6W`GP z089kRYUq}lIca5$;+ShzL*-%WErQ<_8zZmy4l>)kNMetz^?;n*w~ZryboHx=DBn|G zI(XrXd{dfCQR5=EVjOkZ$lL2+acyu8VNb=`I_82s6_F85Rc*Z1`R)E8zp>OY58@6P znujp2t)3L96Iax+AIENM+i!iaW5c?7oQknnQ>xHc`6@#xvH|kFy6RF-)Dwye4u-Bs zR>c1RgH)6lUbQW&qhVOH!6O6<w-G+Q;dL{XqCC!wuN-(#>tR_Qb8tnwm1cbtr^o-krl3rf^z#)bvLnfIa;?SmFI2 z64vm(X&z^lkZk{R8vT3_bBt=zC)M!yG|)Zv)t?q@aQX><)%tK;;u3DkYUH z>bjU$S5sxw%~x3`E+numq_Ub9rahg0 zl0i!eyfL`}-R*5{ZI;(I7w>b}1GyGi0n?gIPaiRXFcO1Op%w(5wwM1Tr&O>2&_dd?x>o*>9F=L=Pt<#lv$F>3)Nkg_SiZOF&Y zsq;L_w_LfDjq#_;JTk@0Xl73=kq`#OSxVa5X~)wGZERD1D1H~XE5uytZYZJ5tN3#` zsvqxj&@68aVYP!x42o2}fEv`R5wRx1))&yFrW0C6v)(MS;pZJ=5D5nmfCw~rH zPsbU_{fQZbh$BJ{ z;EfD<5nnyH7x1g&7Zv94Q|DYWKMrNutvzmGENWvL{E;KGyLt~Qn+vc99`WGr70S3H zg>t?T$s=T;%4t%P0LJW9MYS>RNx44c;J~+FF&*Nc5O_y|s%a^>r#MWwRwR<7^CJim z5u-+FCANr$siRxD0G0y{Da(5%vnYh8NhI~qNk1x<;@&yLxU{3+a-pBw(Ym*O|WZYa)jDY&-+X9F9 zO@`y4zhjF(5OF=14ThI`OgOB%YZ@J6at4zc>(6RgF;hCKXsY0Pc}3O5jk|gg?|U3Z z>G+abDo=-+n({-bE*q%~M^9b7a9MbUfWyquKC54s%57gyPuCFYjJ`=)N#}AJXL$;P z@|I#qAD%OgKH`MhJ8ye{zLM!mlA@fd?h=v$w~cn#>S&Z9a7I}bE#aK!_QqIhWn~h_ zBc!X-Ne65Cc}kzYHx_*pPa-iwfcY33ZP*+4@At$ylP{^Go=IuuC?)_&t8munZQS+2 zIMrhTce(0Gxjy9Lx{qntkg>L935QXl)O8Di0QsHIL$xm2*-8hs6uxO$55%;oW-Yq~ z-~DVb*i5bibQs&jrLTKmZH^Q8b&l>XN%c6*aa-HF>&I@E0L)1sZT5NXH7JDS018}r zkDG9NV{FBomtxF%l5TOrF)O|_$aZBoXWkYY?rY4CzLI`4xCWg3!rSAAR_VUj<53nC zwXwBgPW=uKRmvY349z4YjccXW+Z-s?NVPE9#N$hHaHT>AjH30nk@Yx}wzpAbYfh>I zNu(34NGQ`qBr1Q96ZN(5sm76Xs8ReP*x4TV`jLi%45g9$AP<0wg(ghbB;T$%KG^K8 z*x`qv!)}cv*M)M%-Ep8tt~Gm{Vf7;srNh4}TvjuIvELX7T}sBsrLBY|dz%ipQ3+rT zjlj9z0k?VDI;0K8-=E)|D5eE$pKJ@S&uQqY-jY@GBr7(X*_;;B<-W$&++d>+2fi!5 zH?M|#)U;EG{u)1ryB(TBZf*277y9Bi8ogDEInaCBeg1TI9c(V%$gQa^B=Jt0BB+k0 zX;LVZkYJg@nML>d5G`Zv_QX#u{7U4x-hUMZKMz$$mb6kx)t?y&l^qlo9Gif`#M?u& zn^+~yu?6GG?4vr7@@nbn>fS{G33c+gz1x4`>2rz~IN%N?;i?*p{(`7xaTS>(q7(k& z>~2?5{{R<5bFctywkWP*58Z;7RUrNE%BSDM*gyd(+ns$3$@9#oJEvLl`q-)!kVpa> zI;rWY51D?13_jLbt_8ry&2I~`eD1S897?&YnSNxB=^w(#VlHe2(ba3%3xhEd9 z;cpW7zk_0p_|q|b^DCAm)pbR!q>u}c2(Xz*-o$Db`HxHz)xm(-J9DVjVaq8iZ(6;j zWdmPeH@93xION9!RM~~fl1w|DiBMf{^&G*7H2yp0Ip$!naE}hglp@!u%=HG8+oH!A z@_=?MSohd>6XM^9QSp}y<(VH3yzpl4F_N;8V<(mkJczezSfP?d+-^V{3^#}*U0Xhh z9pvrf)O@H5y9d>5p_g!eF{jR?@Yf|wD?Bb8ALV4+AHF0RbwO%UE_VZRE(Sbf!kjx- zK=IJkYL4-*?)5N@Nb~^M0b{Z2i~EKmT)Qg&0CB1?x`C^cF;M5%uVakAvKH%*tkp-f zyDY9rohr+cHP#CYkai=b@SLu%suo}`fjmFOCW3)s&)Q0aV`Q8lF1vJVTK@oF&kgGM z$Ay|rYnd}EwuJ(n$y3*G1{PodQfT)aY_=AK4R;*q%>{jCMVm!mNg_Urq_G`@k&-UA z^%ews{c*<<_}`S((-v!Ba6pB7?CvKQSBF4X=t%kGxLKndPA2;qWklq|E+l zW7(u#86Fb^0zf!N#A7A!Lz#IWl%*)ZfbyB2bBHmQK-Ff zfTTCE^^Yo^$6FItAY!4E7UmW#NhhlxQ`F)`7Z~O-{4`KkJfa6#BUWud5N-vJ@agcjq6EDgyP-6kE#LTXzCrS<>%u=4N9YrUa>XisdAci|? z9SWWL5$#%1$Ct7gnCU=l_q}&%X!gA$1 zMx2CepfkUvO0{=#rvl2Pbf&rg01@Xg@uq8@WO?mP9W6ybVaSk#aHy)fl=)5c^|yYw zwzwmWb4>m?=`(&Ftfr_6FH({I;mxmd3Dp_)BFC}BKZW=zlR3^IhG=At3N1AiBIFn9 zBTs9PPTSc}sKvVlJT%d)Fhr<}(NtJs=fQS3lZ##;x1qJDoV$e*WWYOX%xg2sjk41x zMHT=KrsVEP$FwV{Vy>f}if~MI5wuTlMixKU9(vBa4&w?)YwB|JrK*OJk0uq9{o<-I zz0g}oYi*>ENe9$paN*m#dsQsDKqdeurBQvNSYkK9k!po4wB{rvPkTrtc}#kZ$g1lr ztgeEl48n-D6=gXRQ`Eb_EfMMSVPaYj$^Ibbhtx)$ujTVZlNFO}ug`A%I+mQn&Bq=g`i z9nO^i3;XSbaU1PAw4o!sC*jhB_GxK!*?QpU%7F4J9LFsLf=7o+8^ye1k?>wy`%62X zMN&wPD5Ek-D|#xAw&uWJaxq%v-aT-;#hT_^Nmn!)qEx2J+AV5U?c4$wuq&vYg{(Sn zZf03+7H>r^U6|7(^z*4nBXO|@9zXGy!-;q&i6Nw=ou{Ly23k`ifXblmr|H=HV;JK* z{9_4HFD-~HjUqXaM|)jHx^kVt(zF~+`-@N=L}mNlu6*aljugo#vf5r0j+&;PT6tP} zN)(M!0zfO&D7E$NZSQh0pABX?Ms<}#Tb9%gTE?Kn?ls0n+E@;UZ@+AL$y!=XGV&NP zI#{UcJ#cr0IFa%!+McqSGSRp&)WjGLWM{q3+JW4DUGbM+-0MK~E zpB<_kVoF+ua3E|tZMAyNE-<4?WJ46P&8ENwur}^V*nYm)gz;Rt>sC{79W<*eL99-T za;k>bP@U4(2ffKZL77H8BbKHE{_Fn$3NSiYZGFdlK-)E{u2+&tU0sRu5aZCib6Q%#;t!Sr;-OwK&PCS9na zke)<$B)BJ|ALTY1`(jy_@#PIt)5S*lfU zq+Fb4N10T?nC0Q8Ay#z^3G2S+5slm}r9jYAZQr|YxK4tf$;0&3(8)Zp+OlaT2)#pIwVs`H1wn-|dLM z6t-T5X(eeVVI`GMMLX&wf3BEC=0HgsfU!)~8JJN=Pb{r51rE&H`K{^h4kI2E)LNh(A8yAY+AD7n3c=ciw65XC!~ao-HjmC0B8as`$#%!Vcm96B9B$!m?&cEz)o zSJP&6H2IAqhk~jknl>HPg~#>Ahr|3rF{fQdgD3=f8K0o|((@#kNv8yX)Z=)rykFy- zvxYL*XzCctJkl(JDCE-qUDt8C`G9No)9x_~;lIT8RS8-iEXu1kP*%2)M4`Xtk7gfG z57QmF;_N!h5LJc3vcMhf#Pl(@Eq3b>t4p|TwPjJOr##N7IDapbGp$M582(`lMo0RE z8=jr9=D!zz5tRH{mCwT*4^HDPs#b=sx}-8R=s^WyMInOT*Cc{%Yg+h{_?`Ha;7Is> zsd87Ut(hZkTFXZyNb<6kOX>iH1+^WnbbvaNJm|4gQRS4-L`0@2m31NM>xw@Z@pFzV z-7wcdZ9}|Mub@`YdB?^L0eN@)4IMexu)GrSHjj^ZVhT#i*v@^G#+3PlCA{vyS!V;O zSpd`zW2t(KRQ~{s4m!%IvTD4BEW#(Lo{e(UjR<4RlCBA+zk4KfsvFSF81J{4b3DSn zj#sXus(Ln7I%*@8qLpuZfXG7te^G%aDyYvutD1S9GJ-Xc*s(%KniQqjxHv|P6xronH_tM-rnP5*9^}c@T7?A6t#uW z+{P(Lxb?ZP!3?@eT9{U{nz1COlnD{k+fY4y$EW9j-nT-W%!SF`LE1U^8d*SDnVOUy zE6gUO3s)R^$kIe>Wi9?Il5OliJPL-MNf?m8F*j4|zkG8~P+Cm~NmU&b56=qH)W&2Z zNkMPR-w$Hgoz^n6D*e*Dx(TOb6#%298bI+x6_^kP=J-OWnTQcK$}e%>+Zu`{k|k|z zxVYbAg(IbPM?rCaL)#2E+MP~7G^t>su@R*-SCdwc;TFZmakaYP32ELF z84lJ5sW@{RAtq9~bnHp*i0;Qyl~y9IG>vA{mj^mXiL(4a|G>E|% zozL{cF1M&CqLOD(S_1AsTVEZlY#V)n>3nV=Y#Fx0fgZ7bw!s#59`G}B-nykml!qu5 z)G^YniQA?+ab>!aFX@ETo{iHFmfK;#GV8r^Nfe@7+}{hqX(}U(c6C3f!fI3tk-xSU z%avZbB0X>UZ~d`h!I}%aVU6=CAo`kV!wDv&7|dYljK|WX^Qel^HW*FC@zW9Oj&L)| z3J`0exwVJBIXia8XBb8MVm(L%K&4G066W{ZoOEmh1X3@x$-da^E)c7oDJkTslTlcd zu?y7u4}1&Rd%6m?>VEd64)K9ab6mnau7aa5n{}s*xKY)}8z}cDY*O{H9KwKnRBQl0 zKU1l%bGh|B`r>WGwe#n(1!`|3WU@zcRCXkh)b+%6dPkCuXcVF#J1g#X#&M2bChgD> zszkx-R{SA>YS}CNMEpMHtC8WRTUR3w$;qD3)^51TU)j{&-h>C1hTrv3zqqne8&4* zd_f5*%mp5@f~=bwsPgU@qpqZ+rl)~2=YX@qB1O4UdXhcuz9#wC0sjEB8Are+bg)br zTbM}}Vk~S|sM`c6_+ox{E+}DSipYq7sOo=PZT7{5l;v_H0ofAEB!O_0x$ZTjhg0&;t?*(=OHKeAkDon~QT=T47Ei zr>>WmAPmDpF<`nytZd@@;O0SBRYo2oRZn>CiWVK%^#8*xmzmaen(OABC!Dj z9{l0^){V8o(a@iS>GG>8J|Go^=-drb$jS-WF#~hI+iVXswZVi@>C&gn{d@1*uleFR z!#qP-PduL()aweNV;iVsZTj!HKH|sU6U?nBsv(l6EtwRodgh~**sxG8UM6q&i{8i1 zH~E0R8bc-T^vz%6i8u)h5c7*J+Y)In1RA$fBthFw5uVosz# zRb>X_(%ta37Yh=9Ke5-ske~v$pj1)vDdCLMrnR?~K(g=C5ZY~bv@A}~- zrKO{fTL|A>%XxYqd^fGnXyT7dFaYk?xi$vgp7eZWDF31#Jhy$q~+ZRkL zi!obP(`RNulK>D7r0h1_o^>RPw@3jT>(JR&VFquO(`IzW@l`~!sJJ!+UdG#8bi=K% z%O%SbCCTXWsN^y&90?AxEL%vnqCNWJp5xvls?2zTww7wCBaVWk)5idjl~5=ias{qf zl5f`5wlr=l;{@=27}ed|Wo|5l!UCMDy1?K+74ak-C6h^> z)zeEgG!GigBVZX-+$N!W17gE#jjxFJg*m2aUzOFtUo6wZO)`pkW@68wlI3+B$OoZ2 z*{#@N--{JFWF8-9Nt(iDj-s5?MG~Jg&mjv4UB>*vrv0sc*pRcwk&IwJwe7o^kfjXV ziezil0zE}}P7=v+I%s#MN5*arT}t1yM2q|el!AVS_B}muN_eNlbsTM<49w8-DIkey zsiBkt>ltFq@>=6l8+kz>1s%!5$P$!As(E8+qaZu<4%XcJT-^Qe6Fjel!o=ke@2baQ zJ8z7q8scm0THD?36asgEB4cUZtM|`3`&nEfD!+3qb%vT*Q7Dk z06Sui9RWldt*5%Uscbia!4pW6{{S>(jU%}SYhax(7}e!d)8$ol($r-$Kl{v6#wBKq z-%wI_vHIX89a`2#U`UK57fsKazzi)dJxxMHP(}!CH~#<+sKdo%>WVoFP(9O41kCk% z>EM+i61YYFBA}fl{jgswopR|$hVwfcM%$6^gkqv-)QKFnplnyM!W1&o49LlxysMZgukaD4oPMGP|{{SkE!?`_4+}z?Zn$smN zVKX&a)oGLWGAPp=fm?E;sRqWx+Y7mMAZBk-)bsI=zZwrMa0k+FF2^v9q%J8>_?@qfb-RIrFM=^cCr^pVXFSP zXFVus+MuSukS+4s!r+gt0aA%GL#gExB8jGLT~(QBj-l2Nn!{+ZvFU5|7@P3Ni(G%h z@&3oib6D1d0%C@u1dv8gQyD!0H#XdRV!g{N>7;n+mBx zOhN>(U1w1jxccCWTc_<;+S@FpT~bIf>0NDWnMt7BRacu;SI?PO*GpShQ~SrBSw^9& zuU>=LeX$$MCaaodLV4=?oE30v6dRkH008Pqu*AnY%NC&(ocZ0rGVeP zuYq)#wOu@I8M)ugjDOXzPcElvAex_?QcHyw0BK{jjvdluh^9uUnI2RZ7VY;PdSk{0 zf|*gM{E*ZsGRTHVY9k8D4$4nLJuWat8V`o062&U$RV>QF`n~-I45n32SX8R{7-|B? zVd!w17Yqzoa(Y_CfBywt=|K! zAPp;_S$3&Z`JHr9=tUuRVxXOY8xOAdbrxwoA`)U}iu&7smu{yFs*^2BT1j&F=aQ_# zsa*`aDo+{G9ySMcbODIlOKKf0fZ4ulGsJ0whG{@5iUqxa{{USu8_X1{0iVCWEsZejv>6ogZWYSC zT}M;{9!b;~0^fh@hp$!pyM@!)zP{LrvaHH3K<1JUVSdJLI;VS6(hdQ95or}g9rgbM$wt;(C`t5(dEZW&Y2@zx+_ZHs~PANbs zbGbFaOo+8mkLPmLqQD80G5*QVn3!B@n7jCu2UUfBx z+$qH6Ui7`r;ElUs#1JEi{_jQSw`@z3|*e1u-;J#_Y@mh!?fJ#xlp>3txAYTG%BiC3?+wMJ%5c zuap!pD{wt}epv3Jnry~aMJHlFC_LDImQa@0D>!vU@&*K-pusG)ArkXhl?!zr_rVOH zxB^snpdH0pHZA!LfCt0ZXiTOQ06L6CxWSR2W#HbSYD#}pw z_tB3vW?55HRlPMZom!gOfq$41cfLJljAEjjGZ2?($2_SUF^ua2@21~;P&{n1<(yHP z<&e@kEEOgwG*;f$(x^XDNjL3?R5`R#H^9qJb$jVz2T}d8)plV|Oje=^ zi!=EI3BAp)_3eeB#Q;GAUk{}tI)sB$ioC*!Ss<28LN>C4bA7rIfmN*o>#2}{(Va*D zy4u}+@f*wY?Nu<%Qp8F@3mxuBu{bRaSH{sR^3_T)4Rh0O{{Uhz`*LYW1yr_CUnNas zVdK_-oou^rYm7|ktGTKoh%&^?3u`y+)SN>oeitl^l?LoDqU5PPE=RT{Gzm{M5yeYP zs#d|ZF^yta{4Hl?!^`F(fy_r~8S5K}KA6*9_oAtLtw09L`M3rPfN8vg)_ zFfhJ*RgvKj8u5=3=9!LJp4C#OD~;+p`wXmP1qneEz;+G z&r!eA6u;s&yEe%+9uMO&3|1#G5N zI;rb2#)?H_*t~4WN4UWeEQJzec95xENiD{9c$SEBY2};;j!960tU~#i5z~Eu#VO+)^JZcU$0LzuucnYkC?iKQ5<8P%bemfH z?r=si+1{x+Rx=Ghx20L`d+=%4jQh zry`(<`})!l)Q#)VwK?n6YZEMj=dH?{9{Zh#Yzk?sMOt&3UQ0O&RNBP%Bz>?CFXKua z@|A03hI(cvmn>`nvk|dUx47TEzL+%yRXL`ok=%78Y)#m7zSsf4rj$~#tu#bvX#P{1 z<`mKVE4gLVE=ky*OP};{C92M6tfEzymY@r;w?GGfz9IQWWtUFE37ocoNF@(**AKsG zQ%5+7r7s(|lVf`k-)wmA zrF~T_Q^h255K9FMqigTe^TGNr54hKgxiaM0D^IDmX(xqjb|mim-|2-m+TK6A6XmTq zgsFNY6HKz|RMrcb0CF1OTwiX#=ZQ5=bd-vc#WR^U8f|a~sQ1B2PX@eB%HR^_d_4&# zNjhudVgWmCa6epXzr&6)q>Qd*k}Mj)*HeJ zC#}4ijqUA%v3NnnnQ=;!l~c_dvC?CyM)LZdT2JYZCl0$>a|Xu&(!%?1*XxT0ejSpUpZ(?HMpoQfolZS9X6b&VBVEUIb-d221{>73k<->$V!zE6n~Gdb0&*Vt|ay)j}wSy@R!YU<*BFx*_S*>CG(bN0ZArOM!% zI*Df?UfZ%3<@@{Lhb_WC7L=7Fjl@)5lA4-^GcrcEa7u;jdz&0}oraP@Swl}v5>^*2 z6m}~UYV#md@~y}qbh8U|!5XT(rlFp)nSgj2#X=Ad^uj`>KY(nyuAI6w#-^5~TT3I5 z0|Ga?5EkHoZUG0VA}O>kMAs6i(t%Ouyj_ya^qEF+TSW^eoIy~?qtl_c++l-peSN2+ zuB@Hf+NCne@2>sL&ih}kCiK}n2Ar{ZT1XY7mzGw+Ffb_zeway6NLXi!aZbgOm0~P%R47F8|(!k3!jN0PV#06jt_dUDx#Oh3ki?Yna zD}t*oNT;rltuQmjQco@JNVx*Tp&r;kvr~sMK_ZbP>|+ZIMan|Og! zz==gol$ENC2-dY~A_tHLz+JDepw;QWTnBS*2#Kc+-42=iY~#NX}p!OBYDmu6r|=xlZvZKWZA1z7Ow zmfA{D9JlcvGC;Wg9`o2DAAYLlq#e{4AwP?8r{n)_{t)i{?|n5rU{hZ3QouE^f!1^9n- zo>D)FQ}P%7_zonE_AP^12~UBL#w~f8{`RoN=h@q7cOPwOA`+FKSj+za%9^_{)KM$n zrZjrvV#63n^~cb0m`SLr=NkhWHXGwEJ#acm&8>9Sb;ej;_|~90<1cZ9W=!i{t}0cU znnh9pDth88Q96lv3PLd!3J&Lf_&HyjMI45jB1<*H5;g+?DkF+X86r@!p$ApE_utzY z=NH{Ib8ryCq@+QqDPn;cc31Y`;0)_;c0kh2VRsyuN+5nl`y5Ccu|*Ckc$N#zPRcdK0&ZhMxxrU`eD?P zgm4J5+V{sXOp=0D_Q9gvln{`06ftpTN#|WVg-z{ahO0C*=p-t9*ER;`*hewUqN5Ef zDY9*BG^d@a*=0rf*2EL~;S0F$z&g{7uu5|)YI{{ORj!^}Tc{guFp^N1;$u2*BU`P- zjvU29BFrZ;Yz2V!?|eLDQUZWI@81ullI*Q}*9)NoDmI~}IB4T0I2O!oEVtNuVv6x9 zkVC~)6jcn!$xjeQ>SSFcM(5u`fPK{B`lyyznY6NL9-{kq7^b{$qj>7_tnCJ()Ur~z zTLxf{tqCVCp zomh0+wePpSGxkc>4`w6{;7w8+%-|&(3ZrvOzOIT#sF7X7UuMS) zM9m!Z?PZO;!`$uESmMmga@@01LtIkC5@QH$d*0Urr+fs0hB&IDYFd>$Sd9c}?f~1S z7MBFU-jk9|35J2-Y**KRrW(rWGb+zIg^%V4 zr{(_u&O1!UEoTc0xlK1<*Y)gex2_*Tz~@Uq2{i9Kf}i4Lik@i@J6u}hr*ZvoQ!c1l zSXLc3D!aC=+Wr2$Fv6x9M^l{`$Qj>tKSDo2;0V$TzvauiFf$YbY}exrCJ^O0Jjk zoxtuaJ#h@rv+87?Dpjjzj4)OjSQ1a$(+l^Mgy~!^1g1qvCpAw<2$UG)KRa7x{{YY5 z17*o1sEh=iTJ2+FYvG-4dkCf0lG-(}3#8t|zt;3($X_>07 zo|>-SvwC{%-JdI;I{;KUDOo81*cTYV7y*FKb$~bk3IY-m5(4V0fP#X8hCzgd`2q?8 z0vsY53OYI(3K|*)HX#lMCO#G#8ZH?wJ`oWK2?+)cIVCwUB_S~h@qZ5i`|1h<4TB5| zi%g7(hDrSY8=nIJG+3}o@E;Ih3S$K^5ul0uUjjC88B=rJ~woU~bxs@8D7k8-h0l^omPcj%q* zA;Gy~%3W0R4@{8GxWpb^u%;YigB;W6cuh_zCD=1ArO7-2^K2!z&(YHP>C1%*#;8y; z-@@;_`8KX8o+qUllJ@J{uH5ja5`L3*__|DCjn~T>@H35KinpgeF-t~Oj#fDTc6OG= zR5Bkyus0lTxn=N-M!~v7N*vDC)Ip3K8x1c}qqpKiWPE%tkF|j)R$zR*ptvD|W}2I6 z)=&B#5cV97&w{h|}fX$>x=4+!*6uY~;r7yQ;z$4GIUFQKx*o9_aIs$tw{ zyMU08nd&;?Cm68Zxmye(ZB8_epf@bk%|PEJX6$zfDuyjElteEaE_c?w=(;mWSaT3L zw`Jn7u1z|6>=|B0DlYb#4xFf?(eZ=W$Ux6|}$ZiOCHn}NnRz^hzz-~ns%z-Pn4g*!m(qs%1` zxFjfHBmUzk`x}GwPBNcDS#*()sE(zk&XNNBT`qSa-;~uLn0kDn>->TpII21Fl?_Q= zZ)MKgU$0=AynEs-n(>ZyKiMbk85W6~F-Oz-R90P3f!u1^{)%u&mb0xE&Ud8&CGNu9 zceWk_0fCLZt4gbg+LpB3{GX1ay&O@ec%fPBP_|LJ>)}W?1lSG%u&S5a*p=wTlM>FB z!|XMC0E#AM7$HN}a<8+pL1A4&+maVypaBe@%3|tRTWwPkmnij#s^+)4pd$7G z{b}IV5{``suyJbyKMrhvL4nrKYl&qOx#Gn?i~X z{79FbHtG)i;1N;J5=Qg}`GNwMO}w$uD@v6Gq+*)NrM-UJH3s79BONB2kjN!IY$4sC zM%`ot`_h9e0{y2-09r=RccajFdN=0b8|I}VpmH-ER;quBIJ<38+BYN~3ieHQnq=ew z>XhvJD(KJ-qT`R+(CM5G?FKZTNQ3a2+GR`#DOu26m_I+yHqJIM&lr4>Fc`q{{Yv2`j93&S)48z_)~ z*yW#fE)#`65o;vyW)4XtEJ95d#tnBhRp&V5L%VeGYpT@g95C8?7bFD=fn9Y%#BgvZ zEyFTF%P0hDb1}GwqeE5_St|}i=6q#`bTA0Tl?kjT>DXcoA~N2jcgyS;M|@>rKtp>I zs_|P-;v+Q3E7x^=_h2{9u59aOjqF!x13)vI!kp-INy9J*H%xzC^4~BoM)u)s#!xxL6Z@&>^k>gy@#PZbZP&o?1MRPQBGY?sqlWJBHjO?@r+2)4| zC2{EKSJSqrY~@_`(70i#q$M{qsM~VsW4{#e-Fjsy+*#`+Y*^N2~<0cfI4c z*B}0t66WoyY0wW44^sBP5bfU-CMufVVl=QUZuRw@uWIzMWHX&910Rc$t#*b_1W~l} zH(@lO6qnh9#EuLgFy@lzsHSrTr6n`7{~b;UVkpYHVym@rVXU?I(Sfff=rER}{p9$? zgbv9kD<8uyoX(r_P*Or_-VZH$Z0@S!pq8Vk`EHK7$*!N0s)fC3om6^f14yyskWFX6dES+mxZDNW# z7J*b=ATt#10={*If!@eY$IX^+Z1Fx1(qhttbPax>KCG}TVR7cysNzgDrM8xQ;+3Io zqc`?(siJfUFM}E}UN{*5^H8~z_KIpzX{1$w{ZR{wm|@npH?LH&^jCA3R><~l^AT4+ zW8Gzt1#(Q%6mw(umX8M?iKdGIHCHQ)-KnUE11<_dq-DxWK$=vF)3{QP)DS7>O#6|% zC9Bfjg_w)zJYYA0*IJHCZ$7gxm`O*Ow)}T&4F%*s*9@tW?qxQanJU8^myoQUGjUna z;*I+ESfsX)evGW}5c3|1Nb-Kvf?{Gi^Wlzsglb>8;rph?AukZ&?|0;x2PofqA$=pk->yXJeqARY5OeVZX?u@`V*y{qWSWll(6y>c;AevX!zD`9_4tvVaq(mk!p?Ut|lY$id?TA)Lh>n)pY zI`q%zye*sYU0KmFwMRcWQm`a6-2S9cHCKz@Kt~{iBD1(b3VZLYc%6%ZvY)J%`8xti zF@nwW0@d?Q5p(;+&WTv9emj%zw=}ZWR4@U zrD`g*l4Ssp{~|Q@F8V4!5zUrb4{T~y^F&*yS>BYv(tTlOd`@mvVLeqNJO>OW+ z>65)F$&~c@qJ9Fw8pf>jhVw@L3jNlUqA^>lU}i$qb!#u{cbUNa~UB{9k!9J3?A?DH2vN&>v;rot2WtWJni@*ai9YWSw&Zt zR*JgUM(Az&f){u~hg3J8ozoG824bF3Q**_de)ud48w`g*%A$3NBoag1LaWzxsNul4 zUeC6mDXB%{Q600JR0}$E^OBQXWzqb%5mkLl``gu&#`<%)MTygW4}r`>_$KWuAzIaH z{DlJE#K9wJ$Ql7=ukmWOFkEh#zeCI_axUE!rwrxI)~P9}$QRk>W=mK#M_JRN1p-Aj zwcr$O{CxA)V&wZEY04hS9pV6KBb#)4;y=|#TvO5jKM}C1t<|=5J;W5s;w@nD$JRe|jnxq1na%QFLZXkk zSj!p~3UMV(sz+$}S_*C`PmHtsk_gr;u8LeWC!{`v&{V00bKnh17@=zHtb`3R%Pi>ftpN?VANsqI#8W3r_;snxq4VYF%|^abu0b(G>ACLmVxJdzQ`u z@{%F3g0)Wv9iNI!6jcuKaHFbLXKp(d+C~>__oSRp=7dJHi#I8LmE|u7&Q*h8=J4Cg zVmp8TJdFf-rz3B#4a>6U*j4YlPXNo^RW7Z4b|ArWIqgJPW_5j4+s?fmh3v$V&eBZ8 z?D#yHME1RvcybI>C{L=g=ia8R)wQ_Sc4L~QKedtgth-})g?x3e&P@# zvV}#JtWO&uqjPFuVM)IFVrHH*nS)!G@FI3bA%}Amac)947eyMRMeBL`qZ!YSgk{$5 zt#F~_fUnM$myeGV4;0{`2^u*SpV(G8A6`n}O1RCWv;-?>M9Y-ox`Xo4&EAcsKuIjh zjzy+bO3uupU(ND^c9G>DJ=b+rVuF;5vcVWVvHi z&S+eju$qY!#i}I&y5EzeD$x{Wxl3#L!w*xBKQju3ww?>clkHJ^rY#p@@5~Zl* zMg`f3gG~uREJVRhnmx_i>K@|J@k)eac?&i_q;JnDww8@CcJ|m7UFLdJa_b-EUpusN z6If;?uwz!`sPT&Bs${?(m9bF#lu-E@BkNiQiI=cZHWcg4o!seAVo)FbM#~>;7f5~M+Ja`gM&eWK|nx$-9UV) zE8qYKNHlaPR17jqQgSv5R(5DCN>L6m&TrUM;u0!fN(}6mKm!H^{ywERK4VYLu1vV> zXAg#R!an^PJp6((+q0fs$~TUk^&eg&gqi^%CK1D6TwI@kG8(+E8$|VT!;dJ)g#}d6 zbr;9<_f{SrM4_4a_MWxNnwP)jwfX(LeT~ukTpLpXXApO`E@4e?Hn0K6^Nx6Jh#QAI zUw}g$u%zqRa|*F2#RWQLf7b?L{qWxB9jK$+1^+6pr!j)zc&FT#K^`J6;w?Ku%MG{! zoaWI2_RiTm*5l66e=@Foa$muCrz9~JOaK*Um${|o55LV#C@S6exwyD^rxe|nXU}YG zY|mL?v9T8RQT_y&!J^|&?)hBVlSTUAnu>2oVyLS`l$V#60cm5$gD5IA5?*5EhkNNt zlc*t_XSgMv@i1n*QeYbP!muZ8y<#^kdaC{VMbsXw+h$ANAB0lA%MK8qj z*kIdb&7HuxZf`?bUZ`epS{7E1&$C-ovW1{Ls%IqDKNcYaVUk=e44yTmmM_jfIJ;Pv z(5Q91(zljPy!3ptd1=1H;6GK;d#MC-(tal$LOePJH>JYHc z9jW{47NKZF|5ho?vT4o}X{(=_rezM76Bd^R8gnNa^+L`|;~gN&x@oWYiyxV`b9eK`|Ge~KRvD8wjXPE&C3-&?72Mn!i9^ya4LAO zoXn4>LL8LOQnG!cu`4D8Am+!NLrRWbub{)O`KG4qow6Pj&zj8Zfc63A)-B=VnHadRF z)iu`VZK_pX)|;Cpy#lg(b*j`oM-}A)zs}I~n;2s}bB!XTt#HHlRfl@oyubRgLv_b* zUk2%LN)+bjzI;)|AJ%eo+*W3nw)nus4U}CtMWGD^IEMPT_ z1WR$U4a#`R6`MQDVVZ?Uj^*H3&sspH(&1T;-;dT~tajud)=fT7S8#5mtz<=M*ge~= z>~JTRtgED%3wUh3yK*>zk!Tr@9Wit`gpWlDPaVH@Vo+hj_Hu$eyNI)op3NI&QaWTC zA784Tj}V1T_Tu2<>hfPQP(IaHw|BS)Nxuex!#-kXA)ahfIXkhOP?i`;^#p%pj^3&! zXZ{2Zp3+uIfgr*@0h3$#mycfBP^R8s?usRt-K9T|M{?nI0wb=EN6>#*r&g}`LVH>U zPn0<~k=9oi=f1&X5XYVQy7cEW4USl zd9P*7H5MH33jSh;n;FKNzQJh=FGQ&3mK2{KweMX0Z>nA;Eeq^dbf zjGpSyKjpBnq!Ke}=cf0a_?*{Dmn1Z;ZE&@yZdPVPV&_mA^W&FVOF!KQs7S zQG&|4k($(0k$Co>qfKPcpQBY_TjeZavu6|EOyhCIx8gi{-;yBaCl2<4VLA+Z(uCAaaHJ!>~H9>t#bd>If z8OQ&=NaQJ)y^5%Bypt1xPB*`L_WA0wp~FJ`v)8_jLx+B>{#5I7KZI^+`9mShhO)n1 z-ax)-Gv469J`tC3W+?XnvaT3<3W4&waFZOF={-2UkH6cg$8*bL7B-D}mWm1V0)Aa& zUNb5iG}+3mp{v(Q!`yKr)QDDWr6YN`qLFo`F@(m#GV&azc>TuUp{r9{P+U(;GA#O*dln}GRm9m<(kj$-4k zJbBrtl^78)OjgAuCmjTVxkuK`oY8D48co3W($DJ6XQX$fob3&ngac81d@`;0&abkp zn01b1Kstvy$2y1FBreHEG*sE4?Xa-f!S|3GhkOIK=^=y1e8~O58waEu@sSdft=Y{X z?KT0U;XF*LCYmz3FlYp1<}uUx0w#u5G$KwlPSOdjqxGp2LKAb1+5uKQnsb^oK}6t? z5Q6!fOF-8lY$G>0Xp%-bSe$y{j@@mQVX&G3dA6JShgBo|O6=+E5}o;Kw0NNZirDXA zK%+b-b*lAuB}N+;L3hzOR|Oz@wt>WTIh~&5FYfgF$>M7D@4%{qPS)rL1xrw;RrA)V zF>Xm_Km8+ae)!_`jfRP5^h`6BlU@>8k^E9g%(E5(8y}VD#{f#ZXT`>AJ4kE9WbohP zo~S&_hL*azS{@p(Bxe=GdEgt;vN*ECd+Iq-jBmMsn({3N7%jHyY2sQqm}e`x3u3BA ztUL8C-|~|a9dvEUq2tQyuwiGIE{F=Tu2j@yE(g48;J1elZAj(^4d!mfL7 z-d!f$p6-@S72Jw8nyzXJjScgXPgX|ze{kUT`Egjeb@k4#$gy#cl!n%1F;V%FI1o>C`PlylPQmQ>d7uj zJmXs7sS0JpdWTiDYyp=oA}a2x_z#O4OIY5XLf3M;uRzMONzP%$@YvAz>!2H={ePaG za1Y~cE`rAUbwGQQJg?p-FT`_2tjx1Bx`Po~5Ee}w-ioiSyaRj5$eDh{L`uzX>NwJ< zg^PyQhr#b;KG*AB)Z564MwNz4_DPN?$fi8hjo0Z22G!H({UZ%$-dl8JzQxAfrMbR& z{sznm(|8liX)wta72&3JYc5?2w!GISfnEnf|(#t+wd@jDn z&uO3L#`S{j9Z!0=6KmNAwm4Km()s*kSnno@?#Qt|Q`}48ieY{YY13pDV@I^xDdgZ; z%;8ezqGFPd!#C76%0%gSr^^V__%Qw<&S@Oh_O*4}zWciYMrHu=uoU+wEwIIQ>C#0{1cYps-+ivDzjS4harxG05R7ejs;)n+%#6 z)C)#psdK`)&On-WO&hMHp`ib;-}ct2ANfv~zJSA!&jS}c^}sqcH7%{+M{mVZE{L~V z^jjUQkkce$0HUBYzQ#>h-c6~c#F@a(H!~C{gLR-(P(BhSXmt9D$C8!Gs(FTelRm0z zS|)1JB0!5`Aztma7wbZrfRC4mmo;p;hbyE!DKh#Jex%;5_)c6}?t_GjSn<2gy$WE< z^rvOuPdlXW{wIKbfy-TW0KUn~$`lB45O4V?;K8-+K$=X8M|!Osc%%)8pafEqD8O;XAGyVn>?JkXIdW5C9Nxeh<{9S8YkuIltF^!##SHAB4} z4hmZ3yYq>$}*md-4fR; z%*H-op#}oNSE+P?QCJY_z%j}m4UTI)FEq8}OXXO15Yi)@%}G15WvdwK?^9Eb_*pW@ zBz8SEti+JGQ5C8yu9IQIfZl>1FC|8mXSFlgql9MULX>}jh$_vGJlL|c@d)F@!{<)Z z61*@Zw*0Z1mt?MQ^l;9mT=j4WQa&2$pHncqUPe5F6+FLWcVw%@c0~*zW)=zU>72|w zH~*Pw@oRLbuO8cOSv6FDL*<5TIk{49`@vrU1^4eTKRDY0V|6nfC>-0i`N+n~PrMGu zUL~K&3>y(8lS>cjS|*nwebpqn;8YhN(v-F6KdfmEI&JwVX*CeJ{>@)-X3}Qkqur05 zISn-Y_O1z-9Bwx%T`GrLxy*h+Mo^s0DMP-l-YeVDF4o?(3Dpy{RL5t8_Ksb{CdyI# zM%@z(HHE9HiSC>$0oBOxNB2YE)%>ovWfsPiS$W;Y*H1Wz<9^S(x@bQj3GnCA8AgFX zP!Z^(r>RMGfAvg@aB7PIhA_gJ>1&cP8my2r%TiKJnP#gve_AyYx5(Q z-%!(eRZvL)_Fp0rp$NzlU}h4VY0MUqPs%cZbxyrbQb8 z9SNP@k)MEsd9kxj(azdl!K;YmRReC~tsc=d+zKr7SBvzi;T;>RG<>(`9;O+Nt#y1P)aBXvK%?U>y!eFDzQ zz!)-=_ltW;IrmRPOG*#?!Q)LiE%+}-#jQdI%(MTKRaPL@k!u)Uas1W)yca%|fqJ@{ zRzwtSr(O=fFVC@uS}IQ~YQ+kH@pt&Ai3Je5bAXiX;@wkDd!iGDw|;#{x}seF$kFLW zlJpuCv*-`|N3hlwN8lnIJNY&Z?xe!_;C8o9!xKmaDWR7(BWPS`qx=eh`5uCHCHo6 zav#C;$g@wNLGy$kup^pw@&QISaU3Zd*=()`fHS)Xgu!|~&nteV2 z8_KWe%NHz-4#y8HwWGndCj*~=BuX#aQL!}F=~4?MKmNY^@Cp79VuDXV3A=}yKfBa) zKVpC0d+fXYJ2UO0*7YbU^U6wC0}+(i{;-RZ9rJ1JUG)C~!yT|~y`kp;F%W=!>hn%8X z5k1?_Z65K(-$pMx)lF`xQiY(C@_o zcyN+pZDeC86AmnZ%nbXtJ)z>zvYY-pGEN->zh7r=h7SD!i9Oy-HEeP=dV?ucO{VE@ z>VtCQ{bHPXA#F&&+N9~=@EyauU46Zw458GV#XgyTPDjm9qm9r6^fJ$zU{A;*%$Run z-F?-xm+7;r$g;ZMYQjrYtqrF|Nhhqu*iY9H3HN|K{}ckyb@)aD@MhlWp?+hiKJgx4 z=7#cTJe20xN2GE7(%z$G{rzJ`Ma1!roiPVL*486cyHM7~%)lchvq#xDu} zt@)w*lOaw=f6{xFJ;aXfnJ~5|Kqnv~0_M`xpYhS^y=vRT@C7^16Jdh52xK-l+`$Sh zIHjf10_^vnxL*J6FH*kz#-H5iO3=psj)(1JSUss1OJ%yaJ^TrH{*f*8)b|6KAK#vw zk$)-w9_8SbqB(49H>}%KUaPZywLjlm(dkBBnapN7&+w+>C=O`UA1S>1N^>1^7Vzud zPVs?*tb5D<9PzaLH*uvKgR#l+zv`PB_=;2G>DlyD3E_@r5ekgr@=ER&1@)iaW~!T4 z#7gzw?KV_l_Et@T>cd9A zQ&}R5+oE%81OiqA%*NBS!&+0m`&IBk<+OG`EL5Sgug5qri#R=Er66hEVy%=+=jY0S zfSI5=tyA2~!svDVPr&z7ll}Qw=ZhilZ2rlMkdlT=_Q%_LnA&?#pW*S}ZIHX5 zf(1BJsPneHN;(&$Na)+&6Xmftf978v^wRY5MTe*_wTc{P!h-xyk1j7MA2WxmazW2A zwbc1PEs^@Tw)whO{IuP*o_)D{R8?v+>*{B_Y^Z^BB{Me+IV5}}gnqT5^K^pA>kBss z&s##Vx20~rU07dCw#vwS*2vdy}4i9qV-;jn{u25wYT}qD_VVD zI6BnwoO$V(z3N=oZ-NQ&OHvHA7vNwwuP~abyQV*blcCuLt_6VoNf|8{FDA|~wOFPZ zhqLtgXj!eDbJn)mhd|tuJou#VTK~tP zPO1fVMuvF_Kle2)rq+s5VJ(-V_`QV){GtYnTi_OXq(`t#+&+1^?>MVv`Mt;%&EC%K+- z+1fHloUIFpQyaZu$~ZsnFWPv>8)w@-IN+zQ3+xWgx1TH=Kg)l)Qu#gc0i-gC))wxH zPl;|_KN5kr6YB8zFc-<(iygKsO(Oj8_Bb-bg(dyE(_MXLuU?ogGWbwyzHG2(M ze!Wc4ZYU@Xh#hIIuG=68$%N(@^|+9S<#6$y(%(=)UcWJliozeGd=AL2R3l(N3o!Ae(#_AjWuehL3z}U#!GERM} zKMNt~RJpS1-k-r|yml&@-)}}TTn#v2vi=B@G4nyAps00sPkFt9Xc2T>-rlXmA;$eH z?`&rDZ`vmSvkg24f8^$9DTvHZ=Z`8uxf`VN70V}p+KPnz6@&BF01 zxKg?}D~bnMGOd`ymb zRbwg^>N0OD4@*q0c-O53jL_c%{9=$d#e(G&{mEYU+9ssv{?oaPgW%`HzL-o;SaoT;1*<`k;-E&~9iX5qVZJ z05(y=uO?2VhG#thD%A*dmIppMyO_{3F&EP$1s-H%8WFotHo?bjx_K9VwSKV8v`8L3 zz38i<&dp|OF-DBQ*v;55EU`iv%h@wpBQvm>MVBq9CgGIvJzHh=4F95GDuKHoL8dI5 z(3T6_bMFnA$$c1llXeZ*WX}^HV8PUDw!rf9nK60)6*Z-h=CJVMys>J!k$>|4tE$e} zdQK|Q>||asaC6S3=Ad~jmOz4d#h(DHLPNxf#7G8R+O?_B-`0|tAnvTMX|qbfq?B+H z(=1Y%MFgc%lsrTd=t{`4p&zsDV(7<07R)M?sB=r4QWUsCg%IK9(B|-d<^SscGNhm^ z8Jtc_a2xH)U`&~lgsEI4oAgC;Rq~m<6i>5GREA+v39^<2op;b8H=@)zfPo_YD1i6Qcl^|3NxE{7#}k}8MOwo^M&X6*Px@} z8!5FnH9E#LH~T>0*c3;bSSlql_%Ax>wga*_wJR|)lC=g7afrlPh)}he{M7@eM#4lA zWlfnX)me{4ruZ;Mr#YG0*aJh*I{ghV4`vM~aGmBToEa_vx>YVX;`zcLR+pwSVL#cP zU2!ZKn5;7BV5u4lIz7#UcI(S)nh-F55>yPo9YY(BW_xcsuD5y3td~eE(Q?+B@hDE? zGy}%Lj$TQhi8u@W4Wu)G&Fq1tmy%Uk^{!@VZVF3#agKC*vPITnAPKGd<59GVwX^lB=i1LwGodsw9sJC>tCU?QaUC_|z7B2tKT1P~K>dG|hRLofqLl;7wZ) z`IVk8(geB-n{ktABdM^OQ+3S0QcMOOwobwqeA@9ckTT$sg_dT_yNYE}8!ha{G7{3- z&L~876MPyuEkZb7)h~X5#KdR^2jwllx|hG?>imr0lJL!(*|3t|Y))13EO55#@x)xi zF0jb0oyT5W4=?P-Y0kjeW&wAd{;5PS8t%8QBZf z{F~E_JnZTom&6tM0C7e#sw zIH}exYD#ET>5%foQ5Ojv%%+qOSU|X+fbitnvHYjCSH{uF$;r`%33hgN4t5TzzX`tR z@z0p)o0mK$W~GgmntUqF?21WZ;uOR2&lcHj*!e{niR@BVXQSsb=TQp*{VzeaWap#j z3cB+mj#`c5y#PT^gCCDab}$%-rzkoOQ}se$gKUHcgGmefnJo?pBP|h;@k4us(G|XDH#f|AF8ty5~?PBa+p6<#`dEBv3dP*G1 z#qcOhkqHpC)=V(Quvr`Z9EeuXiJ~Z#5nH_|Czi@kh;OGk@Ew)nZl}Oqg)q30kSgjP zbXP2-eyyV&l$p1vWYkZHkl88XO-~UwznJAv{HHutR2?lzDL#~$Nb!zQwl#abvUNub zqEug%xb2(8lKO&J0+iWd5}OpQT-ZTI(Qx;0vX##^R0$nl;qXYwZYhI{P89G z*NTn9n4OGGG_Q~P9%@|?LEdVc$dahE3Q3!+8vgK$c@b?Oit?f1aaQxnG^G>c(&kSN zyM6(E0wq)WGC3ZWjNYHE*{kK`#D`c#W=Zyo?ppJ)n(N5GwZXp)ZCqIR`gVh@nf~%S zk*)ujm+6TM3FAiZ(9=A z4SCS;6*mz+(wR!G^`vL|T3=~D0sYS;ryUo6-eYw1UyTpK+a!P8L{uacy`L;#tZQDk zDC*2^(P|?{)$=O9!jUh2uojAmPCQy7+!{k&k`BmTVJgfdaFmYGh^}=I;bVQ zRdASlh`-4;6I>LXITFOfclL<|d6Z@ngEU^^$~&rq;C}zqiDFUyworCa4Le1{oi{ob zy>%kqC4`?NlbECakeY^)+%it5S+eqMGOBSMgQX{e78K%@i(DpTTscv(*l~j*7Q(+B zut)mXx8S*H^5deye2DK7v>@1*^-K2P0Pb!zzrW7$PYrtPs*_REQpvtt&f3ay$3$w5 z`YrB{+@&T?k$8j&NDZ^M%e=G9vs|L~(um;T*;n-#{;XQt9!;gJX%!ZwLc6YtK8@V2 z`3mWb-2g4_*I$~!35#$aq>klE9woqMTV3o!_f7Mj?^%fKQEyFWv5PBUGjJ{`8?C@! zHki8=d+<6?4qr#(!hJIW- zQ23}j&@C2vO>Z>tr)z+w<7af$tdLLPi+)(^roaTh4N+mBRb@&eQ@KNfN9s|g$z{+O zOaO{&FN4+~{1roRijDkk$al;YW~yN=JbiPgY<3Yz#)eLJ!Q=GrI&@caP|%#;2-wEV z_yr`E{gYhBV*p|FZWJDzeEhv(o^Aj$Ge**z8v(3Rd#wA-&D(1kFa%r_+kG31YFYN&s0|RaG_mLDeA|Pj2D-P zF&&TLjO?j3OWni%@Civu`UG@T?@T|~mvL7j5U--Dd=SvBUZ7$AAoHhW%ud_o7Ng`c zl)`65uc0tC_|dRfA3c$>aH5h%IB$h6hlH8C);p0T;&8zGHtv^ zL$HfeZycY>pHvBMy6j1GV7FB#$N9s?QJA#VIllEJg@#93?PJI~F83wQ-V!%9%4KlI zvKc?*Zqga<1L@c+Yx3bF^Xgxol7rIjw+J4(#h+ckM z$&3V%@?w~UYenM^U1!xXs_8wS==OEwQbFB9(Y2PbxMQA2O{ziES08dO1Qez5C!`qc zD9I8u0>R{v0Bs!@fyB-}AhPpjz7_<`qSGA0W2C76!*;{_-xrpxnN|NM|B1(uO3#Ws z^VccmhWE>Da|c}E@h$QM-B}S$Z_-z+UeR5Hp`No;^+7H21Bh~?#H~%;ivh0RXF~I} zl36*8)FMeK9o}8373V6=y1TqiOkWfP3fEFSlT{hU!FswkeHMG;ciO1o)$-{%Q>cNm zG4^HcApk~6JoarO1T$lG?+!d6xD_#BMF7hVJw0Ys-Q%S{RLhfboW-oA8@6oT=>IyH z`^x8hXRZL&7|8|2*5^ybU>}{`keTxnVA4cpT7T%f>Av7sYoRaNG~Zh;2IEds6uf7q z&+HM3yvcFVcXGsWg#2sMNzcDna>o(S-9c!AD++&9ZFXJrll#HbXtc^VzlB!v!DbSm zasX60iLGE;eiAmx+b5}sMi3Hbahv8rP;iO1sEfxoqEA~zQ!JzpNz*5@Y1WrBm#QH3 z8uIT5FKm@5nZj-roZ?vG=gF0@Dre_w|LrmrP0$E_s-hH{8D(R`aRYUBceQG zB){PnMOL$d;6`nN;R5q&6g;cz8$ag7WbA}D@KU)AXcf>f{*apcQN6ezchIEEAeIwV z4%8Zca@J3yYOmPRPYwYCUeidy+Dv=qI7bZCkMUx-N|8vo;}1whsdO?X>#;{QJ0qQ7 zM_znm#iZ^1$j9P$9i86Km#ijv;Z`D2n$?7dw288T#rL7+joBlu^m7X1MEg_vY|6mT z*ii5_?SuI#9qr8Wi3jb*&ds`&UpCE*RWidOtvRUbAuJacOmgNAfgU)y>6F5&O;)Dm z6WM_r)voS&@Gpw#@tgUP7^+vqgR&{ls9hko7v!DvkYLmX_egh8|$s{hvrunc1G6+17wsd)j5q_Tp1^=^)EY6uXwWkDW%WUTwAP^ zM%JYnfR^0xtlL`F-MEU#tjaXY2_?jeI}zCEH2DKw6_r<3|AXa8sw#eEOARIEOG`3a zntMhXubQ74FMsapz3CE(unK?UA$9l7cl&0(uI1zjHZ@@Kb5NT$0A#2a-t(e({4oz4ufXFJQ8-40w^>u`I^PltT{3p zaWFz@a;Rc_YOmQA9Q|Kg;J6`kO%*U7YP1H5EW{TEHGj_Yg~EjwkPUAwf|u9%~$SmTh?bS8w5A$zWBtqS1nM$KN4!msp6hJjhf%DVU_k4@i+ zh>1Ny;_NfmDQW){*_b-}{H%%~mhm8b=eo_!MHJ>MQ}Hm@lLNahp(lr{3jXNT)uxQA zt}_~Mp6=_(!^772`GV2a7{J({UKqwl-lTP>) z3N5UXp`|D<`;Y*!@h3eZ?A&Z5B_4z@B-V~SpfdmoyUd|^HPzC~#u^VEkqP^!bN}Vp z|Do!ggDYvHe(fFGw!LFp6Wg{YwkEc1+qTUeOw5_s#sm}0$@88M=Tuki>i>Gz-PP5- z*1E3Wy_luW&C0mc%{%F8P>PJ{@be!a{Q{IY4&#W0&zUpo417M(KLEu)zO9lVxkRM8+w(m>GKMxhkr;yzBe(_%3 z@@CUxV>dO+Ss9-F7Vl-Z=}?~b9pXxNg{ZIScGDMCEZwt0S`1or7n_un&ppxbwPgK3 zE&oLjGQiHJJTqWbdVR{(LRN92SV4Nk+G5YeqtV!;rDib_iv&J%6(_r9DWr8>aNAq? z>PjP6az}#Ku%PZ6&HNgEkz$0FN!=9ZOp~cFrBj!LuBQ7pxF*Nm+eJs0)J=3d{CNei ze+!nB_SJ8lOISWM=;I0vfV=ayO7pB0>TkV+>Xu7>!_+BM&g zZ>MMOtgKl&tr@farB#ctNVPdXL}*^I?ZCBh%7$}m+F*QEr2LJRN8q;UE~K^Vi&|~9 z#CtN0!PfM1kH&|lqMu1L%l){DH6n9`$HggaHA{Rt898Rw`}a=vjrNj-=KitU z_R%y1is%T^)!LF3hOWnOWTG_PZ{sGUzH|%NNCZ}7TIHR5x7C1STqpKwN{x!_lonKZ zlv$dUn%T zSlYddsX+2S=~=pV#1~xmj-S|Yfn9}a{~RJcoFry(E0F_)*qUF=2CwL%=LYTNV9yXt3L|Cl(tdchk5(@+!A4XvQEe9 z+!B>}ih~ZQ%F~5m2<%a+MV1AI_>@)E9g+m|U?RzC-@OMr->YHja`1>VX`&{CFy@mj z6fO7ECd~x@0e(qR)&Hz5JMdn^eFgTtlKv!DP-yCW+L-;-ETOR zsf;j`c{|v)AoydkE_fKccOhP4F2K5mBeVO{{5#1SU38tB$%$b zT|3{?NV78Amg$3e3LCs=aD)A=V)$m3E5{8-14a%?woLpb3Hh%be~%TIOt0c+5Of?g zI<~m^*+PcxPZkLQmw4dHm2P|F21jU$j*dLe(K(@rl9pn(;?U);|E+P*qX0ebvz1@PVzoV~bz!gxYD) z`I`@3_|NYak|9WV`ux=ByWf|>`+V_6`MdA`0rt6ss!@R2$D<+7I=L2G>?>TE%ZNMb z^GEH7#>ZBRYs>kfl2CgU%tqgQl>0u2x5!G*bEoUF9Z*Bgy1k#gG#Jzz3?(H_@bedQ zRC*QIFc@0G_MLZ>JzR;U2Qs^P-Q34v8e_>EcpYiO%CWUZI;vpd|FCi5b9`67Khn7- zzVO+T^N1*wMLHEEenT(N^we>5iF^$vn|d7MS~iOvV#$^g(4W&!d1pufOMf%QtRKk- zStA*^UiL@x0pE)?UEI6b&y*@jl#gJp%j$k#_hZQN1|Wf`L@kb&*j6&_KB=Gfrxza2 zPMiG}1pR;q`Gc8@pQm`Fe_+))uKsQnV_0C63mLBzY{0ZATfnqV^4QS7L0z*zO}k6| zSkGo+%^%_|lae5_F0&;`OeK_fh2kV}=}gNFra1ZTOT-Slbn(NYdz!cHB&-imz`+mdZgz3dQ=(fSX7`ZPkHlI+gC?!1u~ zQ^P4XP(ll-FOiC*u`Cmoqk*`>QDDCMFcVRIbKLCtbq&XI%t~{V2YRa~FoWq0r3Ie0 zLCZtUH()Vr$P_A46HLi4SW~t=?Te`;6NJwa1qsZ0YPi?Xkrx%r` z7cJ1#f{y(XDf02G{5GKgWbDJ76H_6SvK}kxIqYYI6cWfw_3TsP21v&k`R<-I@RaEX z?hGGk*;r42Q7QG!G|9au(lDy@yJ4ViNOd!wF%mC35?bwaHGIPG zG(J;`x0wwe1wIiU{&%J9l)`YC@Xx#A1o{-jb3U4sQH8u&2mI`r7`hs~T?lCB?#pXi z4f{Mnrh75dv8hZlC9W9KrGgp?4b?n8>RMc8F3C)&Hi8=GLyf2HqYQZQ*YGJD z*tYFdR9N@=a23Gbk!ag=HUIS2m$#OK*{?73@(CeJgCZ#|cqQ#`>F8xJs??l2nmaq4?8-(0E)ln?qQ8DOvC*3!qb z<4-$9wCMF+f{Ti|z$>r&V~K62t9Hd}S_h{iry+j3l1RkbWPIzgAWT=OX>we%nH{d9 zh<9RIQ7p+6|87uG&%e2+@s^dI-h)ravtghI?u6N^n48;zLpV@NOAm4p?-Jt_ zQ07EA!$!D0J$%w3h9y(L?)uOeHGO{kP8^94*0O@`QCic5Kk=FNlJTvln$o6l+=ttK zq)26hk8k&HKviYiGDv?`^eA#LVOeAgiMNIU<0Q_Ch{(m|T!1UkyrH)USr*m)`lG+WEg@wZH&qWUQj7DkjcBNkvVhLkoMi zcP#&})G16xDiTDG`t<`2$rcFb$QF*y{Y?d5B$O;4PMJzH5+O5`ZlQa8T)*=g*yRVo z63f!CtEAlMgXY$UJuMt;i$;5<8l_q+8-=b8D~6he9K5$`kANl;V-lZ+Oa%6AtFRKe z{epmsVo6E?bZRk_u?E7TXLiPuZ>^GV0XnFYwn*dZk`bWRz*Z)@sW$WaJd-oai&qLaFwUA2D3-W0dO8T&M5mF~rS%-GSe6#X|@! z#&O-?Wv6pwA8^aHR3GbOeON=uU`0Ypn^lc7pf%~h)e1Y=s#5Aj+%*}Pm~hM4-?1lP zPkb`4Onu6Gs9Ba1G7X9;%@i{#3=>bQgVjfuRMVDUA}2~%*-rJC6-aBp{9$xmX&6SEyIB9EN{^nkVrQbvw?=z)M{<8X3O%TjTOejwITi*ESJ+H< zWxR&gg0QPv zsTN@l!J0`|Tb>%}M|RmUzo^4yG_KibqJxN9Xhm@=w>~P`_~|sGEQC;;@ic#b%(2hx zEYL3tkr#a@ou=24JyW4jy^jCI#CT%-lXxANE7#qzf<>gwo}$|1i}gN%vz^NN^M!~N zIp(yQM{@BXGDq%@2CF4SQ4!LNwlW$PGBuiF82fLnUL|k0mLdu8!bhUUQ}k|i-=QPm zTa2Y07ST|QQhoGfSYJw-Qg-?=RmNzI05cAB5|0C(#d7H}p@WOE5gE#!*76Ao1CU|P zY${-Miey3TdX$h{Y-g|1AY>$f+QMs3Tx#;T7o?ru%Dnc>x)%ei5nzkKZTknJPzTly*6dRGaL`oFc67x&a;3=mNJ9pp=!9!h$8TWc+}a zkW^8eMC+a6(djr*AOP6!Y4}Q;IR|uTx0_7^-S_F3XHzxKeY_!Ofnws+d8Jn4CKM^~ zU=$^ru;I>7+83IT-VIsRk%LUJMGg=PpI?_+o9i<;WEOu1@4mMed0y(sS*FLN9?XQL z<8Y&JR6%C1z*h&=>UQQeU|A(A^W2r#460;-50M;e`Z`lA`Ib3y*bSTtFuFAO1&BV#sD`auhewztBR&A!ts;o;-l^0ib`3AXKt|UGmJ*UP= z%oR{J;PM5YIh_LhF~w+{WOF}~h#$h%2H1((V@!?an zCdXdVWXPlYXzzG#z~;XH1E@6}Io;^fuys1B(GRa`@?mEjYhs4mC2jJz2( z4yU{j-f^yZ08f;7Y6J5(pi*bH2;oa z0XHk`ewy)j)J>xJ^hVSRSldbm(+oelPqG>xj+q8)r|<^U7+~+vH$fnvBa&eqF4R9t za+x>Tnb%B|n1*q)7jG~+pz}?;@%BPADnDQE{X&Id;;dh5o8*ANy)v*&r$khaovhSvg8ir{k8$csH*ZA zm1D6J8chy@(5RQQ`L^Q5$vZE-Dh6rj3Co{@*`0P(z@Gw zTf%LT^BGIo1p6^@B_2y?oIIumK)h`25I;#DtC0;6=vWcrDSg@&p3fIDJ21nkaM8;cyau2&WmZT2ZHtu;zBc1W}4>q zuf&=KBK2|oY44fpXEg0GCmk$asI`Zi> zIhKM_RMrCYA7kO`yRRDNpaAlB+UvP8yYZ9LpimC!+`X_3yjvVDDhlQOAY$n?oEBx* z1~g&8wk`aRQOwe3+NHM$e62J7xFK!`q$@D)1wB@EADA>_LN_qYoi2%M&KW-`{xq*3 zlED3q2-Ld4$nc5x`4&CT&+v!c!@J@;_)9;!GM+bxiW_;4x;qK^yG_94< z?8?vU#u07$f*Gwh)hJ)zBpMvSGndd3UGDDf7C-tTMKGD>XIibdPUq-PQThUb#0il3 ze=BEyda{MH-Ryfjif&@DO$`?sNs3dDnOiVG;;lGf&n9S3}Q8k^xSb36*_^o&?lRJndl}wz?J+$emrHptM+7VOlq28DGow*&v4DA zx^9OC`;X`gQ2@9t`m3s7)&i9=1XiE}oFW%LaR z3)11V^iE)Vu0cK)JEs?HGvNk5JC8DJ;BdR^`Wth2P4Ty|TMl0KRKJAZuO{#o11Qv6 z9MF}}ZvC4FzaFEUuZ6TMP@ygaPfUaic7g4HBI99WqJY1fKo;boTaTveo=oy9o zjg8nBN*ys}wN38fe-EjM41oPl43t5?i zYQ>peg+v8|wzn3wuwKR_565MuoJB;Vc?_rgW_A>y}a+wy+Y+XoiNE62jyI_EJ{ zVG}n)u7j!XY^Z&#geJoC6!(H3%w`i*ETHB!^lLX~b1nZ}4*CMc;g0&TR>3e5*z!C7 z4z~?BxiV0t7NoNB+E0}ui<>ze5BeKhY6#f}Wx5-9gYp=idMULZu#KO{lw8q$ESkl~ z%pv|$q*-$Cs$4h8k3_9Sga{S6Ks8Aeep&uh;#HB7Ed10_R^E-aDi|lqRdA#nAC?oa ztVTCBsLe?uq{QlsA!U6RW7B!>+dOmVT;)NUv%`8q!eR?8xn~kv>>v`*1OMfwV2BU+-Wq7w&+C2Z3`0h(szwnK2+JNJd#zH$whL9e|FUmHId1>%z|aj_r8Xm>C4j@3ZLYh0c1X372o$VHhn<;3eqLV5Kv z$z)p~#9BF`p}LoH5*NQqYtG%DP($ZM8CCKQR_T%OXVCfn9LJ2Ed6uqI;j)7Vf14AD z$7Q804A%Z7&Z~P)5(#-6X;E5?*=rPH0LD0xZiyF3DrFq$gtah0bd9e_${P~cU0ciY zOY|?ebrQv1)o)rk&W!KDZbV5<`iczYn@~lN?Xd^Qg}8@N`;7FF4OpWzJGu?5wASW5<$L*B35MYtE8SN~%687ha9Dkv54LOrl9`e@l`GkM->NVx-$EID*eaF!GeK@H;J6E$-?C zmzo0fJ!7bbjb|?7A2-cqMc1t8XaL`<2X8t9LduCZXP*t8u zq3I-MP=&8&bsM3J6m{+brH-Xwaauzx2Gv^T7_xEumliu>c!ZL<@_D;H`UEEJ*EZC& zG5xn&89UdSb$V($d=bUCB~v8^4_e?)wkQx_RCL706MOGK5U@#J7^o$E0c)ye=hHoh z|C&39KkaN_rI(wuGO}-Ssr8QXz}`m0ei<~nGW3$E;)Dx`snwlvaYb0{CYqb+uGm|+ zVkbWW)U_RFPg~^@t6qNXL{&|kIJH!-9o+&M>r7Y^ z<)9;K434WWdmjR<%1YAgB5j(5K^awOzvio_wr(kwO^Tf*WKpGcWu;v<{D5X6Ag^Ez zr?-;-A^F=x|DuQ9Y~oi?I1D(lKI5v&_E&S30GXQ*)FS3dWgecE=!$^LB^%Pg+^N*v zlbouCFh_$sW_^W8%p>?Dm%4C-5q)Z) z&GA}w4Xw5qPAc1w-U@Nzi%m-*&xVWB-)ye+5(fQ^=CR;{3*KZ)vTK${Ek2B+8?EjI zy;(j$BO@?rPe<1u6^gf$?n7GDArc&oNy;!se6T#BEjHY13OsV4_@%NdEvQ`_0*mA_Skm}Ur}w}972ty~ZXu8M7F zmv^jUiy)h8{bcwz&j@&=GX9#0%4;&5Z)5S!bQ6T}n6W)kGHGM1Gg@gg`ywW+@LvTl z)99KX#{v$zT@D=^H+be2ORC|*1eI8Gxe89WmFy+x&=c@uVECN=9{?TRbO3!K7(DNR z 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 O^<&OLGnkPBmg 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

_bMa=YU;RtQ$| z^@M>C2XzbkuigQQI)K|xzZ16^wQO3zKO#WZy=}|^sX!s8o@#hT5#?E0C+-L>iNJ@IvhR6+&;3Ftg@T@ zVjm$`mSA$ic{5H3aJT|A97Wfxs496sjA|_Df2F)&I zhk07;4luf+sEKeY<-HW};R!Nb%K2OnfCpKrRe!wQsO;wz$MuMJdNMDpb;o8W2lviT zXVyUDk-64Ic|P}n?sta|Sk)b{{KE_h0Nnj#CA|KOdHyjq{O5=MGrmup21FD805E(- zCGvHS3Z%W|UH6u7C43=~AME9>81hVZMT;nxFBG*&jxbIeOZd zN&yn0YH9xfIF&*o7!+5ac*DD$_jBg^w4ECaA5z=mw7ozr|*37fq5Et7H2}kfSCC?eWSl!OCr0X$(;Vg82R8m!ZWRXQVIv&J`KgI7H{? zsfq@U`!RwLdYNiMbbokEjb6LUV|?3&9r`m+HQBu4(liekaGo%{bBf8&_l-Oe!-pt~ zwjq-s(KU#IPNq*<{_%Gw`p3V<4O!Qm3h`zlK6}_t}WrjdqesMl=6ukccIST6h;sIWAdH7+p^Yw{o&L;18ss8g;iJZwkd}W-7V`pUe zEA@?vdXbAuOGTPfj38+Yss&##egmv^WU?x%iU)8?{9&kfG?>PyDFwh3Rggj{`#JZD zqa1sF^bg(%DGCH3<&V93!LUIA;^BkXWsn?2x_ z1&VUYtlT+gqq7c2NDnT+n;EBkDZSB50FpvkQ;jGmLN-tUw@7U7oJf0fcK)y-&P;G` zbQ1pn1|rIWy3!Ni82ZfwnKOng`Q&~xe%gOHbP0)j=k`PE6$N=ksfkU}-eZ=41xLSA zETnaJAAeZdQ6;k;!53<<_GCH=Z29XDVyU)2`HGtaJ0>vF5N`gQQWUut5{aH>KT1fVKh7Kv5Mv{o|3TYYuTbg0K@Q zR6xDQ>l*OnZqT+4#fT0yuH8GIXBllW-5Mv8B;g#pKgpc?!dsM&oYE;lGEnut@t!bs zc+J8fsg9mXWD%H!4i5d`Z=Sb|iCc!I(>OIx7)kfzAr8)-%s;%QXXQJ>Cj7g}Sopw~ zPsRb~jOrZOsP^MtiD=w4s&VOuzcmjEis zUk5pAw-pzq9mZvj2r966JxMa}RBFNi(Ey3aK5-icqhOYMPCl`=_|bx%q9+LH6XO^` zWb*bm*B>Tq{X{H6Hz!%9|yZ4=Mah9N}{Y*|a=L-hH;Kq?OiQS(pP ziT%JFDzbXNtT+@cNvVPYO2K=|GN96Nj;Ifl&NG(>jsEbEy!Zs(SWuQ;@lXkOt}wo@ zzVU#>)&4Q$CX;y+P+xd5%YY2lZ{ACA7g(t>q?^MEC6BBdM&nkBa_bWpR|#6}PmB(e zsCS4(iKreM(T&x2fl&6g>vt=v6=M$Vn8@HU`5Y7Dc*SdkC^{MK!gYlVK)VNGb{P|z zZ1Cdk<9+Ak$U3kSy?*nYpi8M)UyM8;Q9*aXs*QNRcn~2?Zq-+d{Nj~GbT=%d4|$}d z{;)QQ@re%}@rWAd9$j^Wsn-Xdznq+e-CzDB*T(@f97_(eR;-C8~Du* zx8D1}()-SZzlEdj-*6g@W}? zvD&U~lsglV9~Dg%4tn}kr_llaXS9GH0;4S6w<2_BE$ZUJ5%<_-xk z*Ev+K-kPV3Yfp>;xLir7{I`s>51bMd1Ku*RcazZ; zs^M6tITWN*!*WN6L9uuTfc@iTMgWy@h68}T9RC2{I3S9%r(R$CycTR7!g2O~@aR&A zK-kZ+V=X}o*z#g;zgGlud-a5O4nnVn0)nI|O!Do+HGg=tH`jT!jJRFv zuQ=H~@rv|yh=W7^@qj@|PFl1&Fdr-Xz&qbN{=TtQLP^)b;R*MLJW@rW4-g=C4)6ws zIvmqpE3NSS<9di|LU;zYc8TXN41@(G;Rb<-o#-h~5AhrvrWA%i|*SgFwqiUL7!+~*2Cmi4T7 zwU3Mys4;0FIqMbxZ0~rIJe=`?oB}BJ4ReBW9-Kh`0J*_vp=er#p0V&^n|H&cZBlpH z^Nkl(AUb{j0N(SDi5AnrKDow(4Oe36{p1T}#6rjU$RG)<5P6x+8@)bx#WE_jR;%ZD z3N_jNV9k?To#LO~^61vHNzIo8vajA~2{6CTZks{pE$bFj7XCY&_=pyXxc4)kRgI zVWXD58HMg1kdp;g_PorFt@arXQ4c&~Buh2r$J>IRpAY%K0y6NuVTl3I;<#RdqqXbd z#L~8k>Gh4G>TKk|EOcH^jDb*ay2MJooZ}2w?_a#*L2SKz`N#%~8+pB9ze4SsJ!Gd9 zcjo}GU!lg5$l-X+lTU_4(m#0=33N{IrZ&6#>(($^SC6UPge=%Hhx7y^T44#WHz#B3%-8=t(kO$+wN zMm%B1WOB>BH=SX5*B&ybpEzkfWml;lF(Zw6bD7pbj$|w6SZM+=^lS7OQq`xu*MG}~ zK8g2$pnkG6k33+J&|FP%`pLPY1eQjGZG3yd!*&4zUJ1(J1tYkeWi$Y)@CIJ`6*@cz z)?Ye0csa``SvKL>Nr)v^RA~3c985t0r-R>E&`3oE-oHD;Al*n70*;n9tz-7^pd+>$ zX|46VlBW&?fdm%pvgLRwX)S1%QYqgUdMU>5^M-AsibjHnQ~)o;`@kUu1uAV&1uIMv zk0F}`&SV9ok6MsgGJ;I=^<+rR!>NCyM!bCe4 zzQ4TOOQEh$c$KT;xrdkhSg96#*IX@XCFelhF`7l6RiMcb?z zfT_dQN;!7wPxput_+}{pa8B`*L)T_Mu-4LHRyN&S0gt1;@Yn(K?>2X*ITtRAg~rvH zLBJS9!EN)U!Zu)ly*C>a2PVdBPn>a~2A?Nb>X&z%v}x7v8-l1H&}B+!9C5ZkfH2V5 z&aeQ!D^TWV5FRsAHT8gQ;GS?pIL=P2@xK26SvBX$Fz@xe5GLJUIb)ix^Np;=Gg0dR z*J`f3WZOWFtOPzT0kDpz#%MQ*yeQB#hrb>@;8SI@y><^+wuc+HgO3&cVun=j719fzNICM>@2!Qdr&aiWOiwsd2(IoYSZe;*H#Y^XnKUnc4B+^(-oSn1lj&Du@%kL!KeUx-W0I6FpjkAH#{CM zylQ#YrUXzPZbV+Ym{BD~xik@n&LJyCh3HfFb99~}>kTEH>iB7dnDtseJ}@E%@SI@X z06ws^0YaKwd*!*HZ~6W){{S72PXYY>2bA}$ zIe_51*0I?_mly5h2netR*7mQU!Y-4lYnN$fcnNz7U~fm)dd8rj1P>~Zca^efQU?jn z^d2(i0BKs^o3;AHO%=5#>w^s|PTd|LXu_C?yFy>A@Ni*L>T`1Dkdb(;2`;BOo(jH`eAvs1e6Y5KFUqzA>BWQIUCoCFULD&5! zgRTca2y9t{#w{>}fkoXxg3J)pX7gufy<{YIx@J!b);2t=+50dF5G9?Ma7qD8U?9}! z!U_UB_noi~8MpI_&24G)j1Qxg$Xh;f%4(<;EVvw*a6|&S-V#pIIQMKNwX?D0Sibb9fk)usFx$5DWk` zNQh*x2RB#NInXAO2cHfob*jjoj0iKBc65V<@q~o{HR~B3Pu^Q^;!HY;AUusOG)udV zhVpOmiARZtb$=LH&i??cIg0!^R+s9`;1-#>*9AFD56hYgz@dqd1dw)^)K-l`#X4PS z#iLSAd|;}eB^{YW1FDJgclCgaEhDIWVLK_^YWUt7fk4)=UrCKVdEPn>9b@TXvc9mn zc&mVD!T}pu*m3#B1UK)z-iXNd4gRtQr*62w0|BaJhQ3;2lTJ2F7Ql3d`V-;9J~;_Z zc*93NTrx4UU~A3<9;RT7LaKDnct)U!XD&GfZb3$XQAt>!hjuOrNL?Q;cNf-C1$a}3 z;}{;@^8MoYPZRRVuxe6;@C+Y(^NhyCbWf1Kypbj45dMr{l)@0;Yw+Zgc*eL_Qg0Xp zpiE=I)VMf*Jo<7_Tn{2Me~dY`@Jn>bbMcWxUURfmr8&HbGp&Toe8f*-+(RB5+9_@4g& zoE}O@fohMP;gZ{1Y0uY;(H~py3cO(`mav}j_31uQaSHE)tkK(U5}R%aUpd#GlLvDm zuRHq70lv)M#$Vdw_FZ5hS=OUy^Zv0ba3+pF5C%sU0=n-tp`46S(~;Cq0n$=h1M1CtH*}M14rBA&IJJ5HJT|M$HquF z%}$;!8#Fo&n;)}ZStLL&jHoPo;RZU6_nkK47pJ^XZFH1*;>QLs zYk}9}8Ywlf;}(erLB=SuF2scU$0Gr2&L0a+hS`Da9fQG!+8n-eikiAtoUwKd`kB6t z`fzq22bqaj9AFxvbMcywKr?#URG9;D_cFd~XV&pHg8man>mSHE%@eEV z9R#P&7Pze0ygB1tVeI-|aaqKltSa_9lmL}G0~m_iXgX=3A~hq76>24j3aWvl<66bt z4*vi+^y+VnB+=L72&wqSjvjDNk2e$W&h)b-njX>TI5}rwryzBeK8h73pz}?e;r|_S7edxQm zKrY8PQ-6@aG$K3K(tqACf<#T-pBNh2P;N;53~|>aVirv_h>@6X?HJ-IQZ(~%$^nJ; zb$mF`ZWDXS5mFxLKWT{fR5ouGlTg+wg?KmPoE-}l_s$Da)5bWZ(5C}q^vpiugM|!! z@MagPH9zkdqZ0C|$?N=gg=(tA{XRTmfu|zvKh9MeHar@_(-V~O>kFV0MXmb5=qKqW zF4azlqvH^5D*Yb(;z6%~#w#yafFc?&aXAkja1V>Vanm3`@y-yk1Yr{C6NKvyoCxAQ z9uK}BSX~!GN-*(syqx252<)hN9{xGU((I^mePT^TWM{%}=hi04R4v$`s67z(l4&Rm zQ^?!%kWGX(Dc-u9!%P@xJ*+(C;s)@UBJG}X%dKH)T8-gIX8XVhJ|FXwAe)TmAx0__ z`Nzud4h@{ocx~nH?++Y$>mnbF-@701e>g@WgGteSZeB6ftF^aA6;(*O#v8MYk-PDO z9dm-o#KxPA7jN;7792Dlp^V+T)KjNme)2_B>H+QP$$%-QM&0}dDS_Z{9S_@IyyP3+ zQSr^iWMbC#pl|bzh>>*hfCjV}#6q_ahN6BjyJR=&;5fqvktP=8c^kr?#t#?~UO=bp zGWrlnH!Nq>nF@Di`1;A6Q(;yt2Hl4k;#~k>fg1!yd%1p^p(e&)(nxf>$1p>1r1`*{ z8r|*0Ob#5;r}VPj8+M)yvV#rbp{{!0c}Q{RjA2AYFbYk3>m5Byn*wQkQ2l$#;Hz*i z{^3=T2{`wZ#w5eE`oKi6YJ2qi{{Y+opyASAKlk1|G@S#C6pL{StkS5~-|ql0E`hvJ zI9ATju5t-;S?hTxJz)V17mMClrbqFFf9=VJ4MDw_UlDo7CiyUR0>hWDA6RC>0^MN) zn$&mGllE|+$3`{GSE~H^$CSc^3mwm+1RFqrr8YUv#uieIBdzA_HQDPLoALc)L^Pr7 zrgA^-oYES?f8US(0KysBoG_E`6JG*;a+c8hi9J^rqpLn067(3vnX!U`NIk{E+ZC?g^%*!0uT(uDemHPcK-l5 z)9XK`95`4Y1?dtv63vokgy$5%H;KN3KNw^d?|+Qw^6wIx>j}I>Ri?f%kZ+Tp|Jlu9 BKzINE literal 0 HcmV?d00001 diff --git a/website/static/gallery/photo/beautiful.jpg b/website/static/gallery/photo/beautiful.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d1cfb43e21c0d2822d5d87e58fe22921fd70728d GIT binary patch literal 80225 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 DtA68F literal 0 HcmV?d00001 diff --git a/website/static/gallery/photo/child.jpg b/website/static/gallery/photo/child.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1262b31a376ddeb047ee7858c7f2a1dd99dd3201 GIT binary patch literal 36057 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%0DqsrZSLPgR--J#a3YvSMiHN-2WOvs*pW z8U-ve6}xOdRz{H53bXNR{mWsCDpaklw)Oy^0pQ3=d({^PREt@(aR&F;KD@y)vP-bA z+4Sw#;-y%iaj;vh{GZ&h)TloH0Q`&PP>$7y`yYb&f?P$xDmxj}@jIS=7{@QnO7;3~ z5lXLRKc9=r6mP>6ZB=hC{l)PHEISXtAs$aZ0m3{dQ22D*Dpa`aQ>Zs4M8-~H@fX}9 z@V3OZ3}eYF99JupbPp{b<})Q3V(oA@nfwq`n!6wf+f{Zv%r_X=s8Xn)de-H6+usn4 zAf#1!!0py|^-;$VW1B~7)3xi|(Ey^+Ued3CKewnbq!y-Vo9p5IKq53gfi(2#{E#^Y za>{%e;@{LECTzBvFY|ft@ff5Qp#f?))jah!2nYczb?3V)JbvI)Xnn|lg}1@{+%7Cp zKpla~DK=Fcc+e;dwfSdP&2YK`Qi>>)A}S)a2p4L|>Fw=?fFh_b_w4#*-$Q|R5h?r* zbe(LP4WZ(B^DTC-RPqV_qE7kvEI$>8h^}=WPNCTBuZ#F{iDDOD1E0A3Jh)CiPh;~r z^B*q}Y}-5ehI|Kp2Z`Ywh)7-diX%&x3DW2lo@XsQeb4i4>^0bqQBiY(XR1*_a%$@C z-F$vwG-{i*M(Ff zvxG?s`h@j%fdjQJfPYU9?jE3QOKQapV*zWM_x1h98VE%|V=a*wq$Cv7JMaC;!<5jFPJW literal 0 HcmV?d00001 diff --git a/website/static/gallery/photo/people.jpg b/website/static/gallery/photo/people.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b93a52e6d827fccb8b0c1e8ed6bf7c70fe41e22d GIT binary patch literal 61047 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 L$=$KWA%OBvQb%Y8 literal 0 HcmV?d00001 diff --git a/website/static/images/feature1/graph.png b/website/static/images/feature1/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0597908e3e617653de3cd42ba29eb29b9cb06d10 GIT binary patch literal 4131 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 literal 0 HcmV?d00001 diff --git a/website/static/images/feature1/markdown.png b/website/static/images/feature1/markdown.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6c32b28924807802b888cb8f05bbbae59ad97c GIT binary patch literal 2385 zcmai0dpOf?8~=`(OFu@5{6c0 zLs(A9srf}nG3AsT=lJUVZwp^&ZfE#YMAmV@|^_mP0j--}UGbQ=I*ko_bp*Q>cxdF=rTJXBMDK?d33 zj&8zAJhi!JUoJj_+Ir!3-ywRRsY%Vs2M9F!fqm3R(?@Y$3z8M$CSuVH;vsC!y!*Ga zJ$erwIX-xj=vN)Ao3&D|alBkLfl^I&luWdrZgWxB2+HhYb7ew;S%zH}<};Iq<~DRJ zH2NPb{vkx?@<`Ky0!W58=$pHlENTN->wiqb;|(AOqGp|p`_Yydr5b-cHE2hza^wR4 zLJ5^1w%fD!59yNHC|Lez_(V+V;PD+D!iMV#`~dKi*;F|=tG069(r({oNs>SvbPvCX z*~(%keY(%CW%?9rj(%Me2;1@+5<(Th#3x`FG0+}Jv=MPu zl%|iQ0XyQr47@tfr~=a3{=c76)*Kn+b8RoNX2IgQm*#6C<@9jo&%6d7b`;j_w3&J5 z-P_ulQC*ri-nRp|F?dU*V!oo<<-*geA4M%z&Y|rrV1~Eq+qjx1H5K`Ku3*EHYtD8O zb`}ZaeR;)qHKdhtZb*@-l&ba2|heKg)R|fzL3@dxvrdHohHvsS{00LLCpX-=*)`#$!j%oxxEEH;K&i z&1ƯB!1(0xm4auEE%=q+&MfA}~QTln=w75frpP^`nRfxP4T9DHoUcg7TL?jbd8 z3DRTK2|7%NP&!lDDA!h&K2SE%9=r~Z_e6u;F7UIz*}-)}1Z2+QuRK$Ah$L2Mu*yd#xD%DX>N++7&k7#RN6Ol4*LN+bfO&+*>%%xV&34`Aj2 zA84sbqFhgBMBU)U#xYp#+QzhUUNmL=mu=ZCzye7>EixKMKVc^B^nkPHRaWEuIq>#K zTB*kM_nE3LN4d^&u-YUfw&4UVhAoEh<>b|QU}FEx^6uHG+H1e^<&a?tf5xz(p!#>_ zAI90B-ZGi(W#t7WLP3ZiXrIQf zmNUygf{qx;Xj?Sr;M}rvD^H~M3O~#xes*r*?Yd*@pVlgpb^y!uSC~x#XQMB!o#X0F zHTS^Na||9Su5FYQ5WuOjgI)L9u&85V*c@WxlJX=PQ`#Zphacmg5VEUZ@C;Yq>eCe|@>9;0@|qF+h^havssV<2VNvPOhv!CVJ78 zGQ)xJkcnMawzJ#>fca@A3!AtnVf)_Bv7frZl4OY0`m^MIcY{wqsLlT>kPPg5$ zzT_mH9d5RGBF-VlN@1H5lgv@g6z@c92ef}-zLsr^C}X;|CsoFjEC5Ga(hp$uhBrR- zY(YEAw0D-NC%Z{Y1~_`xBws;HFjHrLj*%8uy`C#wJ_tPcqMFk5`H{OnQh;h3SgBH% zdfq{3YI_k-7yA7r`-mtXj70#gS4Ex}-8G8Ys#xbXJ>-@M%|+)MC~t+^B8%Kve9_5n za4}>H;I5XplNIJAUH8`Gwp%z$eUw6*CvoObHk%597L28<2p^o54xv}dh`5N)i_}N( z3@(o59t007GB-1PSK2IbkIgrQI)YB)4_6pwlk)OBz#4jbULPFqpLQH%s5LM&+9wl_ z|1A6x8Gu&)83cDOgt_i7rb1#@Q^=}XP~V+b-&UK` z*d;LbmaA%!Be9Dd4Cp@b| zQE8b5Ijk#Lv>fvgN*t;J{&TnT1sb)@Aj3d<0zN%K{domDIgCnu{U};1-&}a~*fGW# zv`8Hm9gVP^lb5Y!F6?p3_>`lK(ZmaOACxIPqnf3Kkxsk;l+9K$?yq{jO!`}!f*57$ zGKZIfwZq{^0!`Z8Iqv97HH*vXzm(Fi#ij-GSJwkJeERQlmvHi}9IZpi zw{)1$x+Iq{Y;SNuWv;uk^Dh_OkZTgl!w*B`UiI5#?)=I(T^5Ygrs3hG=eKW|ibmG- tV#20ElsBvgnJNFEHnt>4yjt@n=!WTOza!mYKejXyu;12^RATKN{V$^1NMHZ} literal 0 HcmV?d00001 diff --git a/website/static/images/feature1/number-four.png b/website/static/images/feature1/number-four.png new file mode 100644 index 0000000000000000000000000000000000000000..52ebe5b1db24055d81ff62fd30d3613dddc850e3 GIT binary patch literal 11847 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

e>U=dt{T`= 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 literal 0 HcmV?d00001 diff --git a/website/static/images/feature1/number-two.png b/website/static/images/feature1/number-two.png new file mode 100644 index 0000000000000000000000000000000000000000..eb5c30f0696de90a62b85dc26bc8a682e5bc3525 GIT binary patch literal 12516 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 literal 0 HcmV?d00001 diff --git a/website/static/images/feature1/wave.png b/website/static/images/feature1/wave.png new file mode 100644 index 0000000000000000000000000000000000000000..3759438de79c806e2f91b88236d1691a40d5d760 GIT binary patch literal 2470 zcmZuzdo}m{ZJk3&@y|J_5c7NV`GhS+Nse$ zLRxYscOt#JcZ#IXc{B>x{$T~JW$6I0+rtKBfw_~%&F>FV_Emgi##^wDcw?8i-03eT zrz8u(Xq+{lz@Th`D%CV-4w|9TrUk3C?~wgVy1@naXqFj!pP=j~A@721ORVo+p~V7J zCx=Pe5H+p7o)E|*5}{S^-?cpG2y19YW?k{!)K?F_7Ms~PY{ zO{GW=V$frZXZLjJuorX3!^As&HX(lfO)c`tdp)|Vj&Am;yMt}lV!tpTeCL#y8T=$Y zYy7(Lsvo%?j~o5es%(l+jPXbezH@fyY38V4XyFdUFGQTgVX+*X<=Hgb|o6g z0oRhnJF*6GKy8)O?V;R(6V*S7XnR=kyq!Z<&c_O_j@?i6_N2_ltPsl?;SRFfM+xkg z9~&cugo*knqOiBa7in(NF{TdEo3jQIjb2B9xVQv}%sIkKf=qkkYwYo7YxtJqX&?&f zol+z&shu?w_(gcD0AiXvqo;59B9I)yk)`Fq^p@bc>tXVzCXyLlSs>4Kp__AhH9XUCA-gBd@i`{&Ic6mWsxx-A zN6$MPzi8Y<*EbWvE1-u{Mxh0p6BpSkVF&dukwtLD0<SPL;;IcpK*mNKgBwbY*0yYi`{G#4 zgqJTaNX}>>HS~7%FdNR**Vxv#{5!>Ah)wh!{3u9#bESG&B~K@y&1j~YQ6Ae4DozTK zhskAuYG#KkM;k*+XV#2yIhLipM(xmWspN*7#-cw8iv%R~Gx8L8TW;JiLd7kBHf<@U zAHCb-e%a8RJ*2bg8(lZt#ISnvnPRPg*0Ima$KNu9jqADz+W){L0pvbp(!h9fr?yHg z_AeNp8MmFf{ZUK1yfrNCb!x0>QnSkjQz9uhj+!|4N$IBFX?Z?8PO;!^`ma4vbI%*5 z!ozi|bhg&BJ3HgM=>Hgfe#S&qVjQ|3^qSA#y~Jlu{!uDMb6jev$Ua(L7!N+$161Bo zTD&B$FZ6w2-rIQ@^rwv|K$xxT*nNFQA$R(ayt20cYJK*|2Qdo?zTIUmk;_{+;@pzUNXlPNUN&957t;TV^Nh=B6LF3ruG zWbk2!maqe0zdQuUg3WW@=t0BMcXm?})Rt~{;k#y(7UesMdh+daad-YGl_PCITq6h7&mcEPTYE#0k4-siHtL23d~a#R4h(zk z{4;zcM|m+~i{{T7+P*ziIQRQfdG(aTPz!`JB1*Gq+w3!qcZQtN8TTx zZBno;>0{M=NF*f)>o60)k5v`TVvGu}_qQ+HAWBc*DUmi;CFh4NOYnj1bUa0`U|HGZCj^4H=ChK@U)>Y1KU(zjwVZgMn=)7h;^XB(N}ZI#oH7sHEVw%p z@pV7U1wIjldeDtYZV^hPN%;OAL$MZ)MhO$;9YYU)+|8P-tw>t8>EPyA3a#kqN zZ8LesFIamsX!@hD*yM4wz-h)789yqc`Ga%63|qKpSM%xNWzq_&Jbf*OySXubukRP`$i(SbILRR2!hoG5Aox)1C99LM=&mf=o>x@7#ul96mqD$4k+RhL3dbN|{&^o}>YO$5-4r z3uhKJvtGd%JC|Mnz4K&8g?>dXAuPo4ZEu&7Jo1CoM)DR!g-HeYnDRw7baJahaq3(R7!eB6)I95~=TS5iPN|DWX_G9k->iGcDVI>eN)wqE+=*9+e1cLE+pwMpq%Zi-BdlU zRBv@iGugh=>Dn?kSYPJwC~j!Q?>-nVrn;XWtML0{#`N{~<<$__dY+h-3u&xJygO-W zv($n#uMSwbZIoNz7kDWGYHisDRPaHN>U6G6uHYjS2$(q3k8!+UN=@Rw&l< z${66~j^DoWB)l%vrITc0DJL065ze};J$anZ3wZNGKd`!q?XJNl>xH{RioK^E8~dK{ zG$OEuMhG=+cV;Iyzf}#~xBarW13R8nNJC-VinpI;v^h+<5UUUIB`hG~|Kkc5x4_Pf W(BYw5#_xB87hrSF4pnv5E9O5rHq%D{ literal 0 HcmV?d00001 diff --git a/website/static/images/feature2/bam.png b/website/static/images/feature2/bam.png new file mode 100644 index 0000000000000000000000000000000000000000..877a2bcf4287371f178f2b8632abb98477ed9119 GIT binary patch literal 27313 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 literal 0 HcmV?d00001 diff --git a/website/static/images/feature2/content.png b/website/static/images/feature2/content.png new file mode 100644 index 0000000000000000000000000000000000000000..7e801f1ea4c403401e31afd5e878b4315a6490a1 GIT binary patch literal 2786 zcmYjT2{hDQ8~@w)NE6<8ZHXx}2}PqJ%h<9eMocq?Le{Y*4KkEHHS!u{8!h&=FqTXs zg(gY%H(QhJ4YD;v^NsKO-tT9rGrvp9ivIeC{aXcs#7s^JwbmH^Tv8D1>*HgE>L)dR zZX82Zf6%w_J(rfj($a=EO$Nw~h1PlZ-do>$3a^ZYha&gFW_w`XvjBo)^RJpjv6qD!oJ%vlH4qTj!<7g(g^)}(_hssLg(y?gk6F640ZL{(8~o8 z!X_jBe|m>zK<5Jc|1!XOvgm8FF7U!fwAi8!rvk%jtW495Ir&c2;vZGGJjBfrs+Z%3 zM!JD;a|J`H7RjRPX!}(5S`XSw1pue73l1YJ&Y;$P70b-+n8F+*J0W;{>&TZbJGG$A9q4?^ zCH`)u z5NR9gY${;PJ-Nt4cvsql*>qq1EvN`sJ`4&Yi!cM)uXJDNWvLPXa<}Atg+*h;=3EDU zFp4Uy2;4Oho-`QrjJ!vTdzZzge@aTZ%7Z2{4@f$EVQCQni3et@MiiGs(mQL=`> z{Bn}=-}w?~v5@o{9zg&X#x!M9!#@ovW@S$XV(@3DP4%y5twoDiRHbpL6v-GW@7vno z{hVs?kGooZAM>MkKjC1J(uyxdR5{y{DV!|pxwx3Mc1l}m;?)>9+wPMSnZK5A|M0(e z;kS0bV=JY3B7aF-vJ$Zx5n0NPgguD&-=q}xFEf0BW0tSS&|N`_pWB%0y%ya0>AWpZ z&`p#zfPbpF(XSaVByTCYA~>~#e=M--6*cB>iNVj=OZGD( z6$5G4q9ihMeD0N~9Vt`Y&YrefwTCAcMTDSObVnCcErX=TnA7^U7e`Kk6esKjIwV-_8Iv1rZ z=d`3u?2M)(WM&641x6u(Lnn!a^|x#FJatoZIq=cUK7cLc1cEA>;y=abX5WIL+U!bm z>WO3YW&ep3{6TFEZ_SpVL#WL-+t}e%$2?vkhmMty>aECyAw>%1!8UU1VmJCePm|hU zLd|B>;eetex$nWjR$otbbyanl(Xj`6kz3Ql{Q-?}Q2LK!tca0MpBX%a+O!+D z8AXrWm_iMVh>?r3XPzhqgJ{tK`AO#1Bzsdc;Mu?~_JW!O>8F)(ttCBFA^? zV4WoYv(w#IH11yTF1r`+d-8Wg51@xHbM4XQZ8 zJQnPSkninRVLQ$fkU-ayeln60Fo&Irr>LnQd`Bnj_*pr0T$TeKZMRgQ9bKwg zU5l-C!yq`wSou-DJ5PYw26(6Trng?038ns;RXS+k)PoYW^pQ#mi34P!d$HC)cDHpq zt+)AC9ERrT_1VGgV)|igui}fPAut^*R#`i_tifmhWBHYOpD!q&d4wNqtHZn*1c#ZJ zt5Oo;zbhZ;#6uL+YUYA(EbHN~wk4VCDOzbgj~9b@NvA{oPdk{dH7DSpFXGe6#l>bI z8%!!V*Mu=NzS8sF%nxDo^>b*uMx#TY=!g2e!1;oz&7XjvM6DPrNh!M(W?x4(2B&?HjydS|5C#H8jP&cl+h5-JQrN ziWOn?WcEJ&b8_x#<%`^2Y0JP2cGRgmSEp2SpCLg1!~Pr*FyjN*ZKN^wOvKyZ$F}pl zH6|)Vr)F|AB5(MvY1+Bc=&N@H?g_aMtjEj-ws;Fq^(uxh~Ke&c9 zxb@r+RMZ&|ZRcu)&Q=QQT&gRS@hedtuNQE0aU;j@{GsWanZGp8E%Q9;y@oh2HVO@W zvwaKPC&$<40ABpgh8DpPQLW_Lb%g@y)>d|vg=2O z1BL7FZQgMO`)$7jf$#4SNUw=g&C$-x=bJx;-C3?#)2-M6`){29)bq9?rF0=6z|zzfQEiNk`xhlCGGqV% literal 0 HcmV?d00001 diff --git a/website/static/images/feature2/gallery.png b/website/static/images/feature2/gallery.png new file mode 100644 index 0000000000000000000000000000000000000000..d97b66df2c263228abf4bb7af4662f9bd09b5ecf GIT binary patch literal 4371 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 Il#!wT2YL)PtpET3 literal 0 HcmV?d00001 diff --git a/website/static/images/feature2/graph.png b/website/static/images/feature2/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e7773ab12c6eb831c22adbde1cc3ab3009bb6d GIT binary patch literal 4460 zcmV-y5tHtTP)iDGxH2! zciyj;fB2m5`JOY+hjYH?oadYaIB?*=fddB)95`^`z<~n?4jede;J|?uu$HdCy~41t zu(mQXEs{tiu|%A|R4Ub&IBq)(+>)OzT(~Y)Ie#fZwh&1>YSa&KQhEd&27|FK0Q>=X z05Ab41E6LM7eSOpoMeB2Pie|17F^kw-{`QAC@Cb{M@|^0{aeCQ!F~Y&l53Z)VBfZ# zr8~E5mE1NOV)vd)|5=RR@RtxIH7_feB$5SS>`4G^gydyFAqQ+>99BpA2A;e-eN<>@ zN0LcXmn3~E?b)}F@7?Jq4j;w4FTPS?(%%l*m7bny!_NQ!$ZU1clBDXgdI8e6i4X%o zVvP?1ycjSuBPC^K!niTITbHjY0B{niA>|rsZ*#4b+AG5U{z&+Syr4*=xV4|&Hct8w)8HZD_d)X&g{cSRo zo*wnmiV6y_`h!nO7A{_-lt`o&eHaY}j2$qP2;8@fNuni8!hvDmZLadweP=IT6;hvj zN{|#yPAC}m0O%l=&oAb`gb9t;W-%$J5xS{&p>H+EbmSG8y)6{ZapQ z(ii%&%JKn1M7d|Wtiu}h05IAOKqaPMbw&olqrwH}JMznKxOV9Zyj3a;j~$KG+cvWH zK^;5Sq{lxy&6NP>UEh442wWV+*Y7>iLXPL>2N)!Vlc*ZPio(T|R2=phWmq^$NqtW=mo^$Ct8}rxd1=&v| zbJnSUWx!yueC}J5gpA)0VCvkN=+nOsu3fleZS|CRFMxa4PkfX~mL{%JgOBtG6FN`LZQntzM8+UCw(%_@`L@E*v_7 zUskO_;>NX5dMN9qZCL75~2qs>v`|-nNm^?E9-9x)KNb44MKjd;5q%vW} z$(@|w?BW6d@M-IZeLw8Ng|u_Xx_TX*LxLfZRE?UQU7XQ2z+ZmuWLmGY*RHQH=c{!G zbrUTHgR__})fX}l9y!o#nzM^IMa_D70RSL7GYiR|eU9lb%&txA9o`=$g+<*g<+W;d z+Z-Izs(XN8qS$^JV;~~2-I}Fc#|~&47yxaaruG>Tz-j`F8CtC%Cc+fhp?(3~yW!}8 z!(zL&$gnXZ;o)^>!uiL6!%+G8sx8^KN zscLmco2S8s#Lvmw+xtyR_RTuVI#1`FO0}v%CT1GRz#_nyKZpXV>!BealMy>YjB**U z%wF~QecgJb{j?WTo|}OOA_lcAMwa&dJ#XC%X0JC2_@)~KyjB?#b%CMT9Ld=9|J-euLL=vE%KzWoj| z&!qzZ?&}$fC*FJ$o_?bJJ$xUj3XBuWSq*j*WIvJ2MW_A%zyf=gV~KTh=0UH{z|`0h z5Pj;%{PywuEiQkG+JbyOUJ?) zWf<7YQ1cW^lm0}BRtu%d_A(gI)@CPWu!|t61-YL9#7m53=vu0%o_ZYK^fexxH3Kpy z8z+GTWz$B&5xpx()u~4jQKKuGb+K31k~n!PsQ4xlo+t+hSifBf*S5j%Xd8f>ix)9^ z!F+TLA7E1%01kuE|3$P3+`$+VWwt453rW>#J%}n-@wK-{*Fr@2?Z4|`s4zg`*9A+H zs=f^c^$tbc8;juK>x(PL{=m*<%i-TG7$cvb%e$K-jzgus94-p?nnw?U*bgZ>_1;6e zoM#7l2i_1|;kyu35TeR?U^afutNuINleh{aUziJpmlyA>hRRB8Tl_vsv^vaOyAld7 zFO+DjV^bY*y9^wFIqQ>f@XO6u`SeUYG<6cf!x0!xkcG2c7yVfcyB^n~X*rOx}dU8#lt!-Gpi5N^83o zMPPSy>OT<2wtkO+apN#}(vy%n$!qhPdub&aEjGWl2;S}6A@2qmiX3BZxf{=@YP?SK($5O^_6wdL)Q; z@v+UjdJS9Odmr8bfp~b@6zuwV88XxU1ONo}?or#dXm4g?PvS~wv$8N^-W>RK?qqfV zpf4=K=GPbDfl(tdWcpOA>c3)20=S|ZNO+>WHkO&>Dpcw#F)(f%22G0RE3yfUjfwOQ z*lkTcL=%M1ha}=mIJD_&q;B~RkIkEdUeUv9)68`(HC#NBf<1{VQBhJ1H(4pB#g>8q zY}lp*+yhWvREC&W7NYxukyh2cM5D#hxC!-Q+0isPmL@6iT+(Xz2X__fvWQHk{!xA% zE(^^lS_~m#18W0-8MHUE@%`fW;o|0oSxKwl;ah)L+gJea78MDUL3gPBDGF~v8zF1(WK!u00MSA-+9U`Ov18g>Lrsi}0Vt|5+l+&U&^!83 z^pA~ctPi$`RBooK)h|uekyqHVh|))ejy*%Mep?0zCAG0EsCTF>lgQyIy6iEL-tEkO zs9>SOTE8wLXNhZtgsk=TyyEs$QBq+}q!egin{-?7Jv0A6wsf$80RK76Sbm zrD`{rm)yu)qK#V?~RezzUi}HoIvzn%a`1i08RUfa- z!5IGa%TIQwm3fF^FaYrdsa~UMxIGWeCj?)N1_L6Lz6f@$zrX5|z6hx$;@8#3$rWAQ z8?Go^E-i%Sw!ViDU;JAL(PC70aeX{};UcY{wZdd?1JASs&cM+xXt^Z(ZL;+q3YEx;U?OA7&@*8WOap`eM3SwV>CB7oqgGM5-{ z<9xBUUJR+*dRkknv6d!UfcZRk?2CouGb;#VtlrML6iv>_#tz8Ted$63c9EwiwYcyX=aCb{7LA{n>wiOZZZImjI_u0cn-)K!sNzvw1 z0+3qU5*kC%DGc5NA8+uyH40*hx-F-AWL29c0Xr(h7q6gBfR+KZLzbG>@mGlvw$fOP zVVvm)A-?zyd$UnT5Qhl-AmE^oWfOqs-d+YAw6043;}BabGz-5jOTxA@j$RaAqk98; zjrJJmjpOzy)m zF-QzMjuS=nXUx!a2A+a2#<)~%&Z`9MvA%Y#8+n)ZaEWaAX~!l(0D#cfsLP!XU@0GS z-fLMAs=&P|+MMM8=384gTe#OIk#!-^n}_oA*9`LYEosVD(DHkQcfd<7+T2cHG{*Ys zSTj!~DLBmHv0OBnX}2+Ur$5=u`Gq@OyAHA|Nx_u^$d_I$JNk!Wdn z?OzaOquhudJqEcdT~}6=S9EuFaW3Asaut_z;gU3N%0$FXxpUOK|KLc3^y!IN<0hf| z;6}G`{T0dPV`Q@+BYO0RQ79Fg=D+!>qEEyC6lk=nuKPm~+-S}jCuJ0Cln1X0~C>*cQUmDPw*m&Wd%>Jriovlhg(s9D5w=vP)xvf-kLX4ISZPTfckF8aLj0g)Gr*L;o zPMAMO5k4dee;iDK?v@7OLxf-c1praQhTw-22atO+8yh}bixah-}`d-W)R#$T=Vn0Dg1n#>WTqCG%*0+ z@d@KV3I*cddsj4{Ex<7oXB;O)48V$|6OQ9th^)Kw<9`7L6oSz!1>R*32^9mdqJ?PO z+|D``mzdJi&LOmy=r>D%h_LsE-RKl<{?@mah5-i%&;aNQzz+Zi;3j}{5ZkVoR&3`R zz%BR}PIOpkywY8n^!%ci6@4EJhr->x=}b*P9EY2kS=h8@9j;!@#I(eZA#<|%7ICpD zl5_GX^)HUg_&3NZxq$+S3fWM=$v(w_jfoOh|PrF0_2=@-y$&Au&3|I}o$RocAzzY^>2s+OR|FXKN>BsXf+6G?*UAUq6Vam_@a-vP-gCvX34 ze0K-7W?Ed3x*X5X4=_p%!$25Bgb*-v1>g?AlL3VU6oKIyz|H}bDv@zNg?qGbo*R)J yIB?*=fddB)95`^`z<~n?4jede;J|?c-uyod7Ld^lPo8}M00000I@BTZdre=C- zYO1=cYpu7R_120|R+L79{|*lU0f8hdBcb{^rv7)s!F)aizBulF4lpM2(h?9K|6PAN zN|GQTNFZb-MAbdA&vV>;)HUwAyB+`|MGtb!`Q(zp%IeB|aw;mKU)m~ql|;3c4BDzI zOnQ1(yJ2eKA`1dZ0J`X?5&_fRGE+rqwDy~CZ>(Rwl2Wi|#Q(W@^T{R7b|1@VX9sV1 zU$lS&ahMI;J+5{KqWjNN%5RVyp3<%;JpE)wXB!O>`NA8HT4euj`?2u1+e z1Jv>zf7?KRGS{EsyGX5?b&3@m_hk=z`d|{@I!N#t(@}fVKF(J-W#got_;cmrxig_Ve==h*W zy3M9fh3t$GeT2I$7(nyUU&6~C-M>4W+*#s?6)kE=DeY)fTE(l<>0PrEr6rm}7%A1S zFp(s)6n^_{vLGdwkWt-(_IQd&Kr~}Ebr7g#9Hf(;3|~2t6uZb)_dkNZCW!Ehd~N&P z8)>5XBLcNxIf<<;N~>m)lvTJ2HdC95z?!!7Afi`XC&4KiA8TNW{fFJGC>x`ZNQiAYsSKDs0tlFVrHeMKw) z8b+960&1Y%mI$pHI+;-bKH{!4ln~NPS6qR(5$oS3K7vx!KCKdIG!5c}K%UKc=Euz+ z9ez2eVjau1i!dOQFC(7EkVQW!bMNFedP6%T7qn-eKoz|c&>xoAm@8l^ywnNH>1k-vCA30`gA*y(l zRHrhcv+g%yuGnzY+EFydKlL?kIg=^ zmVU}A?bGYH&_|0wMYtK&fZuQU+|tZm_dsf()dL~hy%$Uzk!+pj#LO{M4(Mr9o_*!7 z6Q`C^%f_2j(JftSg$>iN6*)mHtr!b@%*F3Om+wGAdd>V*+jT)xI&Q@b56zC*MD$eV z=SI<=)r{pQB*$q;P*M`puK!3L@X_mKxy)VU;Nmv+c#rk>5>+aTvTt)$cc6D1qM`cB zmey#`H0faz6T>584nt*|G|MiDQM(`8s0;{ZO*nwjEy@U_;qr;jkuyEy3M2|-~i4Zg4j%$JUf zZ;89;e!A<;L)u(fNRlc%&uhp^95|`k=^Nj9&LRf&fitw4wY==2&KANDXw{1idX+MO zJ>fXPfe*nO6m*!J6}|7M%a23a5U^_ZHLiVTv2XAEjBV~9HND7_BPmE)%|fSmDsYhz z6PD%|&I>XgVo)@05U?I97=rd296Uv1LTi zK(!uv0=@N$9xErV zsWNX8Kbha0!qs~^?NU?t68_*tp* zWlF&(D9~bwJD&^SDuyNx5EUBu%;`LGk3AF0@0S0LLK%6FJD}F*rkyz4ULn7F+@ELE z+YwK>Gj~M-oA)bUROe{MCrS6ZMd8`l9G9n7?Qp}B)n@j4iq`8_KGS89R#d{)LOF^O zh&kekS7!kQ??=0BdTl%y^#^}=maK+(0WpkrjTN^xt} z9jq6AI{iLBbmQnN5e!%Ke|D6%R(+4R zQ1mae*FLMe+mW!dy}Va5qOC`oV%D<**=+De2a^yjGBUuLZ(4=-y#8om1D?9u^V3ZP4 zHr2Z#D9K#Vv3#vFe+Z zY1yompB(gk&6~7Dhpc zDi9LVa;Atj;Qb2(4}p0o%YCANV)avWGD=B8!+|#@0BH2U)h_{M%vwSY1Vf@1m=szr z0m;Lf-gOPoB;|w*-ET`rFy0I}{$H|1L+9NAvSE?mh@Csi7PY;+6jc@q~Syg6=ewk%A5~<3u z)zw;HFG1x@rsU_7Op^?6Hb!s2qASs>Pszc%MqUtRqTyhPdAW&pyk__)P|4jO@YEk@ zt?JL*w5ybhMfy`<7yGRjw&#pUjmt3R{UUR3T#CnZa8-bF^ z*jQ?sx>7RQH1fIL0o%>m)&2!11&zU|JIWWpSj`GUOnP2s-`_6bAXK)Cb?*Q#a)1vc zs>ml_gaWUKs4)m|g9prjrH=|^CQ%Dwc78+&oQQ{G&Z@jDAC~oMp!P9cb{7%z-XKUO zZIHnj&DS>oW}5DDtucEc_4!-_3K&Igt-lYTEXicl{j zvyi;cmXNtt@~*w=Xol;Rt*6hw-1IC~9l1p@4d7Qr>hUE6=p2hzdR~d5 zqSE@J%%E7&R?r}eQONDUM=>SQU%k^0}LXQdIsOBw~UHZYryyaESr1$4? zJHr9u0?)H^B`NUT7A$PBH(nluB+mTU%lOxh9Va1m4-tf2R7M-4YSWX+0(RWCo*s&6)%cmS(2 z;Zzk30K&^pAIfrpiUZIK@KGtW+EZ z40P<#{+EmWUg%tFYPcsc1Ho}$ndGt$eiTKOH%Mn0x} z`=(^O*^VjYAe(lM8K1td(h!)Ryyizu1@O1 z#(a+~IO0ifKd79dbXoc2P&ZAYG%R^JJW`;I!IP?-$@@;>QR^cOpQ3@3r1U2R*Iy^j zX<2!)O3NYe8fr@DdVZrk$#88Mb@in~rn9mMhJr!Ebhx*v9#@U!-O{(sQPZ?`Rh`hR zU`wf5Od}q5^{&*w2f|T0A@lU`TKf=w?VU8*5jbNS z1saIZ48jx3wF03uk~kjtUjh!a$9VL0JvynrCzt+%v*E(WUcgLC~r8~ZKJY4ws9^2Xl)?jbysy; z0@(Bz1>rSLx2)83k`h%l4wNmwPz|iO25dx16pYrHH%ekzo5vuPmlfNCeq zUf*7)bB2y_*|(`8af<%(S)#mo*AM&wJ#lK-)zsLX`d!24)J-u9r;nxdRlCmc>anZN z4Nr`cJ=d1&@lf`j-vsM>VZoCYq3&9f_Dgq*ku)tEpV~Q={?r>AZqic*vXA&SHXv3U zc9S;DrAeTh-S&_q&*ed%AVD3+n5Q_aXCEwS&z#=%OG>JFGRryq*!E0;r>oRN0Bc*% z*~3oh9qOA+7y%kv!jIKL7cD!%S*^^NHLu^8 zc8Hn*yTfSu___viP|Zgmgmc6jZ<@VRs^ad^pl?RwjGTb$4?-TpN`D{<*lEFGO1DbV zxwD&_<+s~6@JJMW(b}^L&Om04ie`3Zg>IJyCsJ5)HVr-1lBQydxMWfyA@oWK3XxOF z^-XXF2h}w^0!@=P%TY}5%Ts*gA^WwveZQSEQD`|_NO-QeCEJl3D*U_SdA8=M2Yi+v z|L~tpLZ;=;>e;RHS~v44RM?p7ac%3T-OJ@xV|H=kc4Fd>@){HLoqLic+W~YjixE#t zDq8v{xAzxK&*11eJ%nhIb++D%L4$4ysu+up2+pC`uvJ<4=u+Oe`R0qW#TJO!*IwwO zHi1m?Zf@gy>6&i7dZy|GU%Mhr|MRnHsdgi+s;xi#K<%pS&x1pf;C^sFC|f~SY;9Pk z*nl&>nADuh@xf*hF-UPLZq2`!nj<+ zWm=LSS;|-_vf1rkoMxA+QIfR5MNuFhZK?!9sU3R*9cLrhJm+B(7+KCMGc_tP$Kf*( zHY}?vCN{P>-h8+^S5l~HCYL94HmX4FdTx#zR0wCaF=1Qr8Q~as*fP3qUv4&E(mgMI z&lcTLBgJkebDGZ^U?YULnokgsCw3k99rXwqQ~z?yDVYh904d1nF*G#3P0NmFVb9W1 zrAosf^MO>q5DZTi|C&SA_GROJ?_*e1^x3p*&~?jyT)xoNtLi5Vdoatif_@{5Bi~b7!(Gl#2aox!J#kTRs9^AJ_Y_)b4@^9M z@QvG;nSSSJ3ABU164;$;K*Ly<*j#AVr5UzZ(=WkefMc+iH7!7u-CpnFR^`ZiozDd) z`L3Pz?5fHDD1|*y{ZRc=RGGXU_!*X{ID|0;M}INFd7R3^0}<^4hB|Gb?}bD?T{_&@ z{#O(#tX1K$Q6)N2V@JXkY}hxlu}r>6%YIl1C?noAt5%n~XksiyUC!U^-%5=B@Sgla za#S*KKb@DYd6wjmPn!NiO)^idnH4jhO(24fj~6qu9sQRpM52b99-%??=-;I!wWly| z23k{RwB+Nzjb0qfHPV3aQq6jsg`~>yAPW0eVy*kwf}8iG!=e3a%d0W|o>ECgPPe_SK{+?jG^Z1k-K@xEyoZHvJ>yv%-ssdW=O1pd@JZ$CP zq~zSAsYshDc7Cvqh_#h&Lw;MXJ*G$J9;c>SpX}RHZSngpcMlr-7vpv)={#g*;3+8p zaVq?@zNaaVCTEtjR%#9T6?>^6W-v54@%BvN3_0abw}@EaB(e;mXZMg}TbRW>v23ni&g|wRikF*EepTvN%dW(h9mzX@-Nw`PI#*Yx zD(6L&6({w2I5~fvZ}vD$_hUssNslq9poWK)d*K|a+EueME5v~&(EM~&(UcU#lD8{| zPx&eOqoZTA^voseCOuYlyv%KczEd-}WSMoZZA&$4wzn7l2!KpivR`1UR7PJyBU4)Y z^{%jc!1=mwM^1;dtG=+vK)$S|y@tmLGCk?L8=@3B@K-|=8{lX$bENPE9fN3}zA3QeTOX>0{R0HY9No8tT|f5@zn0 ztwz78=LKiHW$w)MZgtgIo{#<5`?I@>I=J zmk%+P`aJga1Dq*6#@}e4HMiX_sOxZ(Z=@UmnkL9!xfY;FnFt1YiPU{k1MNHpI$AN6 zerRWoZ0}Tp>>E;Go z&{HxH*6#1k2@Xu9TL3D{xf%ayIH1w$>aWsnjLn14b6Ozcja)Ezn6}<8OK! ztWXk=md%K9OET=m-M@~YYasL8)A~utd{BL=0b`VZ{i;tM2dH=E5dZ5K7CS_}g7!6X z3~FkMmBlnL=T^Tb@+aX(x(Qe~4}T@IU@x}j?PxRq3Hn8DV%+pT(AC8XU;4Bdjlr;` zsg|9Y2_Kw-6ajJQkur^`I_7)(g;4-Q$Ibs`v2cw%?A63ddQ)9oAsY%I7vG;ALnkEY-Kj)D8gok_y&11%7G+xlF z@00D6V{I%^;X^a)MRtc8A)mPH&MPnbR=KNHq1VJHs|;L&k@k9E@Za={Ow11GT|A0Y z#|wZ!LqZjaowQi%WLB(~@P_!5gJhk65T!-%Pr(X#b#Z|q(R9*Y9xq(loMq-N8?me}q*3{RQ{A8_w``TtdBczx)E(%-?pqv&Jn^4bxB9 zVH7E!wJ0uVWsB$Xd>Q1x1Nb*?plQQ};M}of(j-8O6beACyS-4KSt!i{{l-QkQ-T?%R}rJkH6g} zAu1_*+QlY>+11aHE%Hw3{Hr6%`C15a+4SCq;ctNs#5sJP1{z>oeCPh7$=l*atgyES z5)>B4WMLo`xB#!F+W!?0!}7+Q8Yc>I>Y;pxlpSg3H)e}Kz%Dqfck86=(iLapLh^V3H6NOv!VC1ha6WPD3@OvS^t6Qv2M&Y8pD z->G4UH1(>dc}>8pNlC2&Zb4!$xy)wO-qqT9d)u-|1yy33^x8_x2gMesBIlz;V-7Cx ztIvp%JUA{TH;a^ST3-%n-U40y8{q=XaF&`8xYhObd|2px2dzv-Ocs8fg=Ne>m}w&TVMb z3!G1gk*ZO^E~n6LN=;2n%bhG{#`(j2$jkK^ zT4}?Hrz$21kEM!;3-(M6Jy!;$`Kx{kd}780j3d}3qcXNrf3G5_4rDV0<&2k(FTzRt zgVySshNa+5R<~!DR0f@foVTG#;+Xg`c!K=xtq~#hP$_;NLMT_Pa{tANuySjv=W1nzKYvGa~M&~)HVDgJm zJ-E~5ycXf_vb^Pc33}?A+CPf)+KXH zw0NV}9Gau9-#Z2K(=vsSl)9qG#a)_+JF#j#C?BtC?j;c;t_v$tI+lnTQgTb^2hSln zZfU1fdAsc6AlMNX*SfX!+I!C(uha}ca~n&9K-YjB_%iTTf(HlD@wXPwyTXF8oQ=Hu zfX!`EK_!FBy;${DOQ~)KdfcTW`dHhHd=&#Es95SZ_MrS3BWF)U5KWXUgmI zxMtl+ELDzBgcY`#zu5-3VS{Ecu&D4>*Ltoe5`CrXjuu)d`3&ylhzPdF?gfWN1YFWL zO^5#I|2YeR2IsVZI%_sk=sx35%H?8x#E0$tUeI{)-sJ`7%2QOYbf>Qk=5d;S zn#1Hf@YmyJZdC?~4zF0a>k7_gxISr4i6UiVRM+Vzi1TjEWsNCQmdSE zaNmMcYZAq&v5>P-6^P1e!QrvFgaq}Lah_!4^a52tnRw*=(>%8EGC4ITBWedy-TlM}VAu6>?@TPC~io|aS2srS6y#NNR z&m8)?kM{=r8vJ8t%MI-EI6g=;Pz@)CZp2=nM}6U%lgS!YY!R&jzP-6*EpiZ%)Sdgk zLorBSKI`=8=}(Fu{VA9k9FWHUIAlX^3UWimF1ngKMCYJY(TG9m+Uz%W=7o(da`qfz zw+4y^blNC6Zdu8CblH2{s%mwa7UH!Rh8tex@Q45IMgWW2%LIyvTWmFuAFK?WtZV*= zn*2{E)*j%6o+rEOv(6dTdI@l;8&q&wt3+!&)aj z{N+60>9E5c+IQb1JLvvaFDHA(*A!7Gsm~LVp>yG}cjE$cF6rKBRH(ur86Mxgy)8wq z${d zOz-Y|%dogJ;pGUaTQ4CTT1sgYfv&UOroHp}?Cvblo3BzdLb`kNp5_+p3zO!OnaXqG$9yvyT|LJxiOOp3P3%cf}u` zn&_cWAkckv%2`z%lmDAJH$&%C^*tKKFpJsaKolWKdezf8Ai#gaa_^1OOOxUlcXLTJ zNoFKE!tK3@3$d;mW$N|8v(Z+;slvNDH?*MlIYERz>|aMl0{Hq&`p_7$FQxZ?l^tctLQ)3~U;%1|X ze;*lBasKjf&?-$#%CZ|>!0df$a1SyZ%}%?XDtBM%>OB&$;UFiWE}EWWQ2cf=z9AGgtk>?n!;!8uita};gxVol%oh@U20jUj;8~9lp9H$ zLHDKV=U+wF&}rA$Z?XR9pRPXVyTxg0}j*-wu0HZu1T4EIZpZPUZW-t(5wAQ5;i8);)&L5vx z{|1YOUfpc0kb{Xpa*&2(^Loq97DrT~)>OUzzAfmYRNBf7tSm~#OS;(WPcS{=&}G_c zYwE$+>fv!y(ZiRLO?L$qndsQK0myNLjNCMzW@Hn~SgzNLaZWB2ZhK z0`Qrgma?FCJA?meH%(0WbTBnK-`JC%Vu*Ch~-LQIC zute}<&mWpCeKhnpuq>}1+T$FZ<}WU60u)Z3+YXTy1u}lJUmSsO!46cpi9GRS2>Y_6 z{b+z4Ex^JD7YW-ePy+Y=+(-ETHy!#*z7s>;LCf5hjeH^x1ca=lqC~aWkHG%{mwd9s literal 0 HcmV?d00001 diff --git a/website/static/images/feature2/transfer.png b/website/static/images/feature2/transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..d8480e9d49791f528b81a9fcc239d8dd955bef22 GIT binary patch literal 2479 zcmZuzcTkgw694!@NJ0w%Bu5dY+2{vKGlCE_)F9;qIgX$R(uB|<90X89Qv?Ay2u&#m zsB|eI5Qir!2WkBq?bJa0ED|4_Pl*Kbve(+SA6nN?|#^(8!2o; z^M^@WhU5L`-if&q>qW&k-^x2cp({z3Ld}yZqh_iyuiaQ{QMDhJ!rEW8 zPp{Cv{Ty{ay-hJa>rA43xuT|DlIGMD_w%`hO~@0B7H#R*a9J8@1iwxpVYIfM49BeG zkrrmPfb$}}|4$qEw3a$yFyRTMrd2OQI2CdjX!U5gE`|d32`TN`lPX6xxiqm*X?x*P zIALGw;!ipnoiY4+DlSd0O*jlILLJ2LHOR*t*iy2fI3=+{t@fbV0mv8vrYV&hC! zM$#OJdsKrq){BX?YAb)=xP0c3J@t-j+D7mAi%lAJsA3V^?-^Imq+sDUQ16J%Gb3^aLx52=-!B4pgXS24NmzVOU=$^zDYMY){1L79H6v#{AJ*uk+bjb0*g%L&pCqz%^ ziX+5jz9-~k<4n?wI=+M9fH)ISL`Ia%x)1zU;y>&E2k3@I*SGVublJ?z#{2TI4e@A( z$MAH*YUK8a;rspRycblgiIJ6U)U0t5?}VD^ylOG7u%oqcxlL)Gx#)GK#6=?ceDsp& z&kyV>209}Iyx_m1!c8FZ(yMQ`J6spdtj!{@t97qRrnEX!F8_O+o12 z6PS=$Q!2oV*#!g%%COU(uajm&87NzHSJ7^m9==D&f7ZOyZ5fRhrzni1WhT#o1i{sc zK~H?INdBM%5B_)u=kWy{f5|zGu4cm~?GU2tmtUbn+fD$xmod%JdVy3g)7WI&AtAedkE@(NbW78lnoGxTYMJ*0@N9pZNfh4}PQ!}$e||ea zFW`Gvv8sHd^d*>&Jp1L+jm%a_>X)E3Lmn013kIQ&bY&7w?*xQ&=|@%XXyL}2`3vl0 z?F-y3u$9dQsESQL<)4ECt3|?~(Wf5r66A!2 z2XZ$(%mSO#w~t=?C<1e}WBsKpW4lUVB{H+!ovr4G6J7lk1o(-u9bmMlQ0B*u(wwg4 zfDX>)l-~vG+DNi|UO~~2k+ZjGYTe%R4dtLthX}lqgYY#$;RW)WIjqU;P_8#WKdYUV zqdh-<(Lcu{fB1BsBg)M~S4+`xtthDVl#h=QPb1CFvYVE{d&L zCg>v8QiE7xgz%6UW*X&VwQ2AHiANbzp@|!=!0&brG+n!2j-eb=OTa$%uAm|)U2O?) zx%bX068HFD4||SY#F_C*Jg@+A1RtoB%nUqjs+X0X(K?0pcE3UJHSio5;Zb>(dzCSy z9t$9o#o9k+IRGPW)M^QD!$LX^l))_rq^=`5A}uKkzbPwqc5!I;F&7)AU%%LuNBumcdHBg?q`GeXB3k-;gu#ov+WhPIQ%U0zu{3l!{_FfD0@nX^d`o z*Gx{X3S>uz_XfUv8ZJ1EX6S;8f#0yAE9Dsr+0#}+aAuxzzMa(YeUND|{ieJ8c=a7B z=omCa0$Bpc_!NlpY(gjM@{Hxj37ddx$>{Q)c~#QYh>5{8_{-yEKnp&&OzDp2c*t-< zTqZ}s$;sudpW4sd9HdUm*@UM-av_wALn;FT5YeaBxAfOzCdpWWT7)aiP-p$!Duo+I zVT|UM2jNRc*J&E1v{u}tdgLt&qt=!N?m}FwOP91* z!lSHPLb5CL73SfO>DOfl46U#Gw6a$L_%eZ*d}AbJ!C5AICB5z~;JvP2Fjvz7s46)N zn^wWrQonS=AQ&c(r|Sd~alI?H#peT+NEWovk16I9%Z0)%`vr_Q@2*5+>b)Pu6Qjf! zxudjF!F3mg2xn)};wVx1!_z3!$171iYiclwv59_v7h`ueX8MR@MPTs_!P$0~vDd_&y4mhU zr_I{6Raht;$vWP+ANb>5UlZHhCs>e`(*W^u>bzUkhnw^YUf4Mi!JPxMW<>yd$V6|E3oe+PV{NgH|)+KCL0HE5h26vR7R2js#+#& zZ|j0Z@VV|GXE^JTPTICtQM@IZf%S1mLS*eGOQITAcB#WU+p+lW*4u!Zxi#l93ArV) z3sOFS_ZbGCL(=dqs>EnM)Vc(yB6!d6$3ncd;tFYn!u;xb$@4eAiP*gwYv`^@uyUNI zK1M(@I%jd3q7-2fcoW`CSD{)6TIuyf^^{y3l-x)ht5zWn2|zk1lD))(y#v9VHwh)b zCG-0VLEaBH$_(0FR+R$-+k~dlX(|+W-_98~=k*rLI5=={noD?5yl#+v*uYfvpBvre Rw+9~>U}kEKeP&FE`xpBbhIIe{ literal 0 HcmV?d00001 diff --git a/website/static/images/feature2/workflow.png b/website/static/images/feature2/workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..55ee86bf242e3cd911736d1f56cacfc96afe5aee GIT binary patch literal 5659 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 bVs7z&(x5^$$QjPY00000NkvXXu0mjfGG|PC literal 0 HcmV?d00001 diff --git a/website/static/images/feature3/css3-bare.png b/website/static/images/feature3/css3-bare.png new file mode 100644 index 0000000000000000000000000000000000000000..c75f50da150897bfaa61655053995e386357a49d GIT binary patch literal 3381 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 Af&c&j literal 0 HcmV?d00001 diff --git a/website/static/logo.png b/website/static/logo.png deleted file mode 100644 index 6a59505df815f251c0d00b3f66f965d7b54886fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358501 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

v}z=?(Rs$pf0QzWm^5s5m1ZhXby!up@2=I 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 z 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%0AK-Cl(2C^$vks+Z&ry;t&LqDT7 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 diff --git a/website/static/manifest.json b/website/static/manifest.json new file mode 100644 index 000000000..e116fe8bd --- /dev/null +++ b/website/static/manifest.json @@ -0,0 +1,56 @@ +{ + "manifest_version": 2, + "name": "Hugo Zzo theme", + "short_name": "Hugo Zzo theme", + "version": "1.0.0", + "default_locale": "en", + "description": "Hugo blog theme with rich features", + "start_url": "https://themes.gohugo.io/theme/hugo-theme-zzo/", + "icons": [ + { + "src": "favicon/android-icon-36x36.png", + "sizes": "36x36", + "type": "image/png", + "density": "0.75" + }, + { + "src": "favicon/android-icon-48x48.png", + "sizes": "48x48", + "type": "image/png", + "density": "1.0" + }, + { + "src": "favicon/android-icon-72x72.png", + "sizes": "72x72", + "type": "image/png", + "density": "1.5" + }, + { + "src": "favicon/android-icon-96x96.png", + "sizes": "96x96", + "type": "image/png", + "density": "2.0" + }, + { + "src": "favicon/android-icon-144x144.png", + "sizes": "144x144", + "type": "image/png", + "density": "3.0" + }, + { + "src": "favicon/android-icon-192x192.png", + "sizes": "192x192", + "type": "image/png", + "density": "4.0" + }, + { + "src": "favicon/android-icon-512x512.png", + "sizes": "512x512", + "type": "image/png", + "density": "4.0" + } + ], + "theme_color": "#FF6188", + "background_color": "#2D2A2E", + "display": "standalone" +} diff --git a/website/static/prism.css b/website/static/prism.css deleted file mode 100644 index 6d58efa47..000000000 --- a/website/static/prism.css +++ /dev/null @@ -1,140 +0,0 @@ -/* http://prismjs.com/download.html?themes=prism-okaidia&languages=markup+css+clike+javascript+actionscript+applescript+aspnet+bash+basic+c+bison+csharp+cpp+coffeescript+ruby+css-extras+diff+docker+erlang+fsharp+fortran+git+go+haskell+http+icon+java+json+latex+lua+makefile+markdown+matlab+nasm+nginx+objectivec+pascal+perl+php+php-extras+properties+python+r+jsx+rust+scala+scheme+smalltalk+sql+swift+vim+wiki */ -/** - * okaidia theme for JavaScript, CSS and HTML - * Loosely based on Monokai textmate theme by http://www.monokai.nl/ - * @author ocodia - */ - - code[class*="language-"], - pre[class*="language-"] { - color: #f8f8f2; - background: none; - text-shadow: 0 1px rgba(0, 0, 0, 0.3); - font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - } - - /* Code blocks */ - pre[class*="language-"] { - padding: 1em; - margin: .5em 0; - overflow: auto; - border-radius: 0.3em; - } - - :not(pre) > code[class*="language-"], - pre[class*="language-"] { - background: #272822; - } - - /* Inline code */ - :not(pre) > code[class*="language-"] { - padding: .1em; - border-radius: .3em; - white-space: normal; - } - - .token.comment, - .token.prolog, - .token.doctype, - .token.cdata { - color: slategray; - } - - .token.punctuation { - color: #f8f8f2; - } - - .namespace { - opacity: .7; - } - - .token.property, - .token.tag, - .token.constant, - .token.symbol, - .token.deleted { - color: #f92672; - } - - .token.boolean, - .token.number { - color: #ae81ff; - } - - .token.selector, - .token.attr-name, - .token.string, - .token.char, - .token.builtin, - .token.inserted { - color: #a6e22e; - } - - .token.operator, - .token.entity, - .token.url, - .language-css .token.string, - .style .token.string, - .token.variable { - color: #f8f8f2; - } - - .token.atrule, - .token.attr-value, - .token.function { - color: #e6db74; - } - - .token.keyword { - color: #66d9ef; - } - - .token.regex, - .token.important { - color: #fd971f; - } - - .token.important, - .token.bold { - font-weight: bold; - } - .token.italic { - font-style: italic; - } - - .token.entity { - cursor: help; - } - - div.prism-show-language { - position: relative; - } - - div.prism-show-language > div.prism-show-language-label[data-language] { - content: attr(data-language); - color: black; - background-color: #CFCFCF; - display: inline-block; - position: absolute; - top: 0; - right: 0; - font-size: 0.9em; - border-radius: 0 0 0 5px; - padding: 0 0.5em; - text-shadow: none; - } \ No newline at end of file diff --git a/website/static/prism.js b/website/static/prism.js deleted file mode 100755 index 647d69ca8..000000000 --- a/website/static/prism.js +++ /dev/null @@ -1,78 +0,0 @@ -/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+bash+css-extras+git+handlebars+http+makefile+markdown+nginx+php+sass+scss&plugins=line-highlight+line-numbers+autolinker+file-highlight+show-language */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={util:{encode:function(e){return e instanceof a?new a(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)break e;if(!(v instanceof a)){u.lastIndex=0;var b=u.exec(v),k=1;if(!b&&h&&m!=r.length-1){if(u.lastIndex=y,b=u.exec(e),!b)break;for(var w=b.index+(g?b[1].length:0),_=b.index+b[0].length,A=m,S=y,P=r.length;P>A&&_>S;++A)S+=(r[A].matchedStr||r[A]).length,w>=S&&(++m,y=S);if(r[m]instanceof a||r[A-1].greedy)continue;k=A-m,v=e.slice(y,S),b.index-=y}if(b){g&&(f=b[1].length);var w=b.index+f,b=b[0].slice(f),_=w+b.length,x=v.slice(0,w),O=v.slice(_),j=[m,k];x&&j.push(x);var N=new a(l,c?n.tokenize(b,c):b,d,b,h);j.push(N),O&&j.push(O),Array.prototype.splice.apply(r,j)}}}}}return r},hooks:{all:{},add:function(e,t){var a=n.hooks.all;a[e]=a[e]||[],a[e].push(t)},run:function(e,t){var a=n.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(t)}}},a=n.Token=function(e,t,n,a,r){this.type=e,this.content=t,this.alias=n,this.matchedStr=a||null,this.greedy=!!r};if(a.stringify=function(e,t,r){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return a.stringify(n,t,e)}).join("");var i={type:e.type,content:a.stringify(e.content,t,r),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}n.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=(o?" ":"")+s+'="'+(i.attributes[s]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+(o?" "+o:"")+">"+i.content+""},!_self.document)return _self.addEventListener?(_self.addEventListener("message",function(e){var t=JSON.parse(e.data),a=t.language,r=t.code,i=t.immediateClose;_self.postMessage(n.highlight(r,n.languages[a],a)),i&&_self.close()},!1),_self.Prism):_self.Prism;var r=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return r&&(n.filename=r.src,document.addEventListener&&!r.hasAttribute("data-manual")&&("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); - -Prism.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; -Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\w\W]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:{pattern:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*\*?|\/|~|\^|%|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\\\|\\?[^\\])*?`/,greedy:!0,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript; -Prism.languages.actionscript=Prism.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),Prism.languages.actionscript["class-name"].alias="function",Prism.languages.markup&&Prism.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\\1|\\?(?!\1)[\w\W])*\2)*\s*\/?>/,lookbehind:!0,inside:{rest:Prism.languages.markup}}}); -Prism.languages.applescript={comment:[/\(\*(?:\(\*[\w\W]*?\*\)|[\w\W])*?\*\)/,/--.+/,/#.+/],string:/"(?:\\?.)*?"/,number:/\b-?\d*\.?\d+([Ee]-?\d+)?\b/,operator:[/[&=≠≤≥*+\-\/÷^]|[<>]=?/,/\b(?:(?:start|begin|end)s? with|(?:(?:does not|doesn't) contain|contains?)|(?:is|isn't|is not) (?:in|contained by)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:(?:does not|doesn't) come|comes) (?:before|after)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equals|equal to|isn't|is not)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|or|div|mod|as|not))\b/],keyword:/\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,"class":{pattern:/\b(?:alias|application|boolean|class|constant|date|file|integer|list|number|POSIX file|real|record|reference|RGB color|script|text|centimetres|centimeters|feet|inches|kilometres|kilometers|metres|meters|miles|yards|square feet|square kilometres|square kilometers|square metres|square meters|square miles|square yards|cubic centimetres|cubic centimeters|cubic feet|cubic inches|cubic metres|cubic meters|cubic yards|gallons|litres|liters|quarts|grams|kilograms|ounces|pounds|degrees Celsius|degrees Fahrenheit|degrees Kelvin)\b/,alias:"builtin"},punctuation:/[{}():,¬«»《》]/}; -Prism.languages.aspnet=Prism.languages.extend("markup",{"page-directive tag":{pattern:/<%\s*@.*%>/i,inside:{"page-directive tag":/<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,rest:Prism.languages.markup.tag.inside}},"directive tag":{pattern:/<%.*%>/i,inside:{"directive tag":/<%\s*?[$=%#:]{0,2}|%>/i,rest:Prism.languages.csharp}}}),Prism.languages.aspnet.tag.pattern=/<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,Prism.languages.insertBefore("inside","punctuation",{"directive tag":Prism.languages.aspnet["directive tag"]},Prism.languages.aspnet.tag.inside["attr-value"]),Prism.languages.insertBefore("aspnet","comment",{"asp comment":/<%--[\w\W]*?--%>/}),Prism.languages.insertBefore("aspnet",Prism.languages.javascript?"script":"tag",{"asp script":{pattern:/()[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.csharp||{}}}); -!function(e){var t={variable:[{pattern:/\$?\(\([\w\W]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\w\W]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b-?(?:0x[\dA-Fa-f]+|\d*\.?\d+(?:[Ee]-?\d+)?)\b/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[a-z0-9_#\?\*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)(?:"|')?(\w+?)(?:"|')?\s*\r?\n(?:[\s\S])*?\r?\n\2/g,lookbehind:!0,greedy:!0,inside:t},{pattern:/(["'])(?:\\\\|\\?[^\\])*?\1/g,greedy:!0,inside:t}],variable:t.variable,"function":{pattern:/(^|\s|;|\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|npm|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\s|;|\||&)/,lookbehind:!0},keyword:{pattern:/(^|\s|;|\||&)(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\s|;|\||&)/,lookbehind:!0},"boolean":{pattern:/(^|\s|;|\||&)(?:true|false)(?=$|\s|;|\||&)/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a.boolean=e.languages.bash.boolean,a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation}(Prism); -Prism.languages.basic={string:/"(?:""|[!#$%&'()*,\/:;<=>?^_ +\-.A-Z\d])*"/i,comment:{pattern:/(?:!|REM\b).+/i,inside:{keyword:/^REM/i}},number:/(?:\b|\B[.-])(?:\d+\.?\d*)(?:E[+-]?\d+)?/i,keyword:/\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SHARED|SINGLE|SELECT CASE|SHELL|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,"function":/\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,operator:/<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,punctuation:/[,;:()]/}; -Prism.languages.c=Prism.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(define|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|stdin|stdout|stderr)\b/}),delete Prism.languages.c["class-name"],delete Prism.languages.c["boolean"]; -Prism.languages.bison=Prism.languages.extend("c",{}),Prism.languages.insertBefore("bison","comment",{bison:{pattern:/^[\s\S]*?%%[\s\S]*?%%/,inside:{c:{pattern:/%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,inside:{delimiter:{pattern:/^%?\{|%?\}$/,alias:"punctuation"},"bison-variable":{pattern:/[$@](?:<[^\s>]+>)?[\w$]+/,alias:"variable",inside:{punctuation:/<|>/}},rest:Prism.languages.c}},comment:Prism.languages.c.comment,string:Prism.languages.c.string,property:/\S+(?=:)/,keyword:/%\w+/,number:{pattern:/(^|[^@])\b(?:0x[\da-f]+|\d+)/i,lookbehind:!0},punctuation:/%[%?]|[|:;\[\]<>]/}}}); -Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+f?)\b/i}),Prism.languages.insertBefore("csharp","keyword",{"generic-method":{pattern:/[a-z0-9_]+\s*<[^>\r\n]+?>\s*(?=\()/i,alias:"function",inside:{keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}); -Prism.languages.cpp=Prism.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),Prism.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}); -!function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\?[^\\])*?'/,greedy:!0},{pattern:/"(?:\\?[^\\])*?"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\?[\s\S])*?`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},rest:e.languages.javascript}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"]}(Prism); -!function(e){e.languages.ruby=e.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:n}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:n}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:n}}]}(Prism); -Prism.languages.css.selector={pattern:/[^\{\}\s][^\{\}]*(?=\s*\{)/,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+(?:\(.*\))?/,"class":/\.[-:\.\w]+/,id:/#[-:\.\w]+/,attribute:/\[[^\]]+\]/}},Prism.languages.insertBefore("css","function",{hexcode:/#[\da-f]{3,6}/i,entity:/\\[\da-f]{1,8}/i,number:/[\d%\.]+/}); -Prism.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d+.*$/m],deleted:/^[-<].*$/m,inserted:/^[+>].*$/m,diff:{pattern:/^!(?!!).+$/m,alias:"important"}}; -Prism.languages.docker={keyword:{pattern:/(^\s*)(?:ONBUILD|FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|COPY|VOLUME|USER|WORKDIR|CMD|LABEL|ENTRYPOINT)(?=\s)/im,lookbehind:!0},string:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*?\1/,comment:/#.*/,punctuation:/---|\.\.\.|[:[\]{}\-,|>?]/}; -Prism.languages.erlang={comment:/%.+/,string:/"(?:\\?.)*?"/,"quoted-function":{pattern:/'(?:\\.|[^'\\])+'(?=\()/,alias:"function"},"quoted-atom":{pattern:/'(?:\\.|[^'\\])+'/,alias:"atom"},"boolean":/\b(?:true|false)\b/,keyword:/\b(?:fun|when|case|of|end|if|receive|after|try|catch)\b/,number:[/\$\\?./,/\d+#[a-z0-9]+/i,/(?:\b|-)\d*\.?\d+([Ee][+-]?\d+)?\b/],"function":/\b[a-z][\w@]*(?=\()/,variable:{pattern:/(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,lookbehind:!0},operator:[/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:bnot|div|rem|band|bor|bxor|bsl|bsr|not|and|or|xor|orelse|andalso)\b/,{pattern:/(^|[^<])<(?!<)/,lookbehind:!0},{pattern:/(^|[^>])>(?!>)/,lookbehind:!0}],atom:/\b[a-z][\w@]*/,punctuation:/[()[\]{}:;,.#|]|<<|>>/}; -Prism.languages.fsharp=Prism.languages.extend("clike",{comment:[{pattern:/(^|[^\\])\(\*[\w\W]*?\*\)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],keyword:/\b(?:let|return|use|yield)(?:!\B|\b)|\b(abstract|and|as|assert|base|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|global|if|in|inherit|inline|interface|internal|lazy|match|member|module|mutable|namespace|new|not|null|of|open|or|override|private|public|rec|select|static|struct|then|to|true|try|type|upcast|val|void|when|while|with|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|include|method|mixin|object|parallel|process|protected|pure|sealed|tailcall|trait|virtual|volatile)\b/,string:/(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|("|')(?:\\\1|\\?(?!\1)[\s\S])*\1)B?/,number:[/\b-?0x[\da-fA-F]+(un|lf|LF)?\b/,/\b-?0b[01]+(y|uy)?\b/,/\b-?(\d*\.?\d+|\d+\.)([fFmM]|[eE][+-]?\d+)?\b/,/\b-?\d+(y|uy|s|us|l|u|ul|L|UL|I)?\b/]}),Prism.languages.insertBefore("fsharp","keyword",{preprocessor:{pattern:/^[^\r\n\S]*#.*/m,alias:"property",inside:{directive:{pattern:/(\s*#)\b(else|endif|if|light|line|nowarn)\b/,lookbehind:!0,alias:"keyword"}}}}); -Prism.languages.fortran={"quoted-number":{pattern:/[BOZ](['"])[A-F0-9]+\1/i,alias:"number"},string:{pattern:/(?:\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:\s*!.+(?:\r\n?|\n))?|(?!\1).)*(?:\1|&)/,inside:{comment:{pattern:/(&(?:\r\n?|\n)\s*)!.*/,lookbehind:!0}}},comment:/!.*/,"boolean":/\.(?:TRUE|FALSE)\.(?:_\w+)?/i,number:/(?:\b|[+-])(?:\d+(?:\.\d*)?|\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,keyword:[/\b(?:INTEGER|REAL|DOUBLE ?PRECISION|COMPLEX|CHARACTER|LOGICAL)\b/i,/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEWHERE|ELSEIF|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i],operator:[/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV)\.|\.[A-Z]+\./i,{pattern:/(^|(?!\().)\/(?!\))/,lookbehind:!0}],punctuation:/\(\/|\/\)|[(),;:&]/}; -Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(\\?.)*?\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s(--|-)\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \w{40}$/m}; -Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(bool|byte|complex(64|128)|error|float(32|64)|rune|string|u?int(8|16|32|64|)|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(ln)?|real|recover)\b/,"boolean":/\b(_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/\b(-?(0x[a-f\d]+|(\d+\.?\d*|\.\d+)(e[-+]?\d+)?)i?)\b/i,string:/("|'|`)(\\?.|\r|\n)*?\1/}),delete Prism.languages.go["class-name"]; -Prism.languages.haskell={comment:{pattern:/(^|[^-!#$%*+=?&@|~.:<>^\\\/])(--[^-!#$%*+=?&@|~.:<>^\\\/].*|{-[\w\W]*?-})/m,lookbehind:!0},"char":/'([^\\']|\\([abfnrtv\\"'&]|\^[A-Z@[\]\^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,string:{pattern:/"([^\\"]|\\([abfnrtv\\"'&]|\^[A-Z@[\]\^_]|NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|\d+|o[0-7]+|x[0-9a-fA-F]+)|\\\s+\\)*"/,greedy:!0},keyword:/\b(case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,import_statement:{pattern:/(\r?\n|\r|^)\s*import\s+(qualified\s+)?([A-Z][_a-zA-Z0-9']*)(\.[A-Z][_a-zA-Z0-9']*)*(\s+as\s+([A-Z][_a-zA-Z0-9']*)(\.[A-Z][_a-zA-Z0-9']*)*)?(\s+hiding\b)?/m,inside:{keyword:/\b(import|qualified|as|hiding)\b/}},builtin:/\b(abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,number:/\b(\d+(\.\d+)?(e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,operator:/\s\.\s|[-!#$%*+=?&@|~.:<>^\\\/]*\.[-!#$%*+=?&@|~.:<>^\\\/]+|[-!#$%*+=?&@|~.:<>^\\\/]+\.[-!#$%*+=?&@|~.:<>^\\\/]*|[-!#$%*+=?&@|~:<>^\\\/]+|`([A-Z][_a-zA-Z0-9']*\.)*[_a-z][_a-zA-Z0-9']*`/,hvariable:/\b([A-Z][_a-zA-Z0-9']*\.)*[_a-z][_a-zA-Z0-9']*\b/,constant:/\b([A-Z][_a-zA-Z0-9']*\.)*[A-Z][_a-zA-Z0-9']*\b/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.http={"request-line":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b\shttps?:\/\/\S+\sHTTP\/[0-9.]+/m,inside:{property:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/,"attr-name":/:\w+/}},"response-status":{pattern:/^HTTP\/1.[01] [0-9]+.*/m,inside:{property:{pattern:/(^HTTP\/1.[01] )[0-9]+.*/i,lookbehind:!0}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var httpLanguages={"application/json":Prism.languages.javascript,"application/xml":Prism.languages.markup,"text/xml":Prism.languages.markup,"text/html":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp("(content-type:\\s*"+contentType+"[\\w\\W]*?)(?:\\r?\\n|\\r){2}[\\w\\W]*","i"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore("http","header-name",options)}; -Prism.languages.icon={comment:/#.*/,string:/(["'])(?:(?!\1)[^\\\r\n]|\\.|_(?:\r?\n|\r))*\1/,number:/\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,"builtin-keyword":{pattern:/&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,alias:"variable"},directive:{pattern:/\$\w+/,alias:"builtin"},keyword:/\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,"function":/(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,operator:/[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,punctuation:/[\[\](){},;]/}; -Prism.languages.java=Prism.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),Prism.languages.insertBefore("java","function",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0}}); -Prism.languages.json={property:/".*?"(?=\s*:)/gi,string:/"(?!:)(\\?[^"])*?"(?!:)/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,punctuation:/[{}[\]);,]/g,operator:/:/g,"boolean":/\b(true|false)\b/gi,"null":/\bnull\b/gi},Prism.languages.jsonp=Prism.languages.json; -!function(a){var e=/\\([^a-z()[\]]|[a-z\*]+)/i,n={"equation-command":{pattern:e,alias:"regex"}};a.languages.latex={comment:/%.*/m,cdata:{pattern:/(\\begin\{((?:verbatim|lstlisting)\*?)\})([\w\W]*?)(?=\\end\{\2\})/,lookbehind:!0},equation:[{pattern:/\$(?:\\?[\w\W])*?\$|\\\((?:\\?[\w\W])*?\\\)|\\\[(?:\\?[\w\W])*?\\\]/,inside:n,alias:"string"},{pattern:/(\\begin\{((?:equation|math|eqnarray|align|multline|gather)\*?)\})([\w\W]*?)(?=\\end\{\2\})/,lookbehind:!0,inside:n,alias:"string"}],keyword:{pattern:/(\\(?:begin|end|ref|cite|label|usepackage|documentclass)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,lookbehind:!0},url:{pattern:/(\\url\{)[^}]+(?=\})/,lookbehind:!0},headline:{pattern:/(\\(?:part|chapter|section|subsection|frametitle|subsubsection|paragraph|subparagraph|subsubparagraph|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\}(?:\[[^\]]+\])?)/,lookbehind:!0,alias:"class-name"},"function":{pattern:e,alias:"selector"},punctuation:/[[\]{}&]/}}(Prism); -Prism.languages.lua={comment:/^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,string:{pattern:/(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[\s\S]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,greedy:!0},number:/\b0x[a-f\d]+\.?[a-f\d]*(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|\.?\d*(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,keyword:/\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,"function":/(?!\d)\w+(?=\s*(?:[({]))/,operator:[/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,{pattern:/(^|[^.])\.\.(?!\.)/,lookbehind:!0}],punctuation:/[\[\](){},;]|\.+|:+/}; -Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|.)*/,lookbehind:!0},string:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^[^:=\r\n]+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; -Prism.languages.markdown=Prism.languages.extend("markup",{}),Prism.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},code:[{pattern:/^(?: {4}|\t).+/m,alias:"keyword"},{pattern:/``.+?``|`[^`\n]+`/,alias:"keyword"}],title:[{pattern:/\w+.*(?:\r?\n|\r)(?:==+|--+)/,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])([\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:/(^|[^\\])(\*\*|__)(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^\*\*|^__|\*\*$|__$/}},italic:{pattern:/(^|[^\\])([*_])(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\[[^\]]+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[[^\]\n]*\])/,inside:{variable:{pattern:/(!?\[)[^\]]+(?=\]$)/,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.italic.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.bold.inside.italic=Prism.util.clone(Prism.languages.markdown.italic),Prism.languages.markdown.italic.inside.bold=Prism.util.clone(Prism.languages.markdown.bold); -Prism.languages.matlab={string:/\B'(?:''|[^'\n])*'/,comment:[/%\{[\s\S]*?\}%/,/%.+/],number:/\b-?(?:\d*\.?\d+(?:[eE][+-]?\d+)?(?:[ij])?|[ij])\b/,keyword:/\b(?:break|case|catch|continue|else|elseif|end|for|function|if|inf|NaN|otherwise|parfor|pause|pi|return|switch|try|while)\b/,"function":/(?!\d)\w+(?=\s*\()/,operator:/\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,punctuation:/\.{3}|[.,;\[\](){}!]/}; -Prism.languages.nasm={comment:/;.*$/m,string:/("|'|`)(\\?.)*?\1/m,label:{pattern:/(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,lookbehind:!0,alias:"function"},keyword:[/\[?BITS (16|32|64)\]?/m,{pattern:/(^\s*)section\s*[a-zA-Z\.]+:?/im,lookbehind:!0},/(?:extern|global)[^;\r\n]*/im,/(?:CPU|FLOAT|DEFAULT).*$/m],register:{pattern:/\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(bp|sp|si|di)|[cdefgs]s)\b/i,alias:"variable"},number:/(\b|-|(?=\$))(0[hx][\da-f]*\.?[\da-f]+(p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|\d*\.?\d+(\.?e[+-]?\d+)?[dt]?)\b/i,operator:/[\[\]*+\-\/%<>=&|$!]/}; -Prism.languages.nginx=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},keyword:/\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|accept_mutex|accept_mutex_delay|access_log|add_after_body|add_before_body|add_header|addition_types|aio|alias|allow|ancient_browser|ancient_browser_value|auth|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|autoindex|autoindex_exact_size|autoindex_localtime|break|charset|charset_map|charset_types|chunked_transfer_encoding|client_body_buffer_size|client_body_in_file_only|client_body_in_single_buffer|client_body_temp_path|client_body_timeout|client_header_buffer_size|client_header_timeout|client_max_body_size|connection_pool_size|create_full_put_path|daemon|dav_access|dav_methods|debug_connection|debug_points|default_type|deny|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_cache|fastcgi_cache_bypass|fastcgi_cache_key|fastcgi_cache_lock|fastcgi_cache_lock_timeout|fastcgi_cache_methods|fastcgi_cache_min_uses|fastcgi_cache_path|fastcgi_cache_purge|fastcgi_cache_use_stale|fastcgi_cache_valid|fastcgi_connect_timeout|fastcgi_hide_header|fastcgi_ignore_client_abort|fastcgi_ignore_headers|fastcgi_index|fastcgi_intercept_errors|fastcgi_keep_conn|fastcgi_max_temp_file_size|fastcgi_next_upstream|fastcgi_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|fastcgi_send_timeout|fastcgi_split_path_info|fastcgi_store|fastcgi_store_access|fastcgi_temp_file_write_size|fastcgi_temp_path|flv|geo|geoip_city|geoip_country|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|msie_padding|msie_refresh|multi_accept|open_file_cache|open_file_cache_errors|open_file_cache_min_uses|open_file_cache_valid|open_log_file_cache|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|proxy_busy_buffers_size|proxy_cache|proxy_cache_bypass|proxy_cache_key|proxy_cache_lock|proxy_cache_lock_timeout|proxy_cache_methods|proxy_cache_min_uses|proxy_cache_path|proxy_cache_use_stale|proxy_cache_valid|proxy_connect_timeout|proxy_cookie_domain|proxy_cookie_path|proxy_headers_hash_bucket_size|proxy_headers_hash_max_size|proxy_hide_header|proxy_http_version|proxy_ignore_client_abort|proxy_ignore_headers|proxy_intercept_errors|proxy_max_temp_file_size|proxy_method|proxy_next_upstream|proxy_no_cache|proxy_pass|proxy_pass_error_message|proxy_pass_header|proxy_pass_request_body|proxy_pass_request_headers|proxy_read_timeout|proxy_redirect|proxy_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|sub_filter_once|sub_filter_types|tcp_nodelay|tcp_nopush|timeout|timer_resolution|try_files|types|types_hash_bucket_size|types_hash_max_size|underscores_in_headers|uninitialized_variable_warn|upstream|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i}),Prism.languages.insertBefore("nginx","keyword",{variable:/\$[a-z_]+/i}); -Prism.languages.objectivec=Prism.languages.extend("c",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,string:/("|')(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}); -Prism.languages.pascal={comment:[/\(\*[\s\S]+?\*\)/,/\{[\s\S]+?\}/,/\/\/.*/],string:/(?:'(?:''|[^'\r\n])*'|#[&$%]?[a-f\d]+)+|\^[a-z]/i,keyword:[{pattern:/(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,lookbehind:!0},{pattern:/(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,lookbehind:!0}],number:[/[+-]?(?:[&%]\d+|\$[a-f\d]+)/i,/([+-]|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?/i],operator:[/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/i,{pattern:/(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,lookbehind:!0}],punctuation:/\(\.|\.\)|[()\[\]:;,.]/}; -Prism.languages.perl={comment:[{pattern:/(^\s*)=\w+[\s\S]*?=cut.*/m,lookbehind:!0},{pattern:/(^|[^\\$])#.*/,lookbehind:!0}],string:[/\b(?:q|qq|qx|qw)\s*([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,/\b(?:q|qq|qx|qw)\s+([a-zA-Z0-9])(?:[^\\]|\\[\s\S])*?\1/,/\b(?:q|qq|qx|qw)\s*\((?:[^()\\]|\\[\s\S])*\)/,/\b(?:q|qq|qx|qw)\s*\{(?:[^{}\\]|\\[\s\S])*\}/,/\b(?:q|qq|qx|qw)\s*\[(?:[^[\]\\]|\\[\s\S])*\]/,/\b(?:q|qq|qx|qw)\s*<(?:[^<>\\]|\\[\s\S])*>/,/("|`)(?:[^\\]|\\[\s\S])*?\1/,/'(?:[^'\\\r\n]|\\.)*'/],regex:[/\b(?:m|qr)\s*([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[msixpodualngc]*/,/\b(?:m|qr)\s+([a-zA-Z0-9])(?:[^\\]|\\.)*?\1[msixpodualngc]*/,/\b(?:m|qr)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngc]*/,/\b(?:m|qr)\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngc]*/,/\b(?:m|qr)\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngc]*/,/\b(?:m|qr)\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngc]*/,{pattern:/(^|[^-]\b)(?:s|tr|y)\s*([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\2(?:[^\\]|\\[\s\S])*?\2[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s+([a-zA-Z0-9])(?:[^\\]|\\[\s\S])*?\2(?:[^\\]|\\[\s\S])*?\2[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\((?:[^()\\]|\\[\s\S])*\)\s*\((?:[^()\\]|\\[\s\S])*\)[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\{(?:[^{}\\]|\\[\s\S])*\}\s*\{(?:[^{}\\]|\\[\s\S])*\}[msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*\[(?:[^[\]\\]|\\[\s\S])*\]\s*\[(?:[^[\]\\]|\\[\s\S])*\][msixpodualngcer]*/,lookbehind:!0},{pattern:/(^|[^-]\b)(?:s|tr|y)\s*<(?:[^<>\\]|\\[\s\S])*>\s*<(?:[^<>\\]|\\[\s\S])*>[msixpodualngcer]*/,lookbehind:!0},/\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor|x)\b))/],variable:[/[&*$@%]\{\^[A-Z]+\}/,/[&*$@%]\^[A-Z_]/,/[&*$@%]#?(?=\{)/,/[&*$@%]#?((::)*'?(?!\d)[\w$]+)+(::)*/i,/[&*$@%]\d+/,/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/],filehandle:{pattern:/<(?![<=])\S*>|\b_\b/,alias:"symbol"},vstring:{pattern:/v\d+(\.\d+)*|\d+(\.\d+){2,}/,alias:"string"},"function":{pattern:/sub [a-z0-9_]+/i,inside:{keyword:/sub/}},keyword:/\b(any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|say|state|sub|switch|undef|unless|until|use|when|while)\b/,number:/\b-?(0x[\dA-Fa-f](_?[\dA-Fa-f])*|0b[01](_?[01])*|(\d(_?\d)*)?\.?\d(_?\d)*([Ee][+-]?\d+)?)\b/,operator:/-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(lt|gt|le|ge|eq|ne|cmp|not|and|or|xor)\b/,punctuation:/[{}[\];(),:]/}; -Prism.languages.php=Prism.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0}}),Prism.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),Prism.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),Prism.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(n){return e.tokenStack.push(n),"{{{PHP"+e.tokenStack.length+"}}}"}))}),Prism.hooks.add("after-highlight",function(e){if("php"===e.language){for(var n,a=0;n=e.tokenStack[a];a++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(a+1)+"}}}",Prism.highlight(n,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),Prism.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:Prism.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})); -Prism.languages.insertBefore("php","variable",{"this":/\$this\b/,global:/\$(?:_(?:SERVER|GET|POST|FILES|REQUEST|SESSION|ENV|COOKIE)|GLOBALS|HTTP_RAW_POST_DATA|argc|argv|php_errormsg|http_response_header)/,scope:{pattern:/\b[\w\\]+::/,inside:{keyword:/(static|self|parent)/,punctuation:/(::|\\)/}}}); -Prism.languages.properties={comment:/^[ \t]*[#!].*$/m,"attr-value":{pattern:/(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+?(?: *[=:] *| ))(?:\\(?:\r\n|[\s\S])|.)+/m,lookbehind:!0},"attr-name":/^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+?(?= *[ =:]| )/m,punctuation:/[=:]/}; -Prism.languages.python={"triple-quoted-string":{pattern:/"""[\s\S]+?"""|'''[\s\S]+?'''/,alias:"string"},comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:{pattern:/("|')(?:\\\\|\\?[^\\\r\n])*?\1/,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.r={comment:/#.*/,string:/(['"])(?:\\?.)*?\1/,"percent-operator":{pattern:/%[^%\s]*%/,alias:"operator"},"boolean":/\b(?:TRUE|FALSE)\b/,ellipsis:/\.\.(?:\.|\d+)/,number:[/\b(?:NaN|Inf)\b/,/\b(?:0x[\dA-Fa-f]+(?:\.\d*)?|\d*\.?\d+)(?:[EePp][+-]?\d+)?[iL]?\b/],keyword:/\b(?:if|else|repeat|while|function|for|in|next|break|NULL|NA|NA_integer_|NA_real_|NA_complex_|NA_character_)\b/,operator:/->?>?|<(?:=|=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,punctuation:/[(){}\[\],;]/}; -!function(a){var e=a.util.clone(a.languages.javascript);a.languages.jsx=a.languages.extend("markup",e),a.languages.jsx.tag.pattern=/<\/?[\w\.:-]+\s*(?:\s+[\w\.:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+|(\{[\w\W]*?\})))?\s*)*\/?>/i,a.languages.jsx.tag.inside["attr-value"].pattern=/=[^\{](?:('|")[\w\W]*?(\1)|[^\s>]+)/i;var s=a.util.clone(a.languages.jsx);delete s.punctuation,s=a.languages.insertBefore("jsx","operator",{punctuation:/=(?={)|[{}[\];(),.:]/},{jsx:s}),a.languages.insertBefore("inside","attr-value",{script:{pattern:/=(\{(?:\{[^}]*\}|[^}])+\})/i,inside:s,alias:"language-javascript"}},a.languages.jsx.tag)}(Prism); -Prism.languages.rust={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:[/b?r(#*)"(?:\\?.)*?"\1/,/b?("|')(?:\\?.)*?\1/],keyword:/\b(?:abstract|alignof|as|be|box|break|const|continue|crate|do|else|enum|extern|false|final|fn|for|if|impl|in|let|loop|match|mod|move|mut|offsetof|once|override|priv|pub|pure|ref|return|sizeof|static|self|struct|super|true|trait|type|typeof|unsafe|unsized|use|virtual|where|while|yield)\b/,attribute:{pattern:/#!?\[.+?\]/,alias:"attr-name"},"function":[/[a-z0-9_]+(?=\s*\()/i,/[a-z0-9_]+!(?=\s*\(|\[)/i],"macro-rules":{pattern:/[a-z0-9_]+!/i,alias:"function"},number:/\b-?(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(\d(_?\d)*)?\.?\d(_?\d)*([Ee][+-]?\d+)?)(?:_?(?:[iu](?:8|16|32|64)?|f32|f64))?\b/,"closure-params":{pattern:/\|[^|]*\|(?=\s*[{-])/,inside:{punctuation:/[\|:,]/,operator:/[&*]/}},punctuation:/[{}[\];(),:]|\.+|->/,operator:/[-+*\/%!^=]=?|@|&[&=]?|\|[|=]?|<>?=?/}; -Prism.languages.scala=Prism.languages.extend("java",{keyword:/<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,string:[{pattern:/"""[\W\w]*?"""/,greedy:!0},{pattern:/("|')(?:\\\\|\\?[^\\\r\n])*?\1/,greedy:!0}],builtin:/\b(?:String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/,number:/\b(?:0x[\da-f]*\.?[\da-f]+|\d*\.?\d+e?\d*[dfl]?)\b/i,symbol:/'[^\d\s\\]\w*/}),delete Prism.languages.scala["class-name"],delete Prism.languages.scala["function"]; -Prism.languages.scheme={comment:/;.*/,string:/"(?:[^"\\\r\n]|\\.)*?"|'[^('\s]*/,keyword:{pattern:/(\()(?:define(?:-syntax|-library|-values)?|(?:case-)?lambda|let(?:\*|rec)?(?:-values)?|else|if|cond|begin|delay(?:-force)?|parameterize|guard|set!|(?:quasi-)?quote|syntax-rules)/,lookbehind:!0},builtin:{pattern:/(\()(?:(?:cons|car|cdr|list|call-with-current-continuation|call\/cc|append|abs|apply|eval)\b|null\?|pair\?|boolean\?|eof-object\?|char\?|procedure\?|number\?|port\?|string\?|vector\?|symbol\?|bytevector\?)/,lookbehind:!0},number:{pattern:/(\s|\))[-+]?[0-9]*\.?[0-9]+(?:\s*[-+]\s*[0-9]*\.?[0-9]+i)?\b/,lookbehind:!0},"boolean":/#[tf]/,operator:{pattern:/(\()(?:[-+*%\/]|[<>]=?|=>?)/,lookbehind:!0},"function":{pattern:/(\()[^\s()]*(?=\s)/,lookbehind:!0},punctuation:/[()]/}; -Prism.languages.smalltalk={comment:/"(?:""|[^"])+"/,string:/'(?:''|[^'])+'/,symbol:/#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,"block-arguments":{pattern:/(\[\s*):[^\[|]*?\|/,lookbehind:!0,inside:{variable:/:[\da-z]+/i,punctuation:/\|/}},"temporary-variables":{pattern:/\|[^|]+\|/,inside:{variable:/[\da-z]+/i,punctuation:/\|/}},keyword:/\b(?:nil|true|false|self|super|new)\b/,character:{pattern:/\$./,alias:"string"},number:[/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,/(?:\B-|\b)\d+(?:\.\d+)?(?:e-?\d+)?/],operator:/[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,punctuation:/[.;:?\[\](){}]/}; -Prism.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},string:{pattern:/(^|[^@\\])("|')(?:\\?[\s\S])*?\2/,lookbehind:!0},variable:/@[\w.$]+|@("|'|`)(?:\\?[\s\S])+?\1/,"function":/\b(?:COUNT|SUM|AVG|MIN|MAX|FIRST|LAST|UCASE|LCASE|MID|LEN|ROUND|NOW|FORMAT)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR VARYING|CHARACTER (?:SET|VARYING)|CHARSET|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|DATA(?:BASES?)?|DATE(?:TIME)?|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITER(?:S)?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE(?: PRECISION)?|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE KEY|ELSE|ENABLE|ENCLOSED BY|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPE(?:D BY)?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTO|INVOKER|ISOLATION LEVEL|JOIN|KEYS?|KILL|LANGUAGE SQL|LAST|LEFT|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MODIFIES SQL DATA|MODIFY|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL(?: CHAR VARYING| CHARACTER(?: VARYING)?| VARCHAR)?|NATURAL|NCHAR(?: VARCHAR)?|NEXT|NO(?: SQL|CHECK|CYCLE)?|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READ(?:S SQL DATA|TEXT)?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEATABLE|REPLICATION|REQUIRE|RESTORE|RESTRICT|RETURNS?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE MODE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|START(?:ING BY)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED BY|TEXT(?:SIZE)?|THEN|TIMESTAMP|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNPIVOT|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?)\b/i,"boolean":/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b-?(?:0x)?\d*\.?[\da-f]+\b/,operator:/[-+*\/=%^~]|&&?|\|?\||!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/}; -Prism.languages.swift=Prism.languages.extend("clike",{string:{pattern:/("|')(\\(?:\((?:[^()]|\([^)]+\))+\)|\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:{pattern:/\\\((?:[^()]|\([^)]+\))+\)/,inside:{delimiter:{pattern:/^\\\(|\)$/,alias:"variable"}}}}},keyword:/\b(as|associativity|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|Protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__))\b/,number:/\b([\d_]+(\.[\de_]+)?|0x[a-f0-9_]+(\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,constant:/\b(nil|[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,atrule:/@\b(IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|noreturn|NS(?:Copying|Managed)|objc|UIApplicationMain|auto_closure)\b/,builtin:/\b([A-Z]\S+|abs|advance|alignof(?:Value)?|assert|contains|count(?:Elements)?|debugPrint(?:ln)?|distance|drop(?:First|Last)|dump|enumerate|equal|filter|find|first|getVaList|indices|isEmpty|join|last|lexicographicalCompare|map|max(?:Element)?|min(?:Element)?|numericCast|overlaps|partition|print(?:ln)?|reduce|reflect|reverse|sizeof(?:Value)?|sort(?:ed)?|split|startsWith|stride(?:of(?:Value)?)?|suffix|swap|toDebugString|toString|transcode|underestimateCount|unsafeBitCast|with(?:ExtendedLifetime|Unsafe(?:MutablePointers?|Pointers?)|VaList))\b/}),Prism.languages.swift.string.inside.interpolation.inside.rest=Prism.util.clone(Prism.languages.swift); -Prism.languages.vim={string:/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,comment:/".*/,"function":/\w+(?=\()/,keyword:/\b(?:ab|abbreviate|abc|abclear|abo|aboveleft|al|all|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|ar|args|argu|argument|as|ascii|bad|badd|ba|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bN|bNext|bo|botright|bp|bprevious|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|br|brewind|bro|browse|bufdo|b|buffer|buffers|bun|bunload|bw|bwipeout|ca|cabbrev|cabc|cabclear|caddb|caddbuffer|cad|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cgetb|cgetbuffer|cgete|cgetexpr|cg|cgetfile|c|change|changes|chd|chdir|che|checkpath|checkt|checktime|cla|clast|cl|clist|clo|close|cmapc|cmapclear|cnew|cnewer|cn|cnext|cN|cNext|cnf|cnfile|cNfcNfile|cnorea|cnoreabbrev|col|colder|colo|colorscheme|comc|comclear|comp|compiler|conf|confirm|con|continue|cope|copen|co|copy|cpf|cpfile|cp|cprevious|cq|cquit|cr|crewind|cuna|cunabbrev|cu|cunmap|cw|cwindow|debugg|debuggreedy|delc|delcommand|d|delete|delf|delfunction|delm|delmarks|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|di|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|earlier|echoe|echoerr|echom|echomsg|echon|e|edit|el|else|elsei|elseif|em|emenu|endfo|endfor|endf|endfunction|endfun|en|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fina|finally|fin|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|folddoc|folddoclosed|foldd|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|ha|hardcopy|h|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iuna|iunabbrev|iu|iunmap|j|join|ju|jumps|k|keepalt|keepj|keepjumps|kee|keepmarks|laddb|laddbuffer|lad|laddexpr|laddf|laddfile|lan|language|la|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|let|left|lefta|leftabove|lex|lexpr|lf|lfile|lfir|lfirst|lgetb|lgetbuffer|lgete|lgetexpr|lg|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|l|list|ll|lla|llast|lli|llist|lmak|lmake|lm|lmap|lmapc|lmapclear|lnew|lnewer|lne|lnext|lN|lNext|lnf|lnfile|lNf|lNfile|ln|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lpf|lpfile|lp|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|mak|make|ma|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkvie|mkview|mkv|mkvimrc|mod|mode|m|move|mzf|mzfile|mz|mzscheme|nbkey|new|n|next|N|Next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|omapc|omapclear|on|only|o|open|opt|options|ou|ounmap|pc|pclose|ped|pedit|pe|perl|perld|perldo|po|pop|popu|popu|popup|pp|ppop|pre|preserve|prev|previous|p|print|P|Print|profd|profdel|prof|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptN|ptNext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|pyf|pyfile|py|python|qa|qall|q|quit|quita|quitall|r|read|rec|recover|redi|redir|red|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|rub|ruby|rubyd|rubydo|rubyf|rubyfile|ru|runtime|rv|rviminfo|sal|sall|san|sandbox|sa|sargument|sav|saveas|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbN|sbNext|sbp|sbprevious|sbr|sbrewind|sb|sbuffer|scripte|scriptencoding|scrip|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sla|slast|sl|sleep|sm|smagic|sm|smap|smapc|smapclear|sme|smenu|sn|snext|sN|sNext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|sor|sort|so|source|spelld|spelldump|spe|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|sp|split|spr|sprevious|sre|srewind|sta|stag|startg|startgreplace|star|startinsert|startr|startreplace|stj|stjump|st|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tab|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabnew|tabn|tabnext|tabN|tabNext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|ta|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tm|tmenu|tn|tnext|tN|tNext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tu|tunmenu|una|unabbreviate|u|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|verb|verbose|ve|version|vert|vertical|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|vi|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|wa|wall|wh|while|winc|wincmd|windo|winp|winpos|win|winsize|wn|wnext|wN|wNext|wp|wprevious|wq|wqa|wqall|w|write|ws|wsverb|wv|wviminfo|X|xa|xall|x|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|XMLent|XMLns|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,builtin:/\b(?:autocmd|acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|t_AB|t_AF|t_al|t_AL|t_bc|t_cd|t_ce|t_Ce|t_cl|t_cm|t_Co|t_cs|t_Cs|t_CS|t_CV|t_da|t_db|t_dl|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_fs|t_IE|t_IS|t_k1|t_K1|t_k2|t_k3|t_K3|t_k4|t_K4|t_k5|t_K5|t_k6|t_K6|t_k7|t_K7|t_k8|t_K8|t_k9|t_K9|t_KA|t_kb|t_kB|t_KB|t_KC|t_kd|t_kD|t_KD|t_ke|t_KE|t_KF|t_KG|t_kh|t_KH|t_kI|t_KI|t_KJ|t_KK|t_kl|t_KL|t_kN|t_kP|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_RI|t_RV|t_Sb|t_se|t_Sf|t_SI|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_WP|t_WS|t_xs|t_ZH|t_ZR)\b/,number:/\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,operator:/\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,punctuation:/[{}[\](),;:]/}; -Prism.languages.wiki=Prism.languages.extend("markup",{"block-comment":{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0,alias:"comment"},heading:{pattern:/^(=+).+?\1/m,inside:{punctuation:/^=+|=+$/,important:/.+/}},emphasis:{pattern:/('{2,5}).+?\1/,inside:{"bold italic":{pattern:/(''''').+?(?=\1)/,lookbehind:!0},bold:{pattern:/(''')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},italic:{pattern:/('')[^'](?:.*?[^'])?(?=\1)/,lookbehind:!0},punctuation:/^''+|''+$/}},hr:{pattern:/^-{4,}/m,alias:"punctuation"},url:[/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:RFC|PMID) +\d+/i,/\[\[.+?\]\]|\[.+?\]/],variable:[/__[A-Z]+__/,/\{{3}.+?\}{3}/,/\{\{.+?}}/],symbol:[/^#redirect/im,/~{3,5}/],"table-tag":{pattern:/((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,lookbehind:!0,inside:{"table-bar":{pattern:/\|$/,alias:"punctuation"},rest:Prism.languages.markup.tag.inside}},punctuation:/^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m}),Prism.languages.insertBefore("wiki","tag",{nowiki:{pattern:/<(nowiki|pre|source)\b[\w\W]*?>[\w\W]*?<\/\1>/i,inside:{tag:{pattern:/<(?:nowiki|pre|source)\b[\w\W]*?>|<\/(?:nowiki|pre|source)>/i,inside:Prism.languages.markup.tag.inside}}}}); - -Prism.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=.$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; -Prism.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/()[\w\W]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css"}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag)); -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),Prism.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\w\W]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript"}}),Prism.languages.js=Prism.languages.javascript; -!function(e){var t={variable:[{pattern:/\$?\(\([\w\W]+?\)\)/,inside:{variable:[{pattern:/(^\$\(\([\w\W]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b-?(?:0x[\dA-Fa-f]+|\d*\.?\d+(?:[Ee]-?\d+)?)\b/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\([^)]+\)|`[^`]+`/,inside:{variable:/^\$\(|^`|\)$|`$/}},/\$(?:[a-z0-9_#\?\*!@]+|\{[^}]+\})/i]};e.languages.bash={shebang:{pattern:/^#!\s*\/bin\/bash|^#!\s*\/bin\/sh/,alias:"important"},comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},string:[{pattern:/((?:^|[^<])<<\s*)(?:"|')?(\w+?)(?:"|')?\s*\r?\n(?:[\s\S])*?\r?\n\2/g,lookbehind:!0,inside:t},{pattern:/("|')(?:\\?[\s\S])*?\1/g,inside:t}],variable:t.variable,"function":{pattern:/(^|\s|;|\||&)(?:alias|apropos|apt-get|aptitude|aspell|awk|basename|bash|bc|bg|builtin|bzip2|cal|cat|cd|cfdisk|chgrp|chmod|chown|chroot|chkconfig|cksum|clear|cmp|comm|command|cp|cron|crontab|csplit|cut|date|dc|dd|ddrescue|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|enable|env|ethtool|eval|exec|expand|expect|export|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|getopts|git|grep|groupadd|groupdel|groupmod|groups|gzip|hash|head|help|hg|history|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|jobs|join|kill|killall|less|link|ln|locate|logname|logout|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|make|man|mkdir|mkfifo|mkisofs|mknod|more|most|mount|mtools|mtr|mv|mmv|nano|netstat|nice|nl|nohup|notify-send|nslookup|open|op|passwd|paste|pathchk|ping|pkill|popd|pr|printcap|printenv|printf|ps|pushd|pv|pwd|quota|quotacheck|quotactl|ram|rar|rcp|read|readarray|readonly|reboot|rename|renice|remsync|rev|rm|rmdir|rsync|screen|scp|sdiff|sed|seq|service|sftp|shift|shopt|shutdown|sleep|slocate|sort|source|split|ssh|stat|strace|su|sudo|sum|suspend|sync|tail|tar|tee|test|time|timeout|times|touch|top|traceroute|trap|tr|tsort|tty|type|ulimit|umask|umount|unalias|uname|unexpand|uniq|units|unrar|unshar|uptime|useradd|userdel|usermod|users|uuencode|uudecode|v|vdir|vi|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yes|zip)(?=$|\s|;|\||&)/,lookbehind:!0},keyword:{pattern:/(^|\s|;|\||&)(?:let|:|\.|if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)(?=$|\s|;|\||&)/,lookbehind:!0},"boolean":{pattern:/(^|\s|;|\||&)(?:true|false)(?=$|\s|;|\||&)/,lookbehind:!0},operator:/&&?|\|\|?|==?|!=?|<<>|<=?|>=?|=~/,punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];]/};var a=t.variable[1].inside;a["function"]=e.languages.bash["function"],a.keyword=e.languages.bash.keyword,a.boolean=e.languages.bash.boolean,a.operator=e.languages.bash.operator,a.punctuation=e.languages.bash.punctuation}(Prism); -Prism.languages.css.selector={pattern:/[^\{\}\s][^\{\}]*(?=\s*\{)/,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+(?:\(.*\))?/,"class":/\.[-:\.\w]+/,id:/#[-:\.\w]+/}},Prism.languages.insertBefore("css","function",{hexcode:/#[\da-f]{3,6}/i,entity:/\\[\da-f]{1,8}/i,number:/[\d%\.]+/}); -Prism.languages.git={comment:/^#.*/m,deleted:/^[-–].*/m,inserted:/^\+.*/m,string:/("|')(\\?.)*?\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s(--|-)\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \w{40}$/m}; -!function(e){var a=/\{\{\{[\w\W]+?\}\}\}|\{\{[\w\W]+?\}\}/g;e.languages.handlebars=e.languages.extend("markup",{handlebars:{pattern:a,inside:{delimiter:{pattern:/^\{\{\{?|\}\}\}?$/i,alias:"punctuation"},string:/(["'])(\\?.)*?\1/,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee][+-]?\d+)?)\b/,"boolean":/\b(true|false)\b/,block:{pattern:/^(\s*~?\s*)[#\/]\S+?(?=\s*~?\s*$|\s)/i,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\w\W]+/}},punctuation:/[!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~\s]+/}}}),e.languages.insertBefore("handlebars","tag",{"handlebars-comment":{pattern:/\{\{![\w\W]*?\}\}/,alias:["handlebars","comment"]}}),e.hooks.add("before-highlight",function(e){"handlebars"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(a,function(a){return e.tokenStack.push(a),"___HANDLEBARS"+e.tokenStack.length+"___"}))}),e.hooks.add("before-insert",function(e){"handlebars"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),e.hooks.add("after-highlight",function(a){if("handlebars"===a.language){for(var n,t=0;n=a.tokenStack[t];t++)a.highlightedCode=a.highlightedCode.replace("___HANDLEBARS"+(t+1)+"___",e.highlight(n,a.grammar,"handlebars").replace(/\$/g,"$$$$"));a.element.innerHTML=a.highlightedCode}})}(Prism); -Prism.languages.http={"request-line":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b\shttps?:\/\/\S+\sHTTP\/[0-9.]+/m,inside:{property:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/,"attr-name":/:\w+/}},"response-status":{pattern:/^HTTP\/1.[01] [0-9]+.*/m,inside:{property:{pattern:/(^HTTP\/1.[01] )[0-9]+.*/i,lookbehind:!0}}},"header-name":{pattern:/^[\w-]+:(?=.)/m,alias:"keyword"}};var httpLanguages={"application/json":Prism.languages.javascript,"application/xml":Prism.languages.markup,"text/xml":Prism.languages.markup,"text/html":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp("(content-type:\\s*"+contentType+"[\\w\\W]*?)(?:\\r?\\n|\\r){2}[\\w\\W]*","i"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore("http","header-name",options)}; -Prism.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|.)*/,lookbehind:!0},string:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^[^:=\r\n]+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/}; -Prism.languages.markdown=Prism.languages.extend("markup",{}),Prism.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},code:[{pattern:/^(?: {4}|\t).+/m,alias:"keyword"},{pattern:/``.+?``|`[^`\n]+`/,alias:"keyword"}],title:[{pattern:/\w+.*(?:\r?\n|\r)(?:==+|--+)/,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])([\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:/(^|[^\\])(\*\*|__)(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^\*\*|^__|\*\*$|__$/}},italic:{pattern:/(^|[^\\])([*_])(?:(?:\r?\n|\r)(?!\r?\n|\r)|.)+?\2/,lookbehind:!0,inside:{punctuation:/^[*_]|[*_]$/}},url:{pattern:/!?\[[^\]]+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[[^\]\n]*\])/,inside:{variable:{pattern:/(!?\[)[^\]]+(?=\]$)/,lookbehind:!0},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),Prism.languages.markdown.bold.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.italic.inside.url=Prism.util.clone(Prism.languages.markdown.url),Prism.languages.markdown.bold.inside.italic=Prism.util.clone(Prism.languages.markdown.italic),Prism.languages.markdown.italic.inside.bold=Prism.util.clone(Prism.languages.markdown.bold); -Prism.languages.nginx=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])#.*/,lookbehind:!0},keyword:/\b(?:CONTENT_|DOCUMENT_|GATEWAY_|HTTP_|HTTPS|if_not_empty|PATH_|QUERY_|REDIRECT_|REMOTE_|REQUEST_|SCGI|SCRIPT_|SERVER_|http|server|events|location|include|accept_mutex|accept_mutex_delay|access_log|add_after_body|add_before_body|add_header|addition_types|aio|alias|allow|ancient_browser|ancient_browser_value|auth|auth_basic|auth_basic_user_file|auth_http|auth_http_header|auth_http_timeout|autoindex|autoindex_exact_size|autoindex_localtime|break|charset|charset_map|charset_types|chunked_transfer_encoding|client_body_buffer_size|client_body_in_file_only|client_body_in_single_buffer|client_body_temp_path|client_body_timeout|client_header_buffer_size|client_header_timeout|client_max_body_size|connection_pool_size|create_full_put_path|daemon|dav_access|dav_methods|debug_connection|debug_points|default_type|deny|devpoll_changes|devpoll_events|directio|directio_alignment|disable_symlinks|empty_gif|env|epoll_events|error_log|error_page|expires|fastcgi_buffer_size|fastcgi_buffers|fastcgi_busy_buffers_size|fastcgi_cache|fastcgi_cache_bypass|fastcgi_cache_key|fastcgi_cache_lock|fastcgi_cache_lock_timeout|fastcgi_cache_methods|fastcgi_cache_min_uses|fastcgi_cache_path|fastcgi_cache_purge|fastcgi_cache_use_stale|fastcgi_cache_valid|fastcgi_connect_timeout|fastcgi_hide_header|fastcgi_ignore_client_abort|fastcgi_ignore_headers|fastcgi_index|fastcgi_intercept_errors|fastcgi_keep_conn|fastcgi_max_temp_file_size|fastcgi_next_upstream|fastcgi_no_cache|fastcgi_param|fastcgi_pass|fastcgi_pass_header|fastcgi_read_timeout|fastcgi_redirect_errors|fastcgi_send_timeout|fastcgi_split_path_info|fastcgi_store|fastcgi_store_access|fastcgi_temp_file_write_size|fastcgi_temp_path|flv|geo|geoip_city|geoip_country|google_perftools_profiles|gzip|gzip_buffers|gzip_comp_level|gzip_disable|gzip_http_version|gzip_min_length|gzip_proxied|gzip_static|gzip_types|gzip_vary|if|if_modified_since|ignore_invalid_headers|image_filter|image_filter_buffer|image_filter_jpeg_quality|image_filter_sharpen|image_filter_transparency|imap_capabilities|imap_client_buffer|include|index|internal|ip_hash|keepalive|keepalive_disable|keepalive_requests|keepalive_timeout|kqueue_changes|kqueue_events|large_client_header_buffers|limit_conn|limit_conn_log_level|limit_conn_zone|limit_except|limit_rate|limit_rate_after|limit_req|limit_req_log_level|limit_req_zone|limit_zone|lingering_close|lingering_time|lingering_timeout|listen|location|lock_file|log_format|log_format_combined|log_not_found|log_subrequest|map|map_hash_bucket_size|map_hash_max_size|master_process|max_ranges|memcached_buffer_size|memcached_connect_timeout|memcached_next_upstream|memcached_pass|memcached_read_timeout|memcached_send_timeout|merge_slashes|min_delete_depth|modern_browser|modern_browser_value|mp4|mp4_buffer_size|mp4_max_buffer_size|msie_padding|msie_refresh|multi_accept|open_file_cache|open_file_cache_errors|open_file_cache_min_uses|open_file_cache_valid|open_log_file_cache|optimize_server_names|override_charset|pcre_jit|perl|perl_modules|perl_require|perl_set|pid|pop3_auth|pop3_capabilities|port_in_redirect|post_action|postpone_output|protocol|proxy|proxy_buffer|proxy_buffer_size|proxy_buffering|proxy_buffers|proxy_busy_buffers_size|proxy_cache|proxy_cache_bypass|proxy_cache_key|proxy_cache_lock|proxy_cache_lock_timeout|proxy_cache_methods|proxy_cache_min_uses|proxy_cache_path|proxy_cache_use_stale|proxy_cache_valid|proxy_connect_timeout|proxy_cookie_domain|proxy_cookie_path|proxy_headers_hash_bucket_size|proxy_headers_hash_max_size|proxy_hide_header|proxy_http_version|proxy_ignore_client_abort|proxy_ignore_headers|proxy_intercept_errors|proxy_max_temp_file_size|proxy_method|proxy_next_upstream|proxy_no_cache|proxy_pass|proxy_pass_error_message|proxy_pass_header|proxy_pass_request_body|proxy_pass_request_headers|proxy_read_timeout|proxy_redirect|proxy_redirect_errors|proxy_send_lowat|proxy_send_timeout|proxy_set_body|proxy_set_header|proxy_ssl_session_reuse|proxy_store|proxy_store_access|proxy_temp_file_write_size|proxy_temp_path|proxy_timeout|proxy_upstream_fail_timeout|proxy_upstream_max_fails|random_index|read_ahead|real_ip_header|recursive_error_pages|request_pool_size|reset_timedout_connection|resolver|resolver_timeout|return|rewrite|root|rtsig_overflow_events|rtsig_overflow_test|rtsig_overflow_threshold|rtsig_signo|satisfy|satisfy_any|secure_link_secret|send_lowat|send_timeout|sendfile|sendfile_max_chunk|server|server_name|server_name_in_redirect|server_names_hash_bucket_size|server_names_hash_max_size|server_tokens|set|set_real_ip_from|smtp_auth|smtp_capabilities|so_keepalive|source_charset|split_clients|ssi|ssi_silent_errors|ssi_types|ssi_value_length|ssl|ssl_certificate|ssl_certificate_key|ssl_ciphers|ssl_client_certificate|ssl_crl|ssl_dhparam|ssl_engine|ssl_prefer_server_ciphers|ssl_protocols|ssl_session_cache|ssl_session_timeout|ssl_verify_client|ssl_verify_depth|starttls|stub_status|sub_filter|sub_filter_once|sub_filter_types|tcp_nodelay|tcp_nopush|timeout|timer_resolution|try_files|types|types_hash_bucket_size|types_hash_max_size|underscores_in_headers|uninitialized_variable_warn|upstream|use|user|userid|userid_domain|userid_expires|userid_name|userid_p3p|userid_path|userid_service|valid_referers|variables_hash_bucket_size|variables_hash_max_size|worker_connections|worker_cpu_affinity|worker_priority|worker_processes|worker_rlimit_core|worker_rlimit_nofile|worker_rlimit_sigpending|working_directory|xclient|xml_entities|xslt_entities|xslt_stylesheet|xslt_types)\b/i}),Prism.languages.insertBefore("nginx","keyword",{variable:/\$[a-z_]+/i}); -Prism.languages.php=Prism.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),Prism.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),Prism.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),Prism.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(a){return e.tokenStack.push(a),"{{{PHP"+e.tokenStack.length+"}}}"}))}),Prism.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),Prism.hooks.add("after-highlight",function(e){if("php"===e.language){for(var a,n=0;a=e.tokenStack[n];n++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(n+1)+"}}}",Prism.highlight(a,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),Prism.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:Prism.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})); -!function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var a=/((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:a,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:a,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,delete e.languages.sass.selector,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/,lookbehind:!0}})}(Prism); -Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)*url(?=\()/i,selector:{pattern:/(?=\S)[^@;\{\}\(\)]?([^@;\{\}\(\)]|&|#\{\$[-_\w]+\})+(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/m,inside:{placeholder:/%[-_\w]+/}}}),Prism.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),Prism.languages.insertBefore("scss","property",{variable:/\$[-_\w]+|#\{\$[-_\w]+\}/}),Prism.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-_\w]+/,alias:"selector"},statement:/\B!(?:default|optional)\b/i,"boolean":/\b(?:true|false)\b/,"null":/\bnull\b/,operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),Prism.languages.scss.atrule.inside.rest=Prism.util.clone(Prism.languages.scss); -!function(){function e(e,t){return Array.prototype.slice.call((t||document).querySelectorAll(e))}function t(e,t){return t=" "+t+" ",(" "+e.className+" ").replace(/[\n\t]/g," ").indexOf(t)>-1}function n(e,n,i){for(var o,a=n.replace(/\s+/g,"").split(","),l=+e.getAttribute("data-line-offset")||0,d=r()?parseInt:parseFloat,c=d(getComputedStyle(e).lineHeight),s=0;o=a[s++];){o=o.split("-");var u=+o[0],m=+o[1]||u,h=document.createElement("div");h.textContent=Array(m-u+2).join(" \n"),h.className=(i||"")+" line-highlight",t(e,"line-numbers")||(h.setAttribute("data-start",u),m>u&&h.setAttribute("data-end",m)),h.style.top=(u-l-1)*c+"px",t(e,"line-numbers")?e.appendChild(h):(e.querySelector("code")||e).appendChild(h)}}function i(){var t=location.hash.slice(1);e(".temporary.line-highlight").forEach(function(e){e.parentNode.removeChild(e)});var i=(t.match(/\.([\d,-]+)$/)||[,""])[1];if(i&&!document.getElementById(t)){var r=t.slice(0,t.lastIndexOf(".")),o=document.getElementById(r);o&&(o.hasAttribute("data-line")||o.setAttribute("data-line",""),n(o,i,"temporary "),document.querySelector(".temporary.line-highlight").scrollIntoView())}}if("undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector){var r=function(){var e;return function(){if("undefined"==typeof e){var t=document.createElement("div");t.style.fontSize="13px",t.style.lineHeight="1.5",t.style.padding=0,t.style.border=0,t.innerHTML=" 
 ",document.body.appendChild(t),e=38===t.offsetHeight,document.body.removeChild(t)}return e}}(),o=0;Prism.hooks.add("complete",function(t){var r=t.element.parentNode,a=r&&r.getAttribute("data-line");r&&a&&/pre/i.test(r.nodeName)&&(clearTimeout(o),e(".line-highlight",r).forEach(function(e){e.parentNode.removeChild(e)}),n(r,a),o=setTimeout(i,1))}),window.addEventListener&&window.addEventListener("hashchange",i)}}(); - - -!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.hooks.add("complete",function(e){if(e.code){var t=e.element.parentNode,s=/\s*\bline-numbers\b\s*/;if(t&&/pre/i.test(t.nodeName)&&(s.test(t.className)||s.test(e.element.className))&&!e.element.querySelector(".line-numbers-rows")){s.test(e.element.className)&&(e.element.className=e.element.className.replace(s,"")),s.test(t.className)||(t.className+=" line-numbers");var n,a=e.code.match(/\n(?!$)/g),l=a?a.length+1:1,m=new Array(l+1);m=m.join(""),n=document.createElement("span"),n.className="line-numbers-rows",n.innerHTML=m,t.hasAttribute("data-start")&&(t.style.counterReset="linenumber "+(parseInt(t.getAttribute("data-start"),10)-1)),e.element.appendChild(n)}}})}(); -!function(){if(("undefined"==typeof self||self.Prism)&&("undefined"==typeof global||global.Prism)){var i=/\b([a-z]{3,7}:\/\/|tel:)[\w\-+%~\/.:#=?&]+/,n=/\b\S+@[\w.]+[a-z]{2}/,e=/\[([^\]]+)]\(([^)]+)\)/,t=["comment","url","attr-value","string"];Prism.hooks.add("before-highlight",function(a){a.grammar&&!a.grammar["url-link"]&&(Prism.languages.DFS(a.grammar,function(a,r,l){t.indexOf(l)>-1&&"Array"!==Prism.util.type(r)&&(r.pattern||(r=this[a]={pattern:r}),r.inside=r.inside||{},"comment"==l&&(r.inside["md-link"]=e),"attr-value"==l?Prism.languages.insertBefore("inside","punctuation",{"url-link":i},r):r.inside["url-link"]=i,r.inside["email-link"]=n)}),a.grammar["url-link"]=i,a.grammar["email-link"]=n)}),Prism.hooks.add("wrap",function(i){if(/-link$/.test(i.type)){i.tag="a";var n=i.content;if("email-link"==i.type&&0!=n.indexOf("mailto:"))n="mailto:"+n;else if("md-link"==i.type){var t=i.content.match(e);n=t[2],i.content=t[1]}i.attributes.href=n}})}}(); -!function(){"undefined"!=typeof self&&self.Prism&&self.document&&document.querySelector&&(self.Prism.fileHighlight=function(){var e={js:"javascript",html:"markup",svg:"markup",xml:"markup",py:"python",rb:"ruby",ps1:"powershell",psm1:"powershell"};Array.prototype.forEach&&Array.prototype.slice.call(document.querySelectorAll("pre[data-src]")).forEach(function(t){for(var r,a=t.getAttribute("data-src"),s=t,n=/\blang(?:uage)?-(?!\*)(\w+)\b/i;s&&!n.test(s.className);)s=s.parentNode;if(s&&(r=(t.className.match(n)||[,""])[1]),!r){var o=(a.match(/\.(\w+)$/)||[,""])[1];r=e[o]||o}var l=document.createElement("code");l.className="language-"+r,t.textContent="",l.textContent="Loading…",t.appendChild(l);var i=new XMLHttpRequest;i.open("GET",a,!0),i.onreadystatechange=function(){4==i.readyState&&(i.status<400&&i.responseText?(l.textContent=i.responseText,Prism.highlightElement(l)):l.textContent=i.status>=400?"✖ Error "+i.status+" while fetching file: "+i.statusText:"✖ Error: File does not exist or is empty")},i.send(null)})},self.Prism.fileHighlight())}(); -!function(){if("undefined"!=typeof self&&self.Prism&&self.document){var e={css:"CSS",clike:"C-like",javascript:"JavaScript",abap:"ABAP",actionscript:"ActionScript",apacheconf:"Apache Configuration",apl:"APL",applescript:"AppleScript",asciidoc:"AsciiDoc",aspnet:"ASP.NET (C#)",autoit:"AutoIt",autohotkey:"AutoHotkey",basic:"BASIC",csharp:"C#",cpp:"C++",coffeescript:"CoffeeScript","css-extras":"CSS Extras",fsharp:"F#",glsl:"GLSL",http:"HTTP",inform7:"Inform 7",latex:"LaTeX",lolcode:"LOLCODE",matlab:"MATLAB",mel:"MEL",nasm:"NASM",nginx:"nginx",nsis:"NSIS",objectivec:"Objective-C",ocaml:"OCaml",parigp:"PARI/GP",php:"PHP","php-extras":"PHP Extras",powershell:"PowerShell",jsx:"React JSX",rest:"reST (reStructuredText)",sas:"SAS",sass:"Sass (Sass)",scss:"Sass (Scss)",sql:"SQL",typescript:"TypeScript",vhdl:"VHDL",vim:"vim",wiki:"Wiki markup",yaml:"YAML"};Prism.hooks.add("before-highlight",function(a){var s=a.element.parentNode;if(s&&/pre/i.test(s.nodeName)){var t=e[a.language]||a.language.substring(0,1).toUpperCase()+a.language.substring(1);s.setAttribute("data-language",t);var i,r,l=s.previousSibling;l&&/\s*\bprism-show-language\b\s*/.test(l.className)&&l.firstChild&&/\s*\bprism-show-language-label\b\s*/.test(l.firstChild.className)?(r=l.firstChild,r.getAttribute("data-language")!==t&&(r.setAttribute("data-language",t),r.innerHTML=t)):(i=document.createElement("div"),r=document.createElement("div"),r.className="prism-show-language-label",r.setAttribute("data-language",t),r.innerHTML=t,i.className="prism-show-language",i.appendChild(r),s.parentNode.insertBefore(i,s))}})}}(); diff --git a/website/themes/book/.github/workflows/main.yml b/website/themes/book/.github/workflows/main.yml deleted file mode 100644 index 19f30e9cf..000000000 --- a/website/themes/book/.github/workflows/main.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Build with Hugo - -on: [push] - -jobs: - hugo-latest: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - - name: Install Hugo - run: | - LATEST_VERSION=`curl --silent "https://api.github.com/repos/gohugoio/hugo/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/'` - VERSION_NO_PREFIX=`echo $LATEST_VERSION | cut -c 2-` - wget "https://github.com/gohugoio/hugo/releases/download/$LATEST_VERSION/hugo_extended_${VERSION_NO_PREFIX}_Linux-64bit.deb" -O /tmp/hugo.deb - sudo dpkg -i /tmp/hugo.deb - - - name: Run Hugo - working-directory: exampleSite - run: hugo --themesDir ../.. - hugo-minimum: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@master - - - name: Install Hugo - run: | - wget "https://github.com/gohugoio/hugo/releases/download/v0.68.0/hugo_extended_0.68.0_Linux-64bit.deb" -O /tmp/hugo.deb - sudo dpkg -i /tmp/hugo.deb - - - name: Run Hugo - working-directory: exampleSite - run: hugo --themesDir ../.. diff --git a/website/themes/book/.gitignore b/website/themes/book/.gitignore deleted file mode 100644 index e52eb5292..000000000 --- a/website/themes/book/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -public/ -exampleSite/public/ -.DS_Store diff --git a/website/themes/book/LICENSE b/website/themes/book/LICENSE deleted file mode 100644 index e7a669ab2..000000000 --- a/website/themes/book/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Alex Shpak - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/website/themes/book/README.md b/website/themes/book/README.md deleted file mode 100644 index 7b925676d..000000000 --- a/website/themes/book/README.md +++ /dev/null @@ -1,304 +0,0 @@ -# Hugo Book Theme - -[![Hugo](https://img.shields.io/badge/hugo-0.68-blue.svg)](https://gohugo.io) -[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) -![Build with Hugo](https://github.com/alex-shpak/hugo-book/workflows/Build%20with%20Hugo/badge.svg) - -### [Hugo](https://gohugo.io) documentation theme as simple as plain book - -![Screenshot](https://github.com/alex-shpak/hugo-book/blob/master/images/screenshot.png) - -- [Features](#features) -- [Requirements](#requirements) -- [Installation](#installation) -- [Menu](#menu) -- [Blog](#blog) -- [Configuration](#configuration) -- [Shortcodes](#shortcodes) -- [Versioning](#versioning) -- [Contributing](#contributing) - -## Features - -- Clean simple design -- Light and Mobile-Friendly -- Multi-language support -- Customisable -- Zero initial configuration -- Handy shortcodes -- Comments support -- Simple blog and taxonomy -- Primary features work without JavaScript -- Dark Mode - -## Requirements - -- Hugo 0.68 or higher -- Hugo extended version, read more [here](https://gohugo.io/news/0.48-relnotes/) - -## Installation - -Navigate to your hugo project root and run: - -``` -git submodule add https://github.com/alex-shpak/hugo-book themes/book -``` - -Then run hugo (or set `theme = "book"`/`theme: book` in configuration file) - -``` -hugo server --minify --theme book -``` - -### Creating site from scratch - -Below is an example on how to create a new site from scratch: - -```sh -hugo new site mydocs; cd mydocs -git init -git submodule add https://github.com/alex-shpak/hugo-book themes/book -cp -R themes/book/exampleSite/content . -``` - -```sh -hugo server --minify --theme book -``` - -## Menu - -### File tree menu (default) - -By default, the theme will render pages from the `content/docs` section as a menu in a tree structure. -You can set `title` and `weight` in the front matter of pages to adjust the order and titles in the menu. - -### Leaf bundle menu - -You can also use leaf bundle and the content of its `index.md` file as menu. -Given you have the following file structure: - -``` -├── content -│ ├── docs -│ │ ├── page-one.md -│ │ └── page-two.md -│ └── posts -│ ├── post-one.md -│ └── post-two.md -``` - -Create a file `content/menu/index.md` with the content: - -```md -+++ -headless = true -+++ - -- [Book Example]({{< relref "/docs/" >}}) - - [Page One]({{< relref "/docs/page-one" >}}) - - [Page Two]({{< relref "/docs/page-two" >}}) -- [Blog]({{< relref "/posts" >}}) -``` - -And Enable it by setting `BookMenuBundle: /menu` in Site configuration. - -- [Example menu](https://github.com/alex-shpak/hugo-book/blob/master/exampleSite/content/menu/index.md) -- [Example config file](https://github.com/alex-shpak/hugo-book/blob/master/exampleSite/config.yaml) -- [Leaf bundles](https://gohugo.io/content-management/page-bundles/) - -## Blog - -A simple blog is supported in the section `posts`. -A blog is not the primary usecase of this theme, so it has only minimal features. - -## Configuration - -### Site Configuration - -There are a few configuration options that you can add to your `config.toml` file. -You can also see the `yaml` example [here](https://github.com/alex-shpak/hugo-book/blob/master/exampleSite/config.yaml). - -```toml -# (Optional) Set Google Analytics if you use it to track your website. -# Always put it on the top of the configuration file, otherwise it won't work -googleAnalytics = "UA-XXXXXXXXX-X" - -# (Optional) If you provide a Disqus shortname, comments will be enabled on -# all pages. -disqusShortname = "my-site" - -# (Optional) Set this to true if you use capital letters in file names -disablePathToLower = true - -# (Optional) Set this to true to enable 'Last Modified by' date and git author -# information on 'doc' type pages. -enableGitInfo = true - -# (Optional) Theme is intended for documentation use, therefore it doesn't render taxonomy. -# You can remove related files with config below -disableKinds = ['taxonomy', 'taxonomyTerm'] - -[params] - # (Optional, default true) Controls table of contents visibility on right side of pages. - # Start and end levels can be controlled with markup.tableOfContents setting. - # You can also specify this parameter per page in front matter. - BookToC = true - - # (Optional, default none) Set the path to a logo for the book. If the logo is - # /static/logo.png then the path would be 'logo.png' - BookLogo = 'logo.png' - - # (Optional, default none) Set leaf bundle to render as side menu - # When not specified file structure and weights will be used - BookMenuBundle = '/menu' - - # (Optional, default docs) Specify section of content to render as menu - # You can also set value to "*" to render all sections to menu - BookSection = 'docs' - - # Set source repository location. - # Used for 'Last Modified' and 'Edit this page' links. - BookRepo = 'https://github.com/alex-shpak/hugo-book' - - # Enable 'Edit this page' links for 'doc' page type. - # Disabled by default. Uncomment to enable. Requires 'BookRepo' param. - # Path must point to the site directory. - BookEditPath = 'edit/master/exampleSite' - - # (Optional, default January 2, 2006) Configure the date format used on the pages - # - In git information - # - In blog posts - BookDateFormat = 'Jan 2, 2006' - - # (Optional, default true) Enables search function with flexsearch, - # Index is built on fly, therefore it might slowdown your website. - # Configuration for indexing can be adjusted in i18n folder per language. - BookSearch = true - - # (Optional, default true) Enables comments template on pages - # By default partials/docs/comments.html includes Disqus template - # See https://gohugo.io/content-management/comments/#configure-disqus - # Can be overwritten by same param in page frontmatter - BookComments = true - - # /!\ This is an experimental feature, might be removed or changed at any time - # (Optional, experimental, default false) Enables portable links and link checks in markdown pages. - # Portable links meant to work with text editors and let you write markdown without {{< relref >}} shortcode - # Theme will print warning if page referenced in markdown does not exists. - BookPortableLinks = true - - # /!\ This is an experimental feature, might be removed or changed at any time - # (Optional, experimental, default false) Enables service worker that caches visited pages and resources for offline use. - BookServiceWorker = true -``` - -### Multi-Language Support - -Theme supports Hugo's [multilingual mode](https://gohugo.io/content-management/multilingual/), just follow configuration guide there. You can also tweak search indexing configuration per language in `i18n` folder. - -### Page Configuration - -You can specify additional params in the front matter of individual pages: - -```toml -# Set type to 'docs' if you want to render page outside of configured section or if you render section other than 'docs' -type = 'docs' - -# Set page weight to re-arrange items in file-tree menu (if BookMenuBundle not set) -weight = 10 - -# (Optional) Set to mark page as flat section in file-tree menu (if BookMenuBundle not set) -bookFlatSection = true - -# (Optional, Experimental) Set to hide nested sections or pages at that level. Works only with file-tree menu mode -bookCollapseSection = true - -# (Optional) Set true to hide page or section from side menu (if BookMenuBundle not set) -bookHidden = true - -# (Optional) Set 'false' to hide ToC from page -bookToC = true - -# (Optional) If you have enabled BookComments for the site, you can disable it for specific pages. -bookComments = true -``` - -### Partials - -There are few empty partials you can override in `layouts/partials/` - -| Partial | Placement | -| -------------------------------------------------- | -------------------------------------- | -| `layouts/partials/docs/inject/head.html` | Before closing `` tag | -| `layouts/partials/docs/inject/body.html` | Before closing `` tag | -| `layouts/partials/docs/inject/footer.html` | After page footer content | -| `layouts/partials/docs/inject/menu-before.html` | At the beginning of `