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];
}
}