- 博客(58)
- 资源 (2)
- 收藏
- 关注
原创 零钱兑换(完全背包)
题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例 1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0
2022-05-29 10:28:32 120
原创 剑指 Offer 12. 矩阵中的路径
标准的DFS,也可以理解为回溯算法的题目。找到数组中和word首字母相同的元素,开始DFS搜索即可。记得使用一个visited数组来存储路径,避免回头路情况的出现。代码如下:class Solution { int[][] res = new int[][]{{1 ,0} , {0 ,1} ,{-1, 0} ,{0 ,-1}}; public boolean exist(char[][] board, String word) { int h = board.len.
2022-05-19 22:11:03 60
原创 剑指 Offer 46. 把数字翻译成字符串
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"提示:0 <= num < 231典型的动态规划解法,首先需要将数字按位存到数组里,使用的
2022-05-14 14:53:48 92
原创 剑指 Offer 42. 连续子数组的最大和(动态规划)
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100dp[i] 表示以i结尾的最大子数组,所以状态转移方程:dp[i] = Math.max(dp[i - 1] +
2022-05-13 18:39:29 222
原创 面试题 01.05. 一次编辑
这个题有个相对复杂的思路,就是先求最小编辑距离,然后看是够小于等于1,参考最小编辑距离:编辑距离但这个题目是中等题,所以可以不这么复杂,经过观察如果一次编辑可以解决的问题首先长度的差值应该小于等于1,所以:int n = first.length() - 1; int m = second.length() - 1; if(Math.abs(m - n) > 1) { return false; }然后.
2022-05-13 16:00:33 101
原创 剑指 Offer 58 - I. 翻转单词顺序
使用双指针的思路,即使用两个指针指向最后一个单词的开始和结束,然后使用substring() 进行切分,使用一个stringBuilder去存储结果即可。需要注意的点:首先是最后有空格的情况的处理,需要想使i指向最后一个部位空格的字符,这里用倒叙循环解决输出时最后一个字符串后面没有空格的问题,简繁使用一个flag解决,即每次添加单词前先添加空格,但第一个单词前不添加`总体代码如下:class Solution { public String reverseWords(String s.
2022-05-13 11:12:32 65
原创 股票最大利润
参考labuladong算法小抄,代码先放这里,留念:class Solution { public int maxProfit(int[] prices) { int n = prices.length; if(n == 0) return 0; int dp_i_0 = 0; int dp_i_1 = -10000; for(int i = 0 ;i < n ;i++) {.
2022-05-11 21:32:25 69
原创 (剑指Offer 28). 对称的二叉树
两种思路:思路1建立一个翻转的二叉树newroot ,然后比较两个二叉树是都相同。翻转代码:TreeNode jing(TreeNode root) { if(root == null || (root.left == null && root.right == null)) return root; TreeNode newroot = new TreeNode(root.val); newroot.left.
2022-05-10 22:09:46 100
原创 (剑指 Offer 27). 二叉树的镜像
这是一个典型的递归题目,首先看结束条件:如果root为空或者root为单个节点则直接返回该节点。否则定义一个和root val相同的节点newroot;将root节点的左孩子翻转后的结果给newroot右孩子;将root节点的只右孩子翻转后的结果给newroot左孩子;代码如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * .
2022-05-10 21:26:56 98
原创 (剑指 Offer)从上到下打印二叉树 I;从上到下打印二叉树 II
从上到下打印二叉树 I二叉树的层次遍历,一般层次遍历使用队列,思路如下:将树根元素root入队开始循环:每次判断队列是否为空,为空则结束循环不为空执行以下步骤将队头元素出队,将队头val存储;将队头节点的左右孩子入队;代码如下 ans.offer(root); while(!ans.isEmpty()) { TreeNode temp = ans.poll(); res.add(temp.
2022-05-10 09:56:22 220
原创 剑指 Offer 11. 旋转数组的最小数字
这个题目看到数据量,我觉得O(n)肯定是可以过的,于是一个简单的线性搜索就出来了。class Solution { public int minArray(int[] numbers) { int n = numbers.length; for(int i = n - 1 ; i > 0 ; i--) { if(numbers[i - 1] > numbers[i]) return num.
2022-05-09 12:32:23 132
原创 最长回文子串和最长回文子序列
这两个题目我觉得可以放在一起讨论下:字长回文子序列首先是回文子序列的题目,涉及到子序列,一般都是不连续的问题:那么首推动态规划,并且这个题目只要求返回长度,那么dp数组用来存子问题的最长回文串长度就可以,即dp[i][j] 表示,从i -j这段的最长回文子串的长度,递推公式:if( s.charAt(i) == s.charAt(j)) ans[i][j] = ans[i + 1][j - 1] + 2; else
2022-05-08 15:27:14 373
原创 最小基因变化(BFS)
经典的BFS暴力搜索的题目,使用一个队列进行BFS搜索即可,到达终点即返回step。有一点需要注意,走完一层算一步。为了不走回头路使用HashSet去存储走过的节点。总体代码如下:class Solution { public int minMutation(String start, String end, String[] bank) { HashSet<String> bank_set = new HashSet<>(); Hash.
2022-05-08 14:27:30 150
原创 不同的二叉搜索树(递推)
拿到这个题目,首先就定位到,这肯定是一个找规律的题目,也就可以使用递推(动态规划的解法进行解决)。然后开始疯狂找规律,其实给的这个图简化了这个题目,不然还真的不好想。我们可以仔细分析一下样例3 这个图,二叉搜索树的树根将其余的节点分成了左右两棵字数,那么我们可以遍历树根,每一种树根的左右子树的节点树是固定的。那么这个题目抽象一下:一个n个节点的二叉搜索树,根节点的可能性为1 ~ n ,那么递推公式就出来了dp[i] += dp[j -1] * dp[i - j];其中j是遍历1 ~ i;那么这个.
2022-05-07 16:42:38 199
原创 编辑距离(动态规划)
考虑使用动态规划解法,dp数组需要时二维的,dp[i][j] 表示 word1的前 i 个和word2前 j 个字符的最小距离。那么需要现有一个base条件即某一个单词为0,则直接返回另一个单词的长度。那么初始化代码如下: int n = word1.length(); int m = word2.length(); int[][] dp = new int[n + 1][ m + 1]; for(int i =1 ;i <= n ; i++.
2022-05-07 13:01:45 332
原创 0~n-1中缺失的数字(超100%)
这个题我们可以使用比较的思想,即我们可以很容易的推出来目标函数是什么样子。目标函数即为 0 - nums.length 共n个数。正好对应数组下标,我们只需要从前向后遍历数组,然后每个数和下标比较。找到第一个与下标不同的第一个数,则缺少的是其下标。代码如下:class Solution { public int missingNumber(int[] nums) { int n = nums.length ; for(int i = 0 ; i < n.
2022-05-07 09:48:56 263
原创 乘积小于 K 的子数组(滑动窗口)
简要分析,这个题目刚开始确实没想到滑动窗口,只是想到动态规划解法,时间复杂度为O(),代码如下:class Solution { public int numSubarrayProductLessThanK(int[] nums, int k) { int n = nums.length; int ans = 0; for(int i = 0 ; i < n ; i++) { int .
2022-05-05 16:06:57 889
原创 LinkedList(对队列、、栈、list实现的简单理解)
自己对LinkedList的一些了解实现了三种数据结构:1. List链表的实现:方式如下:LinkedList<E> ans = new LinkedList<>();这里表示双端队列,在插入、删除频繁的时候常用,效率较高,但查找节点比较麻烦,用接口:即获得元素、链表长度、添加元素、删除元素、判断为空、排序、判断是否包含某个元素2. 队列的 实现:Queue<Integer> ans = new LinkedList<>();需要尾
2022-05-05 11:37:04 612
原创 复杂链表的复制(中等)
这个题目在复制的时候需要考虑random指向的结点是否需要new或者是否不存在这个问题,所以我们可以先用,按照正常链表复制的思路,下一个节点肯定需要复制,所以可以使用递归的思路先复制完成下一个节点,然后复制random指向的节点,判断节点是否存在使用HashMap,具体代码如下:/*// Definition for a Node.class Node { int val; Node next; Node random; public Node(int val) ..
2022-05-04 22:02:59 289
原创 1823. 找出游戏的获胜者
这是一个经典的约瑟夫环问题使用队列模拟去解决这个问题这个:class Solution { public int findTheWinner(int n, int k) { Queue<Integer> ans = new LinkedList<>(); for(int i = 1 ;i <= n ; i++) { ans.offer(i); } whil
2022-05-04 10:14:51 955
原创 单例模式(双检锁)
使用DCL双检索模式:代码如下:package SingLeton_pattern;//import static com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type.String;//双检锁/双重校验锁(DCL,即 double-checked locking)public class Singleton { private volatile static Singleton singleton; priva
2022-05-04 09:45:29 1690
原创 [leetcode]电话号码的字母组合
这算是一个组合问题,就是从每一个数字的字母里选择一个数,组成一个全排列,首先想到的就是回溯算法。回溯需要画一个相应的回溯树,这样比较容易理解这个过程,每一次递归调用函数就是树向下走一层,所以处理好这一层的关系和终止条件,那么这个题就很容易解出来,我们先看终止条件。可以看出每个组合的长度和原来digits的长度相同,那么终止条件也就来了:if(path.length() == digits.length()) { result.add(path.toString.
2022-05-03 10:51:03 78
校园失物招领系统.zip
2019-12-30
银行账户管理.zip
2019-12-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人