You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
buy-and-sell-n-times/src/main/java/Solution.java

63 lines
2.9 KiB
Java

import java.util.*;
import java.util.stream.IntStream;
class Solution {
public static void main( String[] args ) {
// read values with in.next...() methods
var scanner = new Scanner( System.in );
var sellCount = scanner.nextInt();
var prices = scanner.tokens()
.mapToInt( Integer::valueOf )
.toArray();
// Write result with System.out.println()
System.out.println( maxProfits( sellCount, prices ));
}
// code your solution here
// 0 - 1 | ... | x-sellCount - x --> 0 - x-1 | ... | x-1 - x
private static int maxProfits( int sellCount, int[] prices ) {
return IntStream.range( 0, sellCount )
.parallel()
.map( sale -> {
// recursion end condition
if ( sellCount == 1 ) {
return maxProfit( prices );
}
else {
return IntStream.range( 2, prices.length )
.parallel()
.map( index -> {
var firstRange = Arrays.copyOfRange( prices, 0, index );
final int max1 = maxProfit( firstRange );
var secondRange = Arrays.copyOfRange( prices, index - 1,
prices.length
);
// reduce range sizes recursively
final int max2 = maxProfits( sellCount - 1, secondRange );
return max1 + max2;
})
.max().orElse( 0 );
}
})
.max().orElse( 0 );
}
private static int maxProfit( int[] prices ) {
return IntStream.range( 0, prices.length )
.map( index -> {
var range = Arrays.copyOfRange( prices, Math.min( index + 1, prices.length - 1 ),
prices.length
);
int max = IntStream.of( range ).max().orElse( 0 );
// difference between current price and future maximum
return max - prices[index];
})
.max().orElse( 0 );
}
}