From a32bc3eb1837fc00a44e0269aacae02fc602cb0e Mon Sep 17 00:00:00 2001 From: Azhar Date: Wed, 29 Apr 2020 18:27:04 +0530 Subject: [PATCH 1/5] add: Spiral matrix --- Spiral Matrix/Images/spiral-matrix.jpg | Bin 0 -> 26682 bytes Spiral Matrix/README.markdown | 154 ++++++++++++++++++ .../spiral-matrix.playground/Contents.swift | 103 ++++++++++++ .../contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + 6 files changed, 276 insertions(+) create mode 100644 Spiral Matrix/Images/spiral-matrix.jpg create mode 100644 Spiral Matrix/README.markdown create mode 100644 Spiral Matrix/spiral-matrix.playground/Contents.swift create mode 100644 Spiral Matrix/spiral-matrix.playground/contents.xcplayground create mode 100644 Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Spiral Matrix/Images/spiral-matrix.jpg b/Spiral Matrix/Images/spiral-matrix.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9cc4c8e8675f27cc897c926cc426e5badc14a805 GIT binary patch literal 26682 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%0Dtv#6W3c6Lgd>_a#^kj}eGtBa=cK?#39KDiy?L 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 T9nt-JzWYx;{fGWp$mo9qak8ex literal 0 HcmV?d00001 diff --git a/Spiral Matrix/README.markdown b/Spiral Matrix/README.markdown new file mode 100644 index 000000000..495114b65 --- /dev/null +++ b/Spiral Matrix/README.markdown @@ -0,0 +1,154 @@ + +## Goal +Traverse a 2D array in Spiral order. + +## Overview +Given a 2D array, which can be a square array with `n == m`, we want to return a one-dimensional array of all the elements of the 2D array in spiral order. + +Spiral order will start at the top left corner of the 2D array move all the way to the right-most column on that row, then continue in a spiral pattern all the way until every element has been visited. + +// image + +## Example +Given the 2D array + +```swift +array = [ + [1, 2, 3, 4], + [12, 13, 14, 5], + [11, 16, 15, 6], + [10, 9, 8, 7] +] +``` + +we want to traverse this in spiral order and return the following one-dimensional array + +```swift +[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +``` + +## Iterative approach +We want to traverse this in clockwise spiral order. We go from the outer-most ‘layer’ to the inner-most ‘ layer’. + +Let’s hold the indices of + +```swift +var startRow = 0 +var startCol = 0 +var endRow = array.count - 1 +var endCol = array[0].count - 1 +``` + +The order in which we will move through the first layer of the spiral using these indices is + +### Steps + +1. Loop while `startRow <= endRow, startCol <= endCol` +2. Horizontally traverse towards the right from `startCol` to (inclusive) `endCol` by `1`. +3. Vertically traverse down from `startRow + 1` to (inclusive) `endRow` by `1` . +4. Horizontally traverse towards the left from `endCol - 1` to (inclusive) `startCol` by `-1`. +5. Vertically traverse up from `endRow - 1` to (inclusive) `startCol + 1` by `-1`. +6. Increment indices `startRow += 1` `startCol += 1` +7. Decrement indices `endRow -= 1` `endCol -= 1` + +### Edge cases +The matrix may have single row or a single columns in the middle. In this case, we don’t want to double-count values during step `4` and `5`, which we have already counted in step `2` and `3`. We will do an index check in both cases and break if it is true. + +### Code + +```swift +func spiralTraverse(array: [[Int]]) -> [Int] { + guard array.count != 0 else { return [] } + + var result = [Int]() + var startRow = 0 + var endRow = array.count - 1 + var startCol = 0 + var endCol = array[0].count - 1 + + while startRow <= endRow, startCol <= endCol { + for col in stride(from: startCol, through: endCol, by: 1) { + result.append(array[startRow][col]) + } + + for row in stride(from: startRow + 1, through: endRow, by: 1) { + result.append(array[row][endCol]) + } + + for col in stride(from: endCol - 1, through: startCol, by: -1) { + if startRow == endRow { + break + } + result.append(array[endRow][col]) + } + + for row in stride(from: endRow - 1, through: startRow + 1, by: -1) { + if startCol == endCol { + break + } + result.append(array[row][startCol]) + } + + startRow += 1 + endRow -= 1 + startCol += 1 + endCol -= 1 + } + return result +} +``` + +## Recursive approach +Now let’s check out the recursive implementation of the algorithm. In this version we don’t need to maintain and update indices since we will be calling the function recursively based on different values. + +### Code +```swift +func spiralTraverse(array: [[Int]]) -> [Int] { + var result = [Int]() + spiralHelper(array, 0, array.count - 1, 0, array[0].count - 1, &result) + return result +} + +func spiralHelper(_ array: [[Int]], _ startRow: Int, _ endRow: Int, _ startCol: Int, _ endCol: Int, _ result: inout [Int]) { + if startRow > endRow || startCol > endCol { + return + } + + for col in stride(from: startCol, through: endCol, by: 1) { + result.append(array[startRow][col]) + } + + for row in stride(from: startRow + 1, through: endRow, by: 1) { + result.append(array[row][endCol]) + } + + for col in stride(from: endCol - 1, through: startCol, by: -1) { + if startRow == endRow { break } + result.append(array[endRow][col]) + } + + for row in stride(from: endRow - 1, through: startRow + 1, by: -1) { + if startCol == endCol { break } + result.append(array[row][startCol]) + } + + spiralHelper(array, startRow + 1, endRow - 1, startCol + 1, endCol - 1, &result) +} +``` + +## Test + +```swift +let array = [ + [1,2,3,4], + [12,13,14,5], + [11,16,15,6], + [10,9,8,7] +] +spiralTraverse(array: array) +``` + +## Complexity + +* Time: `O(n)` - where `n` is the total number of elements in the 2D array +* Space: `O(n)` - since we are storing every element of the 2D array into a one-dimensional array diff --git a/Spiral Matrix/spiral-matrix.playground/Contents.swift b/Spiral Matrix/spiral-matrix.playground/Contents.swift new file mode 100644 index 000000000..a1b7bdffa --- /dev/null +++ b/Spiral Matrix/spiral-matrix.playground/Contents.swift @@ -0,0 +1,103 @@ +import Foundation + +/** + Complexity: + Time: O(n) - where n is the total number of elements in the 2D array + Space: O(n) + */ + +/// Iterative Spiral Matrix traversal +/// - Parameter array: 2D input array +/// - Returns: One-dimensional result array +func spiralTraverseIterative(array: [[Int]]) -> [Int] { + if array.count == 0 { return [] } + + var result = [Int]() + + var startRow = 0 + var startCol = 0 + var endRow = array.count - 1 + var endCol = array[0].count - 1 + + while startRow <= endRow, startCol <= endCol { + for col in stride(from: startCol, through: endCol, by: 1) { + result.append(array[startRow][col]) + } + + for row in stride(from: startRow + 1, through: endRow, by: 1) { + result.append(array[row][endCol]) + } + + for col in stride(from: endCol - 1, through: startCol, by: -1) { + if startRow == endRow { break } + result.append(array[endRow][col]) + } + + for row in stride(from: endRow - 1, through: startCol + 1, by: -1) { + if startCol == endCol { break } + result.append(array[row][startCol]) + } + + startRow += 1 + endRow -= 1 + startCol += 1 + endCol -= 1 + } + + return result +} + + +/// Recursive Spiral Matrix traversal +/// - Parameter array: 2D array +/// - Returns: One-dimensional array of all elements from the 2D array traversed in spiral order. +func spiralTraverseRecursive(array: [[Int]]) -> [Int] { + var result = [Int]() + spiralHelper(array, 0, array.count - 1, 0, array[0].count - 1, &result) + return result +} + +/// Spiral traversal helper function +/// - Parameters: +/// - array: 2D array +/// - startRow: Index of starting row +/// - endRow: Index of last row +/// - startCol: Index of first column +/// - endCol: index of last column +/// - result: One-dimensional result array. +func spiralHelper(_ array: [[Int]], _ startRow: Int, _ endRow: Int, _ startCol: Int, _ endCol: Int, _ result: inout [Int]) { + if startRow > endRow || startCol > endCol { + return + } + + for col in stride(from: startCol, through: endCol, by: 1) { + result.append(array[startRow][col]) + } + + for row in stride(from: startRow + 1, through: endRow, by: 1) { + result.append(array[row][endCol]) + } + + for col in stride(from: endCol - 1, through: startCol, by: -1) { + if startRow == endRow { break } + result.append(array[endRow][col]) + } + + for row in stride(from: endRow - 1, through: startRow + 1, by: -1) { + if startCol == endCol { break } + result.append(array[row][startCol]) + } + + spiralHelper(array, startRow + 1, endRow - 1, startCol + 1, endCol - 1, &result) +} + + +///Test +let array = [ + [1,2,3,4], + [12,13,14,5], + [11,16,15,6], + [10,9,8,7] +] +spiralTraverseIterative(array: array) +spiralTraverseRecursive(array: array) diff --git a/Spiral Matrix/spiral-matrix.playground/contents.xcplayground b/Spiral Matrix/spiral-matrix.playground/contents.xcplayground new file mode 100644 index 000000000..5da2641c9 --- /dev/null +++ b/Spiral Matrix/spiral-matrix.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/contents.xcworkspacedata b/Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..02642af82 --- /dev/null +++ b/Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/Spiral Matrix/spiral-matrix.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 51499df9eff722106fabd397a3c3afc509bd9d75 Mon Sep 17 00:00:00 2001 From: Azhar Anwar Date: Wed, 29 Apr 2020 18:28:21 +0530 Subject: [PATCH 2/5] Update README.markdown --- Spiral Matrix/README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Spiral Matrix/README.markdown b/Spiral Matrix/README.markdown index 495114b65..85f4b81ad 100644 --- a/Spiral Matrix/README.markdown +++ b/Spiral Matrix/README.markdown @@ -7,7 +7,7 @@ Given a 2D array, which can be a square array with `n == m`, we want to return Spiral order will start at the top left corner of the 2D array move all the way to the right-most column on that row, then continue in a spiral pattern all the way until every element has been visited. -// image +![spiral-matrix](Images/spiral-matrix.jpg) ## Example Given the 2D array From ac456ece7c824554c3d4f16b7d2b77d5a18ba3f6 Mon Sep 17 00:00:00 2001 From: Azhar Anwar Date: Wed, 29 Apr 2020 18:33:52 +0530 Subject: [PATCH 3/5] add: by line --- Spiral Matrix/README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Spiral Matrix/README.markdown b/Spiral Matrix/README.markdown index 85f4b81ad..211acb6ee 100644 --- a/Spiral Matrix/README.markdown +++ b/Spiral Matrix/README.markdown @@ -152,3 +152,5 @@ spiralTraverse(array: array) * Time: `O(n)` - where `n` is the total number of elements in the 2D array * Space: `O(n)` - since we are storing every element of the 2D array into a one-dimensional array +--- +Written for Swift Algorithm Club by Azhar Anwar From 0fc15ddc0d6846f21d6455fffd5aa4e458673e12 Mon Sep 17 00:00:00 2001 From: Azhar Anwar Date: Wed, 29 Apr 2020 18:35:52 +0530 Subject: [PATCH 4/5] Update README.markdown --- Spiral Matrix/README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Spiral Matrix/README.markdown b/Spiral Matrix/README.markdown index 211acb6ee..8b674e684 100644 --- a/Spiral Matrix/README.markdown +++ b/Spiral Matrix/README.markdown @@ -1,6 +1,6 @@ ## Goal -Traverse a 2D array in Spiral order. +Traverse a 2D array in spiral order. ## Overview Given a 2D array, which can be a square array with `n == m`, we want to return a one-dimensional array of all the elements of the 2D array in spiral order. From 65f3df978df5f44c6ada74bf0ad0d9fa25dd7678 Mon Sep 17 00:00:00 2001 From: Azhar Anwar Date: Wed, 29 Apr 2020 21:47:24 +0530 Subject: [PATCH 5/5] Update README.markdown --- Spiral Matrix/README.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Spiral Matrix/README.markdown b/Spiral Matrix/README.markdown index 8b674e684..002b8e30c 100644 --- a/Spiral Matrix/README.markdown +++ b/Spiral Matrix/README.markdown @@ -1,6 +1,6 @@ +# Spiral Matrix -## Goal -Traverse a 2D array in spiral order. +Goal: Traverse a 2D array in spiral order. ## Overview Given a 2D array, which can be a square array with `n == m`, we want to return a one-dimensional array of all the elements of the 2D array in spiral order.