ACwing 刷题 2022/3/12

今日完成
ACwing 刷题 2022/3/12_第1张图片

25.剪绳子

题目类型:动态规划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];
        }
};

26.二进制数字中1的个数

水题,用位移运算+按位与运算

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

27.数值的整数次方(快速幂问题)

快速幂讲解
即通过位运算将时间复杂度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;
    }
};

28.删除链表中的重复节点

这道题复习了链表的创建过程。注意巩固!

你可能感兴趣的:(ACwing,算法,数据结构)