数组中重复的数字
最简单的用set判断
1 | public int findRepeatNumber(int[] nums) { |
官方题解,交换位置
1 | public int findRepeatNumber(int[] nums) { |
当然也可以排序后遍历,或者用新数组做桶标记。
二维数组中的查找
找对位置从左上角开始,大则左,小则下
1 | public boolean findNumberIn2DArray(int[][] matrix, int target) { |
替换空格
1 | public String replaceSpace(String s) { |
从头到尾打印链表
遍历
1 | public int[] reversePrint(ListNode head) { |
当然也可以考虑先直接将链表倒序
1 | public int[] reversePrint(ListNode head) { |
从前序与中序遍历构造二叉树
1 | HashMap<Integer,Integer> map = new HashMap<>(); |
切片判断,来自题解
1 | /** |
用两个栈实现队列
一个栈用来入队,一个用来出队
1 | class CQueue { |
斐波纳契数列
1 | public int fib(int n) { |
跳台阶
1 | public int numWays(int n) { |
旋转数组
1 | public int minArray(int[] nums) { |
矩阵中的路径
DFS
1 | private char[] ss ; |
机器人的运动范围
DFS
1 | private int counts = 0; |
题解里的优化点:
数位之和计算:
1 | (x + 1) % 10 != 0 ? s_x + 1 : s_x - 8 |
搜索方向简化:
数位和特点: 根据数位和增量公式得知,数位和每逢 进位 突变一次。
解的三角形结构:
- 根据数位和特点,矩阵中 满足数位和的解 构成的几何形状形如多个 等腰直角三角形 ,每个三角形的直角顶点位于 0, 10, 20, …0,10,20,… 等数位和突变的矩阵索引处 。
- 三角形内的解虽然都满足数位和要求,但由于机器人每步只能走一个单元格,而三角形间不一定是连通的,因此机器人不一定能到达,称之为 不可达解 ;同理,可到达的解称为 可达解 (本题求此解) 。
结论:
根据可达解的结构,易推出机器人可
仅通过向右和向下移动,访问所有可达解。
- 三角形内部: 全部连通,易证;
- 两三角形连通处: 若某三角形内的解为可达解,则必与其左边或上边的三角形连通(即相交),即机器人必可从左边或上边走进此三角形。
剪绳子
1 | public int cuttingRope(int n) { |
二进制数中一的个数
1 | public int hammingWeight(int n) { |
数值的整次方
快速幂
1 | public double myPow(double x, int n) { |
调整数组顺序使奇数位于偶数前面
双指针
1 | public int[] exchange(int[] nums) { |
合并链表
1 | public ListNode mergeTwoLists(ListNode l1, ListNode l2) { |
树的子结构
递归
1 | public boolean isSubStructure(TreeNode A, TreeNode B) { |
伪递归
1 | public boolean isSubStructure(TreeNode A, TreeNode B) { |
二叉树的镜像
1 | public TreeNode mirrorTree(TreeNode root) { |
栈
1 | class Solution { |
对称的二叉树
1 | public boolean isSymmetric(TreeNode root) { |
递归
1 | public boolean isSymmetric(TreeNode root) { |
顺时针打印矩阵
1 | private static final int[] dx = new int[]{0,1,0,-1}; |
1 | public int[] spiralOrder(int[][] matrix) { |
栈的压入与弹出
1 | public boolean validateStackSequences(int[] pushed, int[] popped) { |
链表中倒数第K个节点
1 | public ListNode getKthFromEnd(ListNode head, int k) { |
反转链表
1 | public ListNode reverseList(ListNode head) { |
合并两个排序链表
1 | public ListNode mergeTwoLists(ListNode l1, ListNode l2) { |
树的子结构
递归
1 | public boolean isSubStructure(TreeNode A, TreeNode B) { |
二叉树的镜像
注意是镜像复制,所以left复制的是right,right复制的是left
1 | public TreeNode mirrorTree(TreeNode root) { |
对称的二叉树
按照层序遍历,最开始直接加入根节点的左右子树,之后判断左右子树的4个子节点是否对称,加入队列时要注意顺序。
1 | public boolean isSymmetric(TreeNode root) { |
顺时针打印矩阵
憨批写法
1 | private static final int[] dx = new int[]{0,1,0,-1}; |
题解4轮遍历
1 | public int[] spiralOrder(int[][] matrix) { |
最小栈
1 | class MinStack { |
栈的压入与弹出
1 | public boolean validateStackSequences(int[] pushed, int[] popped) { |
从上到下打印二叉树
1 | public int[] levelOrder(TreeNode root) { |
从上到下打印二叉树II
1 | public List<List<Integer>> levelOrder(TreeNode root) { |
从上到下打印二叉树III
1 | public List<List<Integer>> levelOrder(TreeNode root) { |
二叉搜索树的后序遍历
1 | public boolean verifyPostorder(int[] postorder) { |
1 | int[] postorder; |
二叉树中路径和为某一值的路径
1 | List<List<Integer>> ans; |
复杂链表的复制
1 | public Node copyRandomList(Node head) { |
1 | public Node copyRandomList(Node head) { |
二叉搜索树与双向链表
重新排序
1 | public Node treeToDoublyList(Node root) { |
利用二叉搜索树中序为递增
1 | Node preNode = null,headNode = null; |
序列化二叉树
1 | public class Codec{ |
字符串的排列
1 | public String[] permutation(String s) { |
数组中出现次数超过一半
1 | public int majorityElement(int[] nums) { |
最小的k个数
1 | public int[] getLeastNumbers(int[] arr, int k) { |
1 | public int[] getLeastNumbers(int[] arr, int k) { |
数据中的中位数
1 | public class MedianFinder { |
连续数组的最大子序和
1 | public int maxSubArray(int[] nums) { |
1的次数
1 | //每一位出现1的最大数量 |
1 | public int findNthDigit(int n) { |
把数组排成最小值
1 | public String minNumber(int[] nums) { |
把数字翻译成字符串
1 | public int translateNum(int num) { |
礼物的最大价值
1 | public int maxValue(int[][] grid) { |
最长不含重复字符串的子串
1 | public int lengthOfLongestSubstring(String s) { |
丑数
1 | public int nthUglyNumber(int n) { |
第一个只出现一次的字符
1 | private static final char SPACE = ' '; |
数组中的逆序对
1 | public int reversePairs(int[] nums) { |
链表相交节点
1 | public ListNode getIntersectionNode(ListNode headA, ListNode headB) { |
在排序数组中查找数字
1 | public int search(int[] nums, int target) { |
1 | public int search(int[] nums, int target) { |
0-n中缺失的数字
1 | public int missingNumber(int[] nums) { |
二叉搜索树中第k大节点
1 | int res, k; |
二叉树的深度
1 | public int maxDepth(TreeNode root) { |
平衡二叉树
1 | private boolean flag = false; |
数组中只出现一次的数字
1 | public int[] singleNumbers(int[] nums) { |
和为s的连续正序列
1 | public int[][] findContinuousSequence(int target) { |
反转单词顺序
1 | public String reverseWords(String s) { |
左旋转字符串
1 | public String reverseLeftWords(String s, int n) { |
滑动窗口的最大值
1 | public int[] maxSlidingWindow(int[] nums, int k) { |
队列的最大值
1 | class MaxQueue { |
n个骰子的点数
1 | public double[] twoSum(int n) { |
扑克牌中的顺子
1 | public boolean isStraight(int[] nums) { |
圆圈中的最后剩下的数字
1 | public int lastRemaining(int n, int m) { |
1 | public int lastRemaining(int n, int m) { |
股票最大利润
1 | public int maxProfit(int[] prices) { |
等差数列求和
1 | public int sumNums(int n) { |
不用加减乘除实现加法
1 | public int add(int a, int b) { |
1 | public int add(int a, int b) { |
字符串转整数
1 | public int strToInt(String str) { |
二叉搜索树最近的公共祖先
1 | public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { |
判定字符串是否唯一
1 | public boolean isUnique(String astr) { |
判断是否互为字符重排
1 | public boolean CheckPermutation(String s1, String s2) { |