必须每日练习算法------动态规划

必须每日练习算法------动态规划,第1张

目录
  • 509. 斐波那契数
  • 21. 合并两个有序链表
    • 二级标题
      • 三级标题
        • 四级标题
          • 五级标题
            • 六级标题

509. 斐波那契数
  1. 斐波那契数 (2022.4.17.星期日)
    斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

答案:

class Solution {
public:
    int fib(int n) {
    //滚动数组
    if(n<=1) return n;
    int dp[2];
    dp[1]=1;
    dp[0]=0;
    for(int i=2;i<=n;i++){
        int sum=dp[0]+dp[1];
        dp[0]=dp[1];
        dp[1]=sum;
    }
    return dp[1];
    }
};
21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* prehead = new ListNode(-1);
	ListNode* pre = prehead;
	while (l1!=nullptr&&l2!=nullptr)
	{
		if (l1->val < l2->val) {
			pre->next = l1;
			l1 = l1->next;
		}
		else
		{
			pre->next = l2;
			l2 = l2->next;
		}
		pre = pre->next;
	}
	pre->next = (l1 == nullptr) ? l2 : l1;
	return prehead->next;
    }
};

思路

我们可以用迭代的方法来实现上述算法。当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。

算法

首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的 *** 作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。

在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
原文链接:力扣

二级标题 三级标题 四级标题 五级标题 六级标题
  1. 合并两个有序链表

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/676429.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存