leetcode水题第七周

本周主要是dp+链表(学校课程的进度所以也写一下)
在这里插入图片描述
用dp写了两题:
乘积最大子数组
思路:与求最大和相似但是遇到负数元素会比较麻烦。若单是算最大值,则遇到负数的时候此前计算出的最大值就变为最小值,此时若单纯将这个最大值抛掉,遇到[3,2,-2,1,-3]这类情况时就会出错,因此需要一个min来保存,遇到负数的时候min与max交换(负数的min乘上负数就为max)(?

int MAX(int a,int b){
    return (a>b)?a:b;
}
int MIN(int a,int b){
    return (a<b)?a:b;
}
int maxProduct(int* nums, int numsSize){
    int max=1,min = 1;
    int res = nums[0];
    for(int i=0;i<numsSize;i++){
        if(nums[i]<0){
            int temp = max;
            max = min;
            min = temp;
        }
        max = MAX(max*nums[i],nums[i]);
        min = MIN(min*nums[i],nums[i]);
        res = MAX(max,res);
    }
    return res;
}

零钱兑换
与算导中切钢管类似
思路:
1.将数组排序,然后用数组中最大数除amount取余,然后再用比前一个数小的数取余,以此循环直到amount=0
但这会出错,如[1,5,7] amount=10,r若按照这种方法计算,则使用硬币的最小数量为4(10=1+1+1+7)但答案应该是2(10=5+5)
2.类似以前写过的爬楼梯,如[1,2,5] amount = n 则f(n) = min(f(n-1),f(n-2),f(n-5)),用数组记录此前的最优解,以此求得amount==n时的最优解

int coinChange(int* coins, int coinsSize, int amount){
    int *dp=(int *)malloc((amount+1)*sizeof(int));
    memset(dp,-1,sizeof(int)*(amount+1));
    for(int i=0;i<coinsSize&&coins[i]<=amount;i++)
    dp[coins[i]]=1;
    dp[0]=0;
    for(int i=0;i<=amount;i++){
        int number=amount+1;
        for(int j=0;j<coinsSize;j++){
            if(i-coins[j]>=0&&dp[i-coins[j]]!=-1)  number=(dp[i-coins[j]]<number?dp[i-coins[j]]:number);
        }
        if(number!=amount+1)
        dp[i]=number+1;
    }
    return dp[amount];
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LeetCode是一个著名的在线编程题库,可以帮助计算机程序员提升编程能力。LeetCode的题目涵盖了算法、数据结构、字符串、数组、链表等多个方面的知识,对于职面试以及算法竞赛准备非常有帮助。 LeetCode上的编程题目分为简单、中等和困难三个难度级别。每个题目都有详细的题目描述、输入输出示例以及参考答案等内容。在解决每个问题时,我们需要仔细阅读题目,并根据题目要提供正确的解答。 通常,我们需要使用编程语言如Python、C++等来实现解题思路。在编码之前,我们需要先分析问题,并找到合适的算法或数据结构来解决问题。一般来说,我们可以使用递归、迭代、动态规划等方法来解决常见的编程问题。 在LeetCode上,我们可以提交解答,并测试解答是否通过了所有的测试用例。如果通过了所有的测试用例,我们就可以得到题目的AC(Accepted)结果,并获得该题目的通过证书。如果没有通过所有的测试用例,我们可以检查自己的解答,查找解答中的错误或者不完善之处,并进行修改和优化。 总之,LeetCode编程题是一个优秀的学习和练习编程的平台。通过解答LeetCode上的编程题目,我们可以提升自己的编程能力,并且培养解决问题的思维方式。无论是职面试还是算法竞赛,LeetCode编程题都是非常有帮助的资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值