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

来源:互联网 发布:广州qt场及js汇总贴吧 编辑:程序博客网 时间:2024/05/16 02:13


直方图中最大矩形


题目描述

有一个直方图,用一个整数数组表示,其中每列的宽度为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];    }}




  


阅读全文
0 0
原创粉丝点击