📌  相关文章
📜  检查是否可以通过最多修改一个元素来严格减少数组

📅  最后修改于: 2021-04-23 20:40:04             🧑  作者: Mango

给定一个正整数的数组arr [] ,任务是查找是否有可能通过最多修改一个元素来使此数组严格减小。
例子:

方法:对于每个元素arr [i] ,如果它都大于arr [i – 1]arr [i + 1]或小于arr [i – 1]和arr [i + 1]则arr [i]需要修改。
arr [i] =(arr [i – 1] + arr [i + 1])/ 2 。如果在修改之后, arr [i] = arr [i – 1]arr [i + 1],那么在不影响最多一个元素的情况下,不能严格减小数组,否则如果所有修改数都计入最后,则不计算所有此类修改小于或等于1,然后打印是,否则打印
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function that returns true if the array
// can be made strictly decreasing
// with at most one change
bool check(int* arr, int n)
{
 
    // To store the number of modifications
    // required to make the array
    // strictly decreasing
    int modify = 0;
 
    // Check whether the last element needs
    // to be modify or not
    if (arr[n - 1] >= arr[n - 2]) {
        arr[n - 1] = arr[n - 2] - 1;
        modify++;
    }
 
    // Check whether the first element needs
    // to be modify or not
    if (arr[0] <= arr[1]) {
        arr[0] = arr[1] + 1;
        modify++;
    }
 
    // Loop from 2nd element to the 2nd last element
    for (int i = n - 2; i > 0; i--) {
 
        // Check whether arr[i] needs to be modified
        if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i])
            || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i])) {
 
            // Modifying arr[i]
            arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
            modify++;
 
            // Check if arr[i] is equal to any of
            // arr[i-1] or arr[i+1]
            if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
                return false;
        }
    }
 
    // If more than 1 modification is required
    if (modify > 1)
        return false;
 
    return true;
}
 
// Driver code
int main()
{
 
    int arr[] = { 10, 5, 11, 2 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    if (check(arr, n))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}


Java
// Java implementation of the approach
class GFG {
 
    // Function that returns true if the array
    // can be made strictly decreasing
    // with at most one change
    public static boolean check(int[] arr, int n)
    {
 
        // To store the number of modifications
        // required to make the array
        // strictly decreasing
        int modify = 0;
 
        // Check whether the last element needs
        // to be modify or not
        if (arr[n - 1] >= arr[n - 2]) {
            arr[n - 1] = arr[n - 2] - 1;
            modify++;
        }
 
        // Check whether the first element needs
        // to be modify or not
        if (arr[0] <= arr[1]) {
            arr[0] = arr[1] + 1;
            modify++;
        }
 
        // Loop from 2nd element to the 2nd last element
        for (int i = n - 2; i > 0; i--) {
 
            // Check whether arr[i] needs to be modified
            if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i])
                || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i])) {
 
                // Modifying arr[i]
                arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
                modify++;
 
                // Check if arr[i] is equal to any of
                // arr[i-1] or arr[i+1]
                if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
                    return false;
            }
        }
 
        // If more than 1 modification is required
        if (modify > 1)
            return false;
 
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int[] arr = { 10, 5, 11, 3 };
        int n = arr.length;
 
        if (check(arr, n))
            System.out.print("Yes");
        else
            System.out.print("No");
    }
}


Python3
# Python3 implementation of the approach
 
# Function that returns true if the array
# can be made strictly decreasing
# with at most one change
def check(arr, n):
 
    modify = 0
     
    # Check whether the last element needs
    # to be modify or not
    if (arr[n - 1] >= arr[n - 2]):
        arr[n-1] = arr[n-2] - 1
        modify += 1
     
    # Check whether the first element needs
    # to be modify or not
    if (arr[0] <= arr[1]):
        arr[0] = arr[1] + 1
        modify += 1
 
    # Loop from 2nd element to the 2nd last element
    for i in range(n-2, 0, -1):
 
        # Check whether arr[i] needs to be modified
        if (arr[i - 1] <= arr[i] and arr[i + 1] <= arr[i]) or \
        (arr[i - 1] >= arr[i] and arr[i + 1] >= arr[i]):
 
            # Modifying arr[i]
            arr[i] = (arr[i - 1] + arr[i + 1]) // 2
            modify += 1
             
            # Check if arr[i] is equal to any of
            # arr[i-1] or arr[i + 1]
            if (arr[i] == arr[i - 1] or arr[i] == arr[i + 1]):
                return False
 
 
    # If more than 1 modification is required
    if (modify > 1):
        return False
 
    return True
 
# Driver code
if __name__ == "__main__":
    arr = [10, 5, 11, 3]
    n = len(arr)
 
    if (check(arr, n)):
        print("Yes")
    else:
        print("No")


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
    // Function that returns true if the array
    // can be made strictly decreasing
    // with at most one change
    public static bool check(int[]arr, int n)
    {
 
        // To store the number of modifications
        // required to make the array
        // strictly decreasing
        int modify = 0;
 
        // Check whether the last element needs
        // to be modify or not
        if (arr[n - 1] >= arr[n - 2])
        {
            arr[n - 1] = arr[n - 2] - 1;
            modify++;
        }
 
        // Check whether the first element needs
        // to be modify or not
        if (arr[0] <= arr[1])
        {
            arr[0] = arr[1] + 1;
            modify++;
        }
 
        // Loop from 2nd element to the 2nd last element
        for (int i = n - 2; i > 0; i--)
        {
 
            // Check whether arr[i] needs to be modified
            if ((arr[i - 1] <= arr[i] && arr[i + 1] <= arr[i])
                || (arr[i - 1] >= arr[i] && arr[i + 1] >= arr[i]))
            {
 
                // Modifying arr[i]
                arr[i] = (arr[i - 1] + arr[i + 1]) / 2;
                modify++;
 
                // Check if arr[i] is equal to any of
                // arr[i-1] or arr[i+1]
                if (arr[i] == arr[i - 1] || arr[i] == arr[i + 1])
                    return false;
            }
        }
 
        // If more than 1 modification is required
        if (modify > 1)
            return false;
 
        return true;
    }
 
    // Driver code
    static public void Main ()
    {
        int[]arr = { 10, 5, 11, 3 };
        int n = arr.Length;
 
        if (check(arr, n))
            Console.Write("Yes");
        else
            Console.Write("No");
    }
}
 
// This code is contributed by ajit.


输出:
Yes