我们有一个按升序排序的整数数组。我们也有3个整数A,B和C。我们需要对数组中的每个元素x应用A * x * x + B * x + C并对经过修改的数组进行排序。
例子:
Input : arr[] = {-1, 0, 1, 2, 3, 4}
A = -1, B = 2, C = -1
Output : {-9, -4, -4, -1, -1, 0}
Input array is {-1, 0, 1, 2, 3, 4}. After
applying the equation A*x*x + B*x + C on
every element x we get, {-4,-1, 0, -1, -4, -9}
After sorting, we get {-9, -4, -4, -1, -1, 0}
询问:Adobe
方法1(简单):
1-将给定的方程式应用于所有元素。上)
2-排序修改后的数组。 O(n对数n)
O(n log n)的时间复杂度
方法2(有效):抛物线性质
给出的方程是抛物线的。因此,将其应用于已排序数组的结果将导致一个数组,该数组的最大值和最小值与其子数组的左侧和右侧进行排序。
在上面的示例中,maximum为0,其左侧{-4,-1}的子数组以升序排序,其右侧{-1,-4,-9}的子数组以降序排序。
我们需要做的就是合并这些按时间顺序线性排列的数组。
所以算法是:
- 在每个元素上应用方程式。
- 查找最大值/最小值。
- 合并子数组。
注意:以下代码假定修改后的数组先增大然后减小。
C++
// C program to sort an array after applying equation
// A*x*x + B*x + C
#include
using namespace std;
// Function to sort an array after applying given
// equation.
void sortArray(int arr[], int n, int A, int B, int C)
{
// Apply equation on all elements
for (int i = 0; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
int index, maximum = INT_MIN;
for (int i = 0; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays usin simple
// merge function of merge sort
int i = 0, j = n-1;
int new_arr[n], k = 0;
while (i < index && j > index)
{
if (arr[i] < arr[j])
new_arr[k++] = arr[i++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (i < index)
new_arr[k++] = arr[i++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n-1] = maximum;
// Modify original array
for (int i = 0; i < n ; i++)
arr[i] = new_arr[i];
}
// Driver code
int main()
{
int arr[] = {-21 ,-15, 12, 13, 14 };
int n = sizeof(arr) / sizeof(arr[0]);
int A = -6, B =-7, C = 2;
sortArray(arr, n, A, B, C);
cout << "Array after sorting is : n";
for (int i=0; i
Java
// Java program to sort an array after applying equation
// A*x*x + B*x + C
class Main
{
// Function to sort an array after applying given
// equation.
static void sortArray(int arr[], int n, int A, int B, int C)
{
// Apply equation on all elements
for (int i = 0; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
int index=-1;
int maximum = -999999;
for (int i = 0; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays usin simple
// merge function of merge sort
int i = 0, j = n-1;
int[] new_arr = new int[n];
int k = 0;
while (i < index && j > index)
{
if (arr[i] < arr[j])
new_arr[k++] = arr[i++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (i < index)
new_arr[k++] = arr[i++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n-1] = maximum;
// Modify original array
for (int p = 0; p < n ; p++)
arr[p] = new_arr[p];
}
// main function
public static void main (String[] args)
{
int arr[] = {-21 ,-15, 12, 13, 14 };
int n = arr.length;
int A = -6, B =-7, C = 2;
sortArray(arr, n, A, B, C);
System.out.println("Array after sorting is : ");
for (int i=0; i
Python3
# Python3 program to sort an
# array after applying equation
# A*x*x + B*x + C
import sys
# Function to sort an array
# after applying given equation.
def sortArray(arr, n, A, B, C):
# Apply equation on all elements
for i in range(n):
arr[i] = (A * arr[i] * arr[i] +
B * arr[i] + C)
index = -(sys.maxsize - 1)
maximum = -(sys.maxsize - 1)
# Find maximum element in
# resultant array
for i in range(n):
if maximum < arr[i]:
index = i
maximum = arr[i]
# Use maximum element as a break point
# and merge both subarrays usin simple
# merge function of merge sort
i = 0; j = n - 1;
new_arr = [0] * n
k = 0
while i < index and j > index:
if arr[i] < arr[j]:
new_arr[k] = arr[i]
k += 1
i += 1
else:
new_arr[k] = arr[j]
k += 1
j -= 1
# Merge remaining elements
while i < index:
new_arr[k] = arr[i]
k += 1
i += 1
# Modify original array
while j > index:
new_arr[k] = arr[j]
k += 1
j -= 1
new_arr[n - 1] = maximum
for i in range(n):
arr[i] = new_arr[i]
# Driver code
arr = [-21, -15, 12, 13, 14]
n = len(arr)
A = -6
B= -7
C = 2
sortArray(arr, n, A, B, C)
print("Array after sorting is:")
for i in range(n):
print(arr[i], end = " ")
# This code is contributed
# by Shrikant13
C#
// C# program to sort an array after applying equation
// A*x*x + B*x + C
using System;
class MAIN
{
// Function to sort an array after applying given
// equation.
static void sortArray(int[] arr, int n, int A, int B, int C)
{
// Apply equation on all elements
for (int i = 0; i < n; i++)
arr[i] = A*arr[i]*arr[i] + B*arr[i] + C;
// Find maximum element in resultant array
int index=-1;
int maximum = -999999;
for (int i = 0; i< n; i++)
{
if (maximum < arr[i])
{
index = i;
maximum = arr[i];
}
}
// Use maximum element as a break point
// and merge both subarrays usin simple
// merge function of merge sort
int l = 0, j = n-1;
int[] new_arr = new int[n];
int k = 0;
while (l < index && j > index)
{
if (arr[l] < arr[j])
new_arr[k++] = arr[l++];
else
new_arr[k++] = arr[j--];
}
// Merge remaining elements
while (l < index)
new_arr[k++] = arr[l++];
while (j > index)
new_arr[k++] = arr[j--];
new_arr[n-1] = maximum;
// Modify original array
for (int p = 0; p < n ; p++)
arr[p] = new_arr[p];
}
// main function
public static void Main ()
{
int[] arr = {-21 ,-15, 12, 13, 14 };
int n = arr.Length;
int A = -6, B =-7, C = 2;
sortArray(arr, n, A, B, C);
Console.Write("Array after sorting is : "+"\n");
for (int i=0; i
PHP
$index)
{
if ($arr[$i] < $arr[$j])
array_push($new_arr, $arr[$i++]);
else
array_push($new_arr, $arr[$j--]);
}
// Merge remaining elements
while ($i < $index)
array_push($new_arr, $arr[$i++]);
while ($j > $index)
array_push($new_arr, $arr[$j--]);
array_push($new_arr, $maximum);
// Modify original array
for ($i = 0; $i < count($new_arr) ; $i++)
$arr[$i] = $new_arr[$i];
}
// Driver code
$arr = array(-21 ,-15, 12, 13, 14 );
$n = count($arr);
$A = -6;
$B = -7;
$C = 2;
sortArray($arr, $n, $A, $B, $C);
echo "Array after sorting is : \n";
for ($i = 0; $i < $n; $i++)
echo $arr[$i] . " ";
// This code is contributed by mits
?>
输出:
Array after sorting is :
-2497 -1272 -1243 -1103 -946
时间复杂度: O(n)
辅助空间: O(n)
参考:
http://stackoverflow.com/questions/4551599/sorting-result-array