![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
白鸽呀
这个作者很懒,什么都没留下…
展开
-
链表之链表相交
问题给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。简而言之,给定两数组,求出相交节点解决必须要两个指针相同位置,同时移动,才能求出相交节点如果某一链表长度过短,那么需要循环遍历 短链表,直到长链表遍历完毕下列代码抽象以下,会更好看一点public static Node原创 2022-01-23 12:07:12 · 553 阅读 · 0 评论 -
链表之删除链表的倒数第N个节点(一次遍历)
问题给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2:输入:head = [1], n = 1 输出:[] 示例 3:输入:head = [1,2], n = 1 输出:[1]解决双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。例如原创 2022-01-23 12:00:42 · 861 阅读 · 0 评论 -
链表之两两交换链表中的相邻节点
问题给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解决思路如下public static Node changeAdjoiningNode(Node<Integer> headNode){ Node<Integer> virtualNode = new Node(-1,null); // 虚拟节点下一节点 指向头节点 virtualNode.se原创 2022-01-23 11:48:23 · 1393 阅读 · 0 评论 -
链表之反转链表(不使用额外链表)
问题题意:反转一个单链表。示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL注意: 不要使用额外链表解决反转链表,只需要转变方向即可,由于需要从head节点开始遍历那么需要一个currentNode 指向当前节点,tempHeadNode 指向临时头节点,virtualNode 指向 当前节点的需要指向的下一节点(或者说前节点)private static void revers原创 2022-01-23 11:39:04 · 522 阅读 · 0 评论 -
链表之设计链表
题目题意:在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末原创 2022-01-23 11:17:31 · 331 阅读 · 0 评论 -
链表之移除任意链表元素
问题题意:删除链表中等于给定值 val 的所有节点。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]解决注意:建议使用虚拟节点/** * 添加虚节点方式 * 时间复杂度 O(n) * 空间复杂度 O(1) * @param head * @param val * @retur原创 2022-01-23 11:12:30 · 129 阅读 · 0 评论 -
数组之螺旋矩阵
题目给定一个正整数 n,生成一个包含 1 到 n2n^2n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]解决模拟顺时针画矩阵的过程:填充上行从左到右填充右列从上到下填充下行从右到左填充左列从下到上由外向内一圈一圈这么画下去。注意:要仔细处理边界条件 public int[][] generateMatrix(int n) { int[][] res =原创 2022-01-23 11:05:10 · 452 阅读 · 0 评论 -
数组之寻找长度最小的子数组
题目给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。解决方式一:public static int[] subArray(int[] array,int s){ int subLength = Integer.MAX_VALUE;原创 2022-01-23 11:00:10 · 300 阅读 · 0 评论 -
数组之有序数组的平方
题目给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]解决public int[] sortedSquares(int[] nums) {原创 2022-01-23 10:07:48 · 64 阅读 · 0 评论 -
数组之移除元素(一次循环)
题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1)O(1)O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。示例 2: 给定 nums = [0,1,2,2原创 2022-01-23 10:01:37 · 429 阅读 · 0 评论 -
数组之二分查找
题目给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 分析1,2,3,4,7,9,10中查找元素2解答public class BinarySearch { /** * 给定一个 n原创 2022-01-17 17:56:25 · 380 阅读 · 0 评论 -
二分查找基本思想与实现
基本思想1、获取低位,高位下标,求出中位数2、如果查找值key大于中位数,那么,数值key在右边。低位mid+13、再次判断low<=high , low=high为找到key的条件4、如果查找值key小于中位数,那么,数值key在左边。高位mid-15、找到返回,反之返回错误结果二分查找代码public static int binarySearch(int[] array,int key){ int low = 0; int high = array.原创 2021-08-27 17:40:37 · 338 阅读 · 0 评论 -
冒泡排序基本思想与实现
思想外层循环控制轮次,内层循环控制比较次数1、一轮确定一个最大值2、内层循环两两比较,最终确定一个最大值,放在末尾代码public static void bubbleSort(int[] array) { int length = array.length; boolean isChange = false; for (int i = 0; i < length; i++) { isChange = false;原创 2021-08-27 16:36:07 · 179 阅读 · 0 评论 -
选择排序思想与实现
基本思想外层循环控制轮次,内存循环控制比较次数1、每一轮次确定一个默认最小值,定一个minIndex指向2、内存循环将数值与最小值(minIndex指向的)逐次比较,确定这一轮的真正最小值3、将真正最小值,与默认最小值交换,确定第一个最小值4、多个轮次之后,排序成功代码public static void selectionSort(int[] array) { if (array == null || array.length <= 1) {原创 2021-08-27 16:31:40 · 125 阅读 · 0 评论 -
快速排序思想与实现
快排思想1、确定基数key,默认最左边第一个2、比基数key大的值放在右边3、比基数key小的值放在左边,分割成两个区域4、对两个子区域分别递归排序注意:在快排当中一定要判断 left < right ,不然排序过头了,代码public static void main(String[] args) { int[] array = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8,15,29,12,34,11}; quicklySort(原创 2021-08-27 16:24:58 · 66 阅读 · 0 评论