stream solution for n sales
This commit is contained in:
		@@ -1,20 +1,57 @@
 | 
				
			|||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
import java.io.*;
 | 
					import java.util.stream.IntStream;
 | 
				
			||||||
import java.math.*;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Template code to help you parse the standard input 
 | 
					 | 
				
			||||||
 * according to the problem statement.
 | 
					 | 
				
			||||||
 **/
 | 
					 | 
				
			||||||
class Solution {
 | 
					class Solution {
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	public static void main( String[] args ) {
 | 
						public static void main( String[] args ) {
 | 
				
			||||||
		Scanner in = new Scanner( System.in );
 | 
					 | 
				
			||||||
		// read values with in.next...() methods
 | 
							// read values with in.next...() methods
 | 
				
			||||||
		
 | 
							var scanner = new Scanner( System.in );
 | 
				
			||||||
		// code your solution here
 | 
							var sellCount = scanner.nextInt(); 
 | 
				
			||||||
 | 
							var prices = scanner.tokens()
 | 
				
			||||||
 | 
									.mapToInt( Integer::valueOf )
 | 
				
			||||||
 | 
									.toArray();
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// Write result with System.out.println()
 | 
							// 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