剑指offer
文章平均质量分 53
大白羊想学习
这个作者很懒,什么都没留下…
展开
-
剑指offer——图
(一)剑指Offer12. 矩阵中的路径基本思路:图中最常见的就是DFS和BFS算法的应用,即搜索方法。这一题如果把顶点看做根节点,那么实际就是一个DFS搜索的题。由于在搜索过程中可能走向重复的点,所以需要维护一个数组,用于存储每个结点是否访问过。class Solution { boolean flag = false;//标识路径是否存在 void helpFunc(char[][] board, int target, char[] words,int x, int y){原创 2021-03-03 15:04:26 · 176 阅读 · 0 评论 -
剑指offer——栈与队列
在这一部分,30题属于单调栈,59题属于单调队列,二者可以对比分析。(一)剑指offer 30.包含min函数的栈基本思路 :1.首先,由于要求所有操作都是O(1),尤其是min操作,故想到用一个辅助栈来保存当前的最小值。2.由栈的属性决定,每次只能从一端取值,故最小值栈中只要每次都放入当前的最小值即可。也就是说,当一个元素入栈时,比较这个值与最小值栈中栈顶的元素,如果比栈顶元素小,则将这个值放入到最小值栈;否则,将最小值栈的栈顶再次入栈。class MinStack { Stack&l原创 2021-03-03 15:04:13 · 103 阅读 · 0 评论 -
剑指offer——查找算法
(一)剑指Offer53-I. 在排序数组中查找数字I基本思想:1.在排序数组中查找数字,想到了二分搜索方法。由于需要找到所有的该数字,我们想到二分搜索的变形中,有一个查找最左侧的该数字和最右侧的该数字,我们只要找到边界位置,然后向另一方向找就行了。class Solution { public int search(int[] nums, int target) { if(nums.length ==0){ return 0;原创 2021-03-03 15:04:00 · 71 阅读 · 0 评论 -
剑指offer——树
树的题主要就是依赖于递归来实现,一定要学好递归!!!(一)剑指Offer 07.重建二叉树基本思路:1.这道题就是简单地根据前序遍历和后续遍历来创建二叉树,方法如下:前序遍历的第一个元素是根节点,根据根节点在中序遍历中的位置,左侧为左子树,右侧为右子树,然后再递归构建左右子树即可。class Solution { public TreeNode buildTree(int[] preorder, int[] inorder) { //把前序遍历的值和中序遍历的值放到list中原创 2021-03-03 15:03:35 · 176 阅读 · 0 评论 -
剑指offer——HashMap
(一)剑指Offer48. 最长不含重复字符的子字符串基本思路:1.这道题没有什么巧妙的算法,维护一个窗口,保存窗口的最左端位置,并将窗口内的字符以<键:字符,值:位置>存入HashMap中。当有重复字符出现时,就更新HashMap中该键对应的坐标,并将长度与最大长度进行对比更新。class Solution { public int lengthOfLongestSubstring(String s) { //设置一个hashmap,存储每个字符出现的最新位置原创 2021-03-03 15:03:24 · 126 阅读 · 0 评论 -
剑指offer——数学
(一)剑指 Offer 14- I. 剪绳子基本思路:1.如果我们不考虑数学问题,我们可以采用动态规划的方法来解决这个问题。有点类似于青蛙跳台阶的题。2.但是这道题还有数学解法:(1)最优: 3 。把绳子尽可能切为多个长度为 3 的片段,留下的最后一段绳子的长度可能为 0,1,2三种情况。(2)次优: 2 。若最后一段绳子长度为 22 ;则保留,不再拆为 1+1。(3)最差: 1 。若最后一段绳子长度为 1 ;则应把一份 3 + 1替换为 2 + 2推导见官方解答动态规划代码:class原创 2021-03-03 15:03:06 · 107 阅读 · 0 评论 -
剑指offer——递归
(一)剑指Offer10-I.斐波那契数列class Solution { public int fib(int n) { int[] save = new int[101]; save[0]=0; save[1]=1; save[2]=1; for (int i = 3; i <= n; i++) { save[i] = (save[i-1]+save[i-2])%1000000007原创 2021-03-03 15:02:20 · 116 阅读 · 0 评论 -
剑指offer——排序算法
(一)剑指Offer 40. 最小的k个数基本思路:1.这是经典的topK问题,最直接的想法就是对其进行排序,然后取出排序后的前k个数。那么问题就转化为了如何选择排序算法上。2.由于这里只需要找到前k个数,我们在选择排序算法时,希望能够有一个排序算法,通过有限的轮数找到排序好的前k个数,这样后面的排序过程我们就不需要再进行了。3.一个较好的方法是使用快排,快排的时间复杂度为O(nlogn)。我们首先选择一个数,进行一轮排序,此时小于此数的均在左侧,大于的均在右侧;若左侧的个数少于k个,则我们对右侧原创 2021-03-03 15:02:04 · 273 阅读 · 0 评论 -
剑指offer——位运算
(一)剑指Offer39. 数组中出现次数超过一半的数字基本思路:1.这道题最先想到也是最简单的思路就是用HashMap进行统计,或是将数组进行排序,中位数一定是超过一半的那个数字。2.另一个方法是采用摩尔投票的方法,(二)剑指Offer15. 二进制中1的个数基本思路:提取最低位,判断是否为1,并不断进行位右移。public class Solution { // you need to treat n as an unsigned value public int ha原创 2021-03-03 15:01:44 · 189 阅读 · 0 评论 -
剑指offer——动态规划
(一)剑指 Offer 47. 礼物的最大价值基本思路:对于每一个格子,到达它的最大总价值等于左侧、上侧格子中较大的总价值加上自身的价值,故使用动态规划来解决。class Solution { public int maxValue(int[][] grid) { //动态规划,从最后向前算 int[][] route = new int[grid.length][grid[0].length]; //从右往左,从下往上 rou原创 2021-03-03 15:01:22 · 141 阅读 · 0 评论