Day 34

第343题:

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。来源:力扣(LeetCode)

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

1、对于n,当n=0/1的时候它不可以拆分,当n>=2时,它可以拆分成至少两个数;

  此时就来求这至少是两个数的最大乘积dp[n];

  例如拆分出来的第一个数是j,那么后面n-j要么也拆分求最大乘积dp[i-j]或者不拆分直接为i-j;

  因此可以使用动态规划求解。

  

2、动态规划求解还可以进行优化;

  对于任意的 j ,当 j 为奇数时,j=(j-1)/2+(j+1)/2;

         当 j 为偶数时,j=(j/2)*(j/2);

  而上述情况中,当 j >=4的时候上面的等式会变成 j 小于(j-1)/2+(j+1)/2 或者(j/2)*(j/2);

  所以当j>=4的时候,dp[i]肯定是大于j*dp[i-j],且dp[i-j]肯定大于(i-j);

  还有当j=1时,dp[i]<i,这样的话,比较时也不用来判断j=1时的情况了;

  所以我们只需要求j=2或者j=3的情况

  

面试题 08.03:

魔术索引。 在数组A[0...n-1]中,有所谓的魔术索引,满足条件A[i] = i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引,返回索引值最小的一个。来源:力扣(LeetCode)

示例1:

输入:nums = [0, 2, 3, 4, 5]
输出:0
说明: 0下标的元素为0

1、直接遍历数组,判断元素和索引是否相等;

  按不同情况来划分步骤。

  

2、也可以使用二分剪枝来判断数组中是否存在魔术索引;

  每次我们选择数组的中间元素,如果当前中间元素是满足条件的答案,那么这个位置往后的元素我们都不再考虑,只要寻找左半部分是否有满足条件的答案即可;

  否则我们需要查看左半部分是否有满足条件的答案,如果没有的话我们仍然需要在右半边寻找,使用的策略同上。

  

第118题:

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。(来自LeetCode)

在杨辉三角中,每个数是它左上方和右上方的数的和。

1、直接按照杨辉三角的规则来推入元素;

  只有知道了第一行才可以计算处下一行的元素。

  

 

posted @ 2020-07-31 23:41  Liang-Yi  阅读(86)  评论(0编辑  收藏  举报