随笔分类 - 数据结构和算法
摘要:剑指offe刷题 数组 https://cuijiahua.com/blog/2018/04/life_2.html 剑指Offer(一):二维数组中的查找 剑指Offer(六):旋转数组的最小数字 剑指Offer(十三):调整数组顺序使奇数位于偶数前面 剑指Offer(二十八):数组中出现次数超过
阅读全文
摘要:剑指offer25复制链表的复制 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。 (注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 先说明白什么是复杂链表: 就是A结点中有一个结点
阅读全文
摘要:随机洗牌算法就是让一组数据随机出现。 #include <iostream> #include <vector> #include <ctime> #include <cstdio> using namespace std; // 随机洗牌算法 void shuffle(vector<int>& v
阅读全文
摘要:Top K 问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题 1:如何在100亿数据中找到最大的1000个数 最容易想到的就是将数据全排序,但是效率太低了,对于海量数据处理并不合适。 方法一构
阅读全文
摘要:一个面试题:不用sqrt函数如何实现开方 用二分法。 上界初始化为数字本身,下界初始化为0.0,这样用二分,判断中间数字的平方和目标数字比较,再修改上界和下界,直到小于一定的阈值。 注意结束条件和精度判断 // // Created by LK on 2020/3/21. #include <ios
阅读全文
摘要:输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) 图解: 思路1: 先统计两个链表长度,求出相差的步数len3; 让长的先走len3步,然后两个一块走,当两个指针相等时就是公共节点了 // 先统计两个链表长度,找出长度
阅读全文
摘要:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 第一个思路:利用大根堆。也是解决top k海量数据的关键 延伸部分(重要) 大堆还是小堆的选择很重要,不是寻找最小的k个元素就要选择小堆,而且恰恰相反。 寻找最小的k个数,其实
阅读全文
摘要:常用排序算法 我们通常说的排序都是内部排序,就是数据在内存中进行排序 一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等。 另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等。 特殊记法:
阅读全文
摘要:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 两种思路:递归和非递归 先说递归吧, // 先判断两个链表指针是否为空,如果链表一为空,则返回第二个// 如果链表二为空,则返回第一个.如果都是空,合并后也是空//两个链表都是有序的,遍历链表,判断当前指针
阅读全文
摘要:输入一个链表,反转链表后,输出新链表的表头。 注意这里是没有头结点的(就是pHead指向的是第一个元素的地址) 思路: //利用两个指针Pcur指向当前,PNew执行要返回的,和一个中间指针变量保存当前结点的下一个结点//我们需要从第二个节点开始遍历,将当前节点的 next 指向前一个节点。//这里
阅读全文
摘要:堆排序 是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 首先简单了解下堆结构。 堆 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆; 或者每个结点的值都小于或等于其左右孩子结
阅读全文
摘要:这是在网上见到的一道腾讯面试题 先说结论: 1. 计时的情况下需要比赛8轮; 2.不计时的情况下最少需要10轮,最多需要11轮。 1 用秒表计时的话,64匹分8组。 8轮就出来了 2:不能计时的情况下 先说下思路: 一:把64匹马分8组,各跑一次,然后淘汰掉每组的后四名,这里淘汰后四名是因为只需要跑
阅读全文
摘要:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。 同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。 例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a stu
阅读全文
摘要:红黑树常见问题 1 stl中的set和set底层用的什么数据结构? 红黑树 2 红黑树的数据结构 1 enum Color 2. { 3. RED = 0, 4. BLACK = 1 5. }; 6. 7. struct RBTreeNode 8. { 9. struct RBTreeNode*le
阅读全文
摘要:统计一个数字在排序数组中出现的次数。 这个题思路有两种, 一:直接遍历数组统计,时间复杂度为O(n)略 二:利用二分法的变种来写 思路: /* 思路, 和普通的二分改变的是当等于给定值需要修改我们对数组data进行二分,如果数组中间的数字小于k,说明k应该出现在中间位置的右边;如果数组中间的数字大于
阅读全文
摘要:二分查找 普通二分查找 首先说下普通二分查找的思路 普通二分查找是在一个没有重复的排序数组中,找到目标值 思路就是先从中间找,如果中间值大于目标值,说明目标值在左半区 如果中间值小于目标值,说明目标值在右边, 当中间值等于目标值,返回他的下标, // 这里的数组默认都不为空 // 给定一个有序数组和
阅读全文
摘要:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 题解: 这里涉及到了整数转换字符串问题 我们可以先将数组转换成字符串,存放在一个字符串容器中vector<string>
阅读全文
摘要:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分, 并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路一: // 冒泡排序法,如果两个相邻的是前偶后奇数,就交换 O(n^2) 代码: 1 #include <iostream>
阅读全文
摘要:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。 如果不存在则输出0。 思路一: 先排序,排好序之后所有相同的数都在一起了,统计相同的数的个数,并判断个数是
阅读全文
摘要:#include <iostream> #include <vector> using namespace std; int binarySearch(vector<int>&vec, int target) { int left = 0; int right = vec.size() - 1; i
阅读全文