stream solution for n sales
This commit is contained in:
		@@ -1,20 +1,57 @@
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.io.*;
 | 
			
		||||
import java.math.*;
 | 
			
		||||
import java.util.stream.IntStream;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Template code to help you parse the standard input 
 | 
			
		||||
 * according to the problem statement.
 | 
			
		||||
 **/
 | 
			
		||||
class Solution {
 | 
			
		||||
	
 | 
			
		||||
	public static void main( String[] args ) {
 | 
			
		||||
		Scanner in = new Scanner( System.in );
 | 
			
		||||
		// read values with in.next...() methods
 | 
			
		||||
		
 | 
			
		||||
		// code your solution here
 | 
			
		||||
		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( "value" );
 | 
			
		||||
		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 );
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user