自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 问答 (2)
  • 收藏
  • 关注

原创 剑指 Offer 39.数组中出现次数超过一半的数字

剑指 Offer 39.数组中出现次数超过一半的数字我能想到的:哈希表统计法: 遍历数组 nums ,用 HashMap 统计各数字的数量,即可找出 众数 。此方法时间和空间复杂度均为 O(N)O(N) 。数组排序法: 将数组 nums 排序,数组中点的元素 一定为众数。大佬的题解摩尔投票法: 核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N) 和 O(1)O(1) ,为本题的最佳解法。代码:class Solution { public int majo

2020-12-29 10:53:45 67

原创 剑指 Offer 32 -2.从上到下打印二叉树2

剑指 Offer 32 -2.从上到下打印二叉树2这题就是二叉树的层序遍历,跟广度优先搜索一样,用一个队列来保存当前正在搜索的结点。这题要求每一层都要保存在一个新的数组里,因此我们需要记录下每一层的结点个数(即每次循环前队列的size)将根节点入队,此时队列size=1,然后对队头进行拓展,将队头的子节点入队,队头出队,新建一个数组,保存队头。此时队列的size就等于第二层结点的个数,重复此过程,直到队列为空class Solution { public List<List<I

2020-12-17 14:43:23 69

原创 java集合类的创建方式

java集合类的创建方式常常因为不会创建集合类的语法而浪费时间。。集合可以看作一个容器,集合中的对象可以很容易存放到集合中,也很容易将其从集合中取出来,还可以按一定的顺序摆放。Java中提供了不同的集合类,这些类具有不同的存储对象的方式,并提供了相应的方法方便用户对集合进行遍历。集合的长度是可变的,用来存放对象的引用。常见的集合类有List集合、Set集合、Map集合。  下面举一个实例,看看如何创建并添加修改集合元素。 1 import java.util.Iterator; 2 impor

2020-12-17 14:31:06 9806

原创 剑指Offer 30.包含min函数的栈

剑指Offer 30.包含min函数的栈解法一(辅助栈):要保证min函数的时间复杂度为O(1),就要增加额外的空间来保存最小值,这里增加一个栈B来保存每次加入的最小值。保证栈B的顶部都是最新的最小值。当栈A删除掉最小值时,栈B也要删掉最小值,这时栈B的顶部就是上一次加入的最小值。并且A栈会比B栈先空。class MinStack { /** initialize your data structure here. */ LinkedList<Integer> stac

2020-12-17 13:30:27 61

原创 剑指 Offer 29.顺时针打印矩阵

剑指 Offer 29.顺时针打印矩阵大佬的解法:好难啊。但是还是复述一遍大佬的解法:如果matrix为空,直接return new int[0],判断数组为空的方法:二维数组为空,要检查三个部分:一是数组首地址是否为空二是是否为{},也就是array.length == 0的情况三是{{}},这时array.length = 1,但是array[0].length == 0。满足任意一个条件就可以返回false了。if(array == null || array.length == 0

2020-12-16 15:02:30 60

原创 剑指 Offer 28.对称的二叉树

剑指 Offer 28.对称的二叉树啊好难,我不会。记录一下大佬的题解:class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; else return recur(root.left,root.right); } public boolean recur(TreeNode L, TreeNode R) {

2020-12-16 11:20:40 62

原创 剑指Offer 27.二叉树的镜像

剑指Offer 27.二叉树的镜像利用栈或者队列实现:将根节点入队,再出队,将该结点的左右子树入队,交换该结点的左右子树,再将队列中的结点出队,交换该结点的左右子树,重复此步骤,直到队列为空。返回根节点。class Solution { public TreeNode mirrorTree(TreeNode root) { if(root == null) return null; Queue<TreeNode> tree = new Linke

2020-12-15 14:25:32 82

原创 剑指 Offer 25.合并两个排序的链表

剑指 Offer 25.合并两个排序的链表定义一个伪头结点head,再定义一个临时指针cur=head,判断l1和l2的值的大小,让cur指向较小的结点,重复此步骤,直到l1或者l2为空,最后让cur指向剩下的结点。注意:一开始不能让cur指向l1或者l2,这样会形成循环指针,一定要让cur先指向一个伪结点。代码:class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode

2020-12-15 13:42:35 103

原创 剑指 Offer 24.反转链表

剑指 Offer 24.反转链表创建三个指针,pre,cur,temp指针,让pre指针指向null,cur指针指向头结点,temp指针指向cur的下一个节点,然后让cur节点指向pre,pre移动到cur,cur再移动到temp,temp再移动到cur下一个节点,重复执行这个步骤,直到temp指向空,最后再让cur指向pre,返回cur,结束。class Solution { public ListNode reverseList(ListNode head) { List

2020-12-14 23:46:44 91

原创 剑指 Offer 22.链表中倒数第K个节点

剑指 Offer 22.链表中倒数第K个节点普通解法:遍历链表,记录节点个数,然后返回第n-k个节点。聪明的解法:定义pre,cur指针指向头结点,cur指针先移动k步,然后pre指针跟cur指针一起移动,直到cur到达链表尾部,此时pre指针刚好指向倒数第k个节点。class Solution { public ListNode getKthFromEnd(ListNode head, int k) { ListNode pre,cur; pre = hea

2020-12-14 22:44:52 51

原创 剑指Offer 21.调整数组顺序使奇数位于偶数前面

剑指Offer 21.调整数组顺序使奇数位于偶数前面类似快排,定义两个指针,i,j,i指向最左端,j指向最右端,j从右向左遍历,找到一个奇数为止,i从左向右遍历,找到一个偶数为止,交换i,j的值。一直重复这个操作,直到i=j为止,返回nums[]数组。代码:class Solution { public int[] exchange(int[] nums) { int i,j; i = 0; j = nums.length-1

2020-12-13 17:19:23 45

原创 剑指Offer 18.删除链表的节点

剑指Offer 18.删除链表的节点双指针法:定义两个ListNode pre,temp;pre指向前一个节点,temp指向当前节点,当temp的值等于目标值时,让pre指向temp的下一个节点,temp指向空,就成功删除目标节点了。代码:class Solution { public ListNode deleteNode(ListNode head, int val) { ListNode pre = head; ListNode temp = he

2020-12-13 15:11:22 39

原创 剑指Offer 17.打印从1到最大的n位数

剑指Offer 17.打印从1到最大的n位数如果只是int大小的数很简单,代码如下:class Solution { public int[] printNumbers(int n) { int size = (int) Math.pow(10,n); int[] a = new int[size-1]; for(int i = 1; i < size; i++) { a[i-1] = i;

2020-12-12 23:38:46 41

原创 剑指 Offer 42.连续子数组的最大和

剑指 Offer 42.连续子数组的最大和讲不清楚,贴上大佬的图:蠢蠢的代码:class Solution { public int maxSubArray(int[] nums) { int max = nums[0]; for(int i = 1; i < nums.length; i++) { if(nums[i-1] <= 0) nums[i] = nums[i]; else if(nums

2020-12-12 22:42:36 94 2

原创 剑指Offer 15.二进制中1的个数

剑指Offer 15.二进制中1的个数通过右移再跟1进行与运算,就可以得到最右边一位数,再判断这个数是1还是0 ,是1的话则count++public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count=0; while(n!=0) { count+=n&1;

2020-12-12 12:33:38 41

原创 剑指Offer 11.旋转数组的最小数字

剑指Offer 11.旋转数组的最小数字简单法:遍历数组,找到第一个左边的数大于右边,就返回右边的数,时间复杂度O(n)。class Solution { public int minArray(int[] numbers) { for(int i = 0; i < numbers.length-1; i++) { if(numbers[i] > numbers[i+1]) return numbers[i+1];

2020-12-11 17:42:02 52

原创 剑指Offer 10-II. 青蛙跳台阶问题

剑指Offer 10-II. 青蛙跳台阶问题**思路:**通过计算1、2、3、4、5级台阶总共有1,2,3,5,8种跳法,发现每个数都是前两个数相加,可以猜到是斐波那契数列,至于为什么,npy想到了:拿5级台阶举个例子, 5级台阶是4级台阶再加一级或者3级台阶再加两级,因为第一步可以跳1级台阶或者两级,所以5级台阶的跳法可以看成是4级台阶的跳法与3级台阶的跳法之和。以此类推,每个台阶的跳法都等于前两级台阶的跳法之和。这就是斐波那契数列。代码:class Solution { public

2020-12-10 15:19:16 140

原创 剑指Offer 10-1.斐波那契数列

剑指Offer 10-1.斐波那契数列图解:代码:class Solution { public int fib(int n) { int a=0,b=1; int sum=0; if(n == 1) return 1; if(n == 0) return 0; for(int i = 0; i < n-1; i++) { sum = (a + b) % 1000000007

2020-12-10 14:53:57 43

原创 剑指Offer 09.用两个栈实现队列

剑指Offer 09.用两个栈实现队列题目描述:**思路:**用一个栈A接收数据,再把栈A的数据存入栈B,就实现的栈的倒序再倒序。对A的操作很简单,一个push就行了,对B的pop就要分情况讨论了。第一种:B不为空,那就直接pop第二种:B为空,A不为空,那就把A中的元素全部倒入B,记住,一定要全部倒入B!否则就跟A直接pop没区别。第三种:B为空,A也为空,直接return -1。代码:class CQueue {Stack<Integer> A; Stack<Int

2020-12-10 12:04:12 57

原创 剑指Offer 06. 从尾到头打印链表

剑指Offer 06. 从尾到头打印链表题目描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000这题我用了两种方法,第一种:栈代码:public int[] reversePrint(ListNode head) { Stack<Integer> stack=new Stack<>(); in

2020-12-05 22:17:31 47

原创 剑指Offer 05.替换空格

剑指Offer 05.替换空格题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000很简单的题目,要么遍历要么调用API,string.replace(" “,”%20");调用API直接就击败100%的用户了...

2020-12-05 21:38:10 45

原创 剑指offer 03.数组中重复的数字

剑指offer 03.数组中重复的数字题目描述:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000思路:遍历数组,通过交换,将每个数存到对应的下标处,比如把2存到nums[2]处,同时交换过程中通过异或运算判

2020-12-05 16:04:00 67

空空如也

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

TA关注的人

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