给定一个正整数的数组arr [] ,任务是查找是否有可能通过最多修改一个元素来使此数组严格减小。
例子:
Input: arr[] = {12, 9, 10, 5, 2}
Output: Yes
{12, 11, 10, 5, 2} is one of the valid solutions.
Input: arr[] = {1, 2, 3, 4}
Output: No
方法:对于每个元素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