给定一个正整数的数组arr [] ,任务是查找是否有可能通过修改至少一个元素来使该数组严格增加。
例子:
Input: arr[] = {2, 4, 8, 6, 9, 12}
Output: Yes
By modifying 8 to 5, array will become strictly increasing.
i.e. {2, 4, 5, 6, 9, 12}
Input: arr[] = {10, 5, 2}
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] = arr [i + 1],则不能严格增加数组而不影响单个元素。否则将所有此类修改计数,如果最后的修改计数小于或等于1,则打印“是”,否则打印“否” 。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function that returns true if arr[]
// can be made strictly increasing after
// modifying at most one element
bool check(int arr[], int n)
{
// To store the number of modifications
// required to make the array
// strictly increasing
int modify = 0;
// Check whether the first element needs
// to be modify or not
if (arr[0] > arr[1]) {
arr[0] = arr[1] / 2;
modify++;
}
// Loop from 2nd element to the 2nd last element
for (int i = 1; i < n - 1; 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;
// 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;
modify++;
}
}
// Check whether the last element needs
// to be modify or not
if (arr[n - 1] < arr[n - 2])
modify++;
// If more than 1 modification is required
if (modify > 1)
return false;
return true;
}
// Driver code
int main()
{
int arr[] = { 2, 4, 8, 6, 9, 12 };
int n = sizeof(arr) / sizeof(arr[0]);
if (check(arr, n))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
Java
// Java implementation of the approach
class GFG {
// Function that returns true if arr[]
// can be made strictly increasing after
// modifying at most one element
static boolean check(int arr[], int n)
{
// To store the number of modifications
// required to make the array
// strictly increasing
int modify = 0;
// Check whether the first element needs
// to be modify or not
if (arr[0] > arr[1]) {
arr[0] = arr[1] / 2;
modify++;
}
// Loop from 2nd element to the 2nd last element
for (int i = 1; i < n - 1; 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;
// 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;
modify++;
}
}
// Check whether the last element needs
// to be modify or not
if (arr[n - 1] < arr[n - 2])
modify++;
// If more than 1 modification is required
if (modify > 1)
return false;
return true;
}
// Driver code
public static void main(String[] args)
{
int[] arr = { 2, 4, 8, 6, 9, 12 };
int n = arr.length;
if (check(arr, n))
System.out.print("Yes");
else
System.out.print("No");
}
}
C#
// C# implementation of the approach
using System;
class GFG
{
// Function that returns true if arr[]
// can be made strictly increasing after
// modifying at most one element
static bool check(int []arr, int n)
{
// To store the number of modifications
// required to make the array
// strictly increasing
int modify = 0;
// Check whether the first element needs
// to be modify or not
if (arr[0] > arr[1])
{
arr[0] = arr[1] / 2;
modify++;
}
// Loop from 2nd element to the 2nd last element
for (int i = 1; i < n - 1; 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;
// 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;
modify++;
}
}
// Check whether the last element needs
// to be modify or not
if (arr[n - 1] < arr[n - 2])
modify++;
// If more than 1 modification is required
if (modify > 1)
return false;
return true;
}
// Driver code
public static void Main()
{
int[] arr = { 2, 4, 8, 6, 9, 12 };
int n = arr.Length;
if (check(arr, n))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed by AnkitRai01
Python 3
# Python 3 implementation of above approach
# Function that returns true if arr[]
# can be made strictly increasing after
# modifying at most one element
def check( arr, n):
# To store the number of modifications
# required to make the array
# strictly increasing
modify = 0
# Check whether the first element needs
# to be modify or not
if (arr[0] > arr[1]) :
arr[0] = arr[1] // 2
modify+=1
# Loop from 2nd element to the 2nd last element
for i in range ( 1, n - 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
# 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
modify+=1
# Check whether the last element needs
# to be modify or not
if (arr[n - 1] < arr[n - 2]):
modify+=1
# If more than 1 modification is required
if (modify > 1):
return False
return True
# Driver code
if __name__ == "__main__":
arr = [ 2, 4, 8, 6, 9, 12 ]
n = len(arr)
if (check(arr, n)):
print ( "Yes")
else:
print ("No")
# This code is contributed by ChitraNayal
输出:
Yes