- 博客(15)
- 收藏
- 关注
原创 归并排序-特殊数组排序
归并排序 - 特殊数组题目题解代码时间复杂度 题目 已知一个几乎有序的数组,几乎有序指的是:如果把数组排好序的话,每个元素移动的距离一定不超过k,并且k相对于数组长度来说是比较小的 请选择一个合适的排序策略,对这个数组进行排序 题解 用小根堆+归并排序完成 1.因为排好序后每个元素移动的距离不超过k,那么最小值一定在0~k范围上 2.将数组0~k位置的值放到小根堆上,这样堆顶元素一定是数组的最小值 3.将堆顶元素与数组0位置交换 4.将小根堆的左右边界+1,即下一步的数组范围是1-k+1 5.继续将当前小根
2021-07-26 11:09:10
271
原创 求数组小和(归并排序)
求数组小和题目题解代码 题目 在一个数组中,一个数左边比它小的数组的总和,叫数的小和; 所有数的小和累加起来,叫做数组的小和; 求一个数组的小和 例如:[1,3,4,2,5] 1->0(左边没有比1小的数) 3->1(左边 1 比3小) 4->1,3(左边 1,3 比4小) 2->1(左边 1 比2小) 5->1,3,4,2(左边有 1,3,4,2 比5小) 数组小和为 1+1+3+1+1+3+4+2 = 16 题解 将寻找计数过程整合在归并排序的过
2021-07-19 13:01:41
291
原创 排序算法 - 归并排序
排序算法 - 归并排序递归方式基本思想代码复杂度分析非递归方式基本思想代码时间复杂度 递归方式 基本思想 将数组分为左右两部分,分别进行递归排序 排好序的两部分进行合并 合并过程 定义P1指针指向左部分最左边的值(最小值) 定义P2指针指向右部分最左边的值(最小值) 定义新数组,大小等于两部分的总大小 比较P1和P2指针指向的值,当arr[P1]<=arr[P2]时,将arr[P1]加到新数组中,否则加入arr[P2] 如果其中一部分的指针越界,那么将另一部分剩余元素加入新数组中 将新数组赋给赋给
2021-07-15 12:42:54
283
原创 用递归求数组最大值
用递归求数组最大值基本思想 基本思想 给定数组,假设左边界为L,右边界为R 将数组分为两部分,[L] ~ [mid],[mid+1] ~ [R] 分别在两个部分上求最大值,然后比较这两部分的最大值
2021-07-15 09:34:05
1532
原创 栈和队列の互相实现
栈和队列的相互实现用栈实现队列基本思想代码用队列实现栈基本思想代码 用栈实现队列 基本思想 实现两个栈:push栈、pop栈 push栈:元素入栈 pop栈:元素出栈 入栈:元素入栈时进push栈 出栈:元素出栈时,判断pop栈是否为空 如果pop栈不为空,弹出pop栈顶元素 如果pop栈为空,则判断push栈是否为空 如果push栈为空,则没有数据可以出栈 如果push栈不为空,将push栈所有元素弹出压入到pop栈,pop栈顶弹出 代码 import java.util.Stack;
2021-07-14 11:14:04
152
原创 数组实现栈&队列
数组实现栈和队列数组实现栈基本思想代码环形数组实现队列基本思想代码 数组实现栈 基本思想 用一个指针(index)维护入栈位置及出栈位置 入栈时,index++ 出栈时,–index即可 代码 public class ArrayStack { public static class MyStack{ private int[] array; private int index; public MyStack(int length){
2021-07-14 10:47:27
140
原创 实现栈,获取栈中最小值
实现栈,获取栈中最小值空间换时间基本思想代码复杂度分析时间换空间基本思想代码复杂度分析 两种方式实现,第一种用空间换时间,第二种用时间换空间 空间换时间 基本思想 用两个栈来实现,一个栈维护入栈数据(数据栈),一个栈维护最小值(最小栈) 元素入栈时,比较入栈元素与最小栈栈顶 如果最小栈栈顶元素更小,那么再次将该最小栈栈顶元素压入最小栈 如果入栈元素更小,那么将入栈的元素同步压入最小栈 元素出栈时,数据栈与最小栈同步出栈即可,最小栈弹出元素即为当前栈中最小值 代码 import java.util.
2021-07-13 15:06:09
803
原创 双向链表实现栈和队列
双向链表实现栈和队列栈和队列双向链表定义双向链表的节点定义双向链表双向链表从头部增加节点的方法双向链表从尾部增加节点的方法双向链表从头部删除节点的方法双向链表从尾部删除节点的方法用双向链表实现栈用双向链表实现队列 栈和队列 栈:先进后出 队列:先进先出 双向链表 定义双向链表的节点 //定义双向链表 public static class Node<T>{ public T value; Node<T> last; Node<T> next;
2021-07-13 14:36:52
891
原创 删除单链表の指定节点
删除单链表的指定节点删除节点基本思想代码复杂度分析 删除节点 3 -> 2 -> 0 -> 3 -> 4 -> 5 假定删除3这个节点,删除后的链表:2 -> 0 -> 4 -> 5 基本思想 存在删除头节点的情况 先看是否需要删除头节点以及要删除几个头节点 头节点删除完成后,当前节点即为链表的头节点,且作为返回 遍历单链表 用 cur 表示当前节点,用 pre 表示当前节点的前一个节点,用 num 表示目标值 当 cur值 = num时,则将
2021-07-13 13:21:36
872
原创 二分法及题目
二分法时间复杂度题目一题目解题思路代码题目二题目解题思路代码题目三题目解题思路代码 时间复杂度 二分查找时,第1次二分后的范围为N/2,第2次二分后的范围为N/4,第3次二分后的范围为N/8… 若未找到,则在最后范围为1时结束 时间复杂度为 O(logN) 题目一 题目 在一个有序数组中,找某个数是否存在 解题思路 定义三个指针 L代表当前查找范围的左边界 R代表当前查找范围的右边界 mid 代表当前查找范围的中点位置 比较mid指针所在位置的值和目标值 如果等于当前值,那么结束循环,返回t
2021-07-13 10:10:43
803
原创 异或运算及题目
异或运算定义&性质题目一代码执行结果特殊说明题目二 定义&性质 位运算 相同为0,不同为1 也可以记作 无进位相加 性质1:0 ^ N=N,N ^ N = 0 性质2:满足交换律和结合律 题目一 不用额外变量交换两个值,用异或运算实现交换 代码 public static void swap(int[] array,int i,int j){ System.out.println(array[i] + " " + array[j]); array[i] = arra
2021-07-12 14:05:12
898
原创 排序算法 - 插入排序
插入排序排序逻辑代码复杂度分析 排序逻辑 1.给定长度为N的数组 2.[0]~[0]范围上,自然有序 3.[0]~[1]范围上,[1] 位置值若小于[0]位置,则交换 4.[0]~[2]范围上,[2] 位置值若小于[1]位置,则交换[1]和[2];交换后判断[1]位置值若小于[0]位置值则交换 5.以此类推… 代码 public static int[] insert(int[] arr){ for (int i = 1; i < arr.length;i++){ // j从
2021-07-12 13:39:00
123
原创 排序算法 - 冒泡排序
冒泡排序排序逻辑代码复杂度分析 排序逻辑 给定一个数组,假设长度为N 第一次循环 循环范围为[0]~[N-1] [0] 和 [1] 比较,如果 [0] 位置值更大,则交换 [0] 和 [1] 位置的数 [1] 和 [2] 比较,如果 [1] 位置值更大,则交换 [1] 和 [2] 位置的数 … [N-2] 和 [N-1] 比较,如果 [N-2] 位置值更大,则交换 [N-2] 和 [N-1] 位置的数 第二次循环 循环范围为[0]~[N-2] [0] 和 [1] 比较,如果 [0] 位置值更大,则
2021-07-12 10:52:50
106
原创 排序算法 - 选择排序
选择排序排序逻辑代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 排序逻辑 1.给定一个数组,假设长度为N 2.选择逻辑:每次选择范围上的最小值,与当前范围的第一个位置交换 3.第一步:在[0]~[N-1]范围上找到最小值,与[
2021-07-12 09:36:42
108
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅