Leetcode刷题笔记


代码实现
题目类别(文件夹名)

dp-动态规划

509斐波那契数列( 简单)

用动态规划的方法实现斐波那契数列:f(n) = f(n-1) + f(n-2)

请添加图片描述
代码实现
1.可以维护三个变量,每次迭代整体往右移动,并舍弃第一位的方式来实现。
2.并单独写出边界值的情况。

70爬楼梯(简单)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
请添加图片描述

每次你有多少种方法可以爬上当前楼梯的固定的:
1.从前一节台阶爬上
2.从前两节台阶一次爬2个台阶
因此可以推的:f(n) = f(n-1) + f(n-2)
到这步就可以发现这就是一个斐波那契数。

746最小花费爬楼梯(简单)

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
请添加图片描述
这题和上题思路一致:
想爬上顶楼必然是从前两级台阶中的一个一步爬上来。
因为我们维护一个动态数组dp,dp的每一位记录着从当前位置往上爬一次所需要的最小花费,而不是爬到当前位置所需要的花费。
错误想法1.dp记录爬上当前位置所需要的最小消耗,这就为我实现代码添加了难度,因为dp就记录的是前两级台阶的最小消耗,因为我会需要处理更多的情况,因为顶楼是不在数组中的,这就是不合适的。
如果题目改成爬上这级台阶要付出这个台阶的花费,可能我这种想法会更方便解题。
2.从n-2的位置出发走两步和走一步(这个就完全错了,因为我要考虑的是只走一步的情况,走两步肯定更大。当然这也和我维护的dp相关,看来dp选的好,就成功一大半。
因此有动态方程dp[i] = min(dp[i-2], dp[i-1]) + cost[i]
动态方程都好多种,要找到最合理最容易实现的,这能够帮助我们解题目。

198打家劫舍(中等)

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
请添加图片描述
首先维护一个动态一维数组,每个位置上记录走到当前房屋所能偷取的最大值。
因为每次偷取要隔开一位,因此有动态方程:dp[n] = max(dp[n-1], dp[n-2]+nums[n]);
最后在数组的最后一个位置必然记录着走到最后一间房间所能偷取到的最大值。

213.打家劫舍二(中等)

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。

这道题其实思路和上一题一致,只需要先把数组分别去头和去尾形成两个新数组, n = nums.size()
[0,n-2] 和 [1,n-1]
然后分别在两个分别去头和去尾的数组中按照198打家劫舍的方法求能偷取的最大值,然后比大小就可以了。
这样去头和去尾就保证了数组头尾不相连,而且头和尾只能有一个被累加保证了方法的可行性。

740.删除并获得点数(中等)

给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
输入:nums = [2,2,3,3,3,4]
输出:9
解释:
删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。

这道题的思路与打家结舍的思想是一致的。但是需要对数组先进性处理,转换问题的思路
1.先维护一个数字相同的值的和的sums数组,数组的下标也就是nums的值,而数组的值就是就是相同的值的和。
2.再对这个数组用打家劫舍的思想进行计算,就每隔一个房间的最大和。
例如:对示例:

nums = [2,2,3,3,3,4]
sums = [0,0,4,9,4]

sum的下标也就是房间号,也就是nums中的值。
下标为2的房间的值由nums种的两个2累加的来。

55.跳跃游戏(简单)

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

1.首先可以维护一个动态值,表示走到当前位置可以走到的最远距离,只要这个距离走到数组的最后,便返回true,否则就继续。
2.然后用for循环遍历数组,遍历的范围是能走到的最远下标,同时动态的更新这个最远距离。:
当前下标加当前可以走的最大步数: i + nums[i];
和maxi的大小,最开始maxi = 0;

maxi = max(maxi, i+nums[i]);

乘积最大子序列

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6
参考题解

leetcode Top 100

215. 数组中的第K个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素

此题考查的就是一个排序算法:
请添加图片描述
543.二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树

      1
     / \
    2   3
   / \     
  4   5    

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值