面试题 08.11. 硬币
https://leetcode-cn.com/problems/coin-lcci/
class Solution {
public int waysToChange(int n) {
int[] nums = {1,5,10,25};
long[][] dp = new long[5][n + 1];
for (int i = 0; i < 4; i++) {
dp[i][0] = 1;
for (int j = 0; j <= n; j++) {
if (j >= nums[i]) dp[i + 1][j] = dp[i][j] + dp[i + 1][j - nums[i]];
else dp[i + 1][j] = dp[i][j];
}
}
return (int) (dp[4][n] % 1000000007);
}
}
面试题 16.17. 连续数列
https://leetcode-cn.com/problems/contiguous-sequence-lcci/
//方法1动态规划: f(x) = Math.max(f(i - 1) + nums[i], nums[i])
public int maxSubArray2(int[] nums) {
int pre = 0, ans = nums[0];
for (int num : nums) {
pre = Math.max(num,pre + num);
ans = Math.max(ans, pre);
}
return ans;
}
//方法2 分治思想:
public class Status{
public int lSum, rSum, mSum, aSum;
public Status(int lSum, int rSum, int mSum, int aSum) {
this.lSum = lSum;
this.rSum = rSum;
this.mSum = mSum;
this.aSum = aSum;
}
}
public int maxSubArray(int[] nums) {
return getMax(nums, 0, nums.length - 1).mSum;
}
public Status getMax(int[] arr, int L, int R) {
if (L == R) {
return new Status(arr[L], arr[L], arr[L], arr[L]);
}
int m = (L + R) >> 1;
Status lSub = getMax(arr, L, m);
Status rSub = getMax(arr, m + 1, R);
return getMax(lSub, rSub);
}
public Status getMax(Status lSub, Status rSub) {
int lSum = Math.max(lSub.lSum,lSub.aSum + rSub.lSum);
int rSum = Math.max(rSub.rSum, rSub.aSum + lSub.rSum);
int mSum = Math.max(lSub.rSum + rSub.lSum,Math.max(lSub.mSum, rSub.mSum));
int aSum = lSub.aSum + rSub.aSum;
return new Status(lSum,rSum,mSum,aSum);
}
面试题 17.16. 按摩师
https://leetcode-cn.com/problems/the-masseuse-lcci/
public int massage(int[] nums) {
int n = nums.length;
if (nums == null || n == 0) return 0;
int[][] dp = new int[n][2];
dp[0][1] = nums[0];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(dp[i - 1][0],dp[i - 1][1]);
dp[i][1] = dp[i - 1][0] + nums[i];
}
return Math.max(dp[n - 1][0],dp[n - 1][1]);
}
public int massage2(int[] nums) {
int n = nums.length;
if (nums == null || n == 0) return 0;
int dp0 = 0, dp1 = nums[0];
for (int i = 1; i < n; i++) {
int temp0 = Math.max(dp0,dp1);
dp1 = dp0 + nums[i];
dp0 = temp0;
}
return Math.max(dp0,dp1);
}