刷题笔记
数据结构与算法刷题记录,PTA,LeetCode等
Anton丶
前路不尽,心已明,行将远......
展开
-
【剑指 Offer 40】最小的k个数
因为是输出最小的 k 个数,索引从 0 开始,所以当基准数为 k+1 小的数时,这个基准数的左边子数组就是我们要找的 k 个数,也就是基准数索引为 k 时。例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4。若 k < 基准数索引 ,代表第 k+1 小的数字在 左子数组 中,则递归左子数组。若 k > 基准数索引 ,代表第 k+1 小的数字在 右子数组 中,则递归右子数组。输入:arr = [0,1,2,1], k = 1。输出:[1,2] 或者 [2,1]原创 2023-08-09 09:58:05 · 1003 阅读 · 0 评论 -
【剑指 Offer 39】数组中超过一半的数字
遍历数组,是众数 +1,不是众数 -1,为 0 就接着继续重新来。数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]使用一个 map,key 存数组中的数字,val 存出现的次数。众数和非众数投票,初始票数为 0,为 0 时假设当前数字为众数。将数组排序,出现次数超过一半的数字肯定在数组中间的那个位置。你可以假设数组是非空的,并且给定的数组总是存在多数元素。当有数字出现次数超过数组长度一半时,直接返回。原创 2023-08-09 09:56:38 · 839 阅读 · 0 评论 -
【剑指 Offer 32】从上到下打印二叉树 II
循环拿出队列中现有的所有结点,也就是本层节点,共 queue.size() 个,采用 i–的方式循环,因为队列在不停出队,长度是变化的。拿出每一个结点加入到一个 list,即本层的索引结点,然后判断本层节点的左右结点是否存在,存在就加入到对列中,为下层的节点。从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。题目要求从上到下按层打印二叉树,也就是二叉树的广度优先搜索(BFS)将本层节点的 list 加入到结果集合,开始下层循环。头结点先入队(需要先判断头结点不为空,防止空指针)原创 2023-08-07 11:11:33 · 287 阅读 · 0 评论 -
【剑指 Offer 27】二叉树的镜像
root 的左右结点都为空,代表这棵子树只有根结点了,不需要交换直接返回。先出栈 node,如果 node 的左右子结点哪个不为空,就入栈,然后交换 node 的左右子结点。请完成一个函数,输入一个二叉树,该函数输出它的镜像。输入:root = [4,2,7,1,3,6,9]先 new 一个辅助栈,将头结点入栈,然后开始循环。二叉树的镜像,就是交换二叉树的每个节点的左右结点。栈其实就是遍历所有节点,然后交换左右子节点。递归是自下而上交换,栈是自上而下进行交换。输出:[4,7,2,9,6,3,1]原创 2023-08-03 10:25:27 · 207 阅读 · 0 评论 -
【剑指 Offer 25】 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。因为 l1,l2 都是递增的,我们可以从头比较,交替的拿出每次较小的头结点。当其中一个链表被全部拿出时,另一个可以直接连接在新链表的后边。因为要存放新的顺序,可以定义一个虚拟的辅助结点。输入:1->2->4, 1->3->4。输出:1->1->2->3->4->4。最后从辅助结点的下一个开始返回即可。原创 2023-08-02 10:07:41 · 228 阅读 · 0 评论 -
【剑指 Offer 22】链表中倒数第 k 个节点
可以使用快慢指针,开始快慢指针都指向 head 结点,先让快指针走 k 步,然后快慢指针一块走,当快指针为空时,慢指针指向的就是该链表中倒数第 k 个节点。题目要输出该链表中倒数第 k 个节点,第一时间想到计算链表的长度 n,然后从头开始走 n-k 步,得到的结点就是该链表中倒数第 k 个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾节点是倒数第 1 个节点。原创 2023-08-01 10:05:09 · 129 阅读 · 0 评论 -
剑指offer-11-旋转数组的最小数字(Java)
请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为 1。注意,数组 [a[0], a[1], a[2], …, a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], …, a[n-2]]。把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入:numbers = [3,4,5,1,2]输入:numbers = [2,2,2,0,1]原创 2023-07-17 10:41:28 · 369 阅读 · 0 评论 -
剑指offer-06-从尾到头打印链表
想要用数组倒序存储链表,如果知道长度的话,可以利用索引很简单的存入;输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。:利用递归,走到链表的末尾,在回溯时保存结点,即实现倒序;输入:head = [1,3,2]:利用栈先进后出的特性;输出:[2,3,1]原创 2023-07-11 08:48:25 · 220 阅读 · 0 评论 -
剑指offer-03-数组中重复的数字
数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。:数组长度n中数字范围为0~n-1,可以想到 数组元素的 索引 和 值 是 一对多 的关系,每次将数字n换到索引n位置,nums[n] == n时重复;:找任意一个重复数字,那我就找第一个重复的,数组是无序的,需要排序,循环比较 i 和 i+1 个数字,相等输出nums[i];:很容易想到HashSet,不能存在相同的数,可以再添加前进行contains判断,已存在直接返回;找出数组中重复的数字。原创 2023-07-11 08:45:46 · 331 阅读 · 0 评论 -
[剑指 Offer 62]圆圈中最后剩下的数字(约瑟夫环问题:动态规划)
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。原创 2022-11-30 19:13:44 · 288 阅读 · 0 评论 -
[剑指 Offer 53 - I]在排序数组中查找数字 I
排序数组查找,首先想到二分法。原创 2022-11-25 08:54:18 · 318 阅读 · 0 评论 -
[剑指 Offer 40]最小的k个数
利用快速排序划分数组。原创 2022-11-24 09:00:58 · 184 阅读 · 0 评论 -
[剑指 Offer]数组中出现次数超过一半的数字
方法一:哈希表统计法。方法二:排序取中位数。原创 2022-11-22 09:46:02 · 156 阅读 · 0 评论 -
[剑指 Offer 29]顺时针打印矩阵
顺时针打印矩阵顺时针打印矩阵。原创 2022-11-19 09:07:05 · 144 阅读 · 0 评论 -
[剑指 Offer 28]对称的二叉树
【代码】[剑指 Offer 28]对称的二叉树。原创 2022-11-18 10:32:10 · 259 阅读 · 0 评论 -
[剑指 Offer 27]二叉树的镜像
方法二:利用辅助栈遍历树的所有节点,并交换每个结点的左/右子节点。方法一:递归遍历二叉树交换每个结点的左右结点。原创 2022-11-17 11:48:36 · 390 阅读 · 0 评论 -
[剑指 Offer 24] 反转链表
leetcode反转链表原创 2022-11-16 14:03:55 · 350 阅读 · 0 评论 -
[剑指 Offer 11]旋转数组的最小数字
如果numbers[mid] == numbers[j] ,j- -,既缩小了区间,又不会导致旋转点丢失。因为numbers是经过有序数组旋转得来的,所以现在就是找右边数组的第一个元素(旋转点)如果numbers[mid] > numbers[j],则旋转点肯定在mid右边。如果numbers[mid] < numbers[j],则旋转点肯定在mid左边。则 numbers[mid] 和 numbers[j] 进行比较。有序数组问题可以选择使用二分法:i,mid,j。将numbers数组看成左右两个部分。原创 2022-11-14 10:58:42 · 260 阅读 · 0 评论 -
[剑指 Offer 10- I]斐波那契数列
【代码】[剑指 Offer 10- I]斐波那契数列。原创 2022-11-11 11:18:39 · 365 阅读 · 0 评论 -
[剑指 Offer 06]从尾到头打印链表
剑指 Offer 06]从尾到头打印链表。[剑指 Offer 06]从尾到头打印链表。[剑指 Offer 06]从尾到头打印链表。原创 2022-11-09 10:36:24 · 212 阅读 · 0 评论 -
剑指 Offer 03.找出数组中重复的数字
【代码】剑指 Offer 03.找出数组中重复的数字。原创 2022-11-08 11:27:00 · 130 阅读 · 0 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。原创 2022-09-09 10:12:06 · 142 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像
二叉树的递归分为遍历和分解子问题两种模式。方法一:递归遍历交换每个结点的左右子结点。利用递归前序遍历的框架。原创 2022-09-05 10:56:32 · 116 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
方法一:双指针法,从前到后逐个修改指针,第一步:初始化指针,curr 指向 head ,表示当前结点,pre 表示当前结点的前驱结点,刚开始指向null,第二步:循环修改指针,直到curr当前结点为null,先记录curr的next节点,防止后序修改丢失,修改curr指向前一个结点,移动pre结点到当前curr结点,移动curr结点到下一个结点,最后,pre指向的为原链表最后一个结点,即现在的头结点原创 2022-09-02 10:32:54 · 277 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
排序数组查找首先想到二分查找,旋转数组并且寻找最小元素,其实就可以理解为 旋把数组分成了两部分,右边部分就是以原数组第一个开始到结尾,而且,左边部分所有元素大于等于右边部分的元素,那么,我们寻找到右边部分的第一个,就是最小元素......原创 2022-09-01 10:22:54 · 99 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
链表只能正序访问,题目要求倒叙输出,由先入后出的思路可以想到借助一个辅助栈,先将所有链表节点压入栈中,然后出栈时保存到数组原创 2022-08-31 10:06:32 · 150 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字。原创 2022-08-30 10:39:27 · 131 阅读 · 0 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
查找的时候需要注意判断左右边界的返回值,比如查找左边界时,所给target比所给数组的所有数都要大,那么就会返回一个大于等于数组长度的一个数,肯定是不能用的,同样查找右边界也是这个道理。二分查找在找目标数字时,找到mid是直接返回的,而边界二分查找,比如左边界,找到mid之后不返回,继续让右边界减一,相当于向左寻找,最后返回最左边的边界。还有一种情况,target还是不存在于数组,但是他的数值在所给数组数值最大最小之间,这时也要判断一下。如果返回的left和right都为-1,则表示不存在找不到。.....原创 2022-08-26 11:50:47 · 105 阅读 · 0 评论 -
1008 数组元素循环右移问题 (20 分)
1008 数组元素循环右移问题 (20 分)(Java语言)原创 2022-02-26 21:27:53 · 152 阅读 · 0 评论 -
1004 成绩排名 (20 分)
1004 成绩排名 (20 分)(Java语言)原创 2022-02-26 21:24:16 · 156 阅读 · 0 评论 -
1003 我要通过 (20 分)
1003 我要通过! (20 分)(Java语言)原创 2022-02-26 21:20:57 · 102 阅读 · 0 评论 -
1002 写出这个数 (20 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //輸入接收 String str = scan.nextLine(); //提前定义数字与拼音的对应关系 String result[] = {原创 2022-02-26 21:14:05 · 83 阅读 · 0 评论 -
1106 2019数列 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); String [] array = new String[1000]; array[0] = "2";原创 2022-02-21 20:16:34 · 201 阅读 · 0 评论 -
1101 B是A的多少倍 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int num = scan.nextInt(); int n = scan.nextInt(); //准备 String str = num +原创 2022-02-21 20:14:31 · 121 阅读 · 0 评论 -
1096 大美数 (15 分)
题目要求:代码:import java.util.ArrayList;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); // for(int i = 0; i < n;i++原创 2022-02-21 20:11:29 · 134 阅读 · 0 评论 -
1091 N-自守数 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); // for(int i = 0; i < n;i++) { int num = sc原创 2022-02-21 20:05:10 · 97 阅读 · 0 评论 -
1081 检查密码 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); for (int i = 0; i < n; i++) {原创 2022-02-21 20:02:23 · 101 阅读 · 0 评论 -
1076 Wifi密码 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.nextLine(); StringBuilder sb = new StringBuilder();原创 2022-02-21 19:58:24 · 98 阅读 · 0 评论 -
1071 小赌怡情 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); int k = sc.nextInt(); sc.nextLine(); for (int i = 0;原创 2022-02-21 19:55:06 · 112 阅读 · 0 评论 -
1061 判断题 (15 分)
题目要求:代码:import java.util.Scanner;public class Main { public static void main(String[] args) { //輸入 Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); scanner.next原创 2022-02-20 23:34:43 · 110 阅读 · 0 评论