查找峰值元素(多个)SWIFT
Find peak elements (multiple) SWIFT
如何在数组中找到多个峰?
给定数组:[1,2,3,4,5,4,3,2,3,4,5,6,5,4,3,2,4,2]
我可以使用下面的代码找到最大峰值。
func findPeakElement(_ readings: [Int]) -> Int {
if readings.count == 0 {
return 0
}
while left < right {
middle1 = (left + right) / 2
middle2 = middle1 + 1
if readings[middle1] < readings[middle2] {
left = middle2
} else {
right = middle1
}
}
return left
}
但是;我需要找到所有的峰;[5,6,4]
我需要什么代码?即使它只是告诉我峰数 (3) 也足够了。
假设您想要任何两边都具有较低值的值,您可以执行以下操作:
func findPeaks(readings: [Int]) -> [Int] {
var result = [Int]()
if readings.count >= 3 {
for i in 1..<readings.count-1 {
if readings[i - 1] < readings[i] && readings[i + 1] < readings[i] {
result.append(readings[i])
}
}
}
return result
}
let readings = [1,2,3,4,5,4,3,2,3,4,5,6,5,4,3,2,4,2]
print(findPeaks(readings: readings))
输出:
[5, 6, 4]
有一种情况不能按原样处理:
[1,4,4,1]
此算法将找不到 4
。支持这需要更多的工作。
您可以迭代您的元素并检查您的值是升序还是降序,并将您的元素与最后一个元素进行比较。如果当前元素大于最后一个元素,则将其标记为升序。如果它较小并且它是升序的,则将其标记为降序并附加最后一个元素:
func findPeakElement(_ readings: [Int]) -> [Int] {
var ascending = false
var peaks: [Int] = []
if var last = readings.first {
readings.dropFirst().forEach {
if last < [=10=] {
ascending = true
}
if [=10=] < last && ascending {
ascending = false
peaks.append(last)
}
last = [=10=]
}
}
return peaks
}
let readings = [1,2,3,4,5,4,3,2,3,4,5,6,5,4,3,2,4,2]
let peaks = findPeakElement(readings)
print(peaks) // [5, 6, 4]
如何在数组中找到多个峰?
给定数组:[1,2,3,4,5,4,3,2,3,4,5,6,5,4,3,2,4,2] 我可以使用下面的代码找到最大峰值。
func findPeakElement(_ readings: [Int]) -> Int {
if readings.count == 0 {
return 0
}
while left < right {
middle1 = (left + right) / 2
middle2 = middle1 + 1
if readings[middle1] < readings[middle2] {
left = middle2
} else {
right = middle1
}
}
return left
}
但是;我需要找到所有的峰;[5,6,4] 我需要什么代码?即使它只是告诉我峰数 (3) 也足够了。
假设您想要任何两边都具有较低值的值,您可以执行以下操作:
func findPeaks(readings: [Int]) -> [Int] {
var result = [Int]()
if readings.count >= 3 {
for i in 1..<readings.count-1 {
if readings[i - 1] < readings[i] && readings[i + 1] < readings[i] {
result.append(readings[i])
}
}
}
return result
}
let readings = [1,2,3,4,5,4,3,2,3,4,5,6,5,4,3,2,4,2]
print(findPeaks(readings: readings))
输出:
[5, 6, 4]
有一种情况不能按原样处理:
[1,4,4,1]
此算法将找不到 4
。支持这需要更多的工作。
您可以迭代您的元素并检查您的值是升序还是降序,并将您的元素与最后一个元素进行比较。如果当前元素大于最后一个元素,则将其标记为升序。如果它较小并且它是升序的,则将其标记为降序并附加最后一个元素:
func findPeakElement(_ readings: [Int]) -> [Int] {
var ascending = false
var peaks: [Int] = []
if var last = readings.first {
readings.dropFirst().forEach {
if last < [=10=] {
ascending = true
}
if [=10=] < last && ascending {
ascending = false
peaks.append(last)
}
last = [=10=]
}
}
return peaks
}
let readings = [1,2,3,4,5,4,3,2,3,4,5,6,5,4,3,2,4,2]
let peaks = findPeakElement(readings)
print(peaks) // [5, 6, 4]