Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 查找峰值元素(多个)SWIFT_Arrays_Swift_Search_Element - Fatal编程技术网

Arrays 查找峰值元素(多个)SWIFT

Arrays 查找峰值元素(多个)SWIFT,arrays,swift,search,element,Arrays,Swift,Search,Element,如何在阵列中找到多个峰值 给定数组:[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

如何在阵列中找到多个峰值

给定数组:[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
}
func findPeakElement(u读数:[Int])->Int{
如果读数.count==0{
返回0
}
而左<右{
中间1=(左+右)/2
中间2=中间1+1
如果读数[middle1]<读数[middle2]{
左=中2
}否则{
右=中1
}
}         
左转
}
但是,;我需要找到所有的山峰;[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))

此算法将找不到
4
。支持这一点需要更多的工作。

您可以迭代元素,检查值是升序还是降序,并将元素与上一个元素进行比较。如果当前元素大于最后一个元素,则将其标记为升序。如果较小且为升序,则将其标记为降序并附加最后一个元素:

func findPeakElement(_ readings: [Int]) -> [Int] {
    var ascending = false
    var peaks: [Int] = []
    if var last = readings.first {
        readings.dropFirst().forEach {
            if last < $0 {
                ascending = true
            }
            if $0 < last && ascending  {
                ascending = false
                peaks.append(last)
            }
            last = $0
        }
    }
    return peaks
}
func findPeakElement(_ readings: [Int]) -> [Int] {
    var ascending = false
    var peaks: [Int] = []
    if var last = readings.first {
        readings.dropFirst().forEach {
            if last < $0 {
                ascending = true
            }
            if $0 < last && ascending  {
                ascending = false
                peaks.append(last)
            }
            last = $0
        }
    }
    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]