首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《剑指 offer》刷题记录之:查找和排序

本节将主要聚焦二分查找方法,其应用场景为: ❝如果面试题要求排序数组(或者部分排序数组查找一个数字或是统计某个数字出现次数,那么我们可以尝试用「二分查找算法」。...数组可视化如下图所示,我们将旋转点(即目标元素)左侧数组称为「左排序数组」,将其右边数组称为「排序数组」。一种极端情况左排序数组没有元素,即未进行旋转本解法并不需要单独讨论)。 ?...当 numbers[m] == numbers[j] 时,我们选择将右边界指针减一来缩小查找范围,为了证明操作正确性,我们只需要证明执行操作后,旋转k 仍在 [i,j] 区间内即可。...「情况一」:如果 m 排序数组,此时数组 内所有元素相等,执行 j=j-1 操作后只会抛弃一个重复值,旋转点仍位于区间内; 「情况二」:如果 m 左排序数组,此时要再根据旋转值 numbers...[k] == numbers[j]:若 j>k,则执行操作后仍满足要求;若 j==k,此时执行操作旋转k 「可能不」位于区间内,但是根据数组特点,区间 [i,m] 内元素一定都等于旋转值,

60620

ACM算法基础

例如对一个空栈进行 N 次连续 push() 调用需要访问数组元素为 N+4+8+16+...+2N=5N-4(N 数组写入元素,其余都是调整数组大小时进行复制需要访问数组操作),均摊后每次操作访问数组平均次数为常数...ThreeSumSlow 该算法内循环为 if (nums[i] + nums[j] + nums[k] == 0) 语句,总共执行次数N(N-1)(N-2) = N3/6-N2/2+N/3,因此它近似执行次数为...可以利用这个特性找出数组k 个元素。 该算法线性级别的,假设每次能将数组二分,那么比较次数为 (N+N/2+N/4+..),直到找到第 k 个元素,这个和显然小于 2N。...左旋转 因为合法红链接都为左链接,如果出现链接为红链接,那么就需要进行左旋转操作。...插入 先将一个节点按二叉查找树方法插入到正确位置,然后再进行如下颜色操作: 如果子节点红色而左子节点黑色,进行左旋转; 如果左子节点红色,而且左子节点左子节点也是红色,进行右旋转

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

数组还可以这样用!常用但不为人知应用场景

还将对这些应用场景优缺点进行分析,并提供相应类代码和测试用。 正文简介  数组Java一种基本数据结构,可以表示连续内存空间。它可以用来存储一组相同数据类型元素。...Java数组可以是一维或多维,而且数组大小一旦确定就无法更改。  本文将介绍数组几种常用但不为人知应用场景,包括二维数组应用,数组旋转、查找、去重等操作,以及算法中使用数组等场景。...并且将分析这些应用场景优缺点,并提供相应示例代码和测试用。源代码解析二维数组应用  二维数组由多个一维数组组成,可以理解为一个表格,行和列分别对应数组第一维和第二维。...数组旋转、查找、去重等操作数组旋转  数组旋转数组元素按照某个规律进行旋转实际工作数组旋转操作常用于图像处理、游戏等方面。  ... main 方法,没有任何代码。执行结果:小结  数组Java中常用数据结构之一,能够优化算法并提高性能。

25021

Java架构核心基础知识硬核整理,赶快收藏起来吧!!!

大小固定:一旦定义了数组大小,就不能改变。如果需要更大存储空间,需要重新定义一个新数组。 元素类型相同:数组所有元素必须相同数据类型。...易于实现:数组一种简单数据结构,容易实现和操作数组缺点: 大小固定:数组大小固定,不能动态扩展。如果需要更多存储空间,需要重新定义一个新数组,这会增加额外开销。...本课程我们介绍下和Java关联性比较强非线性结构-树 1.2.1 树 树[Tree]nn>=0)个结点有限集。n=0时称为空树。...三种操作:左旋、右旋和变色 操作 描述 左旋 以某个结点作为支点(旋转结点),其子结点变为旋转结点父结点,子结点左子结点变为旋转结点子结点,左子结点保持不变。...旋转操作 左旋:以某个节点作为旋转点,其子节点变为旋转节点父节点,子节点左子节点变为旋转节点子节点,左子节点保持不变。 右旋:以某!

32330

深入理解JavaMap接口:实现原理剖析

如果添加操作后,HashMap 键值对数目超过了负载因子乘以当前数组长度,则进行 rehash 操作,即将数组大小扩大一倍,并将旧键值对重新分桶到新数组。  ...TreeMap每个键值对存储一个节点中,该节点包含键、值、左子节点和子节点等信息。底层数据结构  TreeMap底层数据结构一棵红黑树,每个节点都包含一个键值对。...红黑树一种自平衡二叉搜索树,它能够保持树高度平衡,因此能够保证查询、插入和删除操作都能够O(log n)时间复杂度内完成。  ...具体地说,我们需要执行以下步骤:1.创建一个新节点e来保存键值对,并将其父节点设置为parent。2.将e插入到树,将其置于parent左子树或子树,具体取决于cmp值。...测试用下面一个简单示例,演示如何使用Map接口:测试代码演示package com.demo.javase.day65;import java.util.HashMap;import java.util.Map

35412

常见数据结构及应用

Java 语言为,当声明一个数组后,数组变量会指向数组对象起始地址,也就是第一个元素位置,如下图以此看来,当查询数组某个元素时,通过下标就可以计算出这个元素内存地址,比如想查找下标为2元素...以 Java,一个节点结构这样表示:public class Node { //存储数据元素数据域 private T value; //下一个节点地址指针域...以下图为,当插入节点5时,节点7左右子树高度差为2,这时候节点7就需要进行右旋保持树平衡。右旋就是:以某个节点为旋转点,其左子节点变为其父节点,左子节点子节点变为其左子节点,子节点不变。...虽然AVL通过旋转保持树平衡,但是插入和删除频繁场景,频繁旋转会导致性能下降,为解决问题红黑树被提出。红黑树红黑树大家应该都比较耳熟,但是理不理解另一回事,面试时候应该经常会被问到。...红黑树后面专门写一篇文章介绍,这里先给结论:红黑树旋转次数相对于AVL树来说较少,因此插入、删除等操作较多情况下,通常使用红黑树,比如大家都知道HashMap。

21851

数据结构与算法

层序遍历实现需要利用队列结构,首先将根节点入队,当队列中有元素时,执行以下操作:将队首元素出队,对该元素进行操作,并将该元素左子树、子树依次入队。 层序遍历并不需要用到递归。...根结点子树个数+1=森林中树数量; 前序遍历一棵树等价于前序遍历该树对应二叉树; 后序遍历一棵树等价于序遍历该树对应二叉树。...(递归执行,与树后序遍历思路相似) 代码实现时,利用了一个辅助数组visit,用于标记该结点是否已经被访问。...辅助空间:n,一个与原待排序对象数组同样大小辅助数组。 归并排序算法,递归深度为O(logn),对象关键字比较次数为O(nlogn)。算法总时间复杂度为O(nlogn)。...:棋盘覆盖 一个2^k\times 2^k个方格组成棋盘,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

1.4K21

剑指Offer——编程题Java实现

思路:     Java和C,对字符串处理略有不同,C字符串是以字符数组形式存储,并且字符串或者字符数组中都有一个结束符"\0";而在Java,却没有这样结束符,所以本题在Java处理与...思路:     主要考察二叉搜索树和后序遍历性质,其中后序遍历最后一个数根结点,二叉搜索树,左子树值都小于根结点,子树值都大于跟结点,这样便能构造左右子树序列,用同样方法分别处理左右子树序列...思路:     遍历数组过程纪录两个量,一个数组数字,一个次数,当下一个数字和我们保存一致时则次数加1,当不一致时次数减1,当次数为0时,重置两个量。...思路:     Java可以把字符串转换成字符数组处理,可以使用HashMap数据结构存储,其中key为字符,value为对应出现次数,这样通过两次遍历字符数组就可以找出,其中,第一次构建HashMap...但是Java声明对象数组必须对数组对象初始化才能开辟空间。所以我这题不知道利用Java怎么实现。书中其他几种方式主要是利用C++一些特性。如果有人知道,可以告诉我,谢谢。

2.1K30

剑指Offer——编程题Java实现

思路:     Java和C,对字符串处理略有不同,C字符串是以字符数组形式存储,并且字符串或者字符数组中都有一个结束符"\0";而在Java,却没有这样结束符,所以本题在Java处理与...思路:     主要考察二叉搜索树和后序遍历性质,其中后序遍历最后一个数根结点,二叉搜索树,左子树值都小于根结点,子树值都大于跟结点,这样便能构造左右子树序列,用同样方法分别处理左右子树序列...思路:     遍历数组过程纪录两个量,一个数组数字,一个次数,当下一个数字和我们保存一致时则次数加1,当不一致时次数减1,当次数为0时,重置两个量。...思路:     Java可以把字符串转换成字符数组处理,可以使用HashMap数据结构存储,其中key为字符,value为对应出现次数,这样通过两次遍历字符数组就可以找出,其中,第一次构建HashMap...但是Java声明对象数组必须对数组对象初始化才能开辟空间。所以我这题不知道利用Java怎么实现。书中其他几种方式主要是利用C++一些特性。如果有人知道,可以告诉我,谢谢。

72730

整理得吐血了,二叉树、红黑树、B&B+树超齐全,快速搞定数据结构

当键数量很大时,将以块形式从磁盘读取数据,与主存储器访问时间相比,磁盘访问时间非常高。 B树一种自平衡搜索树,设计主要思想减少磁盘访问次数。...O(log n) p.s:B树由术语最小度t定义,t值取决于磁盘块大小,数值上m = 2t。...从B树删除键各种情况(设删除键k所在节点为n): k所在节点n为树节点(非叶子节点也非根节点),则根据以下不同情况执行子节点key上移或合并完成删除操作 a....节点nk之前子节点kln(key left node)键数至少有m/2个,则在kln节点中查找最接近kk0,将k0替换k,结束删除操作。...节点nk之前子节点kln键数少于m/2个,且k子节点krn(key右侧节点)键数至少有m/2个,则在krn节点中查找最接近kk0,将k0替换k,结束删除操作

2.6K20

文心一言 VS 讯飞星火 VS chatgpt (168)-- 算法导论13.2 1题

一、用go语言,写出 RIGHT-ROTATE 伪代码。 文心一言: 计算机科学,右旋转(RIGHT-ROTATE)一种常见操作,通常用于数组或链表。...以下一个使用Go语言实现右旋转伪代码: func rightRotate(arr []int, k int) []int { n := len(arr) k %= n //...智谱清言: Go语言中实现一个RIGHT-ROTATE操作,我们可以通过以下步骤来完成: 1.定义一个函数,接受两个参数:一个表示要旋转节点指针,以及表示要旋转次数整数。...此外,这段代码假设了旋转次数k有效,并没有处理k大于链表长度情况,这在实际应用也需要考虑。 通义千问: 二叉树旋转操作,右旋(RIGHT-ROTATE)通常用于平衡树操作。...实际红黑树实现,这个指针必要,因为它允许我们旋转操作中正确地更新父节点子节点指针。 混元: 红黑树,RIGHT-ROTATE操作用于将一个节点左子节点旋转子节点。

12120

万字长文!剑指offer全题解思路汇总

面试题33:把数组排成最小数:首先将数组数字全部转换为字符串存储一个新数组,然后比较每两个数字串拼接mn和nm大小,若mn<nm,则m更小,反之n更小,然后把更小数放入一个新List...面试题36:数组逆序对:这道题可以这么想,我们要找到数组逆序对,可以看做对数据进行排序,需要交换数组元素次数,但是防止相同大小元素发生交换,因此需要选择一个稳定排序方法,记录发生交换次数...面试题45:n个骰子点数:用两个数组来存储骰子点数每一个总数出现次数一次循环中,第一个数组n个数字表示骰子和为n出现次数。...注意考虑测试用为0情况。 面试题49:不用加减乘除做加法:将两个数加法看作两步,第一步两个数相加但是不进位,第二步记录之前两数相加应该进位地方加上前一个相加但是不进位数。...m,n大小,如果当前节点值均大于m,n,则在当前节点左子树继续操作,如果当前节点均小于m,n,则在当前节点子树继续操作,反之,则当前结点最小公共祖先。

75120

2. 基础数据结构初识

I k x,表示k 个插入数后面插入一个数 x(操作 k 均大于 0)。 输出格式 共一行,将整个链表从头到尾输出。 数据范围 1≤M≤100000 所有操作保证合法。...其每个结点值,均小于等于左右子节点,即根节点为整棵树最小值 操作思想 存储方式:用一维数组存储,设根节点下标i,则左儿子2*i,儿子2*i+1 //对无序一维数组进行建堆(小根堆) for...不考虑对堆数据进行修改 模板 ////以小根堆为 const int N=1e6+10; //堆大小 int h[N]; //h[N]为堆 int idx; //idx表示当前结点在数组下标...输入格式 第一行包含整数 N,表示操作数量。 接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 一种。...字符串只包含大小写英文字母和数字。 输入格式 第一行包含整数 n 和 m,表示字符串长度和询问次数。 第二行包含一个长度为 n 字符串,字符串只包含大小写英文字母和数字。

20820

精读《MinusOne, PickByType, StartsWith...》

最核心逻辑就是函数 N 了,它做其实是把 T 数组长度放大 10 倍再追加上当前数量 1 在数组末尾。...[] 有 10 个,所以 12 个 1 变成 120 个,加上映射表 3,一共有 123 个 1 总结一下,就是将数字 T 变成字符串,从最左侧开始获取,每次都把已经积累数组数量乘以 10 再追加上当前值数量...never : Q]: T[Q] } 但不匹配测试用,原因最终类型正确,但因为分成了两个对象合并无法匹配成一个对象,所以需要用一点点 Magic 行为合并: // 本题答案 type PartialByKeys...因为 Omit K 有来自于 keyof T 限制,而测试用又包含 unknown 这种不存在 Key 值,此时可以用 extends PropertyKey 处理场景。...K> 虽然本身逻辑没错,但无法把必选覆盖为可选,因此测试用都挂了。

1.1K20

万字长文彻底搞懂二叉树

因此,除去可能插入外,所有树操作都可以以时间O(logN)执行。...(k1->left); rotateWithRightChild(k1); } 5 高级数据结构 大规模数据存储,实现索引查询这样一个实际背景下,树节点存储元素数量有限(如果元素数量非常多的话...B树每个结点根据实际情况可以包含大量关键字信息和分支(当然不能超过磁盘块大小,根据磁盘驱动(disk drives)不同,一般块大小1k~4k左右);这样树深度降低了,这就意味着查找一个元素只要很少结点从外存磁盘读入内存...这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取消耗要高几个数量级,所以评价一个数据结构作为索引优劣最重要指标就是查找过程磁盘I/O操作次数渐进复杂度。...应用 红黑树这种数据结构应用十分广泛,多种编程语言中被用作符号表实现 Javajava.util.TreeMap,java.util.TreeSet C++ STL:map,multimap

42330

LeetCode-剑指offer

旋转字符串 题目 字符串旋转操作把字符串前面的若干个字符转移到字符串尾部。请定义一个函数实现字符串左旋转操作功能。...数组重复数字 题目 一个长度为 n 数组 nums 里所有数字都在 0~n-1 范围内。数组某些数字重复,但不知道有几个数字重复了,也不知道每个数字重复了几次。...排序数组查找数字 I 题目 统计一个数字排序数组中出现次数。...] 闭区间内,因此执行 high = pivot; 当 nums[pivot] = nums[high] 时: 无法判断 pivot 在哪个排序数组,即无法判断旋转点 x [low, pivot]...数组数字出现次数 II 题目 一个数组 nums 除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次数字。

1.2K20

剑指offer题目汇总_朝花夕拾题目及答案填空题

7、调整数组顺序使奇数位于偶数前面 8、数组中出现次数超过一半数字 9、连续子数组最大和 10、把数组排成最小数 11、数组逆序对 12、数字排序数组中出现次数 五、其他 1.求1+...2+3+…+n 2.不用加减乘除做加法 3、旋转数组最小数字 六、其他 1.整数1出现次数(从1到n整数1出现次数) 2.扑克牌顺子 3.孩子们游戏(圆圈剩下数) 4、替换空格 5、...如果点,要判断至此点数量和e数量是否已经有了,因为java e要求后面为整数,如果有了肯定false。索引后移,dotnum增加。 如果e,判断是否重复e,或者前面没有数字返回false。...统计一个数字排序数组中出现次数。...为了方便起见,你可以认为大小0。 思路:剑指和博客 思路:用数组记录五张扑克牌,将数组调整为有序,若0出现次数>=顺子差值,即为顺子。

82000

【数据结构与算法】:关于时间复杂度与空间复杂度计算(CC++篇)——含Leetcode刷题

而是一个算法所花费时间与其中语句执行次数成正比例,算法基本操作执行次数,为算法时间复杂度,时间复杂度通常用大O渐进表示法。...Func3执行操作次数: F(N)= N + M 时间复杂度为: O(M+N) 由于不确定M和N大小,所以这里都不能忽略掉。...旋转数组 旋转数组 题意:输入一个数k,将数组每个元素向右移动k位,数组最后一个元素向右移动移位后就成了数组第一个元素。...这种算法时间复杂度为O(N * K) 思路二:以空间换时间,创建一个和nums同样大数组,将nums数组k位元素与前k位元素进行互换,然后将新数组元素拷贝到nums。...样可能会出现k大于数组元素个数,对k数组大小余数即可。

41610

面向程序员编程——精研排序算法

时间复杂度 时间复杂度定性描述了一段程序运行时间, 官方定义:算法基本操作重复执行次数问题规模n某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(...n)极限值为不等于零常数,则称f(n)T(n)数量级函数。...长度为N数组,如果次数N大小无关,始终为一个固定次数,或许是1次,或许是3次,它们都记为O(1),也叫常数阶,一个遍历就是O(N),也叫线性阶,嵌套两个遍历就是 O(N^2),也叫平方阶,...假设数组长度为N,第一层循环第一次操作执行1次,第二次操作执行2次,直到第N-1次操作执行N-1次,那么总次数为一个等差数列求和,即N*(N-1)/2,当问题规模扩大到无穷大时,小数量加减可以忽略...:数组长度:32,执行交换次数:185 下沉操作数组长度:32,执行交换次数:139 通过结果可以看出,下沉操作执行交换次数较少,因为下沉操作目标位置只是所有的父节点,而上浮操作要遍历整个数组

1.7K50

21Java网易面经备战版 第二弹

红黑树能自平衡,它靠是什么?三种操作:左旋、右旋和变色。 左旋:以某个结点作为支点(旋转结点),其子结点变为旋转结点父结点,子结点左子结点变为旋转结点子结点,左子结点保持不变。如图3。...右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点父结点,左子结点子结点变为旋- 转结点左子结点,子结点保持不变。如图4。 变色:结点颜色由红变黑或由黑变红。...HashMap底层结构Node数组: transient Node[] table 当HashMap存储数据过多时候,table数组就会被装满,这时候就需要扩容,HashMap扩容是以...put操作: 当执行put操作时,会经历两个步骤: 判断是否需要扩容; 定位到添加元素位置,将其放入 HashEntry 数组。...16.一道和Java并发编程相关题目 估计 三个线程 同时执行 顺序执行 交替执行 之类题目 顺序执行 使用 join public class ThreadTest1 { // T1、T2

33720
领券