• [Daily Coding Problem 293] Minimum Cost to Construct Pyramid with Stones


    You have N stones in a row, and would like to create from them a pyramid. This pyramid should be constructed such that the height of each stone increases by one until reaching the tallest stone, after which the heights decrease by one. In addition, the start and end stones of the pyramid should each be one stone high.

    You can change the height of any stone by paying a cost of 1 unit to lower its height by 1, as many times as necessary. Given this information, determine the lowest cost method to produce this pyramid.

    For example, given the stones [1, 1, 3, 3, 2, 1], the optimal solution is to pay 2 to create [0, 1, 2, 3, 2, 1].

    Solution.

    If we are given a max height and its index in the stones array, then it is easy to get the cost in O(N) time.  

    To get this max height and its index, we do the following.

    1. build an increasing array of interval 1 from left to right, starting at 1. 

    2. build an increasing array of interval 1 from right to left, starting at 1.

    3. get the min of the above two arrays at the same indices and find the max of all these mins. This is the max possible height.

    Both the runtime and space complexity are O(N).

    public class ConstructPyramid {
        public static int minCost(int[] stones) {
            int n = stones.length;
            int[] left = new int[n], right = new int[n];
            left[0] = 1;
            for(int i = 1; i < n; i++) {
                left[i] = Math.min(left[i - 1] + 1, stones[i]);
            }
            right[n - 1] = 1;
            for(int i = n - 2; i >= 0; i--) {
                right[i] = Math.min(right[i + 1] + 1, stones[i]);
            }
            
            int maxHeight = 0, centerIdx = -1;
            for(int i = 0; i < n; i++) {
                int currHeight = Math.min(left[i], right[i]);
                if(currHeight > maxHeight) {
                    maxHeight = currHeight;
                    centerIdx = i;
                }
            }
            return getCost(stones, maxHeight, centerIdx);
        }
        private static int getCost(int[] stones, int maxHeight, int centerIdx) {
            int cost = 0, h = maxHeight;
            for(int i = centerIdx; i >=0; i--) {
                if(h > stones[i]) {
                    return -1;
                }
                cost += stones[i] - h;
                if(h > 0) {
                    h--;
                }
            }
            h = maxHeight - 1;
            for(int i = centerIdx + 1; i < stones.length; i++) {
                if(h > stones[i]) {
                    return -1;
                }
                cost += stones[i] - h;
                if(h > 0) {
                    h--;
                }
            }
            return cost;
        }
        public static void main(String[] args) {
            int[] stones = {1, 1, 3, 3, 2, 1};
            System.out.println(minCost(stones));
        }
    }
  • 相关阅读:
    【转】HTML5的小知识点小集合
    11月15日下午 ajax返回数据类型为XML数据的处理
    11月15日下午 用代码操作文件(文件夹)
    11月15日上午文件上传
    11月14日用AJAX、PHP、SESSION做购物车
    各种进位制转换
    11月13日上午ajax返回数据类型为JSON数据的处理
    11月13日上午省、市、区(县)三级联动
    11月10日下午 ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情
    11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
  • 原文地址:https://www.cnblogs.com/lz87/p/11531034.html
Copyright © 2020-2023  润新知