刷题
padawan75
这个作者很懒,什么都没留下…
展开
-
【按照Tag刷剑指】堆、栈
这里写目录标题1 堆、栈1.1 基础知识Stack栈Deque双端队列TopK问题Arrays类PriorityQueue类(最小堆)TreeMap类1.2 题目[剑指 Offer 09. 用两个栈实现队列](https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/)[剑指 Offer 30. 包含min函数的栈](https://leetcode-cn.com/problems/bao-han-minhan-shu原创 2020-09-21 17:12:04 · 106 阅读 · 0 评论 -
【刷题-剑指 Offer】 56 - II. 数组中数字出现的次数 II
题目在一个数组nums中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。方法一:位运算找到了一个看得懂的答案。java的int类型是32位,可以表示-2^31——2^31。最前面的一位是符号位,正数0,负数1。eg:0000 000000000000000000000000 01011.左移<<左移1位后符号位会被保留,数值位左移一位,低位补0,变为: 0000000000000000000...原创 2020-09-03 15:23:02 · 239 阅读 · 0 评论 -
【刷题-剑指 Offer 】18. 删除链表的节点
题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为5的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为1的第三个节点,那么在调用了你的函数之后,该链表应变为 4...原创 2020-08-26 17:37:50 · 107 阅读 · 0 评论 -
【刷题-剑指 Offer 42】. 连续子数组的最大和
题目输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。我的解法:class Solution { public int maxSubArray(int[] nums) { if(nums.length==0) return 0; for(int i=1;i<nums.length;i++){ if(nums[i-1]+nums[i]>nums[i]){ nums[i]=nums[i..原创 2020-08-26 17:01:55 · 112 阅读 · 0 评论 -
【刷题-剑指 Offer】 52. 两个链表的第一个公共节点
题目输入两个链表,找出它们的第一个公共节点。设交集链表长c,链表1除交集的长度为a,链表2除交集的长度为b,有a + c + b = b + c + a 若无交集,则a + b = b + apublic class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode h1 = headA, h2 = he...原创 2020-08-26 15:49:48 · 111 阅读 · 0 评论 -
【刷题-剑指 Offer】 21. 调整数组顺序使奇数位于偶数前面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。我的解法:class Solution { public int[] exchange(int[] nums) { int i=0,j=nums.length-1; while(i<j){ while(i<j&&nums[i]%2==1) i++; while(i<j&&nums[j]%2==0.原创 2020-08-26 11:52:04 · 85 阅读 · 0 评论 -
【刷题-剑指 Offer】 57. 和为s的两个数字
题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。原创 2020-08-26 10:59:47 · 125 阅读 · 0 评论 -
【刷题-剑指 Offer】 39. 数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000我的解法:class Solution { public int majorityElement(int[] nums) { Arrays.sort(nums); return nums[nums.l..原创 2020-08-25 17:52:53 · 167 阅读 · 0 评论 -
【刷题-剑指 Offer】 28. 对称的二叉树
题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。方法一:递归class Solution { public boolean isSymmetric(TreeNode root) { return root == null ? true : recur(root.left, root.right); } boolean recur(TreeNode L, TreeNode R) { .原创 2020-08-25 12:03:46 · 93 阅读 · 0 评论 -
【刷题-剑指 Offer】 32 - II. 从上到下打印二叉树 II
题目从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。层序遍历(递归)class Solution { List<List<Integer>> node=new ArrayList(); public List<List<Integer>> levelOrder(TreeNode root) { lei(root,0); return node; }..原创 2020-08-25 11:18:19 · 107 阅读 · 0 评论 -
【刷题-剑指 Offer 】15. 二进制中1的个数
题目请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。这题有一个很牛逼的解法……但俺看不懂()class Solution {public: int hammingWeight(uint32_t n) { n = (n & 0x55555555) + ((n >> 1) & 0x55555555); ...原创 2020-08-21 17:54:38 · 153 阅读 · 0 评论 -
【刷题-剑指 Offer】 09. 用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )哈哈哈哈这题,题目看不懂!然后去评论里看了一眼!有大佬解释了一下!然后这里还有一个知识点 Deque:https://www.jianshu.com/p/d78a7c982edbhttps://blog.csdn.net/u013967628/ar...原创 2020-08-21 16:52:45 · 122 阅读 · 0 评论 -
【刷题-剑指 Offer】25. 合并两个排序的链表
题目输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。我的解法:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode mergeTwoLists(原创 2020-08-21 16:15:22 · 120 阅读 · 0 评论 -
【刷题-剑指 Offer】 54. 二叉搜索树的第k大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。我的解法:(中序遍历) /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public int kthLarges原创 2020-08-21 15:30:37 · 132 阅读 · 0 评论 -
【刷题-剑指 Offer 】27. 二叉树的镜像
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。我的解法:每次返回的root都是左右已经交换过的结点。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Soluti...原创 2020-08-19 17:29:20 · 107 阅读 · 0 评论 -
【刷题-剑指 Offer】 22. 链表中倒数第k个节点
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。我的解法:看了题解,我这种解法是双指针。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next;原创 2020-08-19 16:28:16 · 116 阅读 · 0 评论 -
【刷题-剑指 Offer 】55 - I. 二叉树的深度
题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。我的解法:这里用的是后续遍历~class Solution { public int maxDepth(TreeNode root) { if(root==null) return 0; int l=maxDepth(root.left); int r=maxDepth(root.right); return (l>原创 2020-08-19 15:35:25 · 95 阅读 · 0 评论 -
【刷题-剑指 Offer】 58 - II. 左旋转字符串
题目字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。我的方法:没看清题目,最开始取模有点多余了。因为k是小于s的长度了。class Solution { public String reverseLeftWords(String s, int n) { int l=n%s.length(); StringBuil.原创 2020-08-19 15:09:11 · 79 阅读 · 0 评论 -
【刷题-剑指 Offer】 06. 从尾到头打印链表
题目输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。我的解法:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public int[] reversePrint(ListNod原创 2020-08-17 16:47:31 · 149 阅读 · 0 评论 -
【刷题-剑指 Offer】 05. 替换空格
题目请实现一个函数,把字符串s中的每个空格替换成"%20"。我的解法:class Solution { public String replaceSpace(String s) { StringBuilder result = new StringBuilder(); for(int i = 0 ; i < s.length(); i++){ char c = s.charAt(i); ...原创 2020-08-14 11:12:09 · 175 阅读 · 0 评论 -
【刷题-剑指 Offer】 04. 二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。我的方法:暴力出奇迹!(x) 最开始的时候想尝试行和列都进行二分法,但是发现没办法推进下去。当给的target比数组中间位置的数要小的时候结果正确,但target比中间位置数大的时候就不对。然后看了方法一的思路,才知道自己为什么会出现这种情况!时间复杂度:O(nm) 空间复杂度:O(1) ...原创 2020-08-14 09:52:03 · 102 阅读 · 0 评论 -
【刷题-剑指offer】03. 数组中重复的数字
题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。我的解法:时间复杂度:O(n) 空间复杂度:O(n)哈哈哈对于这类就很喜欢用桶。把大家都按下标放到桶里。如果大于1就是重复的~class Solution { public int findRepeatNumber(int[] nums) { int[] barrels=n..原创 2020-08-13 10:14:45 · 159 阅读 · 0 评论 -
【刷题】104. 二叉树的最大深度
题目给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点方法一(递归):如果我们知道了左子树和右子树的最大深度 l和 r,那么该二叉树的最大深度即为max(l,r)+1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。我的答案(递归)...原创 2020-07-28 16:18:44 · 175 阅读 · 0 评论 -
【刷题】410. 分割数组的最大值
题目:给定一个非负整数数组和一个整数m,你需要将这个数组分成m个非空的连续子数组。设计一个算法使得这m个子数组各自和的最大值最小。注意:数组长度n满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)方法一:二分法由题意可知:子数组的最大值是有范围的,即在区间 [nums的最大元素值,nums的元素之和]之中。令 left=nums的最大元素值,right=nums的元素之和,mid=(left+right)/2.计算数组和最大值不大于...原创 2020-07-25 17:31:37 · 230 阅读 · 0 评论 -
【刷题】剑指 Offer 11. 旋转数组的最小数字
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。方法一:二分法旋转数组总是左边的子序列大于右边的子序列,所以在找最小值的时候可以使用二分法。设置 ii, jj 指针分别指向 numbers 数组左右两端,m = (i + j) /2 为每次二分的中点当 numbers[m] > number...原创 2020-07-22 15:17:57 · 89 阅读 · 0 评论 -
【刷题】95. 不同的二叉搜索树 II
题目给定一个整数n,生成所有由 1 ...n为节点所组成的二叉搜索树。二叉搜索树二叉搜索树(又:二叉排序树,二叉查找树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(左小右大)方法一:递归思路:我们只需要把 1 作为根节点,[ ] 空作为左子树,[ 2 ... n ] 的所有可能作为右子树。2 作为根节点,[ 1 ] 作为左子...原创 2020-07-21 12:55:43 · 131 阅读 · 0 评论 -
【刷题】167. 两数之和 II - 输入有序数组
题目方法一:二分查找原创 2020-07-21 10:17:52 · 163 阅读 · 0 评论 -
【刷题】785. 判断二分图
官方思路:如果给定的无向图连通,那么我们就可以任选一个节点开始,给它染成红色。随后我们对整个图进行遍历,将该节点直接相连的所有节点染成绿色,表示这些节点不能与起始节点属于同一个集合。我们再将这些绿色节点直接相连的所有节点染成红色,以此类推,直到无向图中的每个节点均被染色。如果我们能够成功染色,那么红色和绿色的节点各属于一个集合,这个无向图就是一个二分图;如果我们未能成功染色,即在染色的过程中,某一时刻访问到了一个已经染色的节点,并且它的颜色与我们将要给它染上的颜色不相同,也就说明这个无...原创 2020-07-16 19:35:57 · 103 阅读 · 0 评论