剑指offer

《剑指Offer》矩阵中的路径(Java 实现)

蹲街弑〆低调 提交于 2020-02-06 04:45:55
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。 1.2 题目链接 《牛客网》:矩阵中的路径 二、实现代码 public class Solution { private final static int [ ] [ ] next = { { 0 , - 1 } , { 0 , 1 } , { - 1 , 0 } , { 1 , 0 } } ; private int rows ; private int cols ; public boolean hasPath ( char [ ] array , int rows , int cols , char [ ] str ) { if ( rows == 0 || cols == 0 ) return false ; this . rows

《剑指offer》刷题-二维数组中的查找-JAVA

霸气de小男生 提交于 2020-02-06 01:09:35
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 public class Solution { public boolean Find ( int target , int [ ] [ ] array ) { int rows = array . length ; //二维数组包含的数组个数,即二维数组行的长度 int cols = array [ 0 ] . length ; //二维数组内第1个数组的长度,即第1列的长度 //左下角元素左边 int i = rows - 1 ; int j = 0 ; /* 二维数组,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序;目标整数小于; 当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--; 当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++; */ while ( i >= 0 && j < cols ) { //数组范围内 if ( target < array [ i ] [ j ] ) i -- ; else if ( target > array

《剑指Offer》34. 二叉树中和为某一值的路径

醉酒当歌 提交于 2020-02-05 01:59:40
题目链接 牛客网 题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12 解题思路 回溯一定要每一个add都对应一个remove,尤其注意即使是正确路径 public class Solution { public ArrayList < ArrayList < Integer > > FindPath ( TreeNode root , int target ) { ArrayList < ArrayList < Integer > > res = new ArrayList < > ( ) ; ArrayList < Integer > path = new ArrayList < > ( ) ; backtracking ( res , path , target , root ) ; return res ; } private void backtracking ( ArrayList < ArrayList < Integer > > res , ArrayList < Integer > path , int target , TreeNode node ) { if ( node == null |

《剑指Offer》35. 复杂链表的复制

匆匆过客 提交于 2020-02-05 00:51:58
题目链接 牛客网 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 public class RandomListNode { int label ; RandomListNode next = null ; RandomListNode random = null ; RandomListNode ( int label ) { this . label = label ; } } 解题思路 public class Solution { public RandomListNode Clone ( RandomListNode pHead ) { if ( pHead == null ) return null ; // 复制 RandomListNode cur = pHead ; while ( cur != null ) { RandomListNode clone = new RandomListNode ( cur . label ) ; clone . next = cur . next ; cur . next = clone ; cur = clone . next ; } // 复制Random cur = pHead ; while ( cur !=

《剑指Offer》和为S的两个数字(Java 实现)

耗尽温柔 提交于 2020-02-04 02:45:50
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。(对应每个测试案例,输出两个数,小的先输出。) 1.2 题目链接 《牛客网》:和为S的两个数字 二、实现代码 import java . util . ArrayList ; import java . util . Arrays ; public class Solution { public ArrayList < Integer > FindNumbersWithSum ( int [ ] array , int sum ) { int left = 0 , right = array . length - 1 ; ArrayList < Integer > list = new ArrayList < > ( ) ; while ( left < right ) { int curSum = array [ left ] + array [ right ] ; if ( curSum == sum ) return new ArrayList < > ( Arrays . asList ( array [ left ] , array [

《剑指Offer》左旋转字符串(Java 实现)

风格不统一 提交于 2020-02-03 23:47:05
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! 1.2 题目链接 《牛客网》:左旋转字符串 二、实现代码 public class Solution { public String LeftRotateString ( String str , int n ) { if ( str . length ( ) <= n ) return str ; char [ ] chars = str . toCharArray ( ) ; reverse ( chars , 0 , n - 1 ) ; reverse ( chars , n , str . length ( ) - 1 ) ; reverse ( chars , 0 , str . length ( ) - 1 ) ; return new String ( chars ) ; } private void reverse ( char [ ] chars , int i , int j

《剑指Offer》22. 链表中倒数第 K 个结点

爱⌒轻易说出口 提交于 2020-02-03 07:26:24
题目链接 牛客网 题目描述 输入一个链表,输出该链表中倒数第k个结点。 解题思路 快慢指针,相隔k个ListNode,fast==null时,返回slow public class Solution { public ListNode FindKthToTail ( ListNode head , int k ) { ListNode slow = head , fast = slow ; for ( int i = 0 ; i < k ; i ++ ) { if ( fast == null ) return null ; fast = fast . next ; } while ( fast != null ) { slow = slow . next ; fast = fast . next ; } return slow ; } } 来源: CSDN 作者: Melo丶 链接: https://blog.csdn.net/weixin_38611497/article/details/104147920

《剑指Offer》二叉树的镜像(Java 实现)

被刻印的时光 ゝ 提交于 2020-02-01 00:12:42
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   操作给定的二叉树,将其变换为源二叉树的镜像。 1.2 题目链接 《牛客网》:二叉树的镜像 二、实现代码 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public void Mirror ( TreeNode root ) { if ( root == null ) return ; TreeNode node = root . left ; root . left = root . right ; root . right = node ; Mirror ( root . left ) ; Mirror ( root . right ) ; } } 来源: CSDN 作者: 杨小帆_ 链接: https://blog.csdn.net/qq_40697071/article/details/104127973

《剑指Offer》7. 重建二叉树

不羁岁月 提交于 2020-01-31 21:52:18
题目链接 牛客网 题目描述 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 解题思路 pre: 1 247 3568 in : 472 1 5386 每次只需要找到中间的根节点即可 import java . util . Arrays ; public class Solution { public TreeNode reConstructBinaryTree ( int [ ] pre , int [ ] in ) { if ( pre . length == 0 ) return null ; TreeNode node = new TreeNode ( pre [ 0 ] ) ; int mid = 0 ; for ( int i = 0 ; i < in . length ; i ++ ) { if ( in [ i ] == pre [ 0 ] ) { mid = i ; break ; } } node . left = reConstructBinaryTree ( Arrays . copyOfRange ( pre , 1 , mid + 1 ) , Arrays . copyOfRange ( in , 0 , mid ) ) ; node . right =

《剑指Offer》重建二叉树(Java 实现)

心已入冬 提交于 2020-01-31 01:58:55
文章目录 一、题目 1.1 题目描述 1.2 题目链接 二、实现代码 一、题目 1.1 题目描述   输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 1.2 题目链接 《牛客网》:重建二叉树 二、实现代码 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java . util . HashMap ; public class Solution { private int [ ] pre ; private int [ ] in ; private HashMap < Integer , Integer > map = new HashMap < > ( ) ; public TreeNode reConstructBinaryTree ( int [ ] pre , int [ ] in ) { this . pre = pre ; this .