目录
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;
}