算法
小码哥编程
这个作者很懒,什么都没留下…
展开
-
判断二叉树是否对称
left == null && right == null: true left != null && right != null: left.val == right.val isTree(left.left, right.right) && isTree(left.right, right.left) import java.util.*; /* * public class TreeNode { * int val = 0; * .原创 2020-10-07 09:57:02 · 154 阅读 · 0 评论 -
单调栈
单调栈 单调栈的特点: 栈中的元素保持单调递增或递减 递增:入栈时把栈中比当前元素nums[i]小的元素都出栈,直到栈为空或者栈顶元素大于nums[i] 递减:同理 496. 下一个更大元素 I 给你一个数组,返回一个等长的数组,对应索引存储着下一个更大元素,如果没有更大的元素,就存 -1。 例子: 给你一个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,-1]。 public int[] nextMax(int[] nums) { if(nums.length ==原创 2020-10-06 09:59:58 · 191 阅读 · 0 评论 -
回溯算法解决排列组合问题
解题框架 步骤 路径:也就是已经做出的选择 选择列表:也就是你当前可以做的选择 结束条件:也就是到达决策树底层,无法再做选择的条件 框架代码 result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择 39. 组合总和 题目 给定一原创 2020-10-06 09:57:23 · 624 阅读 · 0 评论 -
二叉堆实现优先队列
最大堆: 每个节点都大于等于它的两个子节点 堆的操作: swim(k):上浮第k个元素 sink(k):下沉第k个元素 优先队列 删除:delMax(最小堆delMin) 插入:insert 代码框架 public class MaxPQ <Key extends Comparable<Key>> { // 存储元素的数组 private Key[] pq; // 当前 Priority Queue 中的元素个数 private int原创 2020-10-05 22:10:13 · 118 阅读 · 0 评论 -
二叉搜索树系列
1. 判断是否为二叉搜索树 public boolean isBinaryTree(TreeNode root, TreeNode min, TreeNode max) { if(root == null) return true; if(min != null && root.val <= min.val) return false; if(max != null && root.val >= max.val) retur原创 2020-10-05 20:42:39 · 69 阅读 · 0 评论 -
打开转盘锁(LeetCode #752)
打开转盘锁(LeetCode #752) 题目 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。 锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。 列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转原创 2020-09-03 23:10:57 · 166 阅读 · 0 评论 -
二分查找(LeetCode #704)
二分查找(LeetCode #704) 解题思路 基本的二分搜索 搜索区间为[left, right],所以终止条件为left<=right 为了防止溢出,使用mid = left + (right - left) / 2 代码 class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1;原创 2020-09-03 23:09:54 · 62 阅读 · 0 评论 -
二叉树的最小深度(LeetCode #111)
二叉树的最小深度(LeetCode #111) 题目 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree 解题思路 首先明确起点原创 2020-08-31 22:05:31 · 285 阅读 · 0 评论 -
全排列(LeetCode #43)
全排列(LeetCode #63) 题目:给定一个没有重复数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 题目链接:https://leetcode-cn.com/problems/permutations 解题思路 关于排列组合的题目,我们采用穷举法,先固定第一位为 1,然后第二位可以是 2,那么第三位只能是 3;然后可以把第二位变成原创 2020-08-31 22:04:21 · 112 阅读 · 0 评论 -
计数二进制子串--LeetCode #696
计数二进制子串–LeetCode #696 题目 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。 注:重复出现的子串要计算它们出现的次数。 示例 : 输入: "10101" 输出: 4 解释: 有4个子串:“10”,“01”,“10”,“01”,它们具有相同数量的连续1和0。 链接:https://leetcode-cn.com/problems/count-binary-substrings 解题思路 对于任意一个连续的0和原创 2020-08-12 04:46:27 · 86 阅读 · 0 评论 -
数组中重复的元素(剑指Offe.03)
数组中重复的元素(剑指Offe.03) 题目描述: 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 解题思路 遍历数组,采用HashMap存储元素,如果HashMap中已经出现过该元素,则返回,时间复杂度O(N),空间复杂度O(N) 遍历数组元素,交换数组中的元素,使得nums[i] = i,如果在交换时发现两个元素相等,则返回该重复的元素。 算法原理 遍历到原创 2020-08-12 04:44:17 · 132 阅读 · 0 评论 -
动态规划
动态规划 一、适用条件 具有重叠子问题 子问题是不独立的,并且在后续的计算中也可能会多次用到,子问题也能按照相同的方法分割为更小的子问题。 满足最优子结构 某阶段状态一旦确定,就不受这个状态以后决策的影响,即某状态以后的国产不会影响曾经的状态,仅仅于当前状态有关。 无后效性 每个子问题的决策不能对后面未解决的问题产生影响。 二、动态规划的三大步骤 第一步:定义数组元素的含义 一般情况下使用一维数组或者二维数组保存数据,需要规定该数组代表的含义,比如dp[ i ]代表什么意思。 第二步:找出数组元素之间的关系原创 2020-08-11 19:49:56 · 90 阅读 · 0 评论 -
递归总结
递归总结递归三大要素第一要素:明确这个函数想要干什么第二要素:寻找递归结束条件第三要素:找出函数的等价关系式案例1:斐波那契数列案例2:青蛙跳台阶案例3:反转单链表递归优化思路1、考虑是否重复计算2、考虑是否可以自底向上 递归三大要素 第一要素:明确这个函数想要干什么 这个函数的功能是什么,不管代码怎么实现,先明确这个函数是用来干什么的。 第二要素:寻找递归结束条件 我们需要找出当参数为啥时,递归结束,然后返回结果。我们必须更具这个参数的值,能够知道函数的结果是什么。 第三要素:找出函数的等价关系式 我们要原创 2020-06-29 23:10:40 · 177 阅读 · 0 评论 -
经典排序算法
排序算法 冒泡排序 原始冒泡排序代码实现 public static void bubbleSort(int array[]) { for(int i = 0;i < array.length - 1;i++) { for(int j = 0;j < array.length - 1 - i;j++){ i...原创 2020-04-07 15:01:39 · 125 阅读 · 0 评论