![](https://img-blog.csdnimg.cn/20190922172659622.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
玉树临风你卓哥
不积跬步,无以至千里;不积小流,无以成江海。
展开
-
LeetCode --- 547. 朋友圈
LeetCode链接:547. 朋友圈解法1:深度优先搜索class Solution { public int findCircleNum(int[][] M) { boolean[] visited = new boolean[M.length]; int count = 0; for (int i = 0; i <...原创 2020-02-08 18:39:34 · 227 阅读 · 0 评论 -
LeetCode --- 287. 寻找重复数
LeetCode链接:287. 寻找重复数解法1 - 循环链表class Solution { public int findDuplicate(int[] nums) { int slow = 0; int fast = 0; while (true) { slow = nums[slow]; ...原创 2020-02-07 00:47:10 · 221 阅读 · 0 评论 -
LeetCode --- 142. 环形链表 II
LeetCode链接:142. 环形链表 II/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * ...原创 2020-02-06 21:28:45 · 246 阅读 · 1 评论 -
LeetCode --- 141. 环形链表
LeetCode链接:141. 环形链表/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * ...原创 2020-02-06 18:41:40 · 163 阅读 · 0 评论 -
LeetCode --- 590. N叉树的后序遍历
LeetCode链接:590. N叉树的后序遍历/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val;...原创 2020-02-06 15:12:48 · 123 阅读 · 0 评论 -
LeetCode --- 589. N叉树的前序遍历
LeetCode链接:589. N叉树的前序遍历/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val;...原创 2020-02-06 14:47:21 · 110 阅读 · 0 评论 -
LeetCode --- 226. 翻转二叉树
LeetCode链接:226. 翻转二叉树解法1 - 递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; }...原创 2020-02-06 11:29:18 · 104 阅读 · 0 评论 -
LeetCode --- 102. 二叉树的层次遍历
LeetCode链接:102. 二叉树的层次遍历解法1 - 递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x...原创 2020-02-05 00:00:16 · 128 阅读 · 0 评论 -
LeetCode --- 145. 二叉树的后序遍历
LeetCode链接:145. 二叉树的后序遍历解法1 - 递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x...原创 2020-02-04 20:41:35 · 120 阅读 · 0 评论 -
LeetCode --- 94. 二叉树的中序遍历
LeetCode链接:94. 二叉树的中序遍历解法1 - 递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x;...原创 2020-02-04 20:34:37 · 133 阅读 · 0 评论 -
LeetCode --- 144. 二叉树的前序遍历
LeetCode链接:144. 二叉树的前序遍历解法1 - 递归/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x...原创 2020-02-04 20:16:20 · 124 阅读 · 0 评论 -
LeetCode --- 445. 两数相加 II
LeetCode链接:445. 两数相加 II解法1 - 递归版本/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Sol...原创 2020-02-04 19:11:55 · 140 阅读 · 0 评论 -
LeetCode --- 2. 两数相加
LeetCode链接:2.两数相加/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { publi...原创 2020-02-04 18:51:40 · 127 阅读 · 0 评论 -
LeetCode --- 52. N皇后 II
LeetCode链接:52. N皇后 II算法策略 : 回溯(Back Tracking)解法一:class Solution { private int ways; public int totalNQueens(int n) { // 声明一个长度为n的数组用来代表 第n行棋子是在第result[n]列 int[] result...原创 2020-01-31 19:49:42 · 133 阅读 · 0 评论 -
LeetCode --- 1143. 最长公共子序列
LeetCode链接:1143. 最长公共子序列算法策略 : 动态规划(Dynamic Programming)最长公共子序列(Longest Common Subsequence,LCS)求两个序列的最长公共子序列长度[1,3,5,9,10] 和 [1,4,9,10] 的最长公共子序列是 [1,9,10],长度为3ABCBDAB 和 BDCABA 的最长公共子序列长度...原创 2020-01-30 14:23:36 · 393 阅读 · 0 评论 -
LeetCode --- 322. 零钱兑换
LeetCode链接:322. 零钱兑换算法策略 : 贪心(Greedy)算法策略 : 动态规划(Dynamic Programming)假设有25分、20分、5分、1分的硬币,现要找给客户41分的零钱,如何办到硬币个数最少?***此前用贪心策略得到的并非是最优解(贪心得到的解释5枚硬币)解法1 - 暴力递归int coins(int n) { if (n ...原创 2020-01-29 18:43:36 · 206 阅读 · 0 评论 -
LeetCode --- 300. 最长上升子序列
LeetCode链接:300. 最长上升子序列算法策略 : 动态规划(Dynamic Programming)给定一个无序的整数序列,求出它最长上升子序列的长度(要求严格上升)比如 [10,2,2,5,1,7,101,18] 的最长上升子序列是 [2,5,7,101]、[2,5,7,18],长度是4动态规划 - 状态定义假设数组是nums,[10,2,2,5,1,7,1...原创 2020-01-29 18:35:54 · 223 阅读 · 0 评论 -
LeetCode --- 53. 最大子序和
LeetCode链接:53. 最大子序和算法策略 : 分治(Divide And Conquer)解法1 - 暴力出奇迹穷举出所有可能的连续子序列,并计算出它们的和,最后取它们中的最大值int maxSubArray(int[] nums) { if (nums == null || nums.length == 0) return 0; int max =...原创 2020-01-29 00:29:57 · 138 阅读 · 0 评论 -
算法策略 - 贪心(Greedy)
贪心策略,也称贪婪策略每一步都采取当前状态下最优的选择(局部最优解),从而希望推导出全局最优解贪心应用:哈夫曼树最小生成树算法:Prim、Kruskal最短路径算法:Dijkstra练习1 - 最优装载问题(加勒比海盗)在北美洲东南部,有一片神秘的海域,是海盗最活跃的加勒比海盗有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一单打碎就失去了它的价值...原创 2020-01-28 19:33:20 · 1804 阅读 · 0 评论 -
LeetCode --- 51. N皇后
LeetCode链接:51. N皇后class Solution { // 数组索引是行号,数组元素是列号 private int[] queens; // 标记着某一列是否有皇后 boolean[] cols; // 标记着某一斜线上是否有皇后(左上角 -> 右下角) boolean[] leftTop; // 标记着某一斜线上是否有皇后(右上角 -&g...原创 2020-01-27 18:01:45 · 162 阅读 · 0 评论 -
算法策略 - 回溯(Back Tracking)
回溯可以理解为:通过选择不同的岔路口来通往目的地(找到想要的结果)每一步都选择一条路出发,能进则进,不能进则退回上一步(回溯),换一条路试试树、图的深度优先搜索(DFS)就是经典的回溯应用不难看出来,回溯很适合使用递归练习 - 八皇后问题(Eight Queens)八皇后问题是一个古老而著名的问题在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击:任意两个皇后都不能处于同一行...原创 2020-01-27 17:18:01 · 1332 阅读 · 0 评论 -
算法 - 桶排序(Bucket Sort)
执行流程:创建一定数量的桶(比如用数组、链表作为桶)按照一定的规制(不同类型的数据,规则不同),将序列中的元素均匀分配到对应的桶分别对每个桶进行单独排序将所有非空桶的元素合并成有序序列元素在同种的索引元素值*元素数量实现double[] array = {0.34, 0.47, 0.29, 0.84, 0.45, 0.38, 0.35, 0.76}// 桶数组L...原创 2019-10-29 13:10:42 · 255 阅读 · 0 评论 -
算法 - 基数排序(Radix Sort)
基数排序非常适合用于整数排序(尤其是非负整数),因此只演示对非负整数进行基数排序执行流程:一次对个位数、十位数、百位数、千位数、万位数…进行排序(从低位到高位)个位数、十位数、百位数的取值范围都是固定的0~9,可以使用计数排序对它们进行排序思考:如果先对高位排序,再对地位排序,是否可行?不行实现private void countingSort(int divider, int[]...原创 2019-10-29 13:07:56 · 1647 阅读 · 0 评论 -
算法 - 计数排序(Counting Sort)
之前学习的冒泡、选择、插入、归并、快速、希尔、堆排序,都是基于比较的排序平均时间复杂度目前最低是O(nlogn)计数排序、桶排序、基数排序,都不是基于比较的排序它们是典型的用空间换时间,在某些时候,平均时间复杂度可以比O(nlogn)更低计数排序于1954年由Harold H.Seward提出,适合对一定范围内的整数进行排序计数排序的核心思想统计每个整数在序列中出现的次数,进而推导出...原创 2019-10-29 13:04:53 · 196 阅读 · 0 评论 -
算法 - 希尔排序(Shell Sort)
1959年由唐纳德·希尔(Donald Shell)提出希尔排序把序列看作是一个矩阵,分成m列,逐列进行排序m从某个整数逐渐减为1当m为1时,整个序列将完全有序因此,希尔排序也被称为逐渐增量排序(Diminashing Increment Sort)矩阵的列数取决于补偿序列(step sequence)比如,如果步长序列为{1,5,19,41,109,…},就代表依次分层...原创 2019-10-29 12:57:28 · 165 阅读 · 0 评论 -
算法 - 快速排序(Quick Sort)
1960年由查尔斯·安东尼·理查德·霍尔(Charles Antony Richard Hoare,缩写为C.A.R.H)昵称为东尼·霍尔(Tony Hoare )执行流程:从序列中选择一个轴点元素(pivot)假设每次选择0位置的元素为轴点元素利用pivot将序列分割成2个子序列将小于pivot的元素放在pivot前面(左侧)将大于pivot的元素放在pivot后面(右侧)...原创 2019-10-28 19:12:47 · 158 阅读 · 0 评论 -
算法 - 归并排序(Merge Sort)
1954年由约翰·冯·冯诺依曼(John von Nenumann)首次提出执行流程不断地将当前序列平均分割成2个子序列(直到不能分割(序列中只有1个元素))不断地将2个子序列合并成一个有序序列(直到最终只剩下1个有序序列)归并排序 - divide实现// 对 [begin, end) 范围的数据进行归并排序private void sort(int begin, int...原创 2019-10-25 13:52:00 · 177 阅读 · 0 评论 -
算法 --- 十大排序
排序算法的稳定性(Stability)如果相等的2个元素,在排序前后的相对位置保持不变,那么这是稳定的排序算法对自定义对象进行排序是,稳定性会影响最终的排序效果冒泡排序属于稳定的排序算法稍有不慎,稳定你的排序算法也可能被写成不稳定的排序算法原地算法(In-place Algorithm)原地算法(In-place Algorithm)不依赖额外的资源或者依赖少数的额外资源,仅...原创 2019-10-22 12:12:01 · 209 阅读 · 0 评论 -
算法 - 插入排序(Insertion Sort)
插入排序非常类似于扑克牌的排序执行流程在执行过程中,插入排序会将序列分为2部分(头部是已经排好序的,尾部是待排序的)从头开始扫描每一个元素(每当扫描到一个元素,就将它插入到头部适合的位置,使得头部数据依然保持有序)void sort() { for (int begin = 1; begin < array.length; begin++) { int...原创 2019-10-24 12:57:44 · 131 阅读 · 0 评论 -
算法 - 堆排序(Heap Sort)
堆排序可以认为是对选择排序的一种优化执行流程对序列进行原地建堆(heapify)重复执行以下操作,直到堆的元素数量为1(交换堆顶元素与尾元素,对的元素数量减1,对0位置进行1次siftDown操作)最好、最坏、平均时间复杂度O(nlogn),空间复杂度:O(1),属于不稳定排序void sort() { // 原地建堆 ...原创 2019-10-22 13:31:03 · 191 阅读 · 0 评论 -
算法 - 选择排序(Selection Sort)
执行流程从序列中找到最大的那个元素,然后与最末尾的元素交换位置(执行完一轮后,最末尾的那个元素就是最大的元素)忽略1中曾经找到的最大元素,重复执行步骤1选择排序的交换次数要远远小于冒泡排序,平局性能优于冒泡排序最好、最坏、平均时间复杂度:O(n²),空间复杂度O(1),属于稳定排序 for (int end = array.lengt...原创 2019-10-22 13:27:52 · 165 阅读 · 0 评论 -
算法 - 冒泡排序(Bubble Sort)
平均时间复杂度:O(n²),最好情况:O(n),最坏情况O(n²)空间复杂度:O(1)常规冒泡排序for (int end = array.length - 1; end > 0; end--) { for (int begin = 1; begin <= end; begin++) { // if (ar...原创 2019-10-22 11:57:31 · 166 阅读 · 0 评论 -
LeetCode --- 104. 二叉树的最大深度
LeetCode链接:104. 二叉树的最大深度解法1:层序遍历 - 迭代时间复杂度:O(n),空间复杂度:O(n)public class _104_二叉树的最大深度 { public int maxDepth(TreeNode root) { if (root == null) return 0; Queue<TreeNode> qu...原创 2019-09-22 23:12:34 · 159 阅读 · 0 评论 -
LeetCode题解 --- 目录
LeetCode — 21. 合并两个有序链表LeetCode — 23. 合并K个排序链表LeetCode — 98. 验证二叉搜索树LeetCode — 150.逆波兰表达式求值原创 2019-09-22 18:20:46 · 309 阅读 · 0 评论 -
LeetCode --- 98. 验证二叉搜索树
LeetCode链接:98. 验证二叉搜索树解法1:中序遍历 - 迭代时间复杂度:O(n),空间复杂度:O(n)public class _98_验证二叉搜索树 { public boolean isValidBST(TreeNode root) { if (root == null) return true; offer(root, null, nu...原创 2019-09-22 18:17:28 · 139 阅读 · 0 评论 -
LeetCode --- 21. 合并两个有序链表
LeetCode链接:21. 合并两个有序链表解法1:递归public class _21_合并两个有序链表 { // 只要是用到递归,首先要搞清楚一个问题:这个递归函数的功能是什么? // 递归基:边界 public ListNode mergeTwoLists(ListNode k1, ListNode k2) { if (k1 == null) return...原创 2019-09-22 17:58:07 · 149 阅读 · 0 评论 -
LeetCode --- 23. 合并K个排序链表
LeetCode链接:23. 合并K个排序链表思路1 - 最笨的解法, O(nlogn), 空间复杂度:O(n)public class _23_合并K个排序链表 { public ListNode mergeKLists1(ListNode[] lists) { if (lists == null || lists.length == 0) return null;...原创 2019-09-22 17:51:20 · 141 阅读 · 0 评论 -
LeetCode --- 150. 逆波兰表达式求值
150.逆波兰表达式求值解法1 private boolean isOperator(String token) { return "+-*/".contains(token); } private int calculate(Integer right, Integer left, String operator) { switch (operator) { c...原创 2019-09-22 17:33:17 · 117 阅读 · 0 评论