自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 每天一道算法题之平衡二叉树

题目描述:给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。1代码:class Solution { public boolean isBalanced(TreeNode root) { //判断二叉树是否为平衡数 if(root == null) return true; return helper(root)&&isBalanced(root.l.

2020-08-17 17:00:15 166

原创 每天一道算法题之区间列表的交集

题目描述:给定两个由一些 闭区间 组成的列表,每个区间列表都是成对不相交的,并且已经排序。返回这两个区间列表的交集.1代码:class Solution { public int[][] intervalIntersection(int[][] A, int[][] B) { int lena = A.length; int lenb = B.length; int i = 0,j=0; List<Integer..

2020-08-15 10:58:51 335

原创 每天一道算法题之水果成篮

题目描述:在一排树中,第 i 棵树产生 tree[i] 型的水果。 你可以从你选择的任何树开始,然后重复执行以下步骤:把这棵树上的水果放进你的篮子里。如果你做不到,就停下来。移动到当前树右侧的下一棵树。如果右边没有树,就停下来。请注意,在选择一颗树后,你没有任何选择:你必须执行步骤 1,然后执行步骤 2,然后返回步骤 1,然后执行步骤 2,依此类推,直至停止。你有两个篮子,每个篮子可以携带任何数量的水果,但你希望每个篮子只携带一种类型的水果。用这个程序你能收集的水果总量是多少?1示例 1:

2020-08-13 15:19:33 549

原创 每天一道算法题之最佳观光组合

题目描述:​ 给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。1分析: 一个for循环遍历数组,更新ans和preMax;​ ans = A[i]+A[j]+i-j = A[i] + i -(A[j] - j) = A[i] + i - preMax;​ p

2020-08-12 19:17:34 206

原创 每天一道算法题之重建二叉树

题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。1分析: 采用递归确定父节点,前序遍历的第一个值,就是父节点值通过中序遍历,确定父节点的左子树的个数,从而可确定左子树的中序遍历和前序遍历 以及 右子树的中序遍历和前序遍历 ,调用递归即可;base case:前序遍历为空时,返回null,前序遍历只有一个元素val,返回 new TreeNode(val)代码: private int[] pre;

2020-08-11 09:56:22 97

原创 每天一道算法题之最长有效括号

题目描述:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。1示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”分析: 栈:先进后出;存储的是索引;left表示左括号的前一个位置代码:public int longestValidParentheses(String s) { int len = s.length(); if(len <=1 ) return 0; //右括号的索引值减去左括号的前一个

2020-08-10 10:52:46 118

原创 每天一道算法题之复原IP地址

题目描述:给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。1示例:输入: “25525511135”输出: [“255.255.11.135”, “255.255.111.35”]分析:采用回溯法:代码: private int count; public List<String> restoreIpAddresses(Stri

2020-08-09 10:19:48 282

原创 每天一道算法题之恢复二叉搜索树

题目描述: 二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。1示例 1:输入: [1,3,null,null,2]1/3\2输出: [3,1,null,null,2]3/1\2分析: 分为三步二叉搜索树的中序遍历是递增数列,先将二叉树进行中序遍历找到被错误交换的两个结点值,交换两个结点值代码: private List<Integer> l; public void recoverTree(TreeNode

2020-08-08 11:08:48 86

原创 每天一道算法题之有效的括号

题目描述给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。1示例 1:输入: “()”输出: true代码:public boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); int len = s.

2020-08-07 11:15:31 106

原创 每天一道算法题之打家劫舍III

题目描述:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。1计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例 1:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \

2020-08-05 09:41:05 134

原创 每天一道算法题之课程表

题目描述:你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1].给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?1示例 1:输入: 2, [[1,0]]输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能的。示例 2:输入: 2, [[1,0],[0,1]]输出: f.

2020-08-04 19:08:37 387

原创 每天一道算法题之字符串相加

题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。1代码: public String addStrings(String num1, String num2) { int m = num1.length();

2020-08-03 10:35:44 173

原创 每天一道算法题之单词搜索

题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。1示例:board =[[‘A’,‘B’,‘C’,‘E’],[‘S’,‘F’,‘C’,‘S’],[‘A’,‘D’,‘E’,‘E’]]给定 word = “ABCCED”, 返回 true给定 word = “SEE”, 返回 true给定 word = “ABCB”, 返回 fal

2020-08-02 20:36:12 262

原创 每天一道算法题之整数拆分

题目描述:给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。1示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。代码:方法一:动态规划public int integerBreak(int n) { //dp[i]: 正整数i拆分后可以获得的最大乘积 //init:dp[0] = 0,dp[1] = 0;dp[2] = 1 //转移方程 //dp[i] = max(j * .

2020-07-30 19:02:36 243

原创 每天一道算法题之跳跃游戏II

题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。1分析:遍历数组,在本次允许跳跃的范围内更新下一次跳跃可到达的最远距离;直至到达数组最后.统计更新最远距离的次数,就是题目中所求的跳跃次数.代码部分:public int jump(int[] nums) { if(nums == null || nums.length <= 1) return 0; int in

2020-07-28 20:45:15 227

原创 每天一道算法题之跳跃游戏

题目描述:​ 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。1分析:通过一个变量reach记录当前位置可以到达的最远位置,并将这个最远位置与数组最后一个位置进行比较,如果可以到达最后一个位置,返回true,反之无法到达,其变形题求的是通过几部可以到达数组最后,那么每更新一次reach就完成了一步代码部分:public boolean canJump(int[] nums) { if(nums.

2020-07-27 20:22:29 222

原创 每天一道算法题之矩阵中最长递增路径

题目描述:给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。1示例 1:输入: nums =[[9,9,4],[6,6,8],[2,1,1]]输出: 4解释: 最长递增路径为 [1, 2, 6, 9]。分析:寻路:寻找最大递增路径的长度减少搜索时间,采用备忘录进行优化;int[][] memo记录当前位置最大递增路径数模板:也可以作为寻路的模板框架,相比于一般的寻路模板,多一

2020-07-26 11:17:58 298

原创 每天一道算法题之实现strStr

题目描述:​ 实现 strStr() 函数。给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。1示例 1:输入: haystack = “hello”, needle = “ll”输出: 2代码:public int strStr(String haystack, String needle) { if(needle == "") return 0;

2020-07-25 21:49:00 69

原创 每天一道算法题之旋转图像

题目描述:给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。1代码部分:public void rotate(int matrix) { int row = matrix.length;//行 int n = matrix[0].length;//列 int l = 0; int r = row - 1; int up = 0; int down = row -

2020-07-24 19:37:18 132

原创 每天一道算法题之顺时针打印矩阵

题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。1代码部分:public int[] spiralOrder(int[][] matrix) { int row = matrix.length; if(row == 0) return new int[]{}; int col = matrix[0].length; int left = 0,right = col-1,upper= 0,down=row-1; int index = 0; int[] res =

2020-07-23 19:10:19 77

原创 每天一道算法题之螺旋矩阵

题目描述:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素.1代码部分:public List<Integer> spiralOrder(int matrix) { List<Integer> res = new ArrayList<>(); int n = matrix.length; if(n<=0) return res; int m = matrix[0].length; int.

2020-07-22 20:25:51 153

原创 每天一道算法题之数组中第K大的元素

数组中第K大的元素题目描述:在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。1解析:采用优先队列进行解决,java中可以直接调用优先队列,但是面试官可能希望你用大顶锥进行求解.代码部分:public int findKthLargestTwo(int[] nums, int k) { int heapSize = nums.length; //构建大顶锥 buildMaxHeap(nums, he

2020-07-21 20:47:49 103

原创 每天一道算法题之两个栈实现一个队列

题目描述:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )1解析: 一个栈(in)用来入队列,一个栈(out)用来出队列入队列:直接入in栈出队列:首先判断out栈是否为空若不为空,直接出栈,若out栈为空,则判断in栈是否为空若in栈为空,则队列为空,返回-1若in栈不为空,则将in栈中元素出栈,并压到out栈,随

2020-07-20 19:42:12 110

原创 每天一道算法题之两个数组的交集II

两个数组的交集II题目描述:​ 给定两个数组nums1,nums2,编写一个函数来计算它们的交集。1分析:采用哈希表记录一个数组 nums1 中各个元素出现的次数再次遍历数组 nums2,将共元素保存进数组中,更新哈希表代码部分: public int[] intersect(int[] nums1, int[] nums2) { if(nums1.length <= 0 || nums2.length <= 0) return ne

2020-07-13 20:05:45 187

原创 每天一道算法题之K个一组翻转链表

K个一组翻转链表题目描述:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。1例如:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5若数目不够无需翻转思路:利用栈进行存储需要翻转

2020-07-12 20:19:42 295

原创 每天一道算法题之计算右侧小于当前元素的个数

题目描述:给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。1在做这题之前我们先看一下剑指Offer上的一道题:数组中的逆序对回顾:数组中的逆序对:​ 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。2分析:借助数组的排序规律,进行求解,例如index处的值nums[inde..

2020-07-11 20:56:10 425

原创 每天一道算法题之两两交换链表中的节点

两两交换链表中的节点题目描述:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。1例如:示例:给定 1->2->3->4, 你应该返回 2->1->4->3.思路:双指针进行求解,node指向要交换节点的前一个指针,head指向交换的第一个指针代码部分:public ListNode swapPairs(ListNode head) { if(head ==

2020-07-10 21:18:10 157

原创 每天一道算法题之合并两个有序链表

合并两个有序链表题目描述:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 1例如:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路按照大小关系进行添加,遍历链表需要辅助指针分为两部分,先解决均不为空的节点,再解决剩下的节点代码部分:public ListNode mergeTwoLists(ListNode l1, ListNode l2)

2020-07-09 19:43:57 244 1

原创 每天一道算法题之字符串相乘

字符串相乘题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式1例如:输入: num1 = “2”, num2 = “3”输出: “6”题目解析:字符串求和的进阶版非负整数是以字符串的形式进行表示,那么计算的时候应该从低位开始(从右向左遍历).与求和不同,两数相乘需要知道较低位的运算结果:​ 比如 23 * 62 先计算 2*23,在计算 6*23时,更新最后结果是要用到2*23的结果因此

2020-07-08 19:15:37 109

原创 每天一道算法题之两数相加II

两数相加II题目描述:给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。1例如:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 8 -> 0 -> 7​题目解析:链表存储的数据是从高位开始存储,在计算时需要进行处理(用栈存储元素,栈是先进后出).结果输出也是

2020-07-07 21:31:10 150

原创 每天一道算法题之两数相加

两数相加题目描述:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。1例如:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807题目解析:每个链表存储的数字从低位开始

2020-07-06 21:03:07 737

原创 每天一道算法题之二进制求和

二进制求和题目描述:给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。思路:​ 从最低位开始一步一步进行求解,注意处理进位.代码部分:public String addBinary(String a, String b) { int aIdx = a.length()-1; int bIdx = b.length()-1; int array = 0;//进位 StringBuilder sb =

2020-07-05 21:00:27 170 1

原创 每天一道算法题之第K个排列

第K个排列题目描述:给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。解析:从数学的排列组合可知以i(1<=i<=n)起始数字的排列共有(n-1)!种.如果第二个位置上的数字是j(j != i),那么此时共有 (n-2)! 种排列.如果m1m_1m1​(n-1)! <k<

2020-07-04 20:28:20 235

原创 每天一道算法题之除自身以外数组的乘积

直接求解238. 除自身以外数组的乘积238. 除自身以外数组的乘积题目描述:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。1示例:输入: [1,2,3,4]输出: [24,12,8,6]两种求解方法:方法1:一个数组存储当前索引左边的乘积,另一个数组存储当前索引右边的乘积,对应位置上的乘积就是返回值中对应位置上的结果.方法2: 只利用一个数组进行存储

2020-07-03 19:28:10 97

原创 LetCode刷题

直接求解38.外观数列38.外观数列外观数列 是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:1112112111112211 被读作 “one 1” (“一个一”) , 即 11。11 被读作 “two 1s” (“两个一”), 即 21。21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211。给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意

2020-07-02 16:01:50 237

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除