📜  打印整数数组中的所有波峰和波谷

📅  最后修改于: 2022-05-13 01:54:28.374000             🧑  作者: Mango

打印整数数组中的所有波峰和波谷

给定一个整数数组arr[] ,任务是打印数组中所有峰的列表和所有波谷的列表。峰值是数组中大于其相邻元素的元素。类似地,槽是小于其相邻元素的元素。

例子:

方法:对于数组的每个元素,检查当前元素是峰(元素必须大于其相邻元素)还是谷(元素必须小于其相邻元素)。
请注意,数组的第一个和最后一个元素将有一个邻居。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function that returns true if num is
// greater than both arr[i] and arr[j]
static bool isPeak(int arr[], int n, int num,
                   int i, int j)
{
 
    // If num is smaller than the element
    // on the left (if exists)
    if (i >= 0 && arr[i] > num)
        return false;
 
    // If num is smaller than the element
    // on the right (if exists)
    if (j < n && arr[j] > num)
        return false;
    return true;
}
 
// Function that returns true if num is
// smaller than both arr[i] and arr[j]
static bool isTrough(int arr[], int n, int num,
                     int i, int j)
{
 
    // If num is greater than the element
    // on the left (if exists)
    if (i >= 0 && arr[i] < num)
        return false;
 
    // If num is greater than the element
    // on the right (if exists)
    if (j < n && arr[j] < num)
        return false;
    return true;
}
 
void printPeaksTroughs(int arr[], int n)
{
    cout << "Peaks : ";
 
    // For every element
    for (int i = 0; i < n; i++) {
 
        // If the current element is a peak
        if (isPeak(arr, n, arr[i], i - 1, i + 1))
            cout << arr[i] << " ";
    }
    cout << endl;
 
    cout << "Troughs : ";
 
    // For every element
    for (int i = 0; i < n; i++) {
 
        // If the current element is a trough
        if (isTrough(arr, n, arr[i], i - 1, i + 1))
            cout << arr[i] << " ";
    }
}
 
// Driver code
int main()
{
    int arr[] = { 5, 10, 5, 7, 4, 3, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    printPeaksTroughs(arr, n);
 
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
 
class GFG
{
 
    // Function that returns true if num is
    // greater than both arr[i] and arr[j]
    static boolean isPeak(int arr[], int n, int num,
                                    int i, int j)
    {
 
        // If num is smaller than the element
        // on the left (if exists)
        if (i >= 0 && arr[i] > num)
        {
            return false;
        }
 
        // If num is smaller than the element
        // on the right (if exists)
        if (j < n && arr[j] > num)
        {
            return false;
        }
        return true;
    }
 
    // Function that returns true if num is
    // smaller than both arr[i] and arr[j]
    static boolean isTrough(int arr[], int n, int num,
                                        int i, int j)
    {
 
        // If num is greater than the element
        // on the left (if exists)
        if (i >= 0 && arr[i] < num)
        {
            return false;
        }
 
        // If num is greater than the element
        // on the right (if exists)
        if (j < n && arr[j] < num)
        {
            return false;
        }
        return true;
    }
 
    static void printPeaksTroughs(int arr[], int n)
    {
        System.out.print("Peaks : ");
 
        // For every element
        for (int i = 0; i < n; i++)
        {
 
            // If the current element is a peak
            if (isPeak(arr, n, arr[i], i - 1, i + 1))
            {
                System.out.print(arr[i] + " ");
            }
        }
        System.out.println("");
 
        System.out.print("Troughs : ");
 
        // For every element
        for (int i = 0; i < n; i++)
        {
 
            // If the current element is a trough
            if (isTrough(arr, n, arr[i], i - 1, i + 1))
            {
                System.out.print(arr[i] + " ");
            }
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr[] = {5, 10, 5, 7, 4, 3, 5};
        int n = arr.length;
 
        printPeaksTroughs(arr, n);
    }
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 implementation of the approach
 
# Function that returns true if num is
# greater than both arr[i] and arr[j]
def isPeak(arr, n, num, i, j):
 
    # If num is smaller than the element
    # on the left (if exists)
    if (i >= 0 and arr[i] > num):
        return False
 
    # If num is smaller than the element
    # on the right (if exists)
    if (j < n and arr[j] > num):
        return False
    return True
 
# Function that returns true if num is
# smaller than both arr[i] and arr[j]
def isTrough(arr, n, num, i, j):
 
    # If num is greater than the element
    # on the left (if exists)
    if (i >= 0 and arr[i] < num):
        return False
 
    # If num is greater than the element
    # on the right (if exists)
    if (j < n and arr[j] < num):
        return False
    return True
 
def printPeaksTroughs(arr, n):
 
    print("Peaks : ", end = "")
 
    # For every element
    for i in range(n):
 
        # If the current element is a peak
        if (isPeak(arr, n, arr[i], i - 1, i + 1)):
            print(arr[i], end = " ")
    print()
 
    print("Troughs : ", end = "")
 
    # For every element
    for i in range(n):
 
        # If the current element is a trough
        if (isTrough(arr, n, arr[i], i - 1, i + 1)):
            print(arr[i], end = " ")
 
# Driver code
arr = [5, 10, 5, 7, 4, 3, 5]
n = len(arr)
 
printPeaksTroughs(arr, n)
 
# This code is contributed by Mohit Kumar


C#
// C# implementation of the approach
using System;
     
class GFG
{
 
    // Function that returns true if num is
    // greater than both arr[i] and arr[j]
    static Boolean isPeak(int []arr, int n, int num,
                                    int i, int j)
    {
 
        // If num is smaller than the element
        // on the left (if exists)
        if (i >= 0 && arr[i] > num)
        {
            return false;
        }
 
        // If num is smaller than the element
        // on the right (if exists)
        if (j < n && arr[j] > num)
        {
            return false;
        }
        return true;
    }
 
    // Function that returns true if num is
    // smaller than both arr[i] and arr[j]
    static Boolean isTrough(int []arr, int n, int num,
                                        int i, int j)
    {
 
        // If num is greater than the element
        // on the left (if exists)
        if (i >= 0 && arr[i] < num)
        {
            return false;
        }
 
        // If num is greater than the element
        // on the right (if exists)
        if (j < n && arr[j] < num)
        {
            return false;
        }
        return true;
    }
 
    static void printPeaksTroughs(int []arr, int n)
    {
        Console.Write("Peaks : ");
 
        // For every element
        for (int i = 0; i < n; i++)
        {
 
            // If the current element is a peak
            if (isPeak(arr, n, arr[i], i - 1, i + 1))
            {
                Console.Write(arr[i] + " ");
            }
        }
        Console.WriteLine("");
 
        Console.Write("Troughs : ");
 
        // For every element
        for (int i = 0; i < n; i++)
        {
 
            // If the current element is a trough
            if (isTrough(arr, n, arr[i], i - 1, i + 1))
            {
                Console.Write(arr[i] + " ");
            }
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int []arr = {5, 10, 5, 7, 4, 3, 5};
        int n = arr.Length;
 
        printPeaksTroughs(arr, n);
    }
}
 
// This code is contributed by Princi Singh


Javascript


输出:
Peaks : 10 7 5 
Troughs : 5 5 3