Codility - FrogRiverOne - Swift
Codility - FrogRiverOne - Swift
我正在尝试为以下可调节任务找到最佳 swift 解决方案,请分享您的观点。
时间复杂度 - O(N**2)
任务描述
一只小青蛙想去河对岸。青蛙最初位于河的一岸(位置 0),想要到达对岸(位置 X+1)。叶子从树上落到河面上。
给你一个数组A,由N个表示落叶的整数组成。 A[K]表示一片叶子在时间K落下的位置,以秒为单位。
目标是找出青蛙最早能跳到河对岸的时间。只有当从1到X过河的每个位置都出现树叶时,青蛙才能过河(即我们要找到从1到X的所有位置都被树叶覆盖的最早时刻)。你可以假设河流中的水流速度很小,可以忽略不计,即叶子落入河流后不会改变位置。
例如,给定整数 X = 5 和数组 A 使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
第6秒,一片树叶落在第5个位置,这是过河各个位置出现树叶最早的时间。
写一个函数:
public func solution(_ X : Int, _ A : inout [Int]) -> Int
即,给定一个由N个整数和整数X组成的非空数组A,return是青蛙能跳到河对岸的最早时间。
如果青蛙永远无法跳到河的另一边,函数应该return −1.
例如,给定 X = 5 和数组 A 使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
函数应该 return 6,如上所述。
为以下假设编写一个有效的算法:
N and X are integers within the range [1..100,000]; each element of
array A is an integer within the range [1..X].
编辑 - 错过了添加我的方法,感谢您强调它,非常感谢您抽出时间。合十礼
public func solution(_ X : Int, _ A : inout [Int]) -> Int {
// write your code in Swift 4.2.1 (Linux)
let destination = X
var positionDict = [Int: Bool]()
for (index,value) in A.enumerated() {
if value <= destination, positionDict[value] == nil {
positionDict[value] = true
}
if hasPositions(initial: A[0], destination: X, dict: positionDict) {
return index
}
}
return -1
}
func hasPositions(initial: Int, destination: Int, dict: [Int: Bool]) -> Bool {
for i in stride(from: initial, to: destination+1, by: 1 ) {
if dict[i] == nil {
return false
}
}
return true
}
var arr = [1,3,1,4,2,3,5,4]
print(solution(5, &arr))
//CODILITY gave 45 % for the solution, please share where am i going wrong.
public func solution(_ X : Int, _ A : inout [Int]) -> Int {
typealias = [Int]
typealias = EnumeratedSequence<>
let = .first
let = 1
var = Set(...X)
return try!
(A.enumerated()) ({
.remove([=10=].element)
return .isEmpty
})?
.offset
?? -
}
我正在尝试为以下可调节任务找到最佳 swift 解决方案,请分享您的观点。
时间复杂度 - O(N**2)
任务描述
一只小青蛙想去河对岸。青蛙最初位于河的一岸(位置 0),想要到达对岸(位置 X+1)。叶子从树上落到河面上。
给你一个数组A,由N个表示落叶的整数组成。 A[K]表示一片叶子在时间K落下的位置,以秒为单位。
目标是找出青蛙最早能跳到河对岸的时间。只有当从1到X过河的每个位置都出现树叶时,青蛙才能过河(即我们要找到从1到X的所有位置都被树叶覆盖的最早时刻)。你可以假设河流中的水流速度很小,可以忽略不计,即叶子落入河流后不会改变位置。
例如,给定整数 X = 5 和数组 A 使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
第6秒,一片树叶落在第5个位置,这是过河各个位置出现树叶最早的时间。
写一个函数:
public func solution(_ X : Int, _ A : inout [Int]) -> Int
即,给定一个由N个整数和整数X组成的非空数组A,return是青蛙能跳到河对岸的最早时间。
如果青蛙永远无法跳到河的另一边,函数应该return −1.
例如,给定 X = 5 和数组 A 使得:
A[0] = 1
A[1] = 3
A[2] = 1
A[3] = 4
A[4] = 2
A[5] = 3
A[6] = 5
A[7] = 4
函数应该 return 6,如上所述。
为以下假设编写一个有效的算法:
N and X are integers within the range [1..100,000]; each element of array A is an integer within the range [1..X].
编辑 - 错过了添加我的方法,感谢您强调它,非常感谢您抽出时间。合十礼
public func solution(_ X : Int, _ A : inout [Int]) -> Int {
// write your code in Swift 4.2.1 (Linux)
let destination = X
var positionDict = [Int: Bool]()
for (index,value) in A.enumerated() {
if value <= destination, positionDict[value] == nil {
positionDict[value] = true
}
if hasPositions(initial: A[0], destination: X, dict: positionDict) {
return index
}
}
return -1
}
func hasPositions(initial: Int, destination: Int, dict: [Int: Bool]) -> Bool {
for i in stride(from: initial, to: destination+1, by: 1 ) {
if dict[i] == nil {
return false
}
}
return true
}
var arr = [1,3,1,4,2,3,5,4]
print(solution(5, &arr))
//CODILITY gave 45 % for the solution, please share where am i going wrong.
public func solution(_ X : Int, _ A : inout [Int]) -> Int {
typealias = [Int]
typealias = EnumeratedSequence<>
let = .first
let = 1
var = Set(...X)
return try!
(A.enumerated()) ({
.remove([=10=].element)
return .isEmpty
})?
.offset
?? -
}