随笔分类 - 剑指Offer
摘要:不好返回的是时候,就用void,然后在主函数中返回。 思路是在快排中只增加了一句话: if(k == i) return;如果基准数的下标,和k相等,就return。 假如k=7,数组下标为7的时候是第 8个数,第8个数前的数都比第8个数小。 其实在像解答里在arr[i] = pivot;之后判断,
阅读全文
摘要:1.状态定义 dp[i]代表凑齐总价值 i 需要的最少硬币个数; 2.状态转移方程 for(int coin : coins) dp[i] = Math.min(dp[i], dp[i - coin] + 1); 322. 零钱兑换 class Solution { public int coinC
阅读全文
摘要:应该不用写啥。 也可以用有序哈希表LinkedHashMap,第二遍遍历哈希表。 剑指 Offer 50. 第一个只出现一次的字符 class Solution { public char firstUniqChar(String s) { Map<Character, Boolean> dic =
阅读全文
摘要:思路一: 利用小根堆。 小根堆弹出的数是堆里最小的,于是弹出一个x。 就将2*x,3*x,5*x加入set去重,然后重新加入小根堆。 弹出的第n个数就是第n个丑数。 class Solution { public int nthUglyNumber(int n) { int[] factors =
阅读全文
摘要:charAt返回指定索引处的字符。 转为字符数组toCharArray() 剑指 Offer 48. 最长不含重复字符的子字符串 class Solution { public int lengthOfLongestSubstring(String s) { HashMap<Character, I
阅读全文
摘要:dp三步走: 1.状态定义 dp[i]表示到第i位能形成的方案数量(从1开始) 2.状态转移方程 当第i-1位,i位组合起来能被翻译:dp[i] = dp[i - 1] + dp[i - 2] 不能被连起来翻译:dp[i] = dp[i - 1] //指加上了这一位,方案数量没有改变 3.边界处理
阅读全文
摘要:length是数组的属性,单独String用.length(),数组的属性就用.length。 这道题也只是知道策略,不知道怎么证明。 剑指 Offer 45. 把数组排成最小的数 class Solution { public String minNumber(int[] nums) { //这里
阅读全文
摘要:reverseOrder() 方法用于获取一个比较有否就实现Comparable接口的对象的集合的自然顺序相反。 剑指 Offer 40. 最小的k个数 class Solution { public int[] getLeastNumbers(int[] arr, int k) { if(k ==
阅读全文
摘要:感觉是比较难的一道题了,写一下思路以及运行流程。 举例 s = "abc" 1.首先将字符串s存入字符数组便于操作,进入dfs(0) 2.进入循环,交换‘a’和‘a’(相当于没变),进入dfs(1) 3.进入循环,交换‘b’和‘b’,进入dfs(2) 4.触发终止条件,把此时的字符串c转为Strin
阅读全文
摘要:思路:中序遍历依次修改左右连接。 剑指 Offer 36. 二叉搜索树与双向链表 /* // Definition for a Node. class Node { public int val; public Node left; public Node right; public Node()
阅读全文
摘要:思路:用hashmap存储新老节点对应关系。 剑指 Offer 35. 复杂链表的复制 /* // Definition for a Node. class Node { int val; Node next; Node random; public Node(int val) { this.val
阅读全文
摘要:思路:后序遍历则数组末尾为根节点。 二叉搜索树左子节点值 < 根节点值 <右子节点值 因子划分左右子树,递归判断。 剑指 Offer 33. 二叉搜索树的后序遍历序列 class Solution { public boolean verifyPostorder(int[] postorder) {
阅读全文
摘要:思路一: 加了一句: if(res.size() % 2 == 1) Collections.reverse(tmp);如果res.size()为奇数,当前层为偶数,反转tmp之后再存入res。 class Solution { public List<List<Integer>> levelOrd
阅读全文
摘要:思路: 在层序遍历的基础上增加一个List,来存储当前层。 *注意在for循环里,在将现有的队列元素全部出队的同时,会循环将队列里的每一个左右节点入队。 在下一次for循环里,又会将当前层的所有元素出队,同时添加下一层的所有节点。 剑指 Offer 32 - II. 从上到下打印二叉树 II /**
阅读全文
摘要:利用队列进行层序遍历。 剑指 Offer 32 - I. 从上到下打印二叉树 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right
阅读全文
摘要:直接模拟就好了。 剑指 Offer 31. 栈的压入、弹出序列 class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { //泛型需要是对象类型所以不能用int Stack<Integer
阅读全文
摘要:看到返回List就好奇试了一下 List<List<Integer>> res = new List<>(); 结果果然还是不行的。 这道题的思路很好 理解,先序遍历将当前节点值添加进路径。 如果符合一条路径的标准就在res存做一个答案。 遍历到null就返回到上一层,然后会有一个removeLas
阅读全文
摘要:第一个if循环应该很容易看懂。 写一下为什么最后一个root节点不会一直返回,因为当某一个节点left和right都不为空,返回该节点后。 该节点的父节点肯定会有一边为空,而另一边就是上面返回的root节点。 就会执行左不为空返回右,右不为空返回左,向上返回找到的那个节点。 这种递归方法会遍历到每个
阅读全文
摘要:如果一个在根节点,另一个在其子树,返回root没毛病。 如果不是同时大于或小于,因为二叉搜索树性质,会分别在两边,返回root没毛病。 如果同时在一边,则当前节点不会是最近公共祖先,往子树递归,没毛病。 *注意要写3个return 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 /**
阅读全文
摘要:有一个小问题,首先用if(str == null) return 0;来判断特殊输入,这样是不行的。 后来用if(str.length() == 0)来判断,也是不行的。 因为可以有一个空字符,后面会越界。 正确的方法是在str.trim().toCharArray()后判断字符数组c的长度。 *还
阅读全文
浙公网安备 33010602011771号