题录
Leeli9316
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2022.06.15(LC_322_零钱兑换)
①确定状态:dp[i] 表示凑成总金额 i 所需的最少硬币个数;②转移方程:dp[i] = Math.min(dp[i], dp[i - coin] + 1); ③初始条件和边界情况:dp[i] = 0;④计算顺序:因为dp[i] 由 dp[i - coin] 推出,所以从小到大遍历。...原创 2022-06-15 17:34:46 · 177 阅读 · 0 评论 -
2022.05.28(LC_516_最长回文子序列)
方法:动态规划①确定状态:dp[i][j]表示字符串s的下标范围[i, j]内的最长回文子序列长度;②转移方程:if(s.charAt(i)==s.charAt(j)){//长度为1或2的子序列if(j-i<2){dp[i][j]=j-i+1;//长度大于2的子序列...原创 2022-05-28 16:00:09 · 126 阅读 · 0 评论 -
2022.05.28(LC_5_最长回文子串)
方法一:暴力求解class Solution { public String longestPalindrome(String s) { int n = s.length(); String ans = ""; int maxLen = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j <= n; j++) { ..原创 2022-05-28 15:02:52 · 132 阅读 · 0 评论 -
2022.05.27(LC_647_回文子串)
方法一:暴力求解(O(n^3))class Solution { public int countSubstrings(String s) { int n = s.length(); int ans = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j <= n; j++) { if (satisfy(s.subst..原创 2022-05-27 22:37:37 · 132 阅读 · 0 评论 -
2022.05.26(LC_1143_最长公共子序列)
方法:动态规划①确定状态:dp[i][j]表示长度[0, i - 1]的字符串text1与长度[0, j - 1]的字符串text2的最长公共子序列;②转移方程:dp[i][j]=dp[i−1][j−1]+1, 当 text1[i - 1] == text2[j - 1];dp[i][j]=Math.max(dp[i−1][j],dp[i][j−1]), 当 text1[i - 1] != text2[j - 1];③初始条件和边界情况:dp[i...原创 2022-05-26 21:20:41 · 191 阅读 · 0 评论 -
2022.05.25(LC_718_最长重复子数组)
方法一:暴力求解 (写不出来)class Solution { public int findLength(int[] nums1, int[] nums2) { int n1 = nums1.length, n2 = nums2.length; if (n1 < n2) return findLength(nums2, nums1); int ans = 0; for (int i = 0; i < n1; i+..原创 2022-05-25 22:30:59 · 141 阅读 · 0 评论 -
2022.05.24(LC_674_最长连续递增序列)
方法一:枚举class Solution { public int findLengthOfLCIS(int[] nums) { int n = nums.length; int ans = 0; for (int i = 0; i < n; i++) { int pre = nums[i]; int count = 1; for (int j = i + 1; j..原创 2022-05-25 21:46:12 · 127 阅读 · 0 评论 -
2022.05.23(LC_300_最长递增子序列)
方法:动态规划①确定状态:dp[i] 为i之前包括i的以nums[i]结尾最长递增子序列长度;②转移方程:位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值,所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1),注意这里不是要dp[i] 与 dp[j] + 1进行比较,而是要取dp[j] + 1的最大值;③初始条件和边界情况:dp[0] = 1,每一个i,对应的dp[i](即最长上升...原创 2022-05-23 22:33:57 · 156 阅读 · 0 评论 -
2022.05.21(LC_213_打家劫舍 II)
方法:动态规划class Solution { public int rob(int[] nums) { int n = nums.length; if (n == 1) { return nums[0]; } else if (n == 2) { return Math.max(nums[0], nums[1]); } return Math.max(ro...原创 2022-05-21 19:41:48 · 194 阅读 · 0 评论 -
2022.05.20(LC_198_打家劫舍)
方法:动态规划①确定状态:dp[i] 为偷窃第 i +1个房屋的最高金额;②转移方程:dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);③初始条件和边界情况:dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);④计算顺序:因为 dp[i] 由 dp[i-1] 和 dp[i-2]推出,所以从前往后遍历--一维数组class Solution { public int rob(...原创 2022-05-20 21:20:31 · 165 阅读 · 0 评论 -
2022.05.20(LC_474_一和零)
方法:动态规划(转化为01背包)--三维数组class Solution { public int findMaxForm(String[] strs, int m, int n) { int length = strs.length; int[][][] dp = new int[length + 1][m + 1][n + 1]; for (int i = 1; i <= length; i++) { ...原创 2022-05-20 20:45:59 · 147 阅读 · 0 评论 -
2022.05.19(LC_494_目标和)
方法一:深度优先搜索class Solution { int ans = 0; public int findTargetSumWays(int[] nums, int target) { dfs(nums, target, 0, 0); return ans; } public void dfs(int[] nums, int target, int i, int sum){ //数组遍历结束 if(..原创 2022-05-19 22:43:30 · 209 阅读 · 0 评论 -
2022.05.18(LC_1049_最后一块石头的重量 II)
方法:动态规划(转化为01背包)--二维数组class Solution { public int lastStoneWeightII(int[] stones) { //转化为01背包问题:尽量让石头分成重量相同的两堆,粉碎之后重量最小 int sum = 0; for (int stone : stones) { sum += stone; } int n = stones.l...原创 2022-05-18 21:48:14 · 263 阅读 · 0 评论 -
2022.05.14(LC_416_分割等和子集)
方法:动态规划class Solution { public boolean canPartition(int[] nums) { int n = nums.length; if (n < 2) { return false; } int sum = 0, maxNum = 0; for (int num : nums) { sum += num; ...原创 2022-05-14 22:30:21 · 239 阅读 · 0 评论 -
2022.05.13(LC_96_不同的二叉搜索树)
方法:动态规划①确定状态:dp[i] 为从 1 到 n 互不相同的二叉搜索树总数;②转移方程:dp[i]+=dp[j-1]*dp[i-j];③初始条件和边界情况:dp[0] = 1;④计算顺序:因为 dp[i] 是依靠 dp[i - j]的状态,先有 dp[i - j] 再有 dp[i],所以从前往后遍历。class Solution { public int numTrees(int n) { int[] dp = new int[n + ...原创 2022-05-13 21:33:15 · 238 阅读 · 0 评论 -
2022.05.13(LC_343_整数拆分)
方法:动态规划①确定状态:dp[i] 为拆分数字 i, 可以得到的最大乘积;②转移方程:dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));;③初始条件和边界情况:dp[2] = 1;④计算顺序:因为 dp[i] 是依靠 dp[i - j]的状态,先有 dp[i - j] 再有 dp[i],所以从前往后遍历。class Solution { public int integerBreak(int n) ..原创 2022-05-13 20:57:29 · 257 阅读 · 0 评论 -
2022.05.12(LC_63_不同路径Ⅱ)
方法:动态规划①确定状态:dp[i][j] 为到达第 i +1 行 j+1 列网格的所有路径;②转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];③初始条件和边界情况:obstacleGrid[i][j]== 0时,dp[i][j] = 1;④计算顺序:因为 dp[i][j] 由 dp[i - 1][j] 和 dp[i][j - 1]推出,所以根据向下或向右按顺序遍历。class Solution { public int uniqu...原创 2022-05-12 10:23:01 · 234 阅读 · 0 评论 -
2022.05.11(LC_62_不同路径)
方法:动态规划①确定状态:dp[i][j] 为到达第 i +1 行 j+1 列网格的所有路径;②转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];③初始条件和边界情况:dp[0][1] = 1;dp[1][0] = 1;④计算顺序:因为 dp[i][j] 由 dp[i - 1][j] 和 dp[i][j - 1]推出,所以根据向下或向右按顺序遍历。class Solution { public int uniquePaths(int m..原创 2022-05-11 22:35:57 · 234 阅读 · 0 评论 -
2022.05.09(LC_746_使用最小花费爬楼梯)
方法:动态规划①确定状态:dp[i] 为到达第 i 个台阶的最低花费②转移方程:dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i]③初始条件和边界情况:dp[0] = cost[0]; dp[1] = cost[1];④计算顺序:因为 dp[i] 由 dp[i-1] 和 dp[i-2]推出,所以从前往后遍历class Solution { public int minCostClimbingStairs(int[] cost) ..原创 2022-05-09 22:30:16 · 444 阅读 · 0 评论 -
2022.05.07(LC_509_斐波那契数)
方法一:递归class Solution { public int fib(int n) { if (n <= 1) return n; return fib(n - 1) + fib(n - 2); }}方法二:动态规划class Solution { public int fib(int n) { if (n <= 1) return n; int[] dp = n..原创 2022-05-07 17:41:43 · 192 阅读 · 0 评论 -
2022.05.09(LC_70_爬楼梯)
方法:动态规划class Solution { public int climbStairs(int n) { //第 n 个台阶只能从第 n - 2 或第 n - 1 个台阶爬上来, //到第 n - 2个台阶的走法 + 到第 n - 1 个台阶的走法 = 到第 n 个台阶的走法 if (n <= 2) return n; //确定状态 int[] dp = new int[n + 1]; ..原创 2022-05-09 22:02:32 · 377 阅读 · 0 评论 -
2022.04.23(LC_714_买卖股票的最佳时机含手续费)
方法:贪心class Solution { public int maxProfit(int[] prices, int fee) { int profit = 0; //buy表示在最大化收益的前提下,拥有一支股票的最低买入价格 int buy = prices[0] + fee; for (int i = 1; i < prices.length; i++) { //如果当前的股票价格加...原创 2022-04-23 11:36:20 · 324 阅读 · 0 评论 -
2022.04.23(LC_763_划分字母区间)
方法:贪心class Solution { public List<Integer> partitionLabels(String s) { //记录每个字母出现的最后位置 int[] lastPos = new int[26]; for (int i = 0; i < s.length(); i++) { lastPos[s.charAt(i) - 'a'] = i; } ..原创 2022-04-23 10:49:27 · 294 阅读 · 0 评论 -
2022.04.21(LC_56_合并区间)
方法:贪心class Solution { public int[][] merge(int[][] intervals) { //按区间左端点升序排列,如(1, 4)和(2, 3) Arrays.sort(intervals, new Comparator<int[]>() { public int compare(int[] interval1, int[] interval2) { ...原创 2022-04-21 16:14:51 · 297 阅读 · 0 评论 -
2022.04.21(LC_435_无重叠区间)
方法:贪心class Solution { public int eraseOverlapIntervals(int[][] intervals) { //按右端点升序排列 Arrays.sort(intervals, (o1, o2) -> o1[1] - o2[1]); int ans = 0; int pos = intervals[0][1]; for (int i = 1; i < int..原创 2022-04-21 15:20:51 · 172 阅读 · 0 评论 -
2022.04.21(LC_452_用最少数量的箭引爆气球)
方法:贪心class Solution { public int findMinArrowShots(int[][] points) { //对[[-2147483646,-2147483645],[2147483646,2147483647]]来说 //用Arrays.sort(points, (o1, o2) -> o1[1] - o2[1]);进行排序,相减会溢出 //应该按以下写法对Xend升序排列 Array...原创 2022-04-21 10:53:36 · 299 阅读 · 0 评论 -
2022.04.20(LC_406_根据身高重建队列)
思路:按身高降序排列(若h相同,按k升序排列)如果按照排完序后的顺序,依次将每个人放入队列中,那么当放入第 i 个人时:可以发现,后面的人既然不会对第 i个人造成影响,那么可以采用「插空」的方法,依次给每一个人在当前的队列中选择一个插入的位置。也就是说,当放入第 i个人时,只需要将其插入队列中,使得前面恰好有 k个人即可。class Solution { public int[][] reconstructQueue(int[][] people) { ...原创 2022-04-20 15:57:08 · 264 阅读 · 0 评论 -
2022.04.20(LC_738_单调递增的数字)
方法:贪心class Solution { public int monotoneIncreasingDigits(int n) { if (n < 10) return n; char[] number = String.valueOf(n).toCharArray(); //记录赋值9开始的位置 int start = number.length; for (int i = number.le..原创 2022-04-20 15:50:27 · 255 阅读 · 0 评论 -
2022.04.18(LC_860_柠檬水找零)
方法:计数class Solution { public boolean lemonadeChange(int[] bills) { int[] counter = new int[21]; for (int bill : bills) { counter[bill]++; if (bill == 10) { if (counter[5] < 1) return fals...原创 2022-04-18 15:46:30 · 152 阅读 · 0 评论 -
2022.04.17(LC_135_分发糖果)
方法:贪心class Solution { public int candy(int[] ratings) { int n = ratings.length; int[] candies = new int[n]; Arrays.fill(candies, 1); //从前往后遍历,若当前评分大于前一个评分,多分发一个糖果 for (int i = 1; i < n; i++) { ...原创 2022-04-17 20:58:05 · 315 阅读 · 0 评论 -
2022.04.16(LC_134_加油站)
方法一:暴力求解(超时)class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int n = gas.length; for (int i = 0; i < n; i++) { //剩余油量 int remainder = gas[i] - cost[i]; //下一个起始位置 ..原创 2022-04-16 20:25:58 · 338 阅读 · 0 评论 -
2022.04.16(LC_1005_K 次取反后最大化的数组和)
方法一:优先队列(小顶堆)class Solution { public int largestSumAfterKNegations(int[] nums, int k) { PriorityQueue<Integer> pq = new PriorityQueue<>(); for (int num : nums) { pq.offer(num); } for (int i =..原创 2022-04-16 20:17:54 · 350 阅读 · 0 评论 -
2022.04.15(LC_45_跳跃游戏Ⅱ)
方法:贪心class Solution { //贪心思路:局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一 // 整体最优:一步尽可能多走,从而达到最小步数 public int jump(int[] nums) { int n = nums.length; if (n <= 1) return 0; int ans = 0; //当前的最远距离 int c...原创 2022-04-15 22:38:01 · 2611 阅读 · 0 评论 -
2022.04.13(LC_55_跳跃游戏)
方法:贪心class Solution { public boolean canJump(int[] nums) { int n = nums.length; if (n <= 1) return true; //前n-1个元素能到达的最远距离 int maxDistance = 0; for (int i = 0; i <= maxDistance; i++) { //..原创 2022-04-13 16:26:04 · 2623 阅读 · 0 评论 -
2022.04.12(LC_122_买卖股票的最佳时机 II)
方法一:贪心class Solution { public int maxProfit(int[] prices) { int ans = 0; for (int i = 1; i < prices.length; i++) { if (prices[i] > prices[i - 1]) { ans += prices[i] - prices[i - 1]; }..原创 2022-04-12 20:54:49 · 328 阅读 · 0 评论 -
2022.04.12(LC_121_买卖股票的最佳时机)
方法:贪心思路——维护最低买入价格,最高卖出价格减去最低买入价格即为最大利润class Solution { public int maxProfit(int[] prices) { int ans = 0; int minPrice = prices[0]; for (int i = 1; i < prices.length; i++) { if (prices[i] > minPrice) { ..原创 2022-04-12 20:48:44 · 159 阅读 · 0 评论 -
2022.04.12(LC_53_最大子数组和)
方法:贪心class Solution { public int maxSubArray(int[] nums) { int n = nums.length; if (n == 1) return nums[0]; int ans = Integer.MIN_VALUE; int sum = 0; //贪心的地方:如果 -2 1 在一起,计算起点的时候,一定是从1开始计算, //因为负数只会拉...原创 2022-04-12 20:45:08 · 223 阅读 · 0 评论 -
2022.04.11(LC_376_摆动序列)
方法:贪心class Solution { public int wiggleMaxLength(int[] nums) { int n = nums.length; if (n < 2) return n; int preDif = 0; int ans = 1; for (int i = 1; i < n; i++) { //当前差值 int ..原创 2022-04-11 20:12:51 · 204 阅读 · 0 评论 -
2022.04.11(LC_455_分发饼干)
方法:贪心(小饼干满足小胃口)class Solution { public int findContentChildren(int[] g, int[] s) { int ans = 0; Arrays.sort(g); Arrays.sort(s); int i = 0, j = 0; while (i < g.length && j < s.length) { ..原创 2022-04-11 17:50:10 · 164 阅读 · 0 评论 -
2022.04.09(LC_90_子集Ⅱ)
方法:回溯class Solution { List<List<Integer>> ans = new ArrayList<>(); List<Integer> path = new ArrayList<>(); public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); ..原创 2022-04-09 15:27:14 · 340 阅读 · 0 评论
分享