Find minimum cost to buy all books - GeeksforGeeks

22 Jun, 2021
Given an array of ratings for n books. Find the minimum cost to buy all books with below conditions :  
Cost of every book would be at-least 1 dollar.A book has higher cost than an adjacent (left or right) if rating is more than the adjacent.
Cost of every book would be at-least 1 dollar.
A book has higher cost than an adjacent (left or right) if rating is more than the adjacent.
Examples :  
Input : Ratings[] = {1, 3, 4, 3, 7, 1}
Output : 10
Exp :- 1 + 2 + 3 + 1 + 2 + 1 = 10

Input : ratings[] = {1, 6, 8, 3, 4, 1, 5, 7}
Output : 15
Exp :- 1 + 2 + 3 + 1 + 2 + 1 + 2 + 3 = 15 
 
 
Make two arrays left2right and right2left and fill 1 in both of them.Traverse left to right and fill left2right array and update it by seeing previous rating of given array. Do not care about next rating of given array.Traverse right to left and fill right2left array and update it by seeing next rating of given array. Do not care about previous rating of given array.Find maximum value of ith position in both array (left2right and right2left) and add it to result
Make two arrays left2right and right2left and fill 1 in both of them.
Traverse left to right and fill left2right array and update it by seeing previous rating of given array. Do not care about next rating of given array.
Traverse right to left and fill right2left array and update it by seeing next rating of given array. Do not care about previous rating of given array.
Find maximum value of ith position in both array (left2right and right2left) and add it to result
 
 
C++
Java
Python
C#
Javascript
// C++ program to find minimum cost to buy// n books.#include <bits/stdc++.h>using namespace std; int minCost(int ratings[], int n){    int res = 0;    int left2right[n];    int right2left[n];     // fill 1 in both array    fill_n(left2right, n, 1);    fill_n(right2left, n, 1);     // Traverse from left to right and assign    // minimum possible rating considering only    // left adjacent    for (int i = 1; i < n; i++)        if (ratings[i] > ratings[i - 1])            left2right[i] = left2right[i - 1] + 1;         // Traverse from right to left and assign    // minimum possible rating considering only    // right adjacent    for (int i = n - 2; i >= 0; i--)        if (ratings[i] > ratings[i + 1])            right2left[i] = right2left[i + 1] + 1;               // Since we need to follow rating rule for    // both adjacent, we pick maximum of two    for (int i = 0; i < n; i++)        res += max(left2right[i], right2left[i]);         return res;} // Driver functionint main(){    int ratings[] = { 1, 6, 8, 3, 4, 1, 5, 7 };    int n = sizeof(ratings) / sizeof(ratings[0]);    cout << minCost(ratings, n);    return 0;}
// JAVA Code For Find minimum cost to// buy all booksimport java.util.*; class GFG {         public static int minCost(int ratings[], int n)    {        int res = 0;        int left2right[] = new int[n];        int right2left[] = new int[n];;              // fill 1 in both array        Arrays.fill(left2right,  1);        Arrays.fill(right2left, 1);              // Traverse from left to right and assign        // minimum possible rating considering        // only left adjacent        for (int i = 1; i < n; i++)            if (ratings[i] > ratings[i - 1])                left2right[i] = left2right[i - 1] + 1;                  // Traverse from right to left and assign        // minimum possible rating considering only        // right adjacent        for (int i = n - 2; i >= 0; i--)            if (ratings[i] > ratings[i + 1])                right2left[i] = right2left[i + 1] + 1;                        // Since we need to follow rating rule for        // both adjacent, we pick maximum of two        for (int i = 0; i < n; i++)            res += Math.max(left2right[i],                            right2left[i]);                  return res;    }         /* Driver program to test above function */    public static void main(String[] args)    {        int ratings[] = { 1, 6, 8, 3, 4, 1, 5, 7 };        int n = ratings.length;        System.out.print(minCost(ratings, n));             }}   // This code is contributed by Arnav Kr. Mandal.
# Python program to find minimum cost to buy# n books. def minCost(ratings, n):    res = 0        # fill 1 in both array    left2right = [1 for i in range(n)]    right2left = [1 for i in range(n)]      # Traverse from left to right and assign    # minimum possible rating considering only    # left adjacent    for i in range(1, n):        if (ratings[i] > ratings[i - 1]):            left2right[i] = left2right[i - 1] + 1      # Traverse from right to left and assign    # minimum possible rating considering only    # right adjacent    i = n - 2    while(i >= 0):        if (ratings[i] > ratings[i + 1]):            right2left[i] = right2left[i + 1] + 1        i -= 1          # Since we need to follow rating rule for    # both adjacent, we pick maximum of two    for i in range(n):                 res += max(left2right[i], right2left[i])          return res  # Driver functionratings = [ 1, 6, 8, 3, 4, 1, 5, 7 ]n = len(ratings)print minCost(ratings, n) # This code is contributed by Sachin Bisht
// C# code For Finding minimum// cost to buy all booksusing System; class GFG {         public static int minCost(int []ratings, int n)    {        int res = 0;        int []left2right = new int[n];        int []right2left = new int[n];             // fill 1 in both array        for(int i = 0; i < n; i++)        left2right[i] = 1;                 for(int i = 0; i < n; i++)        right2left[i] = 1;             // Traverse from left to right and assign        // minimum possible rating considering        // only left adjacent        for (int i = 1; i < n; i++)            if (ratings[i] > ratings[i - 1])                left2right[i] = left2right[i - 1] + 1;                 // Traverse from right to left and assign        // minimum possible rating considering only        // right adjacent        for (int i = n - 2; i >= 0; i--)            if (ratings[i] > ratings[i + 1])                right2left[i] = right2left[i + 1] + 1;                     // Since we need to follow rating rule for        // both adjacent, we pick maximum of two        for (int i = 0; i < n; i++)            res += Math.Max(left2right[i],                            right2left[i]);                 return res;    }         /* Driver program to test above function */    public static void Main()    {        int []ratings = {1, 6, 8, 3, 4, 1, 5, 7};        int n = ratings.Length;        Console.Write(minCost(ratings, n));    }}     // This code is contributed by nitin mittal.
<script> // JavaScript program to find minimum cost to buy// n books. function minCost(ratings, n) {    let res = 0;    let left2right = new Array(n).fill(1);    let right2left = new Array(n).fill(1);      // Traverse from left to right and assign    // minimum possible rating considering only    // left adjacent    for (let i = 1; i < n; i++)        if (ratings[i] > ratings[i - 1])            left2right[i] = left2right[i - 1] + 1;     // Traverse from right to left and assign    // minimum possible rating considering only    // right adjacent    for (let i = n - 2; i >= 0; i--)        if (ratings[i] > ratings[i + 1])            right2left[i] = right2left[i + 1] + 1;     // Since we need to follow rating rule for    // both adjacent, we pick maximum of two    for (let i = 0; i < n; i++)        res += Math.max(left2right[i], right2left[i]);     return res;} // Driver function let ratings = [1, 6, 8, 3, 4, 1, 5, 7];let n = ratings.length;document.write(minCost(ratings, n)); </script>
Output:  
15
Time complexity – O(n) Auxiliary Space – O(n)This article is contributed by Harshit Agrawal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
nitin mittal
_saurabh_jaiswal
Arrays
Arrays
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Introduction to Arrays
Linear Search
Maximum and minimum of an array using minimum number of comparisons
Python | Using 2D arrays/lists the right way
Linked List vs Array
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Queue | Set 1 (Introduction and Array Implementation)