![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
少林寺小和尚
这个作者很懒,什么都没留下…
展开
-
动态规划做题套路
动态规划做题套路: 第一步:定义dp数组的含义 确定是一维数组还是二维数组(这个根据条件的多少来判断),正确的定义dp数组的含义是做题的关键。 以leetcode53题最大子序和为例:dp[i]的含义为以nums[i]这位为结尾的的最大子数组和为dp[i]。 第二步:确定初始值。 以leetcode53题最大子序和为例:dp[i]=nums[i],因为每一位起码可以自己单独组成一个子序列,和就是自己本身。 第三步:写出状态转移方程。 以leetcode53题最大子序和为例:dp[i]=Math.max(原创 2021-03-22 09:38:20 · 175 阅读 · 0 评论 -
leetcode-322-零钱兑换
题目: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 分析: 第一想法是想枚举出所有的结果,然后在这些结果中选择最少硬币数量的组合,因此套用回溯法(即for循环+bfs),但是运行超时,动态规划解法才是本题正解。 class Solution { public int coinChange(int[] coins, int amount) {原创 2021-01-08 22:38:13 · 152 阅读 · 0 评论 -
leetcode-279-完全平方数
标题给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 解释:此题属于动态规划。本来想用回溯,但是测试用例超时了。 1.动态规划就是求dp这个数组中的值,此题首先让dp[i]=i,即i这个数最坏的情况下是由i个最小完全平方数(也就是1)求和组成的。 2.然后依次算出 dp[i减去所有小于等于它的完全平方数]+1和当前dp[i]的最小值,其中+1代表了它减去的那个完全平方数占的1位。 class Solution {原创 2021-01-06 21:59:05 · 115 阅读 · 0 评论 -
leetcode-39-组合总数
题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。其中candidates 中的数字可以无限制重复被选取。 解释 1.主要考察回溯算法,给出没有剪枝的解法 2.回溯的主要思想就是一个for循环和一个dfs。其中for循环的作用就是遍历每层的所有节点,dfs的作用就是分别对这些节点进行深度优先遍历 3.回溯算法就是穷举所有可能出现的结果,可以通过剪枝操作来把绝对不可能的方案排除掉,进行优化。 class原创 2021-01-06 20:05:56 · 115 阅读 · 0 评论 -
翻转单链表
翻转单链表 题目描述: 给定一个单链表1-2-3-4-5,翻转成5-4-3-2-1。 public ListNode reverse(ListNode head){ if(head==null) return head; ListNode tail=head; head=head.next; tail.next=null; while(head!=null){ ListNode temp=head.nex原创 2020-10-20 14:24:20 · 101 阅读 · 0 评论 -
寻找单链表的中间节点
找到链表的中间节点 题目描述 给定一个单链表,求中间节点。 public ListNode findMid(ListNode head){ ListNode slow=head; ListNode fast=head; while(fast.next!=null&&fast.next.next!=null){ slow=slow.next; fast=fast.next.next; } return slow; } ...原创 2020-10-20 14:12:59 · 159 阅读 · 0 评论