算法之DFS

DFS深度优先搜索是在得到一个新节点时立即堆新节点进行遍历。DFS常用来求解这种可达性问题。 在实现DFS时需要考虑以下两个问题: 栈,使用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。可以使用递归栈。 标记:需要记录那些节点已经遍历过了。 695. 岛屿的最大面积给定一个包含了一些 0 和 1 的非空二维数组 grid 。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。) 示例 1: 12345678[[0,0,1,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,1,1,0,1,0,0,0,0,0,0,0,0], [0,1,0,0,1,1,0,0,1,0,1,0,0], [0,1,0,0,1,1,0,0,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,0,0,0,0]] 对于上面这个给定矩阵应返回 6。注意答案不应该是 11 ,因为岛屿只能包含水平或垂直的四个方向的 1 。 解法123456789101112131415161718192021222324252627282930private int[][] direction={{0,1},{0,-1},{1,0},{-1,0}}; int m,n; public int maxAreaOfIsland(int[][] grid) { if(grid.length==0||grid[0].length==0){ return 0; } m=grid.length; n=grid[0].length; int maxArea=0; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ maxArea=Math.max(maxArea,dfs(grid,i,j)); } } return maxArea; } private int dfs(int[][] grid,int r,int c){ if(r<0||r>m||c<0||c>n||grid[r][c]==0){ return 0; } int area=1; //(r,c)为陆地 grid[r][c]=0;//标记为已经遍历 for (int[] d : direction) { area+=dfs(grid, r+d[0], c+d[1]); } return area; } leetcode原题地址

算法之栈和队列

栈和队列232.用栈实现队列使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: 1234567MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1queue.pop(); // 返回 1queue.empty(); // 返回 false leetcode原题地址

算法之链表

链表160. 相交链表编写一个程序,找到两个单链表相交的起始节点。 leetcode原题地址 解法设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点 . 123456789101112public ListNode getIntersectionNode(ListNode headA, ListNode headB) { //这道题的意思是必定有相交的 ListNode curA=headA; ListNode curB=headB; while (curA!=curB){ curA=(curA==null)?headB:curA.next; curB=(curB==null)?headA:curB.next; } return curA;}

算法之动态规划

动态规划动态规划和递归都是见原问题拆成多个子问题然后求解,它们之间最本质的区别是,动态规划保存了子问题的解,避免重复计算。 70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 123456输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶 示例 2: 1234567输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶 leetcode原题地址

算法之排序

排序215.数组中的第k个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 12输入: [3,2,1,5,6,4] 和 k = 2输出: 5 示例 2: 12输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 leetcode原题地址

算法之双指针

双指针双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。

算法:矩形覆盖

题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 牛客网在线测试

算法:用两个栈实现队列

题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 牛客网在线测试

算法:二叉树的下一个结点

题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 牛客网在线测试

算法:重建二叉树

题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 牛客网在线测试

12