左神中期提升班3

目录

1.最长有效括号(leetcode32)

2.栈中元素排序

3.解码方法(递归dp问题leetcode92)


1.最长有效括号(leetcode32)

定义一个dp数组,记录以当前位置i结束时的最长有效括号,若为左括号则为零,当为右括号时,需要找到其对应的前置左括号,pre=dp[i]-1-dp[i-1],pre计算值可能小于0。最终dp[i]还要判断是否加入pre前的有效括号。 

public int longestValidParentheses(String s) {
    if(s==null||s.equals(""))
            return 0;
        int max =0;
        int length = s.length();
        int[] dp = new int[length];
        dp[0]=0;
        int pre=0;
        for (int i = 1; i < length; i++) {
                if(s.charAt(i)==')'){
                    pre=i-1-dp[i-1];
                    if(pre>=0&&s.charAt(pre)=='(')
                        dp[i]=2+dp[i-1]+(pre>0?dp[pre-1]:0);
               max=Math.max(max,dp[i]);
        }}
        return max;
    }

2.栈中元素排序

private static void Sort(Stack<Integer> stack) {
        if (stack.isEmpty())
            return;
        Stack<Integer> stack1 = new Stack<>();
        stack1.push(stack.pop());
        while (!stack.isEmpty())
        {
            int a = stack.pop();
            if (a<=stack1.peek())
            {
                stack1.push(a);
            }else{
                while (stack1.peek()<a)
                {
                    stack.push(stack1.pop());
                }
                stack1.push(a);
            }
        }
        while (!stack1.isEmpty())
        stack.push(stack1.pop());
        return;
    }

 3.解码方法(递归dp问题leetcode92)

思考:采用递归方法,每个数字都有独自转为字母或者与后以为结合转为字母两种情况,逻辑上为一棵二叉树,终止条件即到达叶子节点,返回一种可能情况;若遍历到0单独转换时应立即终止,返回0;若遍历数字为最后一个数字就不用考虑与后一位结合的情况。

private static int process(char[] str, int i) {
        if(i==str.length)
            return 1;
        if (str[i]=='0')
            return 0;
        int res = 0;
        //当前数字单独转为字母
        res += process(str,i+1);
        //当前数字与后一个数字结合转为字母
        //若为最后一个数字直接返回
        if (i==str.length-1)
            return res;
        if (((str[i]-'0')*10+(str[i+1]-'0'))<27){
            res+=process(str,i+2);
        }
        return res;
    }

改写为dp

private static int dpWays(char[] str) {
        int length = str.length;
        if (length==0)
            return 0;
        int[] dp = new int[length+1];
        dp[length]=1;
        dp[length-1]=dp[length-1]=='0'?0:1;
        for (int i = length-2; i >=0 ; i--) {
            if (str[i]!='0'){
                dp[i]=dp[i+1]+((((str[i]-'0')*10+(str[i+1]-'0'))<27)?dp[i+2]:0);
            }else {
                dp[i]=0;
            }
        }

        return dp[0];
    }

4.二叉树最大权值和 

​​​​​​​

 private static int process1(Tree root) {
        if (root == null)
            return 0;
        int left = process1(root.left);
        int right = process1(root.right);
        return (left>right?left:right)+root.value;
    }

 5.Z字型查找(leetcode240)​​​​​​​

private static boolean ZSelect(int[][] arr,int target) {
        int i = 0;
        int j = arr[0].length-1;
        while(i<arr.length&&j>=0) {
                if (arr[i][j]==target){
                    return true;
                }
                if (arr[i][j]>target)
                    j--;
                else
                    i++;
            }
        return false;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值