剑指offe67题 牛客网
become__better
大胆去问,大胆去做,效率
展开
-
关于剑指Offer刷题的一些个人理解
题目不在于多,而对于精,你可能把这些题都写了一遍,但下次不一定能答上来。我就卡在之字形打印树和反转链表这两道题上(当时有点沙雕了)。另外不管你把这些题写了几遍,看一看剑指offer这本书还是会受益匪浅的。我觉得如果把剑指offer真的写会了,直接去刷LeetCode上的hard题就可以了。...原创 2020-10-31 08:55:16 · 610 阅读 · 0 评论 -
剪绳子
用DP来实现当绳子长度为2,3时需要特判。其他情况f[i]=Math.max(f[i],j*f[i-j]);public class Solution { public int cutRope(int target) { if(target==2){ return 1; } if(target==3){ return 2; } int f[]=new int[ta原创 2020-10-31 08:45:36 · 81 阅读 · 0 评论 -
机器人的运动范围
简单的一道广搜题,我看大部分题解都是用二维数组来标记是否点被访问过,可能会造成空间浪费,用HashMap以String作为key的方法来解一下。import java.util.*;class Node{ int x,y; Node(int x,int y){ this.x=x; this.y=y; }}public class Solution { static HashMap<String,Boolean>map;原创 2020-10-24 09:50:26 · 79 阅读 · 0 评论 -
矩阵中的路径
public class Solution { boolean flag=false; int xx[]={-1,1,0,0}; int yy[]={0,0,1,-1}; boolean vis[][]; public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { vis=new boolean[rows][cols]; int l=str.le原创 2020-10-20 21:07:42 · 366 阅读 · 0 评论 -
滑动窗口的最大值
使用了单调队列,队列最长为size,队列的元素顺序是从大到小,因为一个元素位置靠前,并且值很小,那它就不可能被取到。两个关系if(当前元素位置-队首元素位置>=size) 队首元素出队while(当前元素大于队尾元素) 队尾元素出队代码如下;//package Demo1;import java.util.*;public class Solution { public ArrayList<Integer> maxInWindows(int原创 2020-10-06 15:08:25 · 79 阅读 · 0 评论 -
数据流中的中位数
思想:建立两个排序碓(优先队列),大根堆和小根堆。个数为奇数时,元素存大根堆,放count-count/2的小数。个数为偶数时,元素存小根堆,放count/2的大数。当个数为奇数时if(元素>小根堆的堆顶) swap(元素,小根堆的堆顶)元素加入大根堆偶数时if(元素<大根堆的堆顶) swap(元素,大根堆的堆顶)元素加入小根堆代码如下import java.util.Comparator;import java.util.PriorityQueu原创 2020-10-06 14:42:33 · 92 阅读 · 0 评论 -
二叉搜索树的第k个结点
/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { TreeNode node; int num; int m; TreeNode KthNode(Tr原创 2020-09-30 21:18:09 · 82 阅读 · 1 评论 -
序列化二叉树
/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { String ss; int k; String Serialize(TreeNode root) {//序原创 2020-09-30 21:11:53 · 83 阅读 · 0 评论 -
把二叉树打印成多行
import java.util.ArrayList;import java.util.Queue;import java.util.LinkedList;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public c原创 2020-09-20 20:36:49 · 75 阅读 · 0 评论 -
按之字形顺序打印二叉树
import java.util.ArrayList;import java.util.Stack;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public Ar原创 2020-09-20 18:33:00 · 61 阅读 · 0 评论 -
对称的二叉树
/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { boolean flag=true; boolean isSymmetrical(TreeNode pRoot)//原创 2020-09-16 19:46:08 · 58 阅读 · 0 评论 -
二叉树的下一个结点
/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode next = null; TreeLinkNode(int val) { this.val = val; }}*/public class Solution { TreeLinkNode ans=null; pu原创 2020-09-15 19:58:26 · 82 阅读 · 0 评论 -
删除链表中重复的结点
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode deleteDuplication(ListNode pHead)///使用了辅助空间 避免了头结点需要删除的复杂情况 { if(pHead==n原创 2020-09-14 18:31:24 · 109 阅读 · 0 评论 -
链表中环的入口结点
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode fast=pHead; ListNode原创 2020-09-13 20:59:37 · 86 阅读 · 0 评论 -
字符流中第一个不重复的字符
import java.util.Queue;import java.util.LinkedList;public class Solution { //Insert one char from stringstream int a[]=new int[128];///存储字符出现的次数 Queue<Character>queue=new LinkedList<Character>();///存储只出现一次的字符 public void Inser原创 2020-09-12 15:46:38 · 64 阅读 · 0 评论 -
表示数值的字符串
public class Solution { public boolean isNumeric(char[] str) {///模拟 字符串根据e E分成两部分 int l=str.length; int i; int flag=0;///小数点出现的次数 boolean num=false; for(i=0;i<l;i++){//第一部分 if(i==0&&(str[i]原创 2020-09-11 17:34:57 · 67 阅读 · 0 评论 -
正则表达式匹配
public class Solution { public boolean match(char[] str, char[] pattern)//本题注意str不含'.'和'*' { int l1=str.length; int l2=pattern.length; return dfs(str,0,l1,pattern,0,l2);//此题利用递归来实现 } boolean dfs(char []str,int k1,int原创 2020-09-10 09:53:57 · 81 阅读 · 0 评论 -
构建乘积数组
类似于前缀和的思想。分成两次循环求B[k],从0到k-1一次,从k+1到一次。第一次循环B[k]=B[k-1]*A[i-1]第二次循环B[k]=B[k] * 后缀积import java.util.ArrayList;public class Solution { public int[] multiply(int[] A) { int l=A.length;...原创 2020-03-09 19:41:26 · 81 阅读 · 0 评论 -
数组中重复的数字
public class Solution { // Parameters: // numbers: an array of integers // length: the length of array numbers // duplication: (Output) the duplicated number in the a...原创 2020-03-09 11:20:53 · 108 阅读 · 0 评论 -
把字符串转换成整数
注意溢出的处理public class Solution { int solve(char c){ if(c>'9') return -1; if(c<'0') return -1; return c-'0'; } public int StrToInt(Strin...原创 2020-03-09 11:13:27 · 112 阅读 · 0 评论 -
不用加减乘除做加法
异或表示不进位的相加结果,并表示进位的结果,不断运算,进位是低位不断消失的。public class Solution { public int Add(int num1,int num2) { int n; int m; do{ m=num1^num2; n=num1&num2; ...原创 2020-03-08 15:36:15 · 84 阅读 · 0 评论 -
求1+2+3+...+n
很巧妙,利用&&之前为false,其后就不执行的特性。public class Solution { public int Sum_Solution(int n) { int sum=n; boolean flag=(sum>0)&&((sum+=Sum_Solution(n-1))>0); re...原创 2020-03-08 15:11:01 · 211 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)
队列的应用import java.util.LinkedList;import java.util.Queue;public class Solution { public int LastRemaining_Solution(int n, int m) { if(n<1) return -1; Queue<Integer>queu...原创 2020-03-08 15:08:29 · 171 阅读 · 0 评论 -
扑克牌顺子
简单的模拟,除了大小王之外,牌不能重复,以及距离不能超过5.public class Solution { public boolean isContinuous(int [] numbers) { int l=numbers.length; if(l!=5) return false; int a[]=new int [14]; ...原创 2020-03-08 15:06:52 · 120 阅读 · 0 评论 -
翻转单词顺序列
String的split()方法的应用public class Solution { public String ReverseSentence(String str) { int l1=str.length(); if(l1<=1) return str; int flag=0; for(int i=0;i<...原创 2020-03-08 15:03:33 · 75 阅读 · 0 评论 -
左旋转字符串
StringBuilder的简单应用public class Solution { public String LeftRotateString(String str,int n) { StringBuilder s=new StringBuilder(str); int l=str.length(); if(l==0) ...原创 2020-03-08 15:01:42 · 80 阅读 · 0 评论 -
和为S的两个数字
和相等,乘积最小,那么两个加数的差尽可能大。设置两个指针,一个在首部,一个在尾部,如果两者之和等于sum,返回终止程序;如果两者之和大于sum,向前移动尾指针;两者之和小于sum,向后移动头指针。import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersW...原创 2020-03-08 15:00:14 · 87 阅读 · 0 评论 -
和为S的连续正数序列
成立分两种情况:1. 序列长度为奇数m时,序列的平均数为整数,那么sum%m=0,并且序列第一个数为正数。2. 序列长度为奇数n时,序列的平均数为小数,并且小数部分是0.5,那么2*sum%m=0,并且序列第一个数为正数。连续正数序列的平均数就是中位数。import java.util.ArrayList;public class Solution { public ArrayL...原创 2020-03-08 14:31:28 · 91 阅读 · 0 评论 -
数组中只出现一次的数字
我们知道N^ N=0;假设数组中A和B只出现一次,那么数组异或之和sum=A^B。转换成二进制,A与B肯定在某一位不同,一个为0,一个为1,我们以这一位来划分数组为0派和1派,0派和1派的异或和分别为A和B。//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果public class Solution { public void Fi...原创 2020-03-06 20:59:47 · 109 阅读 · 0 评论 -
平衡二叉树
开始时,想是否先判断它是不是二叉搜索树,后来发现只要满足下面条件就可以了。它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树//import java.util.math;public class Solution { boolean flag; public boolean IsBalanced_Solution(TreeN...原创 2020-03-06 20:48:19 · 88 阅读 · 0 评论 -
二叉树的深度
简单的递归/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { ...原创 2020-03-06 20:42:44 · 72 阅读 · 0 评论 -
数字在排序数组中出现的次数
用两次不同的二分即可确定左右界限,相减即可。public class Solution { int minn(int a[],int l,int r,int x){ while(l<r){ int mid=(l+r)/2; if(a[mid]>=x){ r=mid; ...原创 2020-03-06 20:41:46 · 69 阅读 · 0 评论 -
两个链表的第一个公共结点
存在公共结点一定在尾部。如果两个链表长度相同,只要边遍历边判断即可,发现第一个公共结点。如果长度不相同,就需要再考虑。在图一中,p1的长度为L1,p2长度为L2,p1需要先走(L1-L2)步,然后再一起遍历,就会发现第一个公共结点。问题在于p1先走L1-L2步。我们遍历两遍链表即可完成,第一遍时p2会比p1早(L1-L2)步遍历完链表,让p2=p1.head,当p1遍历完时,让p1=p2.he...原创 2020-03-06 20:39:19 · 130 阅读 · 0 评论 -
数组中的逆序对
使用归并排序,在递归合并的过程中,记录前数组与后数组的逆序对,不断累加即可。public class Solution { final int mod=1000000007; int sum; int b[]; public int InversePairs(int [] array) { int l=array.length; b...原创 2020-03-04 21:45:39 · 85 阅读 · 0 评论 -
第一个只出现一次的字符
使用map记录他们出现的位置(如果只出现一次),取最小值即可。import java.util.*;import java.util.Map.Entry;///public class Solution { public int FirstNotRepeatingChar(String str) { HashMap<Character,Integer>ma...原创 2020-03-04 21:42:46 · 98 阅读 · 0 评论 -
丑数
public class Solution { public int GetUglyNumber_Solution(int index) { if(index==0)return 0; int a[]=new int[index]; a[0]=1; int p2=0; int p3=0; int...原创 2020-03-04 10:30:04 · 75 阅读 · 0 评论 -
把数组排成最小的数
重写compareTo方法,利用Collections对字符串进行排序,连接即可。import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;//import java.unti.Collections;class Num implements Comparable{ Stri...原创 2020-03-04 09:33:32 · 114 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
依次得出个位十位… 上1的个数,进行相加即可。public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int sum=0; for(int m=1;m<=n;m=m*10){ int x=n/(m*10); s...原创 2020-03-04 09:29:12 · 101 阅读 · 0 评论 -
连续子数组的最大和
简单的动态规划maxn[i]=max(maxn[i-1]+array[i],array[i]);maxn[0]=maxn(array[0],0)public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int maxn=array[0]; int sum=0;...原创 2020-03-04 09:20:45 · 123 阅读 · 0 评论 -
最小的K个数
设置大小为K的大根堆,当堆外元素小于堆顶,将其置换更新。到最后堆中元素,即为所求。import java.util.ArrayList;public class Solution { int heap[]; int n; public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int ...原创 2020-03-04 09:03:33 · 125 阅读 · 0 评论