Skip to content

Commit 576884b

Browse files
committed
multiple solution
1 parent acb902e commit 576884b

File tree

5 files changed

+174
-0
lines changed

5 files changed

+174
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
func shortestPathBinaryMatrix(_ grid: [[Int]]) -> Int {
3+
var copyGrid = grid, n = grid.count, queue = [(Int, Int, Int)](), minLength = Int.max
4+
queue.append((0, 0 ,1))
5+
while !queue.isEmpty {
6+
let (row, col, length) = queue.removeFirst()
7+
if row == n - 1 && col == n - 1 {
8+
minLength = length
9+
queue.removeAll()
10+
break
11+
}
12+
for (r, c) in [(0, -1), (-1, 0), (0, 1), (1, 0), (-1, -1), (-1, 1), (1, 1), (1, -1)] {
13+
let (newR, newC) = (row + r, col + c)
14+
if newR < 0 || newR >= copyGrid.count || newC < 0 || newC >= copyGrid[0].count || copyGrid[newR][newC] != 0 {
15+
continue
16+
}
17+
copyGrid[newR][newC] = 2
18+
queue.append((newR, newC, length + 1))
19+
}
20+
}
21+
return minLength
22+
}
23+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Brute Force. Time: O(n^2). TLE
2+
class Solution {
3+
func canSeePersonsCount(_ heights: [Int]) -> [Int] {
4+
var visible = Array(repeating: 0, count: heights.count)
5+
for index in 0..<heights.count - 1 {
6+
var currentMax = Int.min
7+
for index2 in (index + 1)..<heights.count {
8+
if heights[index] < heights[index2] {
9+
visible[index] += 1
10+
break
11+
} else if heights[index] > heights[index2] && heights[index2] > currentMax {
12+
visible[index] += 1
13+
currentMax = heights[index2]
14+
}
15+
}
16+
}
17+
return visible
18+
}
19+
}
20+
21+
// Increasing monotonic stack. Time: O(n). Accepted. https://tinyurl.com/y598x5s3
22+
class Solution {
23+
func canSeePersonsCount(_ heights: [Int]) -> [Int] {
24+
guard heights.count > 1 else {
25+
return [0]
26+
}
27+
var visible = Array(repeating: 0, count: heights.count), incMonoStack = [Int]()
28+
for index in stride(from: heights.count - 1, through: 0, by: -1) {
29+
while !incMonoStack.isEmpty && heights[index] > incMonoStack.last! {
30+
incMonoStack.removeLast()
31+
visible[index] += 1
32+
}
33+
if !incMonoStack.isEmpty {
34+
visible[index] += 1
35+
}
36+
incMonoStack.append(heights[index])
37+
}
38+
return visible
39+
}
40+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
class Solution {
2+
func calculate(_ s: String) -> Int {
3+
let sArray = Array(s)
4+
var stack = [String](), currentNumber = [Character]()
5+
for item in sArray {
6+
if item.isNumber {
7+
currentNumber.append(item)
8+
} else if !currentNumber.isEmpty {
9+
let number = currentNumber.map { String($0) }.reduce("") { $0 + $1 }
10+
stack.append(number)
11+
currentNumber.removeAll()
12+
}
13+
if item == " " {
14+
continue
15+
}
16+
if item == "+" || item == "-" || item == "(" {
17+
stack.append(String(item))
18+
}
19+
if item == ")" {
20+
var subExp = [String]()
21+
while stack.last! != "(" {
22+
subExp.append(stack.removeLast())
23+
}
24+
stack.removeLast() // removes last "(" character
25+
let currentValue = evalExpression(subExp.reversed())
26+
stack.append(String(currentValue)) // Adds back the calculated number
27+
}
28+
}
29+
30+
if !currentNumber.isEmpty {
31+
let number = currentNumber.map { String($0) }.reduce("") { $0 + $1 }
32+
stack.append(number)
33+
currentNumber.removeAll()
34+
}
35+
return evalExpression(stack)
36+
}
37+
38+
func evalExpression(_ exp: [String]) -> Int {
39+
var prevNumber = 0, prevSign = "+"
40+
for item in exp {
41+
if item == "+" || item == "-" {
42+
prevSign = item
43+
continue
44+
}
45+
46+
var newNum = 0
47+
if prevSign == "+" {
48+
newNum = Int(prevNumber) + Int(item)!
49+
} else {
50+
newNum = Int(prevNumber) - Int(item)!
51+
}
52+
prevNumber = newNum
53+
}
54+
return prevNumber
55+
}
56+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
func largestValues(_ root: TreeNode?) -> [Int] {
3+
guard let root = root else {
4+
return []
5+
}
6+
var result = [Int](), queue = [TreeNode]()
7+
queue.append(root)
8+
while !queue.isEmpty {
9+
var currentMax = Int.min
10+
let currentLevelLength = queue.count
11+
for i in 0..<currentLevelLength {
12+
let node = queue.removeFirst()
13+
currentMax = max(currentMax, node.val)
14+
if let left = node.left {
15+
queue.append(left)
16+
}
17+
if let right = node.right {
18+
queue.append(right)
19+
}
20+
}
21+
result.append(currentMax)
22+
}
23+
return result
24+
}
25+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
func nextGreaterElement(_ n: Int) -> Int {
3+
var nArray = Array(String(n))
4+
guard nArray.count >= 2 else {
5+
return -1
6+
}
7+
var prevIdx = nArray.count - 1
8+
for currIdx in stride(from: nArray.count - 2, through: 0, by: -1) {
9+
prevIdx = currIdx + 1
10+
if nArray[prevIdx] > nArray[currIdx] {
11+
var swapIdx = nArray.count - 1
12+
while swapIdx > currIdx {
13+
if nArray[currIdx] < nArray[swapIdx] {
14+
nArray.swapAt(swapIdx, currIdx)
15+
nArray = Array(nArray[0...currIdx]) + Array(nArray[prevIdx..<nArray.count]).reversed()
16+
let result = Int(nArray.map { String($0) }.reduce("") { $0 + $1 })!
17+
if result < Int32.max {
18+
return result
19+
} else {
20+
return -1
21+
}
22+
} else {
23+
swapIdx -= 1
24+
}
25+
}
26+
}
27+
}
28+
return -1
29+
}
30+
}

0 commit comments

Comments
 (0)