Find the Array which when sorted forms an AP and has minimum maximum
Last Updated :
29 Nov, 2021
Given three positive integers N, X, and Y(X<Y). The task is to find an array of length N containing both X and Y, and when sorted in increasing order, the array must form an arithmetic progression
Examples:
Input: N = 5, X = 20, Y = 50
Output: 20 30 40 50 10
Explanation: The array when sorted in increasing order forms an arithmetic progression with common difference 10.
Input: N = 17, X = 23445, Y = 1000000
Output: 23445 218756 414067 609378 804689 1000000 1195311 1390622 1585933 1781244 1976555 2171866 2367177 2562488 2757799 2953110 3148421
Explanation: The array when sorted in increasing order forms an arithmetic progression with common difference 195311.
Approach: In this problem, it can be observed that if the maximum element is to be minimized, then it can be assumed that Y should be the greatest element. If Y is the greatest, then each of the remaining elements will be less than or equal to Y. If Y is not the greatest element in the array, then elements greater than Y can be considered.
Follow the steps below to solve the given problem:
- Check if some elements which have a common difference are present between X and Y. For this, check if (Y-X) is divisible by (N-1). If it is divisible, then decrease N and the common difference d is given by:
d = (Y-X)/(N-1)
- If it is not divisible, then decrease (n-1) and repeat the above step in a loop till the denominator is non-zero.
- If there don’t exist any such elements between X and Y, then the common difference d is given by:
d = (Y-X)
- Let the resultant array be stored in vector ans. Push the elements found between X and Y in the vector ans to use a for loop.
- If N is not equal to zero, insert the elements in ans starting from (X-d) with common difference d.
- If N is equal to zero, output ans. Otherwise, insert the elements in ans starting from (Y+d) till the required array is obtained.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void findArray( int N, int X, int Y)
{
int r = Y - X;
int d = -1;
int num = 0;
for ( int i = (N - 1); i > 0; i--) {
if (r % i == 0) {
d = r / i;
num = i - 1;
break ;
}
}
if (d == -1) {
d = Y - X;
}
N = N - 2 - num;
vector< int > ans;
for ( int i = X; i <= Y; i += d) {
ans.push_back(i);
}
int i = X;
while (N > 0 && i > 0) {
i = i - d;
if (i > 0) {
ans.push_back(i);
N--;
}
}
i = Y;
while (N > 0) {
i = i + d;
ans.push_back(i);
N--;
}
for ( int i = 0; i < ans.size(); ++i) {
cout << ans[i] << " " ;
}
}
int main()
{
int N = 5, X = 20, Y = 50;
findArray(N, X, Y);
return 0;
}
|
Java
import java.util.ArrayList;
class GFG {
static void findArray( int N, int X, int Y) {
int r = Y - X;
int d = - 1 ;
int num = 0 ;
for ( int i = (N - 1 ); i > 0 ; i--) {
if (r % i == 0 ) {
d = r / i;
num = i - 1 ;
break ;
}
}
if (d == - 1 ) {
d = Y - X;
}
N = N - 2 - num;
ArrayList<Integer> ans = new ArrayList<Integer>();
for ( int i = X; i <= Y; i += d) {
ans.add(i);
}
int j = X;
while (N > 0 && j > 0 ) {
j = j - d;
if (j > 0 ) {
ans.add(j);
N--;
}
}
j = Y;
while (N > 0 ) {
j = j + d;
ans.add(j);
N--;
}
for ( int i = 0 ; i < ans.size(); ++i) {
System.out.print(ans.get(i) + " " );
}
}
public static void main(String[] args)
{
int N = 5 , X = 20 , Y = 50 ;
findArray(N, X, Y);
}
}
|
Python3
def findArray(N, X, Y):
r = Y - X
d = - 1
num = 0
for i in range (N - 1 , 0 , - 1 ):
if (r % i = = 0 ):
d = r / / i
num = i - 1
break
if (d = = - 1 ):
d = Y - X
N = N - 2 - num
ans = []
for i in range (X, Y + 1 , d):
ans.append(i)
i = X
while (N > 0 and i > 0 ):
i = i - d
if (i > 0 ):
ans.append(i)
N - = 1
i = Y
while (N > 0 ):
i = i + d
ans.append(i)
N - = 1
for i in range ( 0 , len (ans)):
print (ans[i], end = " " )
if __name__ = = "__main__" :
N = 5
X = 20
Y = 50
findArray(N, X, Y)
|
C#
using System;
using System.Collections.Generic;
public class GFG
{
static void findArray( int N, int X, int Y)
{
int r = Y - X;
int d = -1;
int num = 0;
for ( int i = (N - 1); i > 0; i--) {
if (r % i == 0) {
d = r / i;
num = i - 1;
break ;
}
}
if (d == -1) {
d = Y - X;
}
N = N - 2 - num;
List< int > ans = new List< int >();
for ( int i = X; i <= Y; i += d) {
ans.Add(i);
}
int j = X;
while (N > 0 && j > 0) {
j = j - d;
if (j > 0) {
ans.Add(j);
N--;
}
}
j = Y;
while (N > 0) {
j = j + d;
ans.Add(j);
N--;
}
for ( int i = 0; i < ans.Count; ++i) {
Console.Write( ans[i] + " " );
}
}
public static void Main(String[] args)
{
int N = 5, X = 20, Y = 50;
findArray(N, X, Y);
}
}
|
Javascript
<script>
function findArray(N, X, Y)
{
let r = Y - X;
let d = -1;
let num = 0;
for (let i = (N - 1); i > 0; i--) {
if (r % i == 0) {
d = r / i;
num = i - 1;
break ;
}
}
if (d == -1) {
d = Y - X;
}
N = N - 2 - num;
let ans = [];
for (let i = X; i <= Y; i += d) {
ans.push(i);
}
let i = X;
while (N > 0 && i > 0) {
i = i - d;
if (i > 0) {
ans.push(i);
N--;
}
}
i = Y;
while (N > 0) {
i = i + d;
ans.push(i);
N--;
}
for (let i = 0; i < ans.length; ++i) {
document.write(ans[i] + " " );
}
}
let N = 5, X = 20, Y = 50;
findArray(N, X, Y);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...