每日AC- 美团 -- 直方图中最大矩形 与最少字符使字符串变成回文字符串

实战 Java 并发编程
实战为导向,从Java 并发原理出发,并集合开发实践,全面剖析 Java 并发编程。
wangxiaoming


直方图中最大矩形


题目描述

有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。

给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。

测试样例:
[2,7,9,4,1],5
返回:14


A了一票水题,所以很长时间没发博客,也是因为最近实在是忙的原因。  加上最近感冒发烧..... 总之贵在坚持。


解题思路:

先是一个矩形 , 再每次和前面一个 组成矩形  2个矩形, 取高度最小的直方图 作为高  ;再再加上前面一个作为矩形,3个直方图 然后 取最小的直方图作为高


看AC代码:


import java.util.Stack;

/**
 * 类说明
 * 
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * DELL          2017年7月14日    Create this file
 * </pre>
 * 
 */

public class MaxInnerRec {
    
    public int countArea(int[] A, int n) {
        

       int max = 0;
       for(int j = 0; j < n ;j++){
          //想了一会, 觉得确实不有点棘手 怎么说呢 ,看怎么算了
          int min = 99999999;
          for(int i = j; i>=0; i--){
              /*
               *  栗子
               *  2 7 9 4 
               *  2 开始 前面 无直方图 
               *  2*1  = 2  min = 2 max = 2;
               *  7*1 = 7  // 第一个循环 A[i] = 7 min = 2  min = 2 max = 7  //第二个循环 A[i] = 2  min = 2 2*2 = 4 max = 7;
               *  9开始 就有三种情况  有直方图 9  7*2 2*3
               *  4有四种情况 2*4 
               */
              
              min = Math.min(min, A[i]); //找到当前直方图和其前面直方图最低的那个
              max = Math.max(max, (j-i+1)*min);
          }
       }
   
        return max;
        // write code here
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] A={2,7,9,4};
        int n = 4;
        int ans = new MaxInnerRec().countArea(A, n);
        System.out.println(ans);
    }

}


回文字符串:

/**
 * 类说明
 * 
 * <pre>
 * Modify Information:
 * Author        Date          Description
 * ============ =========== ============================
 * DELL          2017年8月31日    Create this file
 * </pre>
 * 
 */

public class HuiWenZiCHuan {

    /**
     * @param args 回文字符串 时间限制:3000 ms | 内存限制:65535 KB 
     * 难度:4 
     * 描述
     *        所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的
     *        ,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串
     *        。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入
     *        第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数
     *        样例输入 1 Ab3bd 样例输出 2
     */
    public static void main(String[] args) {
        String str = "Ab3bd";
        int ans = getMinChar(str.toCharArray());
        System.out.println(ans);
    }

    /**
     * @param str
     * @return
     */
    private static int getMinChar(char[] str) {
        int  len = str.length;
        int[][] dp = new int[len+1][len+1];
        for(int i = 0; i < len; i++){
            for(int j = len-1; j >=0; j--){
                int k = len -j-1;
                if(str[i] == str[j]){
                    dp[i+1][k+1] = dp[i][k] +1;
                }else{
                    dp[i+1][k+1] = (dp[i+1][k]>dp[i][k+1])?dp[i+1][k]:dp[i][k+1];
                }
            }
        }
        return len-dp[len][len];
    }

}




  


wangxiaoming CSDN认证博客专家 架构 Spring Boot Redis
博客是很好的总结和记录工具,如果有问题,来不及回复,关注微信公众号:程序员开发者社区,获取我的联系方式,向我提问,也可以给我发送邮件,联系 1275801617@qq.com
©️2020 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值