Leetcode刷题笔记——dp (23)

413. Arithmetic Slices

class Solution {
    public int numberOfArithmeticSlices(int[] nums) {
       int ans = 0, n = nums.length, a =0;
       for(int i = 2; i < n; i++) {
           if(nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) a += 1;
           else a = 0;
           ans  += a;
       }
       return ans;
    }
}

396. Rotate Function

class Solution {
    public int maxRotateFunction(int[] nums) {
        int sum = 0, max = Integer.MIN_VALUE, F0 = 0, n = nums.length;
        for(int i = 0; i < n; i++) {
            sum += nums[i];
            F0 += i * nums[i];
        }
        int[] dp = new int[n];
        dp[0] = F0;
        max = F0;
        for(int i = 1; i < n; i++) {
            dp[i] = dp[i - 1] + sum - n * nums[n - i];
            max = Math.max(max, dp[i]);
        }
        return max;
    }
}

152. Maximum Product Subarray

class Solution {
    public int maxProduct(int[] nums) {
        int max = Integer.MIN_VALUE, imax = 1, imin = 1;
        for(int i = 0; i < nums.length; i++) {
            if(nums[i] < 0) {
                int temp = imax;
                imax = imin;
                imin = temp;
            }
            imax = Math.max(imax * nums[i],nums[i]);
            imin = Math.min(imin * nums[i], nums[i]);
            max = Math.max(max, imax);
        }
        return max;
    }
}

53. Maximum Subarray

class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int max = nums[0];
        for(int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);
            max = Math.max(max, dp[i]);
        }
        return max;
    }
}


91. Decode Ways

class Solution {
    public int numDecodings(String s) {
       if(s == null || s.length() == 0) {
           return 0;
       } 
       int n = s.length();
       int[] dp = new int[n + 1];
       dp[0] = 1;
       dp[1] = s.charAt(0) != '0'? 1 : 0;
       for(int i = 2; i <= n; i++) {
           int first = Integer.valueOf(s.substring(i - 1, i));
           int second = Integer.valueOf(s.substring(i - 2, i));
           if(first >= 1 && first <= 9) dp[i] += dp[i - 1];
           if(second >= 10 && second <= 26) dp[i] += dp[i - 2];
       }
       return dp[n];
    }
}

2645. Minimum Additions to Make Valid String

class Solution {
    public int addMinimum(String word) {
        int pre = 'z', k = 0, n = word.length();
        for(int i = 0; i < n; i++) {
            k += word.charAt(i) <= pre ? 1 : 0;
            pre = word.charAt(i);
        }
        return 3 * k - n;
    }
}

264. Ugly Number II 

class Solution {
    public int nthUglyNumber(int n) {
        int[] dp = new int[n + 1];
        dp[1] = 1;
        int p2 = 1;
        int p3 = 1;
        int p5 = 1;
        for(int i = 2; i <= n; i++) {
            int f1 = 2 * dp[p2];
            int f2 = 3 * dp[p3];
            int f3 = 5 * dp[p5];
            int min = Math.min(f1, Math.min(f2, f3));
            dp[i] = min;
            if(min == f1) p2++;
            if(min == f2) p3++;
            if(min == f3) p5++;
        }
        return dp[n];
    }
}

337. House Robber III

class Solution {
    public int rob(TreeNode root) {
        int[] num = dfs(root);
        return Math.max(num[0], num[1]);
    }
    public int[] dfs(TreeNode root) {
        int res[] = new int[2];
        if(root == null) return res;
        int[] left = dfs(root.left);
        int[] right = dfs(root.right);
        res[0] = left[1] + right[1] + root.val;
        res[1] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        return res;
    }
}

213. House Robber II

class Solution {
    public int rob(int[] nums) {
        if(nums.length == 1) return nums[0];
        if(nums.length == 2) return Math.max(nums[0], nums[1]);
        int firstresult = solve(nums, 0, nums.length - 2);
        int lastresult = solve(nums, 1, nums.length - 1);
        return Math.max(firstresult, lastresult);
    }
    public int solve(int[] nums, int start, int end) {
        if(start == end) return nums[start];
        int[] money = new int[nums.length];
        money[start] = nums[start];
        money[start + 1] = Math.max(nums[start + 1], nums[start]);
        for(int i = start + 2; i <= end; i++) {
            money[i] = Math.max(money[i - 1], money[i - 2] + nums[i]);
        }
        return money[end];
    }
}

198. House Robber

class Solution {
    public int rob(int[] nums) {
        int rob = 0;
        int notrob = 0;
        for(int i = 0; i <nums.length; i++) {
            int currob = notrob + nums[i];
            notrob = Math.max(notrob, rob);
            rob = currob;
        }
        return Math.max(rob, notrob);
    }
}


45. Jump Game II

class Solution {
    public int jump(int[] nums) {
        int ans = 0;
        int end = 0;
        int farthest = 0;
        for(int i = 0; i < nums.length - 1; i++) {
            farthest = Math.max(farthest, i + nums[i]);
            if(farthest >= nums.length - 1) {
                ans++;
                break;
            }
            if(i == end) {
                ans++;
                end = farthest;
            }
        }
        return ans;
    }
}

55. Jump Game 

class Solution {
    public boolean canJump(int[] nums) {
        int reach = 0;
        for(int i = 0; i < nums.length; i++) {
            if(reach < i) return false;
            reach = Math.max(reach, i + nums[i]);
        }
        return true;
    }
}



class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length;
        int[] dp = new int[n];
        dp[n - 1] = 0;
        for(int i = n - 2; i >= 0; i--) {
            if(nums[i] == 0) {
                dp[i] = Integer.MAX_VALUE;
            }
            if(nums[i] > 0) {
                int min = Integer.MAX_VALUE;
                for(int j = 1; j <= nums[i]; j++) {
                    if(i + j < dp.length) {
                        if(dp[i + j] != Integer.MAX_VALUE) {
                            min = Math.min(min, dp[i + j]);
                        } else {
                            dp[i] = Integer.MAX_VALUE;
                        }
                    } else {
                        dp[i] = 1;
                        break;
                    }
                }
                if(min != Integer.MAX_VALUE) {
                    dp[i] = min + 1;
                }
            }
        }
        return dp[0] != Integer.MAX_VALUE;
    }
}

140. Word Break II 

class Solution {
    public List<String> wordBreak(String s, List<String> wordDict) {
        List<String> ans = new ArrayList();
        helper("", s, wordDict, ans);
        return ans;
    }
    void helper(String cur, String s, List<String> words, List<String> ans) {
        if(s.length() == 0) {
            ans.add(cur.trim());
            return;
        }
        for(String word : words) {
            if(s.indexOf(word) == 0) {
                helper(cur + " " + word, s.substring(word.length()), words, ans);
            }
        }
    }
}

139. Word Break 

class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        Boolean[] dp = new Boolean[s.length()];
        return helper(0, s, wordDict, dp);
    }
    public boolean helper(int index, String s, List<String>wordDict, Boolean[] dp) {
        int n = s.length();
        if(index == n) return true;
        if(dp[index] != null) return dp[index];
        for(int k = index + 1; k <= n; k++) {
            if(wordDict.contains(s.substring(index, k)) && helper(k, s, wordDict, dp))
            return dp[index] = true;
        }
        return dp[index] = false;
    }
}


97. Interleaving String 

class Solution {
    public boolean isInterleave(String s1, String s2, String s3) {
        if(s1.length() + s2.length() != s3.length()) return false;
        Boolean[][] memo = new Boolean[s1.length() + 1][s2.length() + 1];
        return helper(s1, s2, s3, 0, 0, memo);
    }
    public boolean helper(String s1, String s2, String s3, int i, int j, Boolean[][] memo) {
        if(i + j == s3.length()) return true;
        if(memo[i][j] != null) return memo[i][j];
        if(i < s1.length() && s3.charAt(i + j) == s1.charAt(i)) {
            boolean flag = helper(s1, s2, s3, i + 1, j, memo);
            memo[i][j] = flag;
            if(flag) return true;
        }
        if(j < s2.length() && s3.charAt(i + j) == s2.charAt(j)) {
            boolean flag = helper(s1, s2, s3, i, j + 1, memo);
            memo[i][j] = flag;
            if(flag) return true;
        }
        memo[i][j] = false;
        return false;
    }
}

95. Unique Binary Search Trees II 

class Solution {
    public List<TreeNode> generateTrees(int n) {
        return solve(1, n);
    }
    public List<TreeNode> solve(int left, int right) {
        List<TreeNode> ans = new ArrayList();
        if(left > right) {
            ans.add(null);
            return ans;
        }
        for(int i = left; i <= right; i++) {
            List<TreeNode> lft = solve(left, i - 1);
            List<TreeNode> ryt = solve(i + 1, right);
            for(TreeNode l : lft) {
                for(TreeNode r : ryt) {
                    ans.add(new TreeNode(i, l, r));
                }
            }
        }
        return ans;
    }
}

72. Edit Distance14  

class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        int[][] dp = new int[m + 1][n + 1];
        for(int i = 1; i <= m; i++) {
            dp[i][0] = i;
        }
        for(int j = 1; j <= n; j++)
        dp[0][j] = j;
        for(int i = 1; i <= m; i++) {
            for(int j = 1; j <= n; j++) {
                if(word1.charAt(i - 1) == word2.charAt(j - 1))
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;
            }
        }
        return dp[m][n];
    }
}

5. Longest Palindromic Substring

class Solution {
    public String longestPalindrome(String s) {
        int st = 0, e = 0;
        for(int i = 0; i < s.length(); i++) {
            int odd = pal(s, i, i);
            int even = pal(s, i, i + 1);
            int len = Math.max(odd, even);
            if(len > e - st) {
                st = i - (len - 1) / 2;
                e = i + len / 2;
            }
        }
        return s.substring(st, e + 1);
    }
    public int pal(String s, int ss, int e) {
        while(ss >= 0 && e < s.length() && s.charAt(ss) == s.charAt(e)) {
            ss--;
            e++;
        }
        return e - ss - 1;
    }
}

96. Unique Binary Search Trees 

class Solution {
    public int numTrees(int n) {
        int[] g = new int[n + 1];
        g[0] = g[1] = 1;
        for(int i = 2; i <= n; i++) {
            for(int j = 1; j <= i; j++) {
                g[i] += g[j - 1] * g[i - j];
            }
        }
        return g[n];
    }
}


343. Integer Break 

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 0;
        dp[2] = 1;
        for(int i = 3; i <= n; i++) 
            for(int j = 1; j <= i; j++)
                dp[i] = Math.max(dp[i], j * Math.max(dp[i - j], i - j));
        return dp[n];
    }
}

62. Unique Paths 

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] grid = new int [m][n];
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(i == 0 || j == 0) {
                    grid[i][j] = 1;
                } else 
                grid[i][j] = grid[i][j - 1] + grid[i - 1][j];
            }
        }
        return grid[m - 1][n - 1];
    }
}

63. Unique Paths II

class Solution {
    int[][] g;
    public int uniquePathsWithObstacles(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] ans = new int[m][n];
        ans[0][0] = 1;
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(j > 0 && ans[i][j - 1] != -1) ans[i][j] = ans[i][j - 1];
                if(i > 0 && ans[i - 1][j] != -1) ans[i][j] += ans[i - 1][j];
                if(grid[i][j] == 1) ans[i][j] = 0;
            }
        }
        return ans[m - 1][n - 1];
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值