Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions merge-intervals/delight010.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
class Solution {
// Time O(n log n)
// Space O(n)
func merge(_ intervals: [[Int]]) -> [[Int]] {
if intervals.count <= 1 {
return intervals
}

let intervals = intervals.sorted { $0[0] <= $1[0] }
var answer: [[Int]] = []
var currentInterval: [Int] = []

for i in 0..<intervals.count {
if currentInterval.isEmpty {
currentInterval = intervals[i]
}

if intervals[i][0] >= currentInterval[0] && intervals[i][0] <= currentInterval[1] {
currentInterval = [currentInterval[0], max(currentInterval[1], intervals[i][1])]
Comment on lines +18 to +19
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if intervals[i][0] >= currentInterval[0] && intervals[i][0] <= currentInterval[1] {
currentInterval = [currentInterval[0], max(currentInterval[1], intervals[i][1])]
if intervals[i][0] <= currentInterval[1] {
currentInterval[1] = intervals[i][1]

[0] 기준으로 정렬한 상태에서 intervals[i][0] >= currentInterval[0]은 항상 참일 것 같아요.
왜냐하면 currentInterval = intervals[j]라고 하면 j <= i이므로 intervals[i][0] >= intervals[j][0]가 참이기 때문이에요.
또한 max 연산도 생략 가능해 보입니다.

} else {
answer.append(currentInterval)
currentInterval = intervals[i]
}
}

answer.append(currentInterval)

return answer
}
}

14 changes: 14 additions & 0 deletions missing-number/delight010.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class Solution {
// Time O(n)
// Space O(1)
func missingNumber(_ nums: [Int]) -> Int {
var sum = 0
for i in 0..<nums.count {
sum += i
sum -= nums[i]
}

return sum + nums.count
}
}

63 changes: 63 additions & 0 deletions reorder-list/delight010.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
public class ListNode {
public var val: Int
public var next: ListNode?
public init() { self.val = 0; self.next = nil; }
public init(_ val: Int) { self.val = val; self.next = nil; }
public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
}

class Solution {
// Time O(n)
// Space O(1)
func reorderList(_ head: ListNode?) {
guard let head = head, head.next != nil, head.next?.next != nil else {
return
}

var slow = head
var fast = head

while fast.next != nil && fast.next?.next != nil {
slow = slow.next!
fast = fast.next!.next!
}
Comment on lines +13 to +23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Optional Chaining 대신 이렇게 쓸 수도 있겠네요

Suggested change
guard let head = head, head.next != nil, head.next?.next != nil else {
return
}
var slow = head
var fast = head
while fast.next != nil && fast.next?.next != nil {
slow = slow.next!
fast = fast.next!.next!
}
guard let head = head, let first = head.next, let second = first.next else {
return
}
var slow = head
var fast = head
while true {
guard let first = fast.next, let second = first.next else {
break
}
slow = slow.next!
fast = second
}


let secondHalf = slow.next
slow.next = nil

let reversedSecondHalf = reverseList(secondHalf)

mergeLists(head, reversedSecondHalf)
}

private func reverseList(_ head: ListNode?) -> ListNode? {
var prev: ListNode? = nil
var current = head

while current != nil {
let nextTemp = current?.next
current?.next = prev
prev = current
current = nextTemp
}

return prev
}

private func mergeLists(_ list1: ListNode?, _ list2: ListNode?) {
var first = list1
var second = list2

while first != nil && second != nil {
let firstNext = first?.next
let secondNext = second?.next

first?.next = second
second?.next = firstNext

first = firstNext
second = secondNext
}
}
}