题目类型:动态规划DP问题
注意:和01背包还是有些区别,两种题目似乎都和求解某种情况下的最大值有关,背包问题的选不选物品对应于剪绳子问题的剪不剪。但剪绳子外层循环作为dp数组的下标,而背包问题内层循环对应于dp数组的下标。且本题不能用递归进行(个人想法)。
class Solution {
public:
int maxProductAfterCutting(int length) {
vector<int> dp(length+1,0);//dp[i]存储绳子长度为i时的最大乘积
for(int i=2;i<=length;i++){//表示当前处理的绳子的长度,更新其dp
for(int j=1;j<i;j++){
//表示对长度为i的绳子所剪的位置,j=1表示将绳子剪成1和i-1两段。
//也就是说此层循环是只剪一次的,剪多次需要通过dp数组的更新实现。
dp[i]=max(dp[i],max(dp[i-j]*j,j*(i-j)));
//解释:dp[i-j]*j表示如果继续对剩余的i-j进行剪,则用当前层的另一半长度j乘上当总长是i-j的时候的最大乘积。
//j*(i-j)即表示不继续对剩余的i-j进行剪,那么久直接相乘即可
}
}
return dp[length];
}
};
水题,用位移运算+按位与运算
class Solution {
public:
int NumberOf1(int n) {
int cnt=0;
for(int i=0;i<32;i++){
int tmp=n&1;
if(tmp) cnt++;
n=n>>1;
}
return cnt;
}
};
快速幂讲解
即通过位运算将时间复杂度O(N)变成O(logN)
class Solution {
public:
double Power(double base, int exponent) {
typedef long long LL;
bool flag=exponent>0;//> is 1,
double res=1;
for(LL k=abs(LL(exponent));k;k>>=1){
if(k&1) res=res*base;
base*=base;
}
if(!flag) res=1/res;
return res;
}
};
这道题复习了链表的创建过程。注意巩固!