当前位置: 首页 > news >正文

力扣hot100二刷——动态规划

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。

标志掌握程度解释办法
Fully 完全掌握看到题目就有思路,编程也很流利
⭐⭐Basically 基本掌握需要稍作思考,或者看到提示方法后能解答
⭐⭐⭐Slightly 稍微掌握需要看之前写过的代码才能想起怎么做多做
⭐⭐⭐⭐absolutely no 完全没有掌握需要看题解才知道怎么做
⭐⭐⭐⭐⭐有难度的高频题需要看题解才知道怎么做,而且过几天就忘了这道题怎么做了背背
77贪心算法121.买卖股票的最佳时机遍历数组,每次都计算、更新ans if(prices[i] > in) { out = prices[i]; ans = Math.max(out - in, ans); } else { in = prices[i]; }
78⭐⭐⭐贪心算法55.跳跃游戏维护一个maxIndex记录最大可以覆盖到的索引 遍历数组,如果当前索引 < maxIndex则更新maxIndex Math.max(i + nums[i], maxIndex) 遍历结束后根据maxIndex的大小返回值
79⭐⭐⭐贪心算法45.跳跃游戏2在上一题的基础上改,维护一个end变量来表示当前跳跃次数的覆盖边界 每次遍历中都要判断当前索引是否是边界,是的话表示当前可跳跃的范围已遍历完,跳跃次数ans++ 易错点:循环判断条件不是i < nums.length,而是i < nums.length - 1
80⭐⭐⭐⭐贪心算法763.划分字母区间错误的思路:用一个map统计字符出现次数,再次遍历数组,遇到次数变为0的字符就分割一次 正确思路: 统计每个字符最远的距离, 遍历数组并统计目前所有字符的最远距离, 当遍历索引等于当前最远距离时分割
81Easy动态规划70.爬楼梯dp[i] = dp[i - 1] + dp[i - 2];
82⭐⭐Easy动态规划118.杨辉三角这道题的难点在于集合的运用和添加元素的位置 要注意前一个子集合和后一个子集合的运用 List cur = new ArrayList<>(pre); for(int j = 1; j < i; j++) { cur.set(j, pre.get(j) + pre.get(j - 1)); } cur.add(1); ans.add(new ArrayList<>(cur)); pre = cur;
83⭐⭐Medium动态规划198.打家劫舍dp[i]表示前i间屋子偷到的最大金额,有偷第i 家屋子和不偷第i家屋子两种情况 dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
84⭐⭐⭐⭐Medium动态规划279/完全平方数思路: 维护一个数组表示从 前 i 个 整数 中 选出 完全平方和 为 j 的完全平方数的最少个数 由题目中 完全平方数的范围可知,整数的范围是 1 ≤ i ≤ 100 因为这道题 的 所有算例之间 其实可以相互作用,所以 核心代码 都加上 static修饰符 用 static 修饰 代码块,初始化数组中所有值 为 -1 定义一个递归函数,dfs(i, j) 表示 从 前 i 个数中 选出 和为 j 的完全平方数的最少个数 5.1. 如果record[i][j] != -1,直接返回该索引的值 5.2. 如果i == 0,根据 j == 0 的情况,返回 0 或者 Integer.MAX_VALUE 5.3. 如果 i * i > j 返回 dfs(i - 1, j) 5.4. 如果 i + i <= j 返回 dfs(i, j - i * i) + 1 和 dfs(i - 1, j) 中 较小的 遍历过程: 以 3 为例 dfs(1, 3); dfs(1, 2); dfs(1, 1); dfs(1, 0) 【i * i 开始大于 j了】; dfs(0, 0); 以 12 为例 dfs(3, 12); dfs(2, 12); dfs(2, 8) + 1; dfs(2, 4) + 1 + 1; dfs(2, 0)【i * i 开始大于 j了】 + 1 + 1 + 1; dfs(1, 0) + 1 + 1 + 1; dfs(0, 0) + 3; 以 12 为例 dfs(3, 12); dfs(3, 3) + 1; dfs(2, 3) + 1; dfs(1, 3) + 1; dfs(1, 2) + 1 + 1; dfs(1, 1) + 1 + 1 + 1; dfs(1, 0) + 1 + 1 + 1 + 1; dfs(0, 0) + 4;
85⭐⭐⭐Medium动态规划322/零钱兑换dp[i][j] 表示 前 i 个硬币,组成总金额 j 所需要的 最少硬币个数 如果选 第 i 个硬币, dp[i][j] = dp[i][j - coins[i]] + 1; 如果不选 第 i 个硬币, dp[i][j] = dp[i - 1][j]; 选不选 还要看 第 i 个硬币 是否大于 当前金额
86Medium动态规划139/单词拆分
87⭐⭐⭐⭐Medium动态规划300/最长递增子序列dp[i] 表示以nums[i] 为结尾的最长递增子序列长度 注意:开始核心代码之前,一定要先给dp数组中每个元素都赋值1,因为最长递增子序列长度至少为1 外层循环遍历数组,表示每个以nums[i] 为结尾的序列 内层循环,从索引0 开始遍历当前序列,遍历过程中根据dp[i] = Math.max(dp[j] + 1, dp[i])来更新dp[i] 内层循环外,外层循环中,还要更新答案ans = Math.max(ans, dp[i]),因为dp[n]并不就是最长递增序列的长度
88⭐⭐⭐⭐Medium动态规划152/乘积最大子数组关键在于记录以nums[i]为结尾的子数组的最大乘积 但是由于有负数,所以不仅要记录最大的数max,还要记录最小的数min,因为对于负数来说,乘上一个最小的数可以变成最大的数 如果nums[i]<0,要提前交换max和min的值 更新max,min, ans 返回ans
89⭐⭐⭐⭐Medium动态规划416.分割等和子集数组可以分割为两个和相同的子集,说明: 数组的和是2的倍数 每个子集的和是数组和的一半 数组长度不能小于2 接下来的做法: 先根据以上要求排除不能分割的情况 初创建dp[i][j]数组,表示前i个数中恰好有和为j的子集,初始化,dp[0][i] 遍历得到dp数组 dp[i][j] = dp[i - 1][j] || dp[i - 1][j - nums[i]] (j > nums[i]) 返回dp[len - 1][halfSum]
90Hard动态规划32.最长有效括号

图片版:
在这里插入图片描述

相关文章:

  • 落地长沙市某三甲医院!麒麟信安云桌面再添建设标杆
  • k8s1.22 kubeadm 部署
  • 解决vscode终端和本地终端python版本不一致的问题
  • 音视频 二 看书的笔记 MediaPlayer
  • MySQL 8.0.41源码目录深度解析:探索数据库内核的架构蓝图
  • 利用python调接口获取物流标签,并转成PDF保存在指定的文件夹。
  • SylixOS 中 select 原理及使用分析
  • Keil5 安装全攻略
  • 【django】1-1 django构建web程序的基础知识
  • Photoshop怎样保存为ico格式
  • VS自定义静态库并在其他项目中使用
  • SQL Server安装程序无法启动:系统兼容性检查失败
  • 【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解
  • 中级:设计模式面试题全解析
  • MQTT之重复消息产生
  • node-ddk,electron,主进程通讯,窗口间通讯
  • Django之旅:第五节--Mysql数据库操作(一)
  • 鸿蒙HarmonyOS NEXT之无感监听
  • CSS rem、vw/vh、less
  • 【汽车传感系统架构:借助传感获取安全】
  • 4月一二线城市新房价格环比上涨,沪杭涨幅居百城前列
  • 人民日报评论员:因势利导对经济布局进行调整优化
  • 摩根大通任命杜峯为亚太区副主席,加码中国市场业务布局
  • 屠呦呦当选美国国家科学院外籍院士
  • 国铁集团郑州局预计“五一”发送642.5万人
  • 云南铁路:打造“铁路+金融+产业”融合发展生态